Repository Analysis

Guovin/iptv-api

⚡️ IPTV直播源自动更新工具:自动采集、校验、测速并生成可播放结果,支持 M3U/TXT/API 输出、自定义频道、IPv4/IPv6、Docker、GitHub Actions、CLI 与 GUI 多端部署

16.3 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of Guovin/iptv-api, a Python project with 25,022 GitHub stars. SynthScan v2.0 examined 46,282 lines of code across 178 source files, recording 707 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 16.3 places this repository in the Moderate 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).

16.3
Adjusted Score
16.3
Raw Score
100%
Time Factor
2026-08-27
Last Push
25.0K
Stars
Python
Language
46.3K
Lines of Code
178
Files
707
Pattern Hits
2026-08-29
Scan Date
0.01
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

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.

CRITICAL 0HIGH 1MEDIUM 35LOW 671

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 707 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.

Hyper-Verbose Identifiers372 hits · 368 pts
SeverityFileLineSnippetContext
LOWmain.py86 def _initialize_pause_control(self):CODE
LOWmain.py221 def _diagnose_aggregated_data(self):CODE
LOWmain.py357 def _write_epg_files_if_needed(self):CODE
LOWdesktop_ui/main_window.py31def _update_notification_icon() -> QPixmap:CODE
LOWdesktop_ui/main_window.py289 def _configure_initial_geometry(self):CODE
LOWdesktop_ui/main_window.py315 def _language_environment_override():CODE
LOWdesktop_ui/main_window.py353 def _remove_navigation_tooltips(self):CODE
LOWdesktop_ui/main_window.py431 def _refresh_navigation_status(self, name: str):CODE
LOWdesktop_ui/main_window.py447 def _refresh_navigation_statuses(self):CODE
LOWdesktop_ui/main_window.py661 def _retranslate_tray_actions(self):CODE
LOWdesktop_ui/main_window.py710 def _copy_service_url_from_tray(self):CODE
LOWdesktop_ui/main_window.py757 def _restart_service_from_tray(self):CODE
LOWdesktop_ui/main_window.py818 def _open_rtmp_limit_settings(self):CODE
LOWdesktop_ui/main_window.py964 def _update_rtmp_navigation_status(self, snapshot: dict):CODE
LOWdesktop_ui/main_window.py988 def _update_about_navigation_status(self, state: str, payload):CODE
LOWdesktop_ui/main_window.py1030 def _show_update_notification(self, payload: dict):CODE
LOWdesktop_ui/main_window.py1137 def _set_update_navigation_status(self, state: str):STRING
LOWdesktop_ui/main_window.py1227 def _stream_batch_control_finished(self, action: str, success: int, total: int, message: str):STRING
LOWdesktop_ui/main_window.py1279 def _ask_windows_close_action(self):STRING
LOWdesktop_ui/playback.py266 def _update_advanced_visibility(self):CODE
LOWdesktop_ui/runtime.py45def validate_runtime_directory(directory: str | os.PathLike[str]) -> Path:CODE
LOWdesktop_ui/runtime.py52def default_runtime_directory(CODE
LOWdesktop_ui/runtime.py71def prepare_runtime_directory(CODE
LOWdesktop_ui/stream_status.py20def build_channel_stream_states(snapshot: dict) -> dict[str, dict]:CODE
LOWdesktop_ui/stream_status.py67def build_result_stream_states(snapshot: dict) -> dict[str, dict]:CODE
LOWdesktop_ui/stream_status.py82def apply_channel_stream_state(row: dict, states: dict[str, dict]) -> dict:CODE
LOWdesktop_ui/stream_status.py91def apply_result_stream_state(row: dict, states: dict[str, dict]) -> dict:CODE
LOWdesktop_ui/updater.py77def extracted_application_root(staging_dir: Path, platform_name: str | None = None) -> Path:CODE
LOWdesktop_ui/platform_integration.py7def suspend_macos_window_flush(window):CODE
LOWdesktop_ui/platform_integration.py28def set_macos_activation_policy(accessory: bool):CODE
LOWdesktop_ui/single_instance.py20def create_single_instance_server(timeout: int = 500) -> QLocalServer | None:CODE
LOWdesktop_ui/update_manager.py61def _legacy_asset_for_platform(assets: list[dict], key: str, version: str) -> dict | None:CODE
LOWdesktop_ui/pages/rtmp.py526 def _set_bandwidth_idle_state(self):CODE
LOWdesktop_ui/pages/rtmp.py576 def _update_channel_selection(self, preferred_result_key: str | None = None):CODE
LOWdesktop_ui/pages/rtmp.py658 def _request_selected_control(self, action: str):CODE
LOWdesktop_ui/pages/about.py222 def _set_update_available_presentation(self, available: bool):CODE
LOWdesktop_ui/pages/about.py228 def _refresh_update_notice_style(self):CODE
LOWdesktop_ui/pages/about.py319 def _install_confirmation_dialog(self):CODE
LOWdesktop_ui/pages/sources.py216 def _apply_category_tree_surface(tree):CODE
LOWdesktop_ui/pages/sources.py242 def _apply_template_view_mode(self):CODE
LOWdesktop_ui/pages/sources.py498 def move_selected_to_category(self):CODE
LOWdesktop_ui/pages/sources.py803 def _schedule_alias_summary_refresh(self, logical_index, *_):STRING
LOWdesktop_ui/pages/sources.py807 def _connect_alias_layout_refresh(self):STRING
LOWdesktop_ui/pages/sources.py895 def _schedule_table_order_sync(self, *_):STRING
LOWdesktop_ui/pages/settings.py163 def _open_playback_preferences(self):CODE
LOWdesktop_ui/pages/settings.py166 def _open_data_directory_dialog(self):CODE
LOWdesktop_ui/pages/channels.py908 def _save_result_drawer_height(self):CODE
LOWdesktop_ui/pages/channels.py915 def _toggle_result_drawer_fullscreen(self):CODE
LOWdesktop_ui/pages/channels.py923 def _update_drawer_mode_button(self):CODE
LOWdesktop_ui/pages/channels.py1853 def _auto_capture_missing_screenshot(self, dialog, row: dict):CODE
LOWdesktop_ui/pages/channels.py1861 def _request_dialog_screenshot(self, row: dict):CODE
LOWdesktop_ui/pages/channels.py1871 def _screenshot_dialog_finished(self, *_):CODE
LOWdesktop_ui/pages/channels.py842 def _best_channel_playback_result(self, channel: dict) -> dict | None:CODE
LOWdesktop_ui/pages/channels.py967 def _drawer_animation_finished(self):CODE
LOWdesktop_ui/pages/channels.py988 def _event_position_in_drawer(self, event):CODE
LOWdesktop_ui/pages/channels.py995 def _is_drawer_interaction_widget(self, widget):CODE
LOWdesktop_ui/pages/channels.py1051 def _populate_category_directory(self, categories=None):CODE
LOWdesktop_ui/pages/channels.py1177 def _sort_channels_by_category(self, rows):CODE
LOWdesktop_ui/pages/channels.py1437 def _publish_output_selection(self):CODE
LOWdesktop_ui/pages/channels.py1485 def _result_selection_changed(self, *_):CODE
312 more matches not shown…
Excessive Try-Catch Wrapping194 hits · 217 pts
SeverityFileLineSnippetContext
LOWmain.py138 except Exception:CODE
LOWmain.py315 except Exception as e:CODE
LOWmain.py325 except Exception as e:CODE
LOWmain.py721 except Exception:CODE
LOWmain.py733 except Exception as exc:CODE
LOWmain.py814 except Exception as exc:CODE
LOWdesktop_ui/main_window.py702 except Exception:CODE
MEDIUMdesktop_ui/main_window.py679def _tray_schedule_text(self):CODE
LOWdesktop_ui/controller.py52 except Exception:CODE
LOWdesktop_ui/controller.py167 except Exception:CODE
LOWdesktop_ui/updater.py105 except Exception:CODE
LOWdesktop_ui/updater.py172 except Exception:CODE
LOWdesktop_ui/updater.py194 except Exception as exc:CODE
LOWdesktop_ui/update_manager.py215 except Exception as exc:CODE
LOWdesktop_ui/update_manager.py228 except Exception as exc:CODE
LOWdesktop_ui/update_manager.py273 except Exception as exc:CODE
LOWdesktop_ui/update_manager.py297 except Exception as exc:CODE
LOWdesktop_ui/pages/tasks.py111 except Exception:CODE
LOWdesktop_ui/pages/tasks.py119 except Exception as exc:CODE
MEDIUMdesktop_ui/pages/tasks.py75def refresh(self):CODE
MEDIUMdesktop_ui/pages/tasks.py114def export(self):CODE
LOWdesktop_ui/pages/dashboard.py336 except Exception:CODE
LOWdesktop_ui/pages/dashboard.py604 except Exception:CODE
LOWdesktop_ui/pages/dashboard.py650 except Exception:CODE
MEDIUMdesktop_ui/pages/dashboard.py332def refresh_metrics(self):CODE
MEDIUMdesktop_ui/pages/dashboard.py643def refresh_schedule(self):CODE
LOWdesktop_ui/pages/logs.py244 except Exception as exc:CODE
MEDIUMdesktop_ui/pages/logs.py239def export(self):CODE
MEDIUMdesktop_ui/pages/channels.py1051def _populate_category_directory(self, categories=None):CODE
LOWdesktop_ui/pages/channels.py855 except Exception:CODE
LOWdesktop_ui/pages/channels.py1063 except Exception:CODE
LOWdesktop_ui/pages/channels.py1087 except Exception:CODE
LOWdesktop_ui/pages/channels.py1241 except Exception:CODE
LOWdesktop_ui/pages/channels.py1275 except Exception:CODE
LOWdesktop_ui/pages/channels.py1316 except Exception:CODE
LOWdesktop_ui/pages/channels.py1334 except Exception:CODE
LOWdesktop_ui/pages/channels.py1623 except Exception:CODE
LOWdesktop_ui/pages/channels.py2433 except Exception:CODE
LOWutils/rtmp_runtime.py72 except Exception:CODE
LOWutils/db.py82 except Exception:CODE
LOWutils/db.py117 except Exception:CODE
LOWutils/db.py182 except Exception:CODE
LOWutils/config.py689 except Exception:CODE
LOWutils/config.py1163 except Exception as e:CODE
LOWutils/aggregator.py203 except Exception as exc:CODE
LOWutils/aggregator.py223 except Exception as exc:CODE
LOWutils/aggregator.py314 except Exception as exc:CODE
LOWutils/aggregator.py383 except Exception as exc:CODE
LOWutils/speed.py199 except Exception:CODE
LOWutils/speed.py231 except Exception:CODE
LOWutils/speed.py262 except Exception:CODE
LOWutils/speed.py308 except Exception:CODE
LOWutils/speed.py408 except Exception:CODE
LOWutils/speed.py427 except Exception:CODE
LOWutils/speed.py450 except Exception as e:CODE
LOWutils/speed.py480 except Exception:CODE
LOWutils/speed.py498 except Exception:CODE
LOWutils/speed.py528 except Exception:CODE
LOWutils/speed.py545 except Exception:CODE
LOWutils/speed.py554 except Exception:CODE
134 more matches not shown…
Deep Nesting85 hits · 68 pts
SeverityFileLineSnippetContext
LOWmain.py597CODE
LOWmain.py914CODE
LOWdesktop_ui/main_window.py988CODE
LOWdesktop_ui/models.py105CODE
LOWdesktop_ui/models.py417CODE
LOWdesktop_ui/updater.py134CODE
LOWdesktop_ui/delegates.py253CODE
LOWdesktop_ui/delegates.py286CODE
LOWdesktop_ui/dialogs/local_source_import.py61CODE
LOWdesktop_ui/dialogs/source_import.py63CODE
LOWdesktop_ui/pages/about.py341CODE
LOWdesktop_ui/pages/dashboard.py361CODE
LOWdesktop_ui/pages/sources.py642CODE
LOWdesktop_ui/pages/sources.py915CODE
LOWdesktop_ui/pages/sources.py943CODE
LOWdesktop_ui/pages/sources.py1370CODE
LOWdesktop_ui/pages/channels.py89CODE
LOWdesktop_ui/pages/channels.py2224CODE
LOWtests/test_resource_paths.py11CODE
LOWtests/test_alias.py41CODE
LOWutils/db.py51CODE
LOWutils/db.py124CODE
LOWutils/alias.py9CODE
LOWutils/alias.py61CODE
LOWutils/config.py673CODE
LOWutils/config.py754CODE
LOWutils/config.py796CODE
LOWutils/config.py825CODE
LOWutils/config.py1026CODE
LOWutils/config.py1136CODE
LOWutils/aggregator.py22CODE
LOWutils/aggregator.py150CODE
LOWutils/aggregator.py323CODE
LOWutils/aggregator.py362CODE
LOWutils/speed.py133CODE
LOWutils/speed.py312CODE
LOWutils/speed.py455CODE
LOWutils/speed.py630CODE
LOWutils/speed.py697CODE
LOWutils/speed.py730CODE
LOWutils/diagnostics.py23CODE
LOWutils/whitelist.py23CODE
LOWutils/whitelist.py136CODE
LOWutils/tools.py38CODE
LOWutils/tools.py338CODE
LOWutils/tools.py461CODE
LOWutils/tools.py695CODE
LOWutils/tools.py714CODE
LOWutils/tools.py834CODE
LOWutils/tools.py855CODE
LOWutils/tools.py1051CODE
LOWutils/tools.py1249CODE
LOWutils/tools.py1273CODE
LOWutils/tools.py1361CODE
LOWutils/tools.py364CODE
LOWutils/channel.py183CODE
LOWutils/channel.py309CODE
LOWutils/channel.py464CODE
LOWutils/channel.py681CODE
LOWutils/channel.py864CODE
25 more matches not shown…
Decorative Section Separators18 hits · 60 pts
SeverityFileLineSnippetContext
MEDIUMmain.py83 # ----------------------------COMMENT
MEDIUMmain.py85 # ----------------------------COMMENT
MEDIUMmain.py129 # ----------------------------COMMENT
MEDIUMmain.py131 # ----------------------------COMMENT
MEDIUMmain.py149 # ----------------------------COMMENT
MEDIUMmain.py151 # ----------------------------COMMENT
MEDIUMmain.py239 # ----------------------------COMMENT
MEDIUMmain.py241 # ----------------------------COMMENT
MEDIUMmain.py383 # ----------------------------COMMENT
MEDIUMmain.py385 # ----------------------------COMMENT
MEDIUMmain.py410 # ----------------------------COMMENT
MEDIUMmain.py412 # ----------------------------COMMENT
MEDIUMmain.py559 # ----------------------------COMMENT
MEDIUMmain.py561 # ----------------------------COMMENT
MEDIUMmain.py594 # ----------------------------COMMENT
MEDIUMmain.py596 # ----------------------------COMMENT
MEDIUMmain.py838 # ----------------------------COMMENT
MEDIUMmain.py840 # ----------------------------COMMENT
Unused Imports23 hits · 23 pts
SeverityFileLineSnippetContext
LOWdesktop_ui/main_window.py9CODE
LOWdesktop_ui/updater.py5CODE
LOWdesktop_ui/app.py59CODE
LOWdesktop_ui/app.py60CODE
LOWdesktop_ui/app.py61CODE
LOWdesktop_ui/update_manager.py12CODE
LOWutils/artifacts.py1CODE
LOWutils/reporting.py1CODE
LOWutils/ffmpeg/__init__.py1CODE
LOWutils/ffmpeg/__init__.py1CODE
LOWutils/ffmpeg/__init__.py2CODE
LOWutils/ffmpeg/__init__.py2CODE
LOWutils/ffmpeg/__init__.py3CODE
LOWutils/ffmpeg/__init__.py3CODE
LOWutils/ffmpeg/__init__.py3CODE
LOWutils/ffmpeg/__init__.py4CODE
LOWutils/ip_checker/__init__.py1CODE
LOWupdates/subscribe/__init__.py1CODE
LOWupdates/epg/__init__.py1CODE
LOWupdates/epg/__init__.py2CODE
LOWupdates/epg/__init__.py2CODE
LOWscripts/gui_showcase/fixture.py1CODE
LOWscripts/gui_showcase/capture.py1CODE
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWdesktop_ui/__init__.py1__all__ = []CODE
LOWdesktop_ui/pages/__init__.py1__all__ = []CODE
LOWutils/frozen.py102__all__ = ["mark_url_bad", "mark_url_good", "is_url_frozen", "get_current_frozen_set", "load", "save"]CODE
LOWutils/channel_repository.py1152def set_channel_logo(db_path: str, channel_key: str, logo: str) -> None:STRING
LOWutils/channel_repository.py1162def update_result_measurement(db_path: str, channel_key: str, result_key: str, measurement: dict) -> None:STRING
LOWutils/ffmpeg/__init__.py6__all__ = [CODE
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHscripts/gui_showcase/capture.py88 if ownerPID == targetPID && name == "IPTV-API" && layer == 0 && windowWidth == {width} && windowHeight == {height} {CODE
AI Structural Patterns5 hits · 4 pts
SeverityFileLineSnippetContext
LOWutils/aggregator.py66CODE
LOWutils/speed.py312CODE
LOWutils/speed.py630CODE
LOWutils/channel.py1276CODE
LOWutils/channel_quality.py9CODE
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOWconfig/whitelist.txt1# 这是接口的白名单,白名单内的接口将不会参与测速,始终保留至结果最前;COMMENT
LOWconfig/local.txt1# 这是本地源列表,一行一个源,格式为:频道名称,接口地址COMMENT
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWutils/speed.py62 "placeholder",CODE