开源、免费、跨平台的 B 站视频下载工具,支持多线程加速、音视频分离、弹幕元数据获取、自定义命名与分类等功能。Open Source, Free, Cross-Platform Bilibili Video Downloader.
This report presents the forensic synthetic code analysis of ScottSloan/Bili23-Downloader, a Python project with 6,875 GitHub stars. SynthScan v2.0 examined 69,457 lines of code across 240 source files, recording 421 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 7.9 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 421 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/main.py | 227 | except Exception: | CODE |
| LOW | src/main.py | 234 | except Exception: | CODE |
| LOW | src/main.py | 467 | except Exception: | CODE |
| LOW | src/main.py | 521 | except Exception: | CODE |
| LOW | src/main.py | 539 | except Exception: | CODE |
| MEDIUM | src/main.py | 461 | def stop_mcp_server(self): | CODE |
| MEDIUM | src/main.py | 531 | def warmup(): | CODE |
| LOW | src/util/misc/update.py | 69 | except Exception: | CODE |
| LOW | src/util/misc/macos.py | 43 | except Exception: | CODE |
| LOW | src/util/ffmpeg/runner.py | 98 | except Exception as e: | CODE |
| LOW | src/util/ffmpeg/runner.py | 152 | except Exception: | CODE |
| LOW | src/util/ffmpeg/runner.py | 174 | except Exception: | CODE |
| LOW | src/util/ffmpeg/runner.py | 183 | except Exception: | CODE |
| LOW | src/util/ffmpeg/runner.py | 247 | except Exception: | CODE |
| MEDIUM | src/util/ffmpeg/runner.py | 140 | def read_stderr(): | CODE |
| LOW | src/util/auth/qrcode.py | 37 | except Exception: | CODE |
| LOW | src/util/auth/cookie_login.py | 62 | except Exception: | CODE |
| LOW | src/util/auth/sms.py | 37 | except Exception: | CODE |
| LOW | src/util/parse/worker.py | 98 | except Exception as e: | CODE |
| LOW | src/util/parse/worker.py | 151 | except Exception as e: | CODE |
| LOW | src/util/parse/parser/dynamic.py | 46 | except Exception as e: | CODE |
| LOW | src/util/parse/parser/festival.py | 38 | except Exception as e: | CODE |
| LOW | src/util/parse/preview/worker.py | 40 | except Exception as e: | CODE |
| MEDIUM | src/util/parse/preview/worker.py | 22 | def run(self): | CODE |
| LOW | src/util/parse/preview/previewer.py | 103 | except Exception as e: | CODE |
| LOW | src/util/parse/preview/previewer.py | 158 | except Exception as e: | CODE |
| LOW | src/util/parse/preview/previewer.py | 263 | except Exception as e: | CODE |
| MEDIUM | src/util/parse/preview/previewer.py | 96 | def on_init_success(self): | CODE |
| MEDIUM | src/util/parse/preview/previewer.py | 146 | def parse_info(self): | CODE |
| LOW | src/util/parse/additional/worker.py | 36 | except Exception as e: | CODE |
| MEDIUM | src/util/parse/additional/worker.py | 31 | def run(self): | CODE |
| LOW | src/util/network/request.py | 85 | except Exception: | CODE |
| LOW | src/util/network/request.py | 104 | except Exception: | CODE |
| LOW | src/util/network/request.py | 153 | except Exception as e: | CODE |
| LOW | src/util/network/request.py | 380 | except Exception as e: | CODE |
| MEDIUM | src/util/network/request.py | 374 | def run(self): | CODE |
| LOW | src/util/network/download_url.py | 180 | except Exception as e: | CODE |
| LOW | src/util/network/download_url.py | 227 | except Exception as e: | CODE |
| LOW | src/util/network/cdn.py | 186 | except Exception: | CODE |
| LOW | src/util/mcp/server.py | 428 | except Exception: | CODE |
| LOW | src/util/mcp/server.py | 435 | except Exception: | CODE |
| MEDIUM | src/util/mcp/server.py | 74 | def handle_one_request(self): | CODE |
| LOW | src/util/mcp/stdio_bridge.py | 387 | except Exception: | CODE |
| LOW | src/util/mcp/protocol.py | 150 | except Exception: | CODE |
| LOW | src/util/mcp/__init__.py | 44 | except Exception: | CODE |
| LOW | src/util/mcp/invoke.py | 58 | except Exception as e: | CODE |
| LOW | src/util/mcp/invoke.py | 123 | except Exception: | CODE |
| MEDIUM | src/util/mcp/invoke.py | 54 | def runner(): | CODE |
| LOW | src/util/mcp/tools/download.py | 282 | except Exception: | CODE |
| LOW | src/util/mcp/tools/download.py | 432 | except Exception: | CODE |
| LOW | src/util/mcp/tools/__init__.py | 90 | except Exception as e: | CODE |
| LOW | src/util/mcp/tools/parse.py | 182 | except Exception: | CODE |
| LOW | src/util/mcp/tools/parse.py | 260 | except Exception: | CODE |
| LOW⚡ | src/util/common/config.py | 510 | except Exception: | CODE |
| LOW⚡ | src/util/common/config.py | 516 | except Exception: | CODE |
| LOW⚡ | src/util/common/config.py | 526 | except Exception as e: | CODE |
| LOW | src/util/common/io/file.py | 17 | except Exception as e: | CODE |
| LOW | src/util/common/io/file.py | 35 | except Exception as e: | CODE |
| LOW | src/util/common/io/directory.py | 181 | except Exception as e: | CODE |
| LOW | src/util/download/downloader/downloader.py | 350 | except Exception: | CODE |
| 56 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/main.py | 159 | def handle_uncaught_exception(exc_type, exc_value, exc_traceback): | CODE |
| LOW | src/main.py | 170 | def handle_uncaught_thread_exception(args): | CODE |
| LOW | src/main.py | 388 | def on_new_instance_connection(self): | CODE |
| LOW | src/main.py | 432 | def activate_existing_instance(self): | CODE |
| LOW | src/main.py | 440 | def process_pending_instance_activation(self): | CODE |
| LOW | src/util/misc/update.py | 74 | def sanitize_platform_version(value: str): | CODE |
| LOW | src/util/parse/worker.py | 172 | def _get_interactive_video_parser(self): | CODE |
| LOW | src/util/parse/worker.py | 186 | def _update_progress_callback(self, text: str): | CODE |
| LOW | src/util/parse/episode/list.py | 23 | def seasons_archives_list_parser(self): | CODE |
| LOW | src/util/parse/episode/base.py | 82 | def _video_episode_data_parser(self): | CODE |
| LOW | src/util/parse/parser/list.py | 70 | def get_seasons_archives_list(self): | CODE |
| LOW | src/util/parse/parser/lesson.py | 20 | def build_lesson_play_payload(course_id: int, lesson_id: int, item_id: int, section_id: int): | CODE |
| LOW | src/util/parse/parser/favorite.py | 82 | def on_get_favorite_list_success(self, response: dict): | CODE |
| LOW | src/util/parse/parser/favorite.py | 101 | def on_get_subscription_list_success(self, response: dict): | CODE |
| LOW | src/util/parse/parser/favorite.py | 121 | def on_get_follow_list_success(self, response: dict): | CODE |
| LOW | src/util/parse/parser/video.py | 167 | def parse_interactive_video_episodes(self): | CODE |
| LOW | src/util/parse/parser/video.py | 298 | def get_interactive_video_data(self): | CODE |
| LOW | src/util/parse/preview/audio_info.py | 29 | def _get_dash_available_quality_list(self): | CODE |
| LOW | src/util/parse/preview/audio_info.py | 171 | def get_audio_info_by_priority(self): | CODE |
| LOW | src/util/parse/preview/video_info.py | 27 | def _get_dash_available_quality_list(self): | CODE |
| LOW | src/util/parse/preview/video_info.py | 54 | def get_available_quality_list(self): | CODE |
| LOW | src/util/parse/preview/video_info.py | 172 | def get_video_quality_id_by_priority(self): | CODE |
| LOW | src/util/parse/preview/video_info.py | 177 | def get_video_codec_id_by_priority(self, video_quality_id: int): | CODE |
| LOW | src/util/parse/additional/file/danmaku_xml.py | 51 | def _filter_invalid_characters(self, text: str) -> str: | CODE |
| LOW | src/util/network/cdn.py | 204 | def get_default_cdn_server_list() -> list[dict]: | CODE |
| LOW | src/util/mcp/server.py | 67 | class MCPRequestHandler(BaseHTTPRequestHandler): | CODE |
| LOW | src/util/mcp/protocol.py | 66 | def unsupported_version_error(request_id, requested: str): | CODE |
| LOW | src/util/common/io/directory.py | 18 | def ensure_directory_accessible(directory: str) -> bool: | CODE |
| LOW | src/util/common/io/directory.py | 95 | def open_directory_in_explorer(directory: str): | CODE |
| LOW | src/util/common/data/naming_convention.py | 265 | def _interactive_video_variable(self): | CODE |
| LOW | src/util/download/parse/audio_info.py | 19 | def _get_dash_available_quality_list(self): | CODE |
| LOW | src/util/download/parse/audio_info.py | 117 | def get_audio_info_by_priority(self): | CODE |
| LOW | src/util/download/parse/video_info.py | 16 | def _get_dash_available_quality_list(self): | CODE |
| LOW | src/util/download/parse/video_info.py | 43 | def get_available_quality_list(self): | CODE |
| LOW | src/util/download/parse/video_info.py | 98 | def get_video_quality_id_by_priority(self): | CODE |
| LOW | src/util/download/parse/video_info.py | 103 | def get_video_codec_id_by_priority(self, video_quality_id: int): | CODE |
| LOW⚡ | src/util/download/downloader/downloader.py | 624 | def _start_worker_in_background(self, generation: int): | CODE |
| LOW | src/util/download/downloader/downloader.py | 1038 | def _queue_wait_callback_if_idle(self): | CODE |
| LOW | src/util/download/downloader/merger.py | 409 | def delete_embedded_subtitles(self): | CODE |
| LOW | src/util/download/task/manager.py | 70 | def _reset_add_to_queue_toast_flag(self): | CODE |
| LOW | src/util/download/task/manager.py | 74 | def __episode_info_to_task_info(self, episode_info: dict, number, options: dict = None) -> TaskInfo: | CODE |
| LOW | src/util/download/task/manager.py | 116 | def __determine_download_type(self, options: dict = None): | CODE |
| LOW | src/util/download/task/manager.py | 185 | def __filter_illegal_characters(self, episode_info: dict): | CODE |
| LOW | src/util/download/task/manager.py | 432 | def _remove_temporary_files_async(self, task_info_list: List[TaskInfo]): | CODE |
| LOW | src/util/download/task/manager.py | 445 | def _remove_temporary_files_storage(self, snapshots: List[tuple]): | CODE |
| LOW | src/util/download/task/manager.py | 465 | def _mark_as_completed_storage(self, record: tuple): | CODE |
| LOW | src/util/format/time.py | 82 | def format_ass_time_by_seconds(seconds: float): | CODE |
| LOW | src/util/format/units.py | 12 | def unformat_episode_duration(duration_str: str): | CODE |
| LOW | src/util/format/file_name.py | 118 | def get_variable_data_from_task_info(self, task_info: TaskInfo): | CODE |
| LOW | src/util/format/file_name.py | 175 | def get_type_id_from_task_info(self, task_info: TaskInfo): | CODE |
| LOW | src/util/format/file_name.py | 180 | def get_type_id_from_attribute(self, attribute: int): | CODE |
| LOW | src/util/format/file_name.py | 202 | def get_rule_list_from_attribute(self, attribute: int): | CODE |
| LOW | src/gui/interface/main_window.py | 77 | def show_toast_notification_long_message(self, category: ToastNotificationCategory, title: str, content: str): | CODE |
| LOW | src/gui/interface/main_window.py | 225 | def is_window_position_visible(x: int, y: int, width: int): | CODE |
| LOW | src/gui/interface/main_window.py | 266 | def update_download_btn_badge_info(self: "MainWindow", count: int): | CODE |
| LOW | src/gui/interface/main_window.py | 306 | def show_favorites_flyout_menu(self: "MainWindow"): | CODE |
| LOW | src/gui/interface/setting.py | 192 | def on_custom_parse_list_column(self): | CODE |
| LOW | src/gui/interface/setting.py | 200 | def on_custom_monitor_clipboard(self): | CODE |
| LOW⚡ | src/gui/interface/setting.py | 215 | def on_custom_speed_limit_settings(self): | CODE |
| LOW⚡ | src/gui/interface/setting.py | 221 | def on_adjust_video_quality_priority(self): | CODE |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/gui/interface/parse.py | 459 | self.segmented_widget.pager_widget.auto_parse_btn.clicked.connect(self.on_auto_parse) | CODE |
| CRITICAL⚡ | src/gui/dialog/download_options/media.py | 42 | self.media_info_card.video_quality_widget.choice.currentIndexChanged.connect(self.on_change_video_info_choice) | CODE |
| CRITICAL⚡ | src/gui/dialog/download_options/media.py | 43 | self.media_info_card.audio_quality_widget.choice.currentIndexChanged.connect(self.on_change_audio_info_choice) | CODE |
| CRITICAL⚡ | src/gui/dialog/download_options/media.py | 44 | self.media_info_card.video_codec_widget.choice.currentIndexChanged.connect(self.on_change_video_info_choice) | CODE |
| CRITICAL⚡ | src/gui/dialog/download_options/media.py | 46 | self.media_info_card.video_quality_widget.custom_btn.clicked.connect(self.on_adjust_video_quality_priority) | CODE |
| CRITICAL⚡ | src/gui/dialog/download_options/media.py | 47 | self.media_info_card.audio_quality_widget.custom_btn.clicked.connect(self.on_adjust_audio_quality_priority) | CODE |
| CRITICAL⚡ | src/gui/dialog/download_options/media.py | 48 | self.media_info_card.video_codec_widget.custom_btn.clicked.connect(self.on_adjust_video_codec_priority) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/main.py | 312 | CODE | |
| LOW | src/main.py | 32 | CODE | |
| LOW | src/main.py | 533 | CODE | |
| LOW | src/util/auth/captcha.py | 46 | CODE | |
| LOW | src/util/mcp/server.py | 3 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 1 | CODE | |
| LOW | src/util/common/data/__init__.py | 6 | CODE | |
| LOW | src/util/common/data/__init__.py | 6 | CODE | |
| LOW | src/util/common/data/__init__.py | 6 | CODE | |
| LOW | src/util/common/data/__init__.py | 7 | CODE | |
| LOW | src/util/common/data/__init__.py | 7 | CODE | |
| LOW | src/util/common/data/__init__.py | 8 | CODE | |
| LOW | src/util/common/data/__init__.py | 8 | CODE | |
| LOW | src/util/common/data/__init__.py | 9 | CODE | |
| LOW | src/util/common/data/__init__.py | 10 | CODE | |
| LOW | src/util/common/data/__init__.py | 11 | CODE | |
| LOW | src/util/common/data/__init__.py | 12 | CODE | |
| LOW | src/util/common/data/__init__.py | 13 | CODE | |
| LOW | src/util/download/task/db.py | 2 | CODE | |
| LOW | src/gui/component/download_list/__init__.py | 1 | CODE | |
| LOW | src/gui/component/download_list/__init__.py | 2 | CODE | |
| LOW | src/gui/component/download_list/__init__.py | 3 | CODE | |
| LOW | src/gui/component/download_list/__init__.py | 4 | CODE | |
| LOW | src/gui/component/download_list/__init__.py | 5 | CODE | |
| LOW | src/gui/component/widget/info_bar.py | 1 | CODE | |
| LOW | src/gui/component/widget/navigation.py | 12 | CODE | |
| LOW | src/gui/component/entry_list/list_view.py | 3 | CODE | |
| LOW | src/gui/component/entry_list/poster_item_delegate.py | 1 | CODE | |
| LOW | src/gui/component/entry_list/entry_item_delegate.py | 1 | CODE | |
| LOW | src/gui/component/parse_list/__init__.py | 1 | CODE | |
| LOW | src/gui/component/parse_list/__init__.py | 1 | CODE | |
| LOW | src/gui/component/parse_list/__init__.py | 1 | CODE | |
| LOW | src/gui/component/parse_list/__init__.py | 2 | CODE | |
| LOW | src/gui/component/parse_list/__init__.py | 3 | CODE | |
| LOW | src/gui/component/view_model/__init__.py | 1 | CODE | |
| LOW | src/gui/component/view_model/__init__.py | 1 | CODE | |
| LOW | src/gui/component/view_model/__init__.py | 1 | CODE | |
| LOW | src/gui/component/view_model/__init__.py | 2 | CODE | |
| LOW | src/gui/component/view_model/__init__.py | 3 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| LOW | src/gui/component/setting/__init__.py | 1 | CODE | |
| 25 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/main.py | 326 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/misc/update.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/misc/web.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/misc/macos.py | 4 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/ffmpeg/__init__.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/auth/user.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/auth/base.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/worker.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/episode/lesson.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/parser/dynamic.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/parser/base.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/preview/audio_info.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/preview/previewer.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/additional/worker.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/parse/additional/chapter.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/network/request.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/network/download_url.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/network/cdn.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/server.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/protocol.py | 5 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/__init__.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/invoke.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/tools/task.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/tools/download.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/tools/__init__.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/mcp/tools/parse.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/common/_json.py | 4 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/common/config.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/common/io/file.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/common/io/directory.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/parse/audio_info.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/downloader/downloader.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/downloader/parse_worker.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/downloader/manager.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/downloader/merger.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/task/options.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/task/db.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/task/query_worker.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/task/manager.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/task/reparse_worker.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/cover/db.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/download/cover/query_worker.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/format/file_name.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/thread/dispatcher.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/thread/async_.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/util/thread/pool.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/interface/main_window.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/interface/setting.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/interface/parse.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/component/profile.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/component/download_list/item_delegate.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/component/setting/card.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/dialog/misc/interactive_video.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/dialog/misc/auto_parse.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/dialog/setting/user_agent.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/gui/dialog/setting/proxy.py | 16 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/main.py | 262 | CODE | |
| LOW | src/util/auth/server.py | 10 | CODE | |
| LOW | src/util/auth/server.py | 90 | CODE | |
| LOW | src/util/auth/server.py | 19 | CODE | |
| LOW | src/util/auth/qrcode.py | 46 | CODE | |
| LOW | src/util/auth/cookie.py | 56 | CODE | |
| LOW | src/util/auth/cookie.py | 62 | CODE | |
| LOW | src/util/auth/cookie_login.py | 40 | CODE | |
| LOW | src/util/parse/episode/tree.py | 195 | CODE | |
| LOW | src/util/parse/episode/tree.py | 214 | CODE | |
| LOW | src/util/parse/episode/bangumi.py | 29 | CODE | |
| LOW | src/util/parse/episode/cheese.py | 28 | CODE | |
| LOW | src/util/parse/episode/video.py | 107 | CODE | |
| LOW | src/util/parse/preview/previewer.py | 60 | CODE | |
| LOW | src/util/parse/preview/previewer.py | 106 | CODE | |
| LOW | src/util/parse/additional/file/danmaku_ass.py | 186 | CODE | |
| LOW | src/util/network/download_url.py | 153 | CODE | |
| LOW | src/util/download/downloader/downloader.py | 256 | CODE | |
| LOW | src/util/download/downloader/downloader.py | 836 | CODE | |
| LOW | src/util/download/downloader/downloader.py | 908 | CODE | |
| LOW | src/util/download/downloader/parse_worker.py | 136 | CODE | |
| LOW | src/util/download/downloader/merger.py | 64 | CODE | |
| LOW | src/util/download/downloader/merger.py | 157 | CODE | |
| LOW | src/util/download/task/hash_id.py | 21 | CODE | |
| LOW | src/util/download/cover/query_worker.py | 35 | CODE | |
| LOW | src/util/format/file_name.py | 30 | CODE | |
| LOW | src/gui/interface/parse.py | 62 | CODE | |
| LOW | src/gui/component/parse_list/tree_view.py | 236 | CODE | |
| LOW | src/gui/component/parse_list/tree_view.py | 259 | CODE | |
| LOW | src/gui/component/parse_list/tree_view.py | 456 | CODE | |
| LOW | src/gui/dialog/log.py | 112 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | src/util/parse/additional/file/danmaku_ass.py | 113 | track.push(stime, duration_ms, text_width, speed) | STRING |
| HIGH⚡ | src/util/parse/additional/file/danmaku_ass.py | 121 | track.push(stime + duration_ms) | STRING |
| HIGH⚡ | src/util/parse/additional/file/danmaku_ass.py | 129 | track.push(stime + duration_ms) | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/util/parse/additional/cover.py | 35 | CODE | |
| LOW | src/util/parse/additional/subtitles.py | 197 | CODE | |
| LOW | src/util/parse/additional/danmaku.py | 93 | CODE | |
| LOW | src/util/network/request.py | 278 | CODE | |
| LOW | src/util/network/request.py | 369 | CODE | |
| LOW | src/util/download/task/hash_id.py | 21 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/util/__init__.py | 1 | # 此处不要导入子模块:util 是所有工具模块的父包,任何一次 from util.x import y 都会先执行 | COMMENT |
| LOW | src/util/network/proxy.py | 41 | COMMENT | |
| LOW | src/util/network/download_url.py | 21 | # 否则批量下载时的自身并发会把好节点误判成故障节点 | COMMENT |
| LOW | src/util/download/downloader/downloader.py | 1241 | holder[0].waitForDone() | COMMENT |
| LOW | src/gui/component/widget/__init__.py | 1 | # 此处不要聚合导出子模块:导入任意一个子模块都会先执行本文件,聚合导出会把 flyout -> | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/gui/dialog/main_window/about.py | 31 | self.sponsor_lab = BodyLabel(self.tr("If this project saved you time or solved your problem, consider buying the | CODE |