Repository Analysis

Guovin/iptv-api

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

20.6 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of Guovin/iptv-api, a Python project with 24,603 GitHub stars. SynthScan v2.0 examined 15,026 lines of code across 79 source files, recording 259 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 20.6 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).

20.6
Adjusted Score
20.6
Raw Score
100%
Time Factor
2026-07-14
Last Push
24.6K
Stars
Python
Language
15.0K
Lines of Code
79
Files
259
Pattern Hits
2026-07-14
Scan Date
0.00
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 0MEDIUM 27LOW 232

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 259 distinct pattern matches across 9 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.

Excessive Try-Catch Wrapping142 hits · 161 pts
SeverityFileLineSnippetContext
LOWmain.py102 except Exception:CODE
LOWmain.py184 except Exception as e:CODE
LOWmain.py189 except Exception as e:CODE
LOWutils/db.py82 except Exception:CODE
LOWutils/db.py117 except Exception:CODE
LOWutils/db.py182 except Exception:CODE
LOWutils/config.py23 except Exception:CODE
LOWutils/config.py378 except Exception:CODE
LOWutils/config.py500 except Exception as e:CODE
LOWutils/aggregator.py67 except Exception:CODE
LOWutils/aggregator.py83 except Exception:CODE
LOWutils/aggregator.py148 except Exception:CODE
LOWutils/aggregator.py156 except Exception:CODE
LOWutils/aggregator.py223 except Exception:CODE
LOWutils/aggregator.py275 except Exception:CODE
LOWutils/speed.py251 except Exception:CODE
LOWutils/speed.py367 except Exception:CODE
LOWutils/speed.py390 except Exception as e:CODE
LOWutils/speed.py420 except Exception:CODE
LOWutils/speed.py438 except Exception:CODE
LOWutils/speed.py468 except Exception:CODE
LOWutils/speed.py485 except Exception:CODE
LOWutils/speed.py494 except Exception:CODE
LOWutils/speed.py515 except Exception:CODE
LOWutils/speed.py595 except Exception:CODE
LOWutils/speed.py610 except Exception:CODE
MEDIUMutils/tools.py126 print(f"Error: {e}")CODE
LOWutils/tools.py50 except Exception:CODE
LOWutils/tools.py59 except Exception:CODE
LOWutils/tools.py83 except Exception:CODE
LOWutils/tools.py125 except Exception as e:CODE
LOWutils/tools.py311 except Exception:CODE
LOWutils/tools.py358 except Exception:CODE
LOWutils/tools.py627 except Exception:CODE
LOWutils/tools.py854 except Exception:CODE
LOWutils/tools.py966 except Exception:CODE
LOWutils/tools.py997 except Exception as e:CODE
LOWutils/tools.py1108 except Exception:CODE
LOWutils/tools.py1163 except Exception:CODE
LOWutils/tools.py1225 except Exception:CODE
LOWutils/tools.py1245 except Exception:CODE
LOWutils/tools.py1249 except Exception as e:CODE
LOWutils/tools.py1450 except Exception as e:CODE
LOWutils/tools.py1460 except Exception:CODE
LOWutils/channel.py1115 except Exception:CODE
LOWutils/channel.py1117 except Exception:CODE
LOWutils/channel.py1121 except Exception as e:CODE
LOWutils/channel.py1127 except Exception as e:CODE
LOWutils/channel.py355 except Exception:CODE
LOWutils/channel.py380 except Exception as e:CODE
LOWutils/channel.py590 except Exception as e:CODE
LOWutils/channel.py743 except Exception:CODE
LOWutils/channel.py749 except Exception:CODE
LOWutils/channel.py816 except Exception:CODE
LOWutils/channel.py828 except Exception:CODE
LOWutils/channel.py834 except Exception:CODE
LOWutils/channel.py875 except Exception:CODE
LOWutils/channel.py1204 except Exception as e:CODE
LOWutils/channel.py1208 except Exception as e:CODE
LOWutils/retry.py16 except Exception as e:CODE
82 more matches not shown…
Decorative Section Separators18 hits · 60 pts
SeverityFileLineSnippetContext
MEDIUMmain.py93 # ----------------------------COMMENT
MEDIUMmain.py95 # ----------------------------COMMENT
MEDIUMmain.py217 # ----------------------------COMMENT
MEDIUMmain.py219 # ----------------------------COMMENT
MEDIUMmain.py72 # ----------------------------COMMENT
MEDIUMmain.py74 # ----------------------------COMMENT
MEDIUMmain.py113 # ----------------------------COMMENT
MEDIUMmain.py115 # ----------------------------COMMENT
MEDIUMmain.py129 # ----------------------------COMMENT
MEDIUMmain.py131 # ----------------------------COMMENT
MEDIUMmain.py242 # ----------------------------COMMENT
MEDIUMmain.py244 # ----------------------------COMMENT
MEDIUMmain.py302 # ----------------------------COMMENT
MEDIUMmain.py304 # ----------------------------COMMENT
MEDIUMmain.py330 # ----------------------------COMMENT
MEDIUMmain.py332 # ----------------------------COMMENT
MEDIUMmain.py398 # ----------------------------COMMENT
MEDIUMmain.py400 # ----------------------------COMMENT
Deep Nesting49 hits · 36 pts
SeverityFileLineSnippetContext
LOWmain.py435CODE
LOWutils/db.py51CODE
LOWutils/db.py124CODE
LOWutils/alias.py9CODE
LOWutils/alias.py61CODE
LOWutils/config.py445CODE
LOWutils/config.py477CODE
LOWutils/aggregator.py99CODE
LOWutils/aggregator.py226CODE
LOWutils/speed.py98CODE
LOWutils/speed.py255CODE
LOWutils/speed.py395CODE
LOWutils/speed.py564CODE
LOWutils/speed.py624CODE
LOWutils/speed.py657CODE
LOWutils/whitelist.py23CODE
LOWutils/whitelist.py136CODE
LOWutils/tools.py35CODE
LOWutils/tools.py335CODE
LOWutils/tools.py455CODE
LOWutils/tools.py677CODE
LOWutils/tools.py696CODE
LOWutils/tools.py816CODE
LOWutils/tools.py837CODE
LOWutils/tools.py1033CODE
LOWutils/tools.py1229CODE
LOWutils/tools.py1253CODE
LOWutils/tools.py1341CODE
LOWutils/tools.py361CODE
LOWutils/channel.py182CODE
LOWutils/channel.py308CODE
LOWutils/channel.py441CODE
LOWutils/channel.py642CODE
LOWutils/channel.py894CODE
LOWutils/channel.py1000CODE
LOWutils/channel.py1132CODE
LOWutils/retry.py8CODE
LOWutils/frozen.py71CODE
LOWutils/ffmpeg/ffmpeg.py35CODE
LOWutils/ffmpeg/probe.py61CODE
LOWutils/ffmpeg/probe.py187CODE
LOWupdates/subscribe/request.py49CODE
LOWupdates/subscribe/request.py106CODE
LOWupdates/epg/request.py110CODE
LOWupdates/epg/request.py159CODE
LOWservice/rtmp.py248CODE
LOWservice/rtmp.py503CODE
LOWservice/app.py228CODE
LOWservice/app.py291CODE
Hyper-Verbose Identifiers33 hits · 35 pts
SeverityFileLineSnippetContext
LOWmain.py211 def _write_epg_files_if_needed(self):CODE
LOWutils/db.py51def ensure_result_data_schema(db_path):CODE
LOWutils/aggregator.py86 async def _atomic_write_sorted_view(CODE
LOWutils/speed.py71def create_speed_test_session(concurrency: int):CODE
LOWutils/whitelist.py118def get_whitelist_total_count(data_map: WhitelistMaps) -> int:CODE
LOWutils/tools.py287def get_total_urls_from_sorted_data(data):CODE
LOWutils/tools.py552def remove_duplicates_from_list(data_list, seen, filter_host=False, ipv6_support=True):CODE
LOWutils/tools.py973def get_request_url_candidates(url: str) -> List[str]:CODE
LOWutils/tools.py1206def sanitize_filename_from_url(url: str, max_len: int = 200) -> str:CODE
LOWutils/channel.py86def _build_total_urls_signature(info_list: list[ChannelData]) -> str:CODE
LOWutils/channel.py169def check_channel_need_frozen(info) -> bool:CODE
LOWutils/channel.py182def get_channel_data_from_file(channels, file, whitelist_maps, blacklist,CODE
LOWutils/channel.py414def get_channel_results_by_name(name, data):CODE
LOWutils/channel.py595def append_old_data_to_info_data(info_data, cate, name, data, whitelist_maps=None, blacklist=None, ipv_type_data=None):CODE
LOWutils/channel.py953def generate_channel_statistic(logger, cate, name, values):CODE
LOWutils/ffmpeg/ffmpeg.py13def check_ffmpeg_installed_status():CODE
LOWupdates/subscribe/request.py49async def get_channels_by_subscribe_urls(CODE
LOWupdates/subscribe/request.py106 def process_subscribe_channels(subscribe_info: str | dict) -> defaultdict:CODE
LOWtkinter_ui/speed.py176 def update_speed_test_timeout(self, event):CODE
LOWtkinter_ui/speed.py189 def update_open_filter_resolution(self):CODE
LOWtkinter_ui/speed.py202 def update_speed_test_filter_host(self, event):CODE
LOWtkinter_ui/tkinter_ui.py77 def view_result_link_callback(self, event):CODE
LOWtkinter_ui/default.py555 def update_open_empty_category(self):CODE
LOWtkinter_ui/default.py568 def update_update_time_position(self, event):CODE
LOWtkinter_ui/prefer.py86 def get_origin_type_prefer_index(self, origin_type_prefer):CODE
LOWservice/rtmp.py157def ensure_hls_idle_monitor_started():CODE
LOWservice/rtmp.py193def invalidate_video_encoder_args_cache():CODE
LOWservice/rtmp.py204def _get_video_encoder_candidates():CODE
LOWservice/rtmp.py78def _release_stream_reservation(channel_id):CODE
LOWservice/rtmp.py117def _save_probe_metadata_to_db(channel_id: str, url: str, headers: dict | None, meta: dict | None):CODE
LOWservice/rtmp.py248def _start_reserved_hls_to_rtmp(host, channel_id, client_user_agent: str | None = None):CODE
LOWservice/rtmp.py280 def _client_needs_transcode_for_codec(user_agent: str | None, video_codec: str | None) -> bool:CODE
LOWservice/rtmp.py337 def _audio_compatible_with_flv(audio_codec: str | None) -> bool:CODE
Unused Imports10 hits · 10 pts
SeverityFileLineSnippetContext
LOWutils/ffmpeg/__init__.py1CODE
LOWutils/ffmpeg/__init__.py1CODE
LOWutils/ffmpeg/__init__.py2CODE
LOWutils/ffmpeg/__init__.py2CODE
LOWutils/ffmpeg/__init__.py2CODE
LOWutils/ip_checker/__init__.py1CODE
LOWupdates/subscribe/__init__.py1CODE
LOWupdates/epg/__init__.py1CODE
LOWupdates/epg/__init__.py2CODE
LOWupdates/epg/__init__.py2CODE
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOWconfig/whitelist.txt1# 这是接口的白名单,白名单内的接口将不会参与测速,始终保留至结果最前;COMMENT
LOWconfig/local.txt1# 这是本地源列表,一行一个源,格式为:频道名称,接口地址COMMENT
AI Structural Patterns2 hits · 2 pts
SeverityFileLineSnippetContext
LOWutils/speed.py255CODE
LOWutils/speed.py564CODE
Modern Structural Boilerplate2 hits · 2 pts
SeverityFileLineSnippetContext
LOWutils/frozen.py98__all__ = ["mark_url_bad", "mark_url_good", "is_url_frozen", "get_current_frozen_set", "load", "save"]CODE
LOWutils/ffmpeg/__init__.py4__all__ = [CODE
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWutils/speed.py62 "placeholder",CODE