SYMBOL INDEX (170 symbols across 18 files) FILE: bot.py class Bot (line 25) | class Bot(Client): method __init__ (line 26) | def __init__(self) -> None: method start (line 40) | async def start(self, *args: Any, **kwargs: Any) -> "Bot": method stop (line 48) | async def stop(self, *args: Any, **kwargs: Any) -> None: method init_watchdog (line 56) | def init_watchdog(self) -> None: method set_menu (line 60) | async def set_menu(self) -> None: FILE: core/config.py class BotSettings (line 13) | class BotSettings(BaseSettings): method cache_config_validate (line 34) | def cache_config_validate(self) -> "BotSettings": method model_post_init (line 39) | def model_post_init(self, __context: Any) -> None: method sessions_path (line 46) | def sessions_path(self) -> Path: method cache_path (line 50) | def cache_path(self) -> Path: method config_path (line 54) | def config_path(self) -> Path: method proxy_config (line 59) | def proxy_config(cls, v: str | None = None) -> dict | None: method bot_session_name (line 72) | def bot_session_name(self) -> str: method data_path_init (line 77) | def data_path_init(cls, v: str | Path) -> Path: class WatchdogSettings (line 83) | class WatchdogSettings(BaseSettings): method update_bot_restart_count (line 104) | def update_bot_restart_count(self) -> None: method reset_bot_restart_count (line 108) | def reset_bot_restart_count(self) -> None: method update_bot_disconnect_count (line 112) | def update_bot_disconnect_count(self) -> None: method reset_bot_disconnect_count (line 116) | def reset_bot_disconnect_count(self) -> None: FILE: core/platform_config.py class Platform (line 15) | class Platform(BaseModel): method roll_cookie (line 24) | def roll_cookie(self) -> str | None: method roll_parser_proxy (line 29) | def roll_parser_proxy(self) -> str | None: method roll_downloader_proxy (line 34) | def roll_downloader_proxy(self) -> str | None: class PlatformsConfig (line 40) | class PlatformsConfig(BaseModel): method load_config (line 48) | def load_config(cls, file: Path) -> "PlatformsConfig": method _2l (line 86) | def _2l[T](v: T | list[T] | None) -> list[T] | None: method get (line 93) | def get(self, platform_id: str) -> Platform | None: method roll_cookie (line 96) | def roll_cookie(self, platform_id: str) -> str | None: method roll_parser_proxy (line 101) | def roll_parser_proxy(self, platform_id: str) -> str | None: method roll_downloader_proxy (line 113) | def roll_downloader_proxy(self, platform_id: str) -> str | None: FILE: core/watchdog.py function reset_count_task (line 14) | async def reset_count_task() -> None: function on_connect (line 27) | async def on_connect(_: Client, session: Session) -> None: function on_disconnect (line 40) | async def on_disconnect(cli: Client, session: Session) -> None: function remove_session_file (line 84) | async def remove_session_file(cli: Client) -> None: FILE: log.py function formatter (line 14) | def formatter(record: Any) -> str: function setup_logging (line 32) | def setup_logging(debug: bool = False) -> None: class InterceptHandler (line 50) | class InterceptHandler(logging.Handler): method emit (line 51) | def emit(self, record: logging.LogRecord) -> None: FILE: plugins/filters.py function _platform_filter (line 9) | async def _platform_filter(_: Any, __: Any, update: Message | InlineQuer... FILE: plugins/helpers.py class ProcessedMedia (line 22) | class ProcessedMedia: function resolve_media_info (line 28) | def resolve_media_info(processed: "ProcessedMedia", file_path: str) -> t... function build_caption (line 36) | def build_caption(parse_result: AnyParseResult, telegraph_url: str | Non... function build_caption_by_str (line 40) | def build_caption_by_str(title: str | None, content: str | None, raw_url... function format_text (line 58) | def format_text(text: str) -> str: function progress (line 69) | def progress(current: int, total: int, unit: str) -> str | None: function create_telegraph_page (line 84) | async def create_telegraph_page(html_content: str, cli: Client, parse_re... function create_richtext_telegraph (line 98) | async def create_richtext_telegraph(cli: Client, parse_result: RichTextP... function process_media_files (line 111) | async def process_media_files(download_result: DownloadResult) -> list[P... function get_supported_platforms (line 128) | def get_supported_platforms() -> str: function build_start_text (line 136) | def build_start_text() -> str: FILE: plugins/inline_parse.py class InlineStatusReporter (line 53) | class InlineStatusReporter(StatusReporter): method __init__ (line 56) | def __init__(self, cli: Client, inline_message_id: str, caption: str =... method report (line 62) | async def report(self, text: str) -> None: method report_error (line 73) | async def report_error(self, stage: str, error: Exception) -> None: method dismiss (line 91) | async def dismiss(self) -> None: function build_cached_inline_results (line 95) | def build_cached_inline_results(entry: CacheEntry, raw_url: str) -> list... function build_inline_results (line 170) | async def build_inline_results(parse_result: AnyParseResult, cli: Client... function inline_parse_tip (line 262) | async def inline_parse_tip(_: Client, inline_query: InlineQuery) -> None: function call_inline_parse (line 278) | async def call_inline_parse(cli: Client, inline_query: InlineQuery) -> N... function inline_result_download (line 300) | async def inline_result_download(cli: Client, chosen_result: ChosenInlin... FILE: plugins/parse.py function _send_with_rate_limit (line 47) | async def _send_with_rate_limit[T]( class MessageStatusReporter (line 67) | class MessageStatusReporter(StatusReporter): method __init__ (line 70) | def __init__(self, user_msg: Message): method report (line 74) | async def report(self, text: str) -> None: method report_error (line 77) | async def report_error(self, stage: str, error: Exception) -> None: method dismiss (line 91) | async def dismiss(self) -> None: method _edit_text (line 95) | async def _edit_text(self, text: str, **kwargs: Any) -> None: function jx (line 110) | async def jx(cli: Client, msg: Message) -> None: function handle_parse (line 145) | async def handle_parse( function _build_input_media (line 270) | def _build_input_media( function _cache_media_from_message (line 322) | def _cache_media_from_message(m: Message) -> CacheMedia | None: function _make_cache_entry (line 339) | def _make_cache_entry(parse_result: AnyParseResult, media_list: list[Cac... function _send_raw (line 349) | async def _send_raw( function _send_zip (line 409) | async def _send_zip( function _send_single (line 449) | async def _send_single( function _send_multi (line 499) | async def _send_multi( function _send_media (line 561) | async def _send_media( function _send_cached (line 587) | async def _send_cached(msg: Message, entry: CacheEntry, url: str) -> None: function _send_cached_single (line 616) | async def _send_cached_single(msg: Message, m: CacheMedia, caption: str)... function _send_cached_multi (line 637) | async def _send_cached_multi(msg: Message, media: list[CacheMedia], capt... function _build_cached_media_group (line 661) | def _build_cached_media_group( FILE: plugins/start.py function start (line 8) | async def start(_: Client, msg: Message) -> None: FILE: services/cache.py class TTLCache (line 13) | class TTLCache: method __init__ (line 14) | def __init__(self, ttl: float = 300, cleanup_interval: float = 60, max... method get (line 23) | async def get(self, key: str) -> Any | None: method set (line 37) | async def set(self, key: str, value: Any, ttl: float | None = None) ->... method _evict_overflow_locked (line 46) | async def _evict_overflow_locked(self) -> None: method pop (line 56) | async def pop(self, key: str) -> Any | None: method start_cleanup (line 69) | def start_cleanup(self) -> None: method _periodic_cleanup (line 75) | async def _periodic_cleanup(self) -> None: class CacheMediaType (line 87) | class CacheMediaType(StrEnum): class CacheParseResult (line 94) | class CacheParseResult(BaseModel): class CacheMedia (line 99) | class CacheMedia(BaseModel): class CacheEntry (line 105) | class CacheEntry(BaseModel): class _StorageWrapper (line 111) | class _StorageWrapper(BaseModel): class PersistentCache (line 116) | class PersistentCache: method __init__ (line 117) | def __init__( method enabled (line 139) | def enabled(self) -> bool: method _ensure_loaded_locked (line 142) | async def _ensure_loaded_locked(self) -> None: method _save_locked (line 153) | async def _save_locked(self) -> None: method get (line 160) | async def get(self, url: str) -> CacheEntry | None: method set (line 177) | async def set(self, url: str, entry: CacheEntry) -> None: method remove (line 189) | async def remove(self, url: str) -> None: method start_cleanup (line 197) | def start_cleanup(self) -> None: method close (line 208) | async def close(self) -> None: method _periodic_cleanup (line 221) | async def _periodic_cleanup(self) -> None: method _remove_expired_locked (line 237) | async def _remove_expired_locked(self) -> int: method _evict_overflow_locked (line 248) | async def _evict_overflow_locked(self) -> int: FILE: services/parser.py class ParseService (line 14) | class ParseService: method __new__ (line 17) | def __new__(cls) -> Self: method __init__ (line 22) | def __init__(self) -> None: method get_platform (line 25) | def get_platform(self, url: str) -> Platform: method parse (line 31) | async def parse(self, url: str) -> AnyParseResult: method get_raw_url (line 50) | async def get_raw_url(self, url: str, clean_all: bool = True) -> str: FILE: services/pipeline.py class StatusReporter (line 22) | class StatusReporter(Protocol): method report (line 25) | async def report(self, text: str) -> None: ... method report_error (line 27) | async def report_error(self, stage: str, error: Exception) -> None: ... method dismiss (line 29) | async def dismiss(self) -> None: ... class PipelineResult (line 33) | class PipelineResult: method cleanup (line 38) | def cleanup(self) -> None: class PipelineProgressCallback (line 47) | class PipelineProgressCallback: method __init__ (line 50) | def __init__(self, reporter: StatusReporter): method __call__ (line 54) | async def __call__(self, current: int, total: int, unit: ProgressUnit,... class ParsePipeline (line 64) | class ParsePipeline: method __init__ (line 74) | def __init__( method waited (line 97) | def waited(self) -> bool: method finish (line 101) | def finish(self) -> None: method run (line 107) | async def run(self) -> PipelineResult | None: method _execute (line 133) | async def _execute(self) -> PipelineResult | None: method _step (line 199) | async def _step[T]( FILE: utils/converter.py function clean_article_html (line 42) | def clean_article_html(html_string: str) -> str: function replace_line_breaks_except_pre (line 78) | def replace_line_breaks_except_pre(html_string: str, replace_by: str = "... FILE: utils/event_loop.py function setup_optimized_event_loop (line 7) | def setup_optimized_event_loop() -> bool: FILE: utils/helpers.py function run_cmd (line 12) | async def run_cmd(*cmd: str, timeout: float = 30) -> str: function to_list (line 29) | def to_list[T](v: list[T]) -> list[T]: ... function to_list (line 33) | def to_list[T](v: T) -> list[T]: ... function to_list (line 36) | def to_list[T](v: T | list[T]) -> list[T]: function pack_dir_to_tar_gz (line 40) | def pack_dir_to_tar_gz(dir_path: str | Path, output_path: str | Path | N... function with_request_id (line 66) | def with_request_id[T](func: Callable[..., Awaitable[T]]) -> Callable[..... FILE: utils/media_processing_unit.py class MediaProcessResult (line 21) | class MediaProcessResult: class MediaProcessingUnit (line 28) | class MediaProcessingUnit: method __init__ (line 40) | def __init__( method process (line 59) | async def process(self, file_path: str | Path) -> MediaProcessResult: method process_image (line 73) | async def process_image(self, file_path: Path) -> MediaProcessResult: method _adapt_image (line 102) | def _adapt_image(self, file_path: Path) -> MediaProcessResult | None: method _img2webp (line 136) | def _img2webp(self, file_path: Path) -> Path: method _downscale_image (line 144) | def _downscale_image(self, file_path: Path, max_side: int = 2560) -> P... method _calc_padding_horizontal (line 162) | def _calc_padding_horizontal(w: int, h: int) -> tuple[int, int, int, i... method _calc_padding_vertical (line 167) | def _calc_padding_vertical(w: int, h: int) -> tuple[int, int, int, int]: method _get_dominant_color (line 172) | def _get_dominant_color(file_path: Path) -> tuple[int, ...]: method _pad_image (line 176) | def _pad_image( method _split_image (line 189) | def _split_image(self, file_path: Path, segment_height: int) -> MediaP... method _do_split (line 196) | def _do_split( method process_video (line 220) | async def process_video(self, file_path: Path) -> MediaProcessResult: method get_video_codec (line 244) | async def get_video_codec(file_path: Path) -> str: method get_duration (line 260) | async def get_duration(file_path: Path) -> float: method ensure_h264 (line 273) | async def ensure_h264(self, file_path: Path) -> Path: method _get_video_height (line 297) | async def _get_video_height(file_path: Path) -> int: method _build_sw_transcode_cmd (line 312) | def _build_sw_transcode_cmd(self, file_path: Path, out: Path, duration... method split_video (line 344) | async def split_video( method get_media_type_by_mime (line 402) | def get_media_type_by_mime(file_path: str | Path) -> str: function main (line 412) | async def main() -> None: FILE: utils/ph.py class Telegraph (line 8) | class Telegraph: method __init__ (line 11) | def __init__(self, token: str | None = None, domain: str = "telegra.ph"): method create_account (line 16) | async def create_account( method get_account_info (line 25) | async def get_account_info(self, account_info: dict[str, str] | None =... method create_page (line 43) | async def create_page( class TelegraphAccount (line 78) | class TelegraphAccount: class TelegraphPage (line 87) | class TelegraphPage: