SYMBOL INDEX (342 symbols across 40 files) FILE: example.py function example (line 9) | async def example(): function example_api (line 77) | async def example_api(): function test (line 94) | async def test(): FILE: locale/generate_path.py function find_python_files (line 6) | def find_python_files(dir_, file): FILE: locale/po_to_mo.py function scan_directory (line 7) | def scan_directory(): function generate_map (line 13) | def generate_map(files: list[Path]): function generate_mo (line 17) | def generate_mo(maps: list[tuple[Path, Path]]): FILE: main.py function app (line 12) | async def app(): function api_server (line 17) | async def api_server( function mcp_server (line 30) | async def mcp_server( FILE: source/CLI/main.py function check_value (line 32) | def check_value(function): class CLI (line 39) | class CLI: method __init__ (line 40) | def __init__(self, ctx: Context, **kwargs): method __aenter__ (line 54) | async def __aenter__(self): method __aexit__ (line 58) | async def __aexit__(self, exc_type, exc_value, traceback): method run (line 61) | async def run(self): method __update_settings (line 66) | def __update_settings(self): method __check_settings_path (line 70) | def __check_settings_path(self) -> Path: method __merge_cookie (line 76) | def __merge_cookie(data: dict) -> None: method __clean_params (line 81) | def __clean_params(self, data: dict) -> dict: method __format_index (line 86) | def __format_index(index: str) -> list: method version (line 98) | def version(ctx: Context, param, value) -> None: method help_ (line 114) | def help_(ctx: Context, param, value) -> None: function cli (line 354) | def cli(ctx, help, language, **kwargs): FILE: source/TUI/about.py class About (line 18) | class About(Screen): method __init__ (line 25) | def __init__( method compose (line 30) | def compose(self) -> ComposeResult: method on_mount (line 74) | def on_mount(self) -> None: method action_quit (line 77) | async def action_quit(self) -> None: method action_back (line 80) | async def action_back(self) -> None: method action_update (line 83) | async def action_update(self): FILE: source/TUI/app.py class XHSDownloader (line 18) | class XHSDownloader(App): method __init__ (line 22) | def __init__(self): method __aenter__ (line 28) | async def __aenter__(self): method __aexit__ (line 32) | async def __aexit__(self, exc_type, exc_value, traceback): method __initialization (line 35) | def __initialization(self) -> None: method on_mount (line 42) | async def on_mount(self) -> None: method action_settings (line 66) | async def action_settings(self): method refresh_screen (line 73) | async def refresh_screen(self): method update_result (line 107) | def update_result(self, args: tuple[str, str]) -> None: method action_update (line 113) | async def action_update(self): method close_database (line 121) | async def close_database(self): FILE: source/TUI/index.py class Index (line 27) | class Index(Screen): method __init__ (line 37) | def __init__( method compose (line 46) | def compose(self) -> ComposeResult: method on_mount (line 76) | def on_mount(self) -> None: method deal_button (line 88) | async def deal_button(self): method reset_button (line 102) | def reset_button(self): method paste_button (line 106) | def paste_button(self): method deal (line 110) | async def deal(self): method action_quit (line 132) | async def action_quit(self) -> None: method action_update (line 135) | async def action_update(self) -> None: method action_settings (line 138) | async def action_settings(self): method action_monitor (line 141) | async def action_monitor(self): method action_about (line 148) | async def action_about(self): method action_record (line 151) | async def action_record(self): FILE: source/TUI/loading.py class Loading (line 11) | class Loading(ModalScreen): method __init__ (line 12) | def __init__( method compose (line 17) | def compose(self) -> ComposeResult: FILE: source/TUI/monitor.py class Monitor (line 18) | class Monitor(Screen): method __init__ (line 24) | def __init__( method compose (line 31) | def compose(self) -> ComposeResult: method close_button (line 39) | async def close_button(self): method run_monitor (line 43) | async def run_monitor(self): method on_mount (line 47) | def on_mount(self) -> None: method action_close (line 52) | async def action_close(self): method action_quit (line 56) | async def action_quit(self) -> None: FILE: source/TUI/progress.py class Progress (line 7) | class Progress(Screen): method compose (line 8) | def compose(self) -> ComposeResult: FILE: source/TUI/record.py class Record (line 13) | class Record(ModalScreen): method __init__ (line 14) | def __init__( method compose (line 21) | def compose(self) -> ComposeResult: method delete (line 40) | async def delete(self, text: str): method save_settings (line 49) | async def save_settings(self): method reset (line 55) | def reset(self): FILE: source/TUI/setting.py class Setting (line 13) | class Setting(Screen): method __init__ (line 19) | def __init__( method compose (line 26) | def compose(self) -> ComposeResult: method __check_cookie (line 225) | def __check_cookie(self) -> str: method on_mount (line 230) | def on_mount(self) -> None: method save_settings (line 234) | def save_settings(self): method reset (line 263) | def reset(self): method action_quit (line 266) | async def action_quit(self) -> None: method action_index (line 269) | async def action_index(self): FILE: source/TUI/update.py class Update (line 16) | class Update(ModalScreen): method __init__ (line 17) | def __init__( method compose (line 24) | def compose(self) -> ComposeResult: method check_update (line 32) | async def check_update(self) -> None: method on_mount (line 75) | def on_mount(self) -> None: method compare_versions (line 79) | def compare_versions( FILE: source/application/app.py function data_cache (line 67) | def data_cache(function): class Print (line 85) | class Print: method __init__ (line 86) | def __init__( method __call__ (line 92) | def __call__( class XHS (line 98) | class XHS: method __new__ (line 111) | def __new__(cls, *args, **kwargs): method __init__ (line 116) | def __init__( method __extract_image (line 195) | def __extract_image(self, container: dict, data: Namespace): method __extract_video (line 200) | def __extract_video( method __download_files (line 213) | async def __download_files( method save_data (line 252) | async def save_data( method __add_record (line 262) | async def __add_record( method extract (line 268) | async def extract( method show_statistics (line 304) | def show_statistics( method extract_cli (line 317) | async def extract_cli( method extract_links (line 358) | async def extract_links( method extract_id (line 377) | def extract_id(self, links: list[str]) -> list[str]: method _get_html_data (line 386) | async def _get_html_data( method _extract_data (line 417) | def _extract_data( method _deal_download_tasks (line 430) | async def _deal_download_tasks( method __deal_extract (line 462) | async def __deal_extract( method deal_script_tasks (line 508) | async def deal_script_tasks( method json_to_namespace (line 539) | def json_to_namespace(data: dict) -> Namespace: method update_author_nickname (line 542) | async def update_author_nickname( method __extract_link_id (line 558) | def __extract_link_id(url: str) -> str: method __generate_data_object (line 562) | def __generate_data_object(self, html: str) -> Namespace: method __naming_rules (line 566) | def __naming_rules(self, data: dict) -> str: method __get_name_time (line 591) | def __get_name_time(data: dict) -> str: method __get_name_title (line 594) | def __get_name_title(self, data: dict) -> str: method monitor (line 603) | async def monitor( method __get_link (line 622) | async def __get_link(self, delay: int): method __push_link (line 631) | async def __push_link( method __receive_link (line 644) | async def __receive_link(self, delay: int, *args, **kwargs): method stop_monitor (line 650) | def stop_monitor(self): method skip_download (line 653) | async def skip_download(self, id_: str) -> bool: method __aenter__ (line 656) | async def __aenter__(self): method __aexit__ (line 662) | async def __aexit__(self, exc_type, exc_value, traceback): method close (line 668) | async def close(self): method run_api_server (line 685) | async def run_api_server( method setup_routes (line 706) | def setup_routes( method run_mcp_server (line 758) | async def run_mcp_server( method deal_detail_mcp (line 919) | async def deal_detail_mcp( method init_script_server (line 942) | def init_script_server( method switch_script_server (line 950) | async def switch_script_server( method run_script_server (line 966) | def run_script_server( method _run_script_server (line 974) | async def _run_script_server( method stop_script_server (line 982) | async def stop_script_server(self): method _script_server_debug (line 989) | async def _script_server_debug(self): method logging (line 994) | def logging(self, text, style=INFO): FILE: source/application/download.py class Download (line 30) | class Download: method __init__ (line 42) | def __init__( method run (line 71) | async def run( method __generate_path (line 114) | def __generate_path(self, nickname: str, filename: str): method __ready_download_video (line 124) | def __ready_download_video( method __ready_download_image (line 140) | def __ready_download_image( method __check_exists_glob (line 176) | def __check_exists_glob( method __check_exists_path (line 186) | def __check_exists_path( method __download (line 197) | async def __download( method __create_progress (line 270) | def __create_progress( method __update_progress (line 279) | def __update_progress(bar, advance: int): method __extract_type (line 284) | def __extract_type(cls, content: str) -> str: method __head_file (line 287) | async def __head_file( method __get_resume_byte_position (line 305) | def __get_resume_byte_position(file: Path) -> int: method __update_headers_range (line 308) | def __update_headers_range( method __suffix_with_file (line 316) | async def __suffix_with_file( FILE: source/application/explore.py class Explore (line 9) | class Explore: method run (line 12) | def run(self, data: Namespace) -> dict: method __extract_data (line 15) | def __extract_data(self, data: Namespace) -> dict: method __extract_interact_info (line 26) | def __extract_interact_info(container: dict, data: Namespace) -> None: method __extract_tags (line 33) | def __extract_tags(container: dict, data: Namespace): method __extract_info (line 39) | def __extract_info(self, container: dict, data: Namespace): method __extract_time (line 49) | def __extract_time(self, container: dict, data: Namespace): method __extract_user (line 65) | def __extract_user(container: dict, data: Namespace): method __classify_works (line 75) | def __classify_works(data: Namespace) -> str: FILE: source/application/image.py class Image (line 8) | class Image: method get_image_link (line 10) | def get_image_link(cls, data: Namespace, format_: str) -> tuple[list, ... method __generate_auto_link (line 42) | def __generate_auto_link(token: str) -> str: method __generate_fixed_link (line 46) | def __generate_fixed_link( method __extract_image_token (line 53) | def __extract_image_token(url: str) -> str: method __get_live_link (line 57) | def __get_live_link(items: list) -> list: FILE: source/application/request.py class Html (line 15) | class Html: method __init__ (line 16) | def __init__( method request_url (line 27) | async def request_url( method format_url (line 72) | def format_url(url: str) -> str: method update_cookie (line 75) | def update_cookie( method __request_url_head (line 81) | async def __request_url_head( method __request_url_head_proxy (line 93) | async def __request_url_head_proxy( method __request_url_get (line 110) | async def __request_url_get( method __request_url_get_proxy (line 122) | async def __request_url_get_proxy( FILE: source/application/user_posted.py class UserPosted (line 10) | class UserPosted: method __init__ (line 13) | def __init__( method get_cookie (line 31) | def get_cookie(self, cookies: str = None) -> dict | str: method run (line 37) | def run( method get_data (line 43) | async def get_data(self): method get_headers (line 65) | def get_headers(self): FILE: source/application/video.py class Video (line 7) | class Video: method deal_video_link (line 15) | def deal_video_link( method generate_video_link (line 23) | def generate_video_link(cls, data: Namespace) -> list: method get_video_link (line 31) | def get_video_link( method get_video_items (line 50) | def get_video_items(data: Namespace) -> list: FILE: source/expansion/browser.py class BrowserCookie (line 26) | class BrowserCookie: method run (line 41) | def run( method get (line 67) | def get( method __browser_object (line 85) | def __browser_object(cls, browser: str | int): method __match_browser (line 101) | def __match_browser(cls, browser: str): FILE: source/expansion/cleaner.py class Cleaner (line 14) | class Cleaner: method __init__ (line 17) | def __init__(self): method default_rule (line 24) | def default_rule(): method set_rule (line 50) | def set_rule(self, rule: dict[str, str], update=True): method filter (line 59) | def filter(self, text: str) -> str: method filter_name (line 70) | def filter_name( method clear_spaces (line 95) | def clear_spaces(string: str): method remove_control_characters (line 100) | def remove_control_characters( FILE: source/expansion/converter.py class Converter (line 9) | class Converter: method run (line 24) | def run(self, content: str) -> dict: method _extract_object (line 27) | def _extract_object(self, html: str) -> str: method _convert_object (line 35) | def _convert_object(cls, text: str) -> dict: method _filter_object (line 40) | def _filter_object(cls, data: dict) -> dict: method deep_get (line 48) | def deep_get(cls, data: dict, keys: list | tuple, default=None): method safe_get (line 62) | def safe_get(data: Union[dict, list, tuple, set], index: int): method get_script (line 70) | def get_script(scripts: list) -> str: FILE: source/expansion/error.py class CacheError (line 1) | class CacheError(Exception): method __init__ (line 2) | def __init__(self, message: str): method __str__ (line 6) | def __str__(self): FILE: source/expansion/file_folder.py function file_switch (line 5) | def file_switch(path: Path) -> None: function remove_empty_directories (line 12) | def remove_empty_directories(path: Path) -> None: FILE: source/expansion/namespace.py class Namespace (line 8) | class Namespace: method __init__ (line 9) | def __init__(self, data: dict) -> None: method generate_data_object (line 13) | def generate_data_object(data: dict) -> SimpleNamespace: method safe_extract (line 26) | def safe_extract( method __safe_extract (line 34) | def __safe_extract( method object_extract (line 58) | def object_extract( method __dict__ (line 71) | def __dict__(self): method convert_to_dict (line 75) | def convert_to_dict(cls, data) -> dict: method __bool__ (line 83) | def __bool__(self): FILE: source/expansion/pyi_rth_beartype.py function _is_pyinstaller_frozen (line 37) | def _is_pyinstaller_frozen(): function _patch_beartype_claw (line 42) | def _patch_beartype_claw(): FILE: source/expansion/truncate.py function is_chinese_char (line 4) | def is_chinese_char(char: str) -> bool: function truncate_string (line 8) | def truncate_string(s: str, length: int = 64) -> str: function trim_string (line 19) | def trim_string(s: str, length: int = 64) -> str: function beautify_string (line 24) | def beautify_string(s: str, length: int = 64) -> str: FILE: source/module/extend.py class Account (line 4) | class Account: FILE: source/module/manager.py class Manager (line 28) | class Manager: method __init__ (line 53) | def __init__( method __check_path (line 134) | def __check_path(self, path: str) -> Path: method __check_folder (line 141) | def __check_folder(self, folder: str) -> Path: method __check_root_again (line 146) | def __check_root_again(root: Path) -> bool | Path: method __check_image_format (line 153) | def __check_image_format(image_format) -> str: method is_exists (line 166) | def is_exists(path: Path) -> bool: method delete (line 170) | def delete(path: Path): method archive (line 175) | def archive(root: Path, name: str, folder_mode: bool) -> Path: method move (line 179) | def move( method update_mtime (line 191) | def update_mtime(file: Path, mtime: int): method __clean (line 194) | def __clean(self): method filter_name (line 197) | def filter_name(self, name: str) -> str: method check_bool (line 202) | def check_bool(value: bool, default: bool) -> bool: method close (line 205) | async def close(self): method __check_name_format (line 212) | def __check_name_format(self, format_: str) -> str: method check_video_preference (line 220) | def check_video_preference(preference: str) -> str: method __check_proxy (line 225) | def __check_proxy( method print_proxy_tip (line 261) | def print_proxy_tip( method clean_cookie (line 268) | def clean_cookie(cls, cookie_string: str) -> str: method delete_cookie (line 278) | def delete_cookie(cls, cookie_string: str, patterns: list | tuple) -> ... method create_folder (line 287) | def create_folder( method compatible (line 293) | def compatible( method cookie_str_to_dict (line 304) | def cookie_str_to_dict(cookie_str: str) -> dict: FILE: source/module/mapping.py class Mapping (line 16) | class Mapping: method __init__ (line 17) | def __init__( method update_cache (line 28) | async def update_cache( method has_mapping (line 43) | async def has_mapping(self, id_: str) -> str: method __check_file (line 46) | def __check_file( method __rename_folder (line 71) | def __rename_folder( method __rename_works_folder (line 90) | def __rename_works_folder( method __scan_file (line 112) | def __scan_file( method __batch_rename (line 143) | def __batch_rename( method __rename_file (line 160) | def __rename_file( method __rename (line 181) | def __rename( FILE: source/module/model.py class ExtractParams (line 4) | class ExtractParams(BaseModel): class ExtractData (line 13) | class ExtractData(BaseModel): FILE: source/module/recorder.py class IDRecorder (line 13) | class IDRecorder: method __init__ (line 14) | def __init__(self, manager: "Manager"): method _connect_database (line 22) | async def _connect_database(self): method select (line 30) | async def select(self, id_: str): method add (line 35) | async def add( method __delete (line 46) | async def __delete(self, id_: str) -> None: method delete (line 51) | async def delete(self, ids: list[str]): method all (line 55) | async def all(self): method __aenter__ (line 60) | async def __aenter__(self): method __aexit__ (line 65) | async def __aexit__(self, exc_type, exc_value, traceback): method compatible (line 70) | def compatible( class DataRecorder (line 81) | class DataRecorder(IDRecorder): method __init__ (line 103) | def __init__(self, manager: "Manager"): method _connect_database (line 110) | async def _connect_database(self): method select (line 118) | async def select(self, id_: str): method add (line 121) | async def add(self, **kwargs) -> None: method __delete (line 133) | async def __delete(self, id_: str) -> None: method delete (line 136) | async def delete(self, ids: list | tuple): method all (line 139) | async def all(self): method __generate_values (line 142) | def __generate_values(self, data: dict) -> tuple: class MapRecorder (line 146) | class MapRecorder(IDRecorder): method __init__ (line 147) | def __init__(self, manager: "Manager"): method _connect_database (line 153) | async def _connect_database(self): method select (line 164) | async def select(self, id_: str): method add (line 171) | async def add(self, id_: str, name: str, *args, **kwargs) -> None: method __delete (line 182) | async def __delete(self, id_: str) -> None: method delete (line 185) | async def delete(self, ids: list[str]): method all (line 188) | async def all(self): FILE: source/module/script.py class ScriptServer (line 10) | class ScriptServer: method __init__ (line 11) | def __init__( method handler (line 22) | async def handler(self, websocket): method start (line 28) | async def start(self): method stop (line 36) | async def stop(self): method __aenter__ (line 42) | async def __aenter__(self): method __aexit__ (line 46) | async def __aexit__(self, exc_type, exc_val, exc_tb): FILE: source/module/settings.py class Settings (line 10) | class Settings: method __init__ (line 41) | def __init__(self, root: Path = ROOT): method run (line 52) | def run(self): method read (line 62) | def read(self) -> dict: method create (line 72) | def create(self) -> dict: method update (line 83) | def update(self, data: dict): method compatible (line 93) | def compatible( method migration_file (line 115) | def migration_file(self): FILE: source/module/tools.py function retry (line 13) | def retry(function): function retry_limited (line 25) | def retry_limited(function): function logging (line 42) | def logging(log: Callable, text, style=INFO): function get_wait_time (line 54) | def get_wait_time( function sleep_time (line 62) | async def sleep_time(): FILE: source/translation/translate.py class TranslationManager (line 8) | class TranslationManager: method __new__ (line 13) | def __new__(cls, *args, **kwargs): method __init__ (line 18) | def __init__(self, domain="xhs", localedir=None): method get_language_code (line 28) | def get_language_code() -> str: method setup_translation (line 46) | def setup_translation(self, language: str = "zh_CN"): method switch_language (line 61) | def switch_language(self, language: str = "en_US"): method gettext (line 65) | def gettext(self, message): function _translate (line 74) | def _translate(message): function switch_language (line 79) | def switch_language(language: str = "en_US"): FILE: static/20250619.js function L (line 1) | function L(h, b) { function F (line 33) | function F() { function b (line 306) | function b() { FILE: static/XHS-Downloader.js function showTextModal (line 1146) | function showTextModal(opts) { function showListSelectionModal (line 1816) | function showListSelectionModal(list, options = {}) { function showToast (line 2164) | function showToast(message, duration = 5000) { class WebSocketManager (line 2420) | class WebSocketManager { method constructor (line 2421) | constructor(url) { method onOpen (line 2426) | onOpen() { method onMessage (line 2429) | onMessage(message) { method onClose (line 2433) | onClose(event) { method onError (line 2437) | onError(error) { method isConnected (line 2442) | get isConnected() { method connect (line 2446) | connect() { method disconnect (line 2467) | disconnect() { method send (line 2473) | send(data) {