diff --git a/bot/modules/bot_settings.py b/bot/modules/bot_settings.py index 27961e3bd..77ff56360 100644 --- a/bot/modules/bot_settings.py +++ b/bot/modules/bot_settings.py @@ -1,139 +1,159 @@ +from aiofiles import open as aiopen +from aiofiles.os import remove, rename, path as aiopath +from aioshutil import rmtree from asyncio import ( create_subprocess_exec, create_subprocess_shell, - gather, sleep, + gather, ) -from collections import OrderedDict +from dotenv import load_dotenv from functools import partial from io import BytesIO from os import environ, getcwd +from pyrogram.filters import command, regex, create +from pyrogram.handlers import MessageHandler, CallbackQueryHandler from time import time -from aiofiles import open as aiopen -from aiofiles.os import path as aiopath -from aiofiles.os import remove, rename -from aioshutil import rmtree -from dotenv import load_dotenv -from pyrogram.enums import ChatType -from pyrogram.filters import command, create, regex -from pyrogram.handlers import CallbackQueryHandler, MessageHandler - from bot import ( + MAX_SPLIT_SIZE, + IS_PREMIUM_USER, LOGGER, - bot, config_dict, + user_data, drives_ids, drives_names, - global_extension_filter, index_urls, + aria2, + global_extension_filter, intervals, + aria2_options, + aria2c_global, task_dict, - user_data, + qbit_options, + qbittorrent_client, + sabnzbd_client, + bot, + nzb_options, + get_nzb_options, + get_qb_options, + jd_lock, ) -from bot.helper.ext_utils.bot_utils import ( +from ..helper.ext_utils.bot_utils import ( SetInterval, + sync_to_async, new_task, ) -from bot.helper.ext_utils.db_handler import Database -from bot.helper.ext_utils.task_manager import start_from_queued -from bot.helper.telegram_helper.bot_commands import BotCommands -from bot.helper.telegram_helper.button_build import ButtonMaker -from bot.helper.telegram_helper.filters import CustomFilters -from bot.helper.telegram_helper.message_utils import ( - delete_links, - delete_message, - edit_message, - send_file, +from ..helper.ext_utils.db_handler import Database +from ..helper.ext_utils.jdownloader_booter import jdownloader +from ..helper.ext_utils.task_manager import start_from_queued +from ..helper.mirror_leech_utils.rclone_utils.serve import rclone_serve_booter +from ..helper.telegram_helper.bot_commands import BotCommands +from ..helper.telegram_helper.button_build import ButtonMaker +from ..helper.telegram_helper.filters import CustomFilters +from ..helper.telegram_helper.message_utils import ( send_message, + send_file, + edit_message, update_status_message, + delete_message, ) start = 0 state = "view" handler_dict = {} - -default_values = { +DEFAULT_VALUES = { + "LEECH_SPLIT_SIZE": MAX_SPLIT_SIZE, "UPSTREAM_BRANCH": "main", "DEFAULT_UPLOAD": "gd", } -boolean_variables = { - "STOP_DUPLICATE", - "IS_TEAM_DRIVE", - "USE_SERVICE_ACCOUNTS", - "AS_DOCUMENT", -} - -async def get_buttons(key=None, edit_type=None, edit_mode=None, mess=None): +async def get_buttons(key=None, edit_type=None): buttons = ButtonMaker() if key is None: buttons.data_button("Config Variables", "botset var") buttons.data_button("Private Files", "botset private") buttons.data_button("Close", "botset close") msg = "Bot Settings:" + elif edit_type is not None: + if edit_type == "botvar": + msg = "" + buttons.data_button("Back", "botset var") + if key not in ["TELEGRAM_HASH", "TELEGRAM_API", "OWNER_ID", "BOT_TOKEN"]: + buttons.data_button("Default", f"botset resetvar {key}") + buttons.data_button("Close", "botset close") + if key in [ + "SUDO_USERS", + "CMD_SUFFIX", + "OWNER_ID", + "USER_SESSION_STRING", + "TELEGRAM_HASH", + "TELEGRAM_API", + "AUTHORIZED_CHATS", + "BOT_TOKEN", + ]: + msg += "Restart required for this edit to take effect!\n\n" + msg += f"Send a valid value for {key}. Current value is '{config_dict[key]}'. Timeout: 60 sec" elif key == "var": - for k in list(OrderedDict(sorted(config_dict.items())).keys())[ - start : 10 + start - ]: - buttons.data_button(k, f"botset editvar {k}") + for k in list(config_dict.keys())[start : 10 + start]: + buttons.data_button(k, f"botset botvar {k}") + if state == "view": + buttons.data_button("Edit", "botset edit var") + else: + buttons.data_button("View", "botset view var") buttons.data_button("Back", "botset back") buttons.data_button("Close", "botset close") - for x in range(0, len(config_dict) - 1, 10): + for x in range(0, len(config_dict), 10): buttons.data_button( - f"{int(x/10)+1}", - f"botset start var {x}", - position="footer", + f"{int(x / 10)}", f"botset start var {x}", position="footer" ) - msg = f"Config Variables | Page: {int(start/10)+1}" + msg = f"Config Variables | Page: {int(start / 10)} | State: {state}" elif key == "private": buttons.data_button("Back", "botset back") buttons.data_button("Close", "botset close") - msg = "Send private files" - elif edit_type == "editvar": - msg = f"Variable: {key}\n\n" - if mess.chat.type == ChatType.PRIVATE: - msg += f'Value: {config_dict.get(key, "None")}\n\n' - elif key not in boolean_variables: - buttons.data_button( - "View value", - f"botset showvar {key}", - position="header", - ) - buttons.data_button("Back", "botset back var", position="footer") - if key not in boolean_variables: - if not edit_mode: - buttons.data_button("Edit Value", f"botset editvar {key} edit") - else: - buttons.data_button("Stop Edit", f"botset editvar {key}") - buttons.data_button("Reset", f"botset resetvar {key}") - buttons.data_button("Close", "botset close", position="footer") - if edit_mode and key in ["CMD_SUFFIX", "USER_SESSION_STRING"]: - msg += "Note: Restart required for this edit to take effect!\n\n" - if edit_mode and key not in boolean_variables: - msg += "Send a valid value for the above Var. Timeout: 60 sec" - if key in boolean_variables: - if not config_dict.get(key): - buttons.data_button("Make it True", f"botset boolvar {key} on") - else: - buttons.data_button("Make it False", f"botset boolvar {key} off") + msg = """Send private file: config.env, token.pickle, rclone.conf, accounts.zip, list_drives.txt, cookies.txt, .netrc or any other private file! +To delete private file send only the file name as text message. +Note: Changing .netrc will not take effect for aria2c until restart. +Timeout: 60 sec""" + button = buttons.build_menu(1) if key is None else buttons.build_menu(2) return msg, button -async def update_buttons(message, key=None, edit_type=None, edit_mode=None): - msg, button = await get_buttons(key, edit_type, edit_mode, message) +async def update_buttons(message, key=None, edit_type=None): + msg, button = await get_buttons(key, edit_type) await edit_message(message, msg, button) +@new_task async def edit_variable(_, message, pre_message, key): handler_dict[message.chat.id] = False value = message.text - if key == "EXTENSION_FILTER": + if value.lower() == "true": + value = True + elif value.lower() == "false": + value = False + elif key == "TORRENT_TIMEOUT": + value = int(value) + downloads = await sync_to_async(aria2.get_downloads) + for download in downloads: + if not download.is_complete: + try: + await sync_to_async( + aria2.client.change_option, + download.gid, + {"bt-stop-timeout": f"{value}"}, + ) + except Exception as e: + LOGGER.error(e) + aria2_options["bt-stop-timeout"] = f"{value}" + elif key == "LEECH_SPLIT_SIZE": + value = min(int(value), MAX_SPLIT_SIZE) + elif key == "EXTENSION_FILTER": fx = value.split() global_extension_filter.clear() - global_extension_filter.append(".aria2") + global_extension_filter.extend(["aria2", "!qB"]) for x in fx: x = x.lstrip(".") global_extension_filter.append(x.strip().lower()) @@ -149,10 +169,15 @@ async def edit_variable(_, message, pre_message, key): index_urls.insert(0, value) elif value.isdigit(): value = int(value) + elif value.startswith("[") and value.endswith("]"): + value = eval(value) config_dict[key] = value - await update_buttons(pre_message, key, "editvar", False) + await update_buttons(pre_message, "var") await delete_message(message) - # await Database().update_config({key: value}) + if key == "DATABASE_URL": + await Database.connect() + if config_dict["DATABASE_URL"]: + await Database.update_config({key: value}) if key in ["QUEUE_ALL", "QUEUE_DOWNLOAD", "QUEUE_UPLOAD"]: await start_from_queued() @@ -170,13 +195,12 @@ async def update_private_file(_, message, pre_message): if await aiopath.exists("rclone_sa"): await rmtree("rclone_sa", ignore_errors=True) config_dict["USE_SERVICE_ACCOUNTS"] = False - await Database().update_config({"USE_SERVICE_ACCOUNTS": False}) + if config_dict["DATABASE_URL"]: + await Database.update_config({"USE_SERVICE_ACCOUNTS": False}) elif file_name in [".netrc", "netrc"]: await (await create_subprocess_exec("touch", ".netrc")).wait() await (await create_subprocess_exec("chmod", "600", ".netrc")).wait() - await ( - await create_subprocess_exec("cp", ".netrc", "/root/.netrc") - ).wait() + await (await create_subprocess_exec("cp", ".netrc", "/root/.netrc")).wait() await delete_message(message) elif doc := message.document: file_name = doc.file_name @@ -188,12 +212,7 @@ async def update_private_file(_, message, pre_message): await rmtree("rclone_sa", ignore_errors=True) await ( await create_subprocess_exec( - "7z", - "x", - "-o.", - "-aoa", - "accounts.zip", - "accounts/*.json", + "7z", "x", "-o.", "-aoa", "accounts.zip", "accounts/*.json" ) ).wait() await ( @@ -222,15 +241,16 @@ async def update_private_file(_, message, pre_message): await rename("netrc", ".netrc") file_name = ".netrc" await (await create_subprocess_exec("chmod", "600", ".netrc")).wait() - await ( - await create_subprocess_exec("cp", ".netrc", "/root/.netrc") - ).wait() + await (await create_subprocess_exec("cp", ".netrc", "/root/.netrc")).wait() elif file_name == "config.env": load_dotenv("config.env", override=True) await load_config() await delete_message(message) + if file_name == "rclone.conf": + await rclone_serve_booter() await update_buttons(pre_message) - await Database().update_private_file(file_name) + if config_dict["DATABASE_URL"]: + await Database.update_private_file(file_name) if await aiopath.exists("accounts.zip"): await remove("accounts.zip") @@ -245,12 +265,11 @@ async def event_filter(_, __, event): return bool( user.id == query.from_user.id and event.chat.id == chat_id - and (event.text or (event.document and document)), + and (event.text or event.document and document) ) handler = client.add_handler( - MessageHandler(pfunc, filters=create(event_filter)), - group=-1, + MessageHandler(pfunc, filters=create(event_filter)), group=-1 ) while handler_dict[chat_id]: await sleep(0.5) @@ -264,33 +283,53 @@ async def event_filter(_, __, event): async def edit_bot_settings(client, query): data = query.data.split() message = query.message + handler_dict[message.chat.id] = False if data[1] == "close": - handler_dict[message.chat.id] = False await query.answer() - await delete_links(message) + await delete_message(message.reply_to_message) + await delete_message(message) elif data[1] == "back": - handler_dict[message.chat.id] = False await query.answer() - key = data[2] if len(data) == 3 else None - if key is None: - globals()["start"] = 0 - await update_buttons(message, key) - elif data[1] == "var": + globals()["start"] = 0 + await update_buttons(message, None) + elif data[1] in ["var"]: await query.answer() await update_buttons(message, data[1]) elif data[1] == "resetvar": - handler_dict[message.chat.id] = False - await query.answer("Reset done!", show_alert=True) + await query.answer() value = "" - if data[2] in default_values: - value = default_values[data[2]] + if data[2] in DEFAULT_VALUES: + value = DEFAULT_VALUES[data[2]] + if ( + data[2] == "STATUS_UPDATE_INTERVAL" + and len(task_dict) != 0 + and (st := intervals["status"]) + ): + for key, intvl in list(st.items()): + intvl.cancel() + intervals["status"][key] = SetInterval( + value, update_status_message, key + ) elif data[2] == "EXTENSION_FILTER": global_extension_filter.clear() - global_extension_filter.append(".aria2") + global_extension_filter.extend(["aria2", "!qB"]) + elif data[2] == "TORRENT_TIMEOUT": + downloads = await sync_to_async(aria2.get_downloads) + for download in downloads: + if not download.is_complete: + try: + await sync_to_async( + aria2.client.change_option, + download.gid, + {"bt-stop-timeout": "0"}, + ) + except Exception as e: + LOGGER.error(e) + aria2_options["bt-stop-timeout"] = "0" + if config_dict["DATABASE_URL"]: + await Database.update_aria2("bt-stop-timeout", "0") elif data[2] == "BASE_URL": - await ( - await create_subprocess_exec("pkill", "-9", "-f", "gunicorn") - ).wait() + await (await create_subprocess_exec("pkill", "-9", "-f", "gunicorn")).wait() elif data[2] == "GDRIVE_ID": if drives_names and drives_names[0] == "Main": drives_names.pop(0) @@ -300,46 +339,34 @@ async def edit_bot_settings(client, query): if drives_names and drives_names[0] == "Main": index_urls[0] = "" config_dict[data[2]] = value - await update_buttons(message, data[2], "editvar", False) - await Database().update_config({data[2]: value}) + await update_buttons(message, "var") + if data[2] == "DATABASE_URL": + await Database.disconnect() + if config_dict["DATABASE_URL"]: + await Database.update_config({data[2]: value}) if data[2] in ["QUEUE_ALL", "QUEUE_DOWNLOAD", "QUEUE_UPLOAD"]: await start_from_queued() elif data[1] == "private": - handler_dict[message.chat.id] = False await query.answer() await update_buttons(message, data[1]) pfunc = partial(update_private_file, pre_message=message) rfunc = partial(update_buttons, message) await event_handler(client, query, pfunc, rfunc, True) - elif data[1] == "boolvar": - handler_dict[message.chat.id] = False - value = data[3] == "on" - await query.answer( - f"Successfully variable changed to {value}!", - show_alert=True, - ) - config_dict[data[2]] = value - await update_buttons(message, data[2], "editvar", False) - await Database().update_config({data[2]: value}) - elif data[1] == "editvar": - handler_dict[message.chat.id] = False + elif data[1] == "botvar" and state == "edit": await query.answer() - edit_mode = len(data) == 4 - await update_buttons(message, data[2], data[1], edit_mode) - if data[2] in boolean_variables or not edit_mode: - return + await update_buttons(message, data[2], data[1]) pfunc = partial(edit_variable, pre_message=message, key=data[2]) - rfunc = partial(update_buttons, message, data[2], data[1], edit_mode) + rfunc = partial(update_buttons, message, "var") await event_handler(client, query, pfunc, rfunc) - elif data[1] == "showvar": - value = config_dict[data[2]] - if len(str(value)) > 200: + elif data[1] == "botvar" and state == "view": + value = f"{config_dict[data[2]]}" + if len(value) > 200: await query.answer() with BytesIO(str.encode(value)) as out_file: out_file.name = f"{data[2]}.txt" await send_file(message, out_file) return - if value == "": + elif value == "": value = None await query.answer(f"{value}", show_alert=True) elif data[1] == "edit": @@ -352,31 +379,68 @@ async def edit_bot_settings(client, query): await update_buttons(message, data[2]) elif data[1] == "start": await query.answer() - if int(data[3]) != start: + if start != int(data[3]): globals()["start"] = int(data[3]) await update_buttons(message, data[2]) @new_task async def bot_settings(_, message): + handler_dict[message.chat.id] = False msg, button = await get_buttons() globals()["start"] = 0 await send_message(message, msg, button) async def load_config(): + BOT_TOKEN = environ.get("BOT_TOKEN", "") + if len(BOT_TOKEN) == 0: + BOT_TOKEN = config_dict["BOT_TOKEN"] + + TELEGRAM_API = environ.get("TELEGRAM_API", "") + if len(TELEGRAM_API) == 0: + TELEGRAM_API = config_dict["TELEGRAM_API"] + else: + TELEGRAM_API = int(TELEGRAM_API) + + TELEGRAM_HASH = environ.get("TELEGRAM_HASH", "") + if len(TELEGRAM_HASH) == 0: + TELEGRAM_HASH = config_dict["TELEGRAM_HASH"] + + OWNER_ID = environ.get("OWNER_ID", "") + OWNER_ID = config_dict["OWNER_ID"] if len(OWNER_ID) == 0 else int(OWNER_ID) + + DATABASE_URL = environ.get("DATABASE_URL", "") + if len(DATABASE_URL) == 0: + DATABASE_URL = "" + GDRIVE_ID = environ.get("GDRIVE_ID", "") + if len(GDRIVE_ID) == 0: + GDRIVE_ID = "" + RCLONE_PATH = environ.get("RCLONE_PATH", "") + if len(RCLONE_PATH) == 0: + RCLONE_PATH = "" + DEFAULT_UPLOAD = environ.get("DEFAULT_UPLOAD", "") - if DEFAULT_UPLOAD != "rc": - DEFAULT_UPLOAD = "gd" + if DEFAULT_UPLOAD != "gd": + DEFAULT_UPLOAD = "rc" RCLONE_FLAGS = environ.get("RCLONE_FLAGS", "") + if len(RCLONE_FLAGS) == 0: + RCLONE_FLAGS = "" + AUTHORIZED_CHATS = environ.get("AUTHORIZED_CHATS", "") if len(AUTHORIZED_CHATS) != 0: aid = AUTHORIZED_CHATS.split() for id_ in aid: - user_data[int(id_.strip())] = {"is_auth": True} + chat_id, *thread_ids = id_.split("|") + chat_id = int(chat_id.strip()) + if thread_ids: + thread_ids = list(map(lambda x: int(x.strip()), thread_ids)) + user_data[chat_id] = {"is_auth": True, "thread_ids": thread_ids} + else: + user_data[chat_id] = {"is_auth": True} SUDO_USERS = environ.get("SUDO_USERS", "") if len(SUDO_USERS) != 0: @@ -384,16 +448,6 @@ async def load_config(): for id_ in aid: user_data[int(id_.strip())] = {"is_sudo": True} - THUMBNAIL_LAYOUT = environ.get("THUMBNAIL_LAYOUT", "") - THUMBNAIL_LAYOUT = "" if len(THUMBNAIL_LAYOUT) == 0 else THUMBNAIL_LAYOUT - - FFMPEG_CMDS = environ.get("FFMPEG_CMDS", "") - try: - FFMPEG_CMDS = [] if len(FFMPEG_CMDS) == 0 else eval(FFMPEG_CMDS) - except Exception: - LOGGER.error(f"Wrong FFMPEG_CMDS format: {FFMPEG_CMDS}") - FFMPEG_CMDS = [] - EXTENSION_FILTER = environ.get("EXTENSION_FILTER", "") if len(EXTENSION_FILTER) > 0: fx = EXTENSION_FILTER.split() @@ -404,49 +458,132 @@ async def load_config(): x = x.lstrip(".") global_extension_filter.append(x.strip().lower()) + FILELION_API = environ.get("FILELION_API", "") + if len(FILELION_API) == 0: + FILELION_API = "" + STREAMWISH_API = environ.get("STREAMWISH_API", "") + if len(STREAMWISH_API) == 0: + STREAMWISH_API = "" + INDEX_URL = environ.get("INDEX_URL", "").rstrip("/") + if len(INDEX_URL) == 0: + INDEX_URL = "" - if len(task_dict) != 0 and (st := intervals["status"]): - for key, intvl in list(st.items()): - intvl.cancel() - intervals["status"][key] = SetInterval(1, update_status_message, key) + LEECH_FILENAME_PREFIX = environ.get("LEECH_FILENAME_PREFIX", "") + if len(LEECH_FILENAME_PREFIX) == 0: + LEECH_FILENAME_PREFIX = "" + + MAX_SPLIT_SIZE = 4194304000 if IS_PREMIUM_USER else 2097152000 + + LEECH_SPLIT_SIZE = environ.get("LEECH_SPLIT_SIZE", "") + if len(LEECH_SPLIT_SIZE) == 0 or int(LEECH_SPLIT_SIZE) > MAX_SPLIT_SIZE: + LEECH_SPLIT_SIZE = MAX_SPLIT_SIZE + else: + LEECH_SPLIT_SIZE = int(LEECH_SPLIT_SIZE) YT_DLP_OPTIONS = environ.get("YT_DLP_OPTIONS", "") - LEECH_DUMP_CHAT = environ.get("LEECH_DUMP_CHAT", "") - LEECH_DUMP_CHAT = "" if len(LEECH_DUMP_CHAT) == 0 else int(LEECH_DUMP_CHAT) + if len(YT_DLP_OPTIONS) == 0: + YT_DLP_OPTIONS = "" - LOG_CHAT = environ.get("LOG_CHAT", "") - LOG_CHAT = "" if len(LOG_CHAT) == 0 else int(LOG_CHAT) + LEECH_DUMP_CHAT = environ.get("LEECH_DUMP_CHAT", "") + LEECH_DUMP_CHAT = "" if len(LEECH_DUMP_CHAT) == 0 else LEECH_DUMP_CHAT CMD_SUFFIX = environ.get("CMD_SUFFIX", "") - FSUB_IDS = environ.get("FSUB_IDS", "") + USER_SESSION_STRING = environ.get("USER_SESSION_STRING", "") - MEGA_EMAIL = environ.get("MEGA_EMAIL", "") - MEGA_PASSWORD = environ.get("MEGA_PASSWORD", "") - PAID_CHAT_ID = environ.get("PAID_CHAT_ID", "") - PAID_CHAT_ID = int(PAID_CHAT_ID) if PAID_CHAT_ID else "" - PAID_CHAT_LINK = environ.get("PAID_CHAT_LINK", "") + + TORRENT_TIMEOUT = environ.get("TORRENT_TIMEOUT", "") + downloads = aria2.get_downloads() + if len(TORRENT_TIMEOUT) == 0: + for download in downloads: + if not download.is_complete: + try: + await sync_to_async( + aria2.client.change_option, + download.gid, + {"bt-stop-timeout": "0"}, + ) + except Exception as e: + LOGGER.error(e) + aria2_options["bt-stop-timeout"] = "0" + if config_dict["DATABASE_URL"]: + await Database.update_aria2("bt-stop-timeout", "0") + TORRENT_TIMEOUT = "" + else: + for download in downloads: + if not download.is_complete: + try: + await sync_to_async( + aria2.client.change_option, + download.gid, + {"bt-stop-timeout": TORRENT_TIMEOUT}, + ) + except Exception as e: + LOGGER.error(e) + aria2_options["bt-stop-timeout"] = TORRENT_TIMEOUT + if config_dict["DATABASE_URL"]: + await Database.update_aria2("bt-stop-timeout", TORRENT_TIMEOUT) + TORRENT_TIMEOUT = int(TORRENT_TIMEOUT) + QUEUE_ALL = environ.get("QUEUE_ALL", "") QUEUE_ALL = "" if len(QUEUE_ALL) == 0 else int(QUEUE_ALL) - TOKEN_TIMEOUT = environ.get("TOKEN_TIMEOUT", "") - TOKEN_TIMEOUT = int(TOKEN_TIMEOUT) if TOKEN_TIMEOUT.isdigit() else "" - QUEUE_DOWNLOAD = environ.get("QUEUE_DOWNLOAD", "") QUEUE_DOWNLOAD = "" if len(QUEUE_DOWNLOAD) == 0 else int(QUEUE_DOWNLOAD) QUEUE_UPLOAD = environ.get("QUEUE_UPLOAD", "") QUEUE_UPLOAD = "" if len(QUEUE_UPLOAD) == 0 else int(QUEUE_UPLOAD) - STOP_DUPLICATE = environ.get("STOP_DUPLICATE", "").lower() == "true" + STOP_DUPLICATE = environ.get("STOP_DUPLICATE", "") + STOP_DUPLICATE = STOP_DUPLICATE.lower() == "true" + + IS_TEAM_DRIVE = environ.get("IS_TEAM_DRIVE", "") + IS_TEAM_DRIVE = IS_TEAM_DRIVE.lower() == "true" + + USE_SERVICE_ACCOUNTS = environ.get("USE_SERVICE_ACCOUNTS", "") + USE_SERVICE_ACCOUNTS = USE_SERVICE_ACCOUNTS.lower() == "true" + + AS_DOCUMENT = environ.get("AS_DOCUMENT", "") + AS_DOCUMENT = AS_DOCUMENT.lower() == "true" - IS_TEAM_DRIVE = environ.get("IS_TEAM_DRIVE", "").lower() == "true" + USER_TRANSMISSION = environ.get("USER_TRANSMISSION", "") + USER_TRANSMISSION = USER_TRANSMISSION.lower() == "true" and IS_PREMIUM_USER - USE_SERVICE_ACCOUNTS = environ.get("USE_SERVICE_ACCOUNTS", "").lower() == "true" + BASE_URL_PORT = environ.get("BASE_URL_PORT", "") + BASE_URL_PORT = 80 if len(BASE_URL_PORT) == 0 else int(BASE_URL_PORT) - AS_DOCUMENT = environ.get("AS_DOCUMENT", "").lower() == "true" + RCLONE_SERVE_URL = environ.get("RCLONE_SERVE_URL", "") + if len(RCLONE_SERVE_URL) == 0: + RCLONE_SERVE_URL = "" + + RCLONE_SERVE_PORT = environ.get("RCLONE_SERVE_PORT", "") + RCLONE_SERVE_PORT = 8080 if len(RCLONE_SERVE_PORT) == 0 else int(RCLONE_SERVE_PORT) + + RCLONE_SERVE_USER = environ.get("RCLONE_SERVE_USER", "") + if len(RCLONE_SERVE_USER) == 0: + RCLONE_SERVE_USER = "" + + RCLONE_SERVE_PASS = environ.get("RCLONE_SERVE_PASS", "") + if len(RCLONE_SERVE_PASS) == 0: + RCLONE_SERVE_PASS = "" + + NAME_SUBSTITUTE = environ.get("NAME_SUBSTITUTE", "") + NAME_SUBSTITUTE = "" if len(NAME_SUBSTITUTE) == 0 else NAME_SUBSTITUTE + + MIXED_LEECH = environ.get("MIXED_LEECH", "") + MIXED_LEECH = MIXED_LEECH.lower() == "true" and IS_PREMIUM_USER + + THUMBNAIL_LAYOUT = environ.get("THUMBNAIL_LAYOUT", "") + THUMBNAIL_LAYOUT = "" if len(THUMBNAIL_LAYOUT) == 0 else THUMBNAIL_LAYOUT + + FFMPEG_CMDS = environ.get("FFMPEG_CMDS", "") + try: + FFMPEG_CMDS = [] if len(FFMPEG_CMDS) == 0 else eval(FFMPEG_CMDS) + except: + LOGGER.error(f"Wrong FFMPEG_CMDS format: {FFMPEG_CMDS}") + FFMPEG_CMDS = [] await (await create_subprocess_exec("pkill", "-9", "-f", "gunicorn")).wait() BASE_URL = environ.get("BASE_URL", "").rstrip("/") @@ -454,14 +591,31 @@ async def load_config(): BASE_URL = "" else: await create_subprocess_shell( - "gunicorn web.wserver:app --bind 0.0.0.0:80 --worker-class gevent", + f"gunicorn web.wserver:app --bind 0.0.0.0:{BASE_URL_PORT} --worker-class gevent" ) - UPSTREAM_BRANCH = environ.get("UPSTREAM_BRANCH", "main") - UPSTREAM_REPO = environ.get( - "UPSTREAM_REPO", - "https://github.com/AeonOrg/Aeon-MLTB", - ) + UPSTREAM_REPO = environ.get("UPSTREAM_REPO", "") + if len(UPSTREAM_REPO) == 0: + UPSTREAM_REPO = "" + + UPSTREAM_BRANCH = environ.get("UPSTREAM_BRANCH", "") + if len(UPSTREAM_BRANCH) == 0: + UPSTREAM_BRANCH = "master" + + FSUB_IDS = environ.get("FSUB_IDS", "") + if len(FSUB_IDS) == 0: + FSUB_IDS = "" + + PAID_CHAT_ID = environ.get("PAID_CHAT_ID", "") + PAID_CHAT_ID = "" if len(PAID_CHAT_ID) == 0 else int(PAID_CHAT_ID) + + PAID_CHAT_LINK = environ.get("PAID_CHAT_LINK", "") + if len(PAID_CHAT_LINK) == 0: + PAID_CHAT_LINK = "" + + TOKEN_TIMEOUT = environ.get("TOKEN_TIMEOUT", "") + TOKEN_TIMEOUT = "" if len(TOKEN_TIMEOUT) == 0 else int(TOKEN_TIMEOUT) + drives_ids.clear() drives_names.clear() index_urls.clear() @@ -488,7 +642,10 @@ async def load_config(): "AS_DOCUMENT": AS_DOCUMENT, "AUTHORIZED_CHATS": AUTHORIZED_CHATS, "BASE_URL": BASE_URL, + "BASE_URL_PORT": BASE_URL_PORT, + "BOT_TOKEN": BOT_TOKEN, "CMD_SUFFIX": CMD_SUFFIX, + "DATABASE_URL": DATABASE_URL, "DEFAULT_UPLOAD": DEFAULT_UPLOAD, "EXTENSION_FILTER": EXTENSION_FILTER, "FFMPEG_CMDS": FFMPEG_CMDS, @@ -498,11 +655,14 @@ async def load_config(): "INDEX_URL": INDEX_URL, "IS_TEAM_DRIVE": IS_TEAM_DRIVE, "LEECH_DUMP_CHAT": LEECH_DUMP_CHAT, - "LOG_CHAT": LOG_CHAT, - "MEGA_EMAIL": MEGA_EMAIL, - "MEGA_PASSWORD": MEGA_PASSWORD, + "LEECH_FILENAME_PREFIX": LEECH_FILENAME_PREFIX, + "LEECH_SPLIT_SIZE": LEECH_SPLIT_SIZE, + "MIXED_LEECH": MIXED_LEECH, + "NAME_SUBSTITUTE": NAME_SUBSTITUTE, + "OWNER_ID": OWNER_ID, "PAID_CHAT_ID": PAID_CHAT_ID, "PAID_CHAT_LINK": PAID_CHAT_LINK, + "TOKEN_TIMEOUT": TOKEN_TIMEOUT, "QUEUE_ALL": QUEUE_ALL, "QUEUE_DOWNLOAD": QUEUE_DOWNLOAD, "QUEUE_UPLOAD": QUEUE_UPLOAD, @@ -511,14 +671,17 @@ async def load_config(): "STOP_DUPLICATE": STOP_DUPLICATE, "STREAMWISH_API": STREAMWISH_API, "SUDO_USERS": SUDO_USERS, - "TOKEN_TIMEOUT": TOKEN_TIMEOUT, + "TELEGRAM_API": TELEGRAM_API, + "TELEGRAM_HASH": TELEGRAM_HASH, "THUMBNAIL_LAYOUT": THUMBNAIL_LAYOUT, - "UPSTREAM_BRANCH": UPSTREAM_BRANCH, + "TORRENT_TIMEOUT": TORRENT_TIMEOUT, + "USER_TRANSMISSION": USER_TRANSMISSION, "UPSTREAM_REPO": UPSTREAM_REPO, + "UPSTREAM_BRANCH": UPSTREAM_BRANCH, "USER_SESSION_STRING": USER_SESSION_STRING, "USE_SERVICE_ACCOUNTS": USE_SERVICE_ACCOUNTS, "YT_DLP_OPTIONS": YT_DLP_OPTIONS, - }, + } ) if config_dict["DATABASE_URL"]: