Major Refactor

This commit is contained in:
ZhymabekRoman 2024-03-27 21:49:52 +05:00
parent 34d788d8f5
commit 23bdb73524
13 changed files with 64 additions and 59 deletions

View file

@ -1,4 +1,10 @@
# This is the address of the server that will be used to send the requests to
HOST_ADDRESS = "http://localhost:6752"
# This is the timeout in seconds for the requests
TIMEOUT=3
# This is the secret key that will be used to get access for some internal API endpoints
ADMIN_SECRET_KEY="test"
# MEDIUM_AUTH_COOKIES="Get your premium subscription account coockies here, uid and sid properties is required"
# MEDIUM_AUTH_COOKIES="Get your Medium subscription account coockies here ONLY IF YOU HAVE A PAID SUBSCRIPTION, uid and sid properties is required"

View file

@ -44,21 +44,17 @@ Speed up Freedium, and probably create open source Medium frontend in next life
Requirements:
- Python 3.9+
- pip
- git
- Docker
- Linux. Officially, we can't guarantee that Freedium will work on other OS.
And probably any `Linux` based distro (like Arch btw).
```bash
git clone https://github.com/Freedium-cfd/web ./web
cd ./web
pip install -r requirements.txt
# for linux also do: pip install -r requirements-fast.txt
pip install ./database-lib
pip install ./core
pip install ./rl_string_helper
We need configure our Freedium instance. Copy `.env_template` to `.env` configuration file and set values, required for you.
```
git clone https://github.com/Freedium-cfd/web ./web
cd ./web
cp .env_template .env
# do some changes in .env, if you want
sudo docker-compose -f docker-compose-dev.yml up
```
Now we need configure our Freedium instance. Copy `.env_template` to `.env` configuration file and set values, required for you.
And now you can access local instance of Freedium by opening browser and type `http://localhost:6752`.

View file

@ -1,12 +1,10 @@
import datetime as dt
import pickledb
from multiprocessing import Value, Manager
from multiprocessing import Value
import logging
from contextvars import ContextVar
from typing import Optional
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from jinja2 import Environment, DebugUndefined, FileSystemLoader
import redis.asyncio as redis
from xkcdpass import xkcd_password as xp
@ -14,24 +12,6 @@ from server.utils.loguru_handler import InterceptHandler
redis_storage = redis.Redis(host="dragonfly", port=6379, db=0)
scheduler = AsyncIOScheduler()
jinja_env = Environment(enable_async=True)
jinja_safe_env = Environment(undefined=DebugUndefined)
template_env = Environment(loader=FileSystemLoader("./server/templates"), enable_async=True)
template_safe_env = Environment(loader=FileSystemLoader("./server/templates"), undefined=DebugUndefined)
base_template = template_env.get_template("base.html")
url_line_template = template_env.get_template("url_line.html").render()
main_template_raw = template_safe_env.get_template("main.html")
postleter_template = template_env.get_template("postleter.html")
error_template_raw = template_safe_env.get_template("error.html")
main_template_raw_rendered = main_template_raw.render(url_line=url_line_template)
main_template = jinja_env.from_string(main_template_raw_rendered)
error_template_raw_rendered = error_template_raw.render(url_line=url_line_template)
error_template = jinja_env.from_string(error_template_raw_rendered)
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)

View file

@ -1,3 +1,3 @@
from server.cli import cli
from server.services.cli import cli
cli()

View file

@ -1,11 +1,11 @@
from html5lib.html5parser import parse
from html5lib import serialize
from server import base_template, main_template, config
from fastapi import Request
from fastapi.responses import HTMLResponse, JSONResponse
from server import config
from server.services.jinja import base_template, main_template
from server.handlers.post import render_medium_post_link, render_postleter
from server.handlers.reverse_proxy import miro_proxy, iframe_proxy
from server.handlers.misc import report_problem, delete_from_cache

View file

@ -6,7 +6,8 @@ from html5lib.html5parser import parse
from html5lib import serialize
from loguru import logger
from server import base_template, config, url_correlation, redis_storage, postleter_template, home_page_process, transponder_code_correlation
from server import config, url_correlation, redis_storage, home_page_process, transponder_code_correlation
from server.services.jinja import base_template, postleter_template
from server.utils.error import generate_error
from server.utils.logger_trace import trace
from server.utils.notify import send_message

View file

@ -0,0 +1 @@
from .scheduler import scheduler

View file

@ -24,8 +24,8 @@ def server_cmd(cmd, opts):
if is_port_in_use(opts.port):
cmd.error(f"Port {opts.port} is in use or permission denied")
from server.worker import execute_server_worker
from server.utils.maintenance_scheduler import enable_maintenance_mode
from server.services.worker import execute_server_worker
from server.utils.maintenance_scheduler import do_maintenance
threading.Thread(target=enable_maintenance_mode, daemon=True).start()
threading.Thread(target=do_maintenance, daemon=True).start()
execute_server_worker(host="0.0.0.0", port=opts.port)

18
server/services/jinja.py Normal file
View file

@ -0,0 +1,18 @@
from jinja2 import Environment, DebugUndefined, FileSystemLoader
jinja_env = Environment(enable_async=True)
jinja_safe_env = Environment(undefined=DebugUndefined)
template_env = Environment(loader=FileSystemLoader("./server/templates"), enable_async=True)
template_safe_env = Environment(loader=FileSystemLoader("./server/templates"), undefined=DebugUndefined)
base_template = template_env.get_template("base.html")
url_line_template = template_env.get_template("url_line.html").render()
main_template_raw = template_safe_env.get_template("main.html")
postleter_template = template_env.get_template("postleter.html")
error_template_raw = template_safe_env.get_template("error.html")
main_template_raw_rendered = main_template_raw.render(url_line=url_line_template)
main_template = jinja_env.from_string(main_template_raw_rendered)
error_template_raw_rendered = error_template_raw.render(url_line=url_line_template)
error_template = jinja_env.from_string(error_template_raw_rendered)

View file

@ -0,0 +1,3 @@
from apscheduler.schedulers.asyncio import AsyncIOScheduler
scheduler = AsyncIOScheduler()

View file

@ -2,13 +2,8 @@ import random
from fastapi.responses import HTMLResponse
from server import (
base_template,
config,
error_template,
transponder_code_correlation,
url_correlation
)
from server import config, transponder_code_correlation, url_correlation
from server.services.jinja import base_template, error_template
from server.utils.logger_trace import trace
from server.utils.notify import send_message
@ -28,7 +23,7 @@ ERROR_MSG_LIST = [
"Oops! We've encountered a problem, but don't worry, it's not as disastrous as my attempt at karaoke! 🎤",
"Sorry to hear that, but we've got a problem that's more stubborn than a toddler refusing to eat their veggies! 👶🥦",
"Apologies, but we've run into a problem - it's not as amusing as my dog trying to catch its tail, but it's a problem! 🐶",
"Sorry to hear that, but we've got a problem that's more elusive than the end of a rainbow! 🌈"
"Sorry to hear that, but we've got a problem that's more elusive than the end of a rainbow! 🌈",
]
@ -38,9 +33,7 @@ async def generate_error(error_msg: str = None, title: str = "Error", status_cod
error_msg = random.choice(ERROR_MSG_LIST)
if not quiet:
send_message(
f"📛 Error while processing url: <code>{url_correlation.get()}</code>, transponder_code: <code>{transponder_code_correlation.get()}</code>, error: <code>{error_msg}</code>"
)
send_message(f"📛 Error while processing url: <code>{url_correlation.get()}</code>, transponder_code: <code>{transponder_code_correlation.get()}</code>, error: <code>{error_msg}</code>")
error_template_rendered = await error_template.render_async(error_msg=error_msg, transponder_code=transponder_code_correlation.get())
base_context = {
@ -50,4 +43,3 @@ async def generate_error(error_msg: str = None, title: str = "Error", status_cod
}
base_template_rendered = await base_template.render_async(base_context, HOST_ADDRESS=config.HOST_ADDRESS)
return HTMLResponse(base_template_rendered, status_code=status_code)

View file

@ -1,18 +1,19 @@
from contextlib import suppress
from datetime import datetime
from server import maintenance_mode, scheduler
from server import maintenance_mode
from server.utils.notify import send_message
from medium_parser import cache as medium_cache
from time import sleep
from loguru import logger
def enable_maintenance_mode():
global maintenance_mode
maintenance_mode.value = True
logger.debug("Maintenance mode enabled")
logger.debug("Maintenance mode enabled")
send_message("Maintenance mode enabled")
now = datetime.now()
@ -26,6 +27,13 @@ def enable_maintenance_mode():
logger.debug("Maintenance mode disabled")
send_message("Maintenance mode disabled")
scheduler.add_job(enable_maintenance_mode, 'cron', hour='*/2')
scheduler.start()
def do_maintenance(sleep_time: int = 60 * 60):
while True:
try:
enable_maintenance_mode()
except Exception as e:
logger.error(f"Error enabling maintenance mode: {e}")
send_message(f"Error enabling maintenance mode: {e}")
finally:
sleep(sleep_time)