Repository Analysis

alexta69/metube

Self-hosted video downloader for YouTube and other sites (web UI for yt-dlp)

14.4 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of alexta69/metube, a Python project with 14,100 GitHub stars. SynthScan v2.0 examined 21,835 lines of code across 82 source files, recording 299 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 14.4 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).

14.4
Adjusted Score
14.4
Raw Score
100%
Time Factor
2026-07-13
Last Push
14.1K
Stars
Python
Language
21.8K
Lines of Code
82
Files
299
Pattern Hits
2026-07-14
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 2LOW 296

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 299 distinct pattern matches across 7 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 Identifiers238 hits · 253 pts
SeverityFileLineSnippetContext
LOWapp/state_store.py192 def _warn_direct_write_fallback(self, exc: OSError) -> None:CODE
LOWapp/ytdl.py147def _sanitize_entry_for_pickle(obj, _depth=0):CODE
LOWapp/ytdl.py460def _download_info_from_record(record: dict[str, Any]) -> DownloadInfo:CODE
LOWapp/ytdl.py983 def _seconds_until_next_probe(self) -> Optional[float]:CODE
LOWapp/ytdl.py1021 async def _probe_scheduled_download(self, download: Download) -> None:CODE
LOWapp/ytdl.py1090 def _schedule_upcoming_download(self, download: Download) -> None:CODE
LOWapp/subscriptions.py144def _is_subscriber_only_entry(entry: dict) -> bool:CODE
LOWapp/subscriptions.py239def _normalize_subscription_record(rec: dict[str, Any]) -> dict[str, Any]:CODE
LOWapp/subscriptions.py257def _subscription_from_record(record: Any) -> Optional[SubscriptionInfo]:CODE
LOWapp/subscriptions.py270def _normalize_title_regex_value(value: Any) -> str:CODE
LOWapp/subscriptions.py404 async def _queue_subscription_entries(CODE
LOWapp/dl_formats.py34def _normalize_subtitle_language(language: str) -> str:CODE
LOWapp/main.py37def seconds_until_next_daily_time(time_hhmm: str, now: datetime | None = None) -> float:CODE
LOWapp/main.py334def _parse_ytdl_options_overrides(value, *, enabled: bool) -> dict:CODE
LOWapp/main.py398def _parse_clip_timestamp_value(value) -> float:CODE
LOWapp/main.py428def _clip_field_provided_in_post(raw) -> bool:CODE
LOWapp/main.py436def _extract_t_query_from_url(url: str) -> tuple[str, float | None]:CODE
LOWapp/main.py470def _parse_ytdl_options_presets(post: dict) -> list[str]:CODE
LOWapp/main.py571async def _shutdown_download_manager(app):CODE
LOWapp/main.py606async def _subscription_loop_startup(app):CODE
LOWapp/main.py627async def _start_nightly_update_schedule(app):CODE
LOWapp/tests/test_nightly_update.py12 def test_seconds_until_later_today(self):CODE
LOWapp/tests/test_nightly_update.py17 def test_seconds_until_wraps_to_next_day(self):CODE
LOWapp/tests/test_nightly_update.py22 def test_seconds_until_same_minute_is_next_day(self):CODE
LOWapp/tests/test_state_store.py13 def test_save_and_load_roundtrip(self):CODE
LOWapp/tests/test_state_store.py25 def test_save_falls_back_to_direct_write_when_mkstemp_fails(self):CODE
LOWapp/tests/test_state_store.py44 def test_fallback_tightens_permissions_on_existing_file(self):CODE
LOWapp/tests/test_state_store.py61 def test_save_falls_back_to_direct_write_when_replace_fails(self):CODE
LOWapp/tests/test_state_store.py77 def test_save_reraises_when_atomic_and_direct_write_fail(self):CODE
LOWapp/tests/test_state_store.py96 def test_unsupported_fsync_keeps_atomic_path(self):CODE
LOWapp/tests/test_state_store.py115 def test_save_reraises_and_preserves_state_on_non_atomic_errno(self):CODE
LOWapp/tests/test_state_store.py137 def test_serialization_failure_preserves_existing_state(self):CODE
LOWapp/tests/test_state_store.py154 def test_invalid_file_is_quarantined(self):CODE
LOWapp/tests/test_state_store.py168 def test_json_compat_helpers_roundtrip_bytes_and_datetime(self):CODE
LOWapp/tests/test_subscriptions.py88 def test_is_subscriber_only_detects_availability(self):CODE
LOWapp/tests/test_subscriptions.py93 def test_coerce_optional_bool_defaults_and_fields(self):CODE
LOWapp/tests/test_subscriptions.py102 def test_load_imports_legacy_subscription_shelf(self):CODE
LOWapp/tests/test_subscriptions.py125 def test_invalid_json_is_quarantined_and_legacy_is_imported(self):CODE
LOWapp/tests/test_subscriptions.py148 def test_load_rewrites_old_json_and_trims_seen_ids(self):CODE
LOWapp/tests/test_subscriptions.py197 async def test_add_subscription_rolls_back_when_state_write_fails(self):CODE
LOWapp/tests/test_subscriptions.py237 async def test_add_subscription_marks_existing_videos_seen_without_queueing(self):CODE
LOWapp/tests/test_subscriptions.py276 async def test_add_subscription_skips_collection_tab_entries(self):CODE
LOWapp/tests/test_subscriptions.py326 async def test_check_now_keeps_failed_queue_items_unseen_and_sets_error(self):CODE
LOWapp/tests/test_subscriptions.py367 async def test_check_now_queues_new_video_and_updates_seen_ids(self):CODE
LOWapp/tests/test_subscriptions.py412 async def test_check_now_queues_subscriber_only_when_skip_disabled(self):CODE
LOWapp/tests/test_subscriptions.py463 async def test_check_now_skips_subscriber_only_when_skip_enabled(self):CODE
LOWapp/tests/test_subscriptions.py514 async def test_update_subscription_parses_string_false_enabled(self):CODE
LOWapp/tests/test_subscriptions.py548 async def test_update_subscription_rejects_invalid_enabled_value(self):CODE
LOWapp/tests/test_subscriptions.py589 async def test_add_subscription_rejects_invalid_title_regex(self):CODE
LOWapp/tests/test_subscriptions.py620 async def test_add_subscription_stores_and_exposes_title_regex(self):CODE
LOWapp/tests/test_subscriptions.py652 async def test_check_now_title_regex_queues_only_matches_and_marks_unmatched_seen(self):CODE
LOWapp/tests/test_subscriptions.py707 async def test_check_now_title_regex_queue_failure_keeps_matched_id_unseen(self):CODE
LOWapp/tests/test_subscriptions.py759 async def test_update_subscription_rejects_invalid_title_regex(self):CODE
LOWapp/tests/test_subscriptions.py791 async def test_update_subscription_persists_valid_title_regex(self):CODE
LOWapp/tests/test_subscriptions.py824 async def test_update_subscription_skip_subscriber_only(self):CODE
LOWapp/tests/test_subscriptions.py858 async def test_update_subscription_rejects_invalid_skip_subscriber_only(self):CODE
LOWapp/tests/test_subscriptions.py890 def test_persistence_includes_title_regex(self):CODE
LOWapp/tests/test_subscriptions.py932 def test_persistence_includes_skip_subscriber_only(self):CODE
LOWapp/tests/test_subscriptions.py976 def test_descends_one_level_when_root_entries_are_nested_collections(self):CODE
LOWapp/tests/test_subscriptions.py1027 def test_extra_opts_applied_on_top_of_config_options(self):CODE
178 more matches not shown…
Excessive Try-Catch Wrapping22 hits · 24 pts
SeverityFileLineSnippetContext
LOWapp/state_store.py75 except Exception as exc:CODE
LOWapp/state_store.py113 except Exception as exc:CODE
LOWapp/state_store.py144 except Exception:CODE
MEDIUMapp/ytdl.py685def running(self):CODE
MEDIUMapp/ytdl.py967def _wake_live_monitor(self) -> None:CODE
LOWapp/ytdl.py171 except Exception:CODE
LOWapp/ytdl.py176 except Exception:CODE
LOWapp/ytdl.py674 except Exception as e:CODE
LOWapp/ytdl.py879 except Exception:CODE
LOWapp/ytdl.py892 except Exception:CODE
LOWapp/ytdl.py1013 except Exception as exc:CODE
LOWapp/ytdl.py1038 except Exception as exc:CODE
LOWapp/subscriptions.py478 except Exception as e:CODE
LOWapp/subscriptions.py632 except Exception:CODE
LOWapp/subscriptions.py657 except Exception:CODE
LOWapp/subscriptions.py723 except Exception:CODE
LOWapp/subscriptions.py788 except Exception:CODE
LOWapp/subscriptions.py807 except Exception:CODE
LOWapp/subscriptions.py823 except Exception:CODE
LOWapp/subscriptions.py947 except Exception:CODE
LOWapp/main.py289 except Exception:CODE
LOWapp/main.py446 except Exception:CODE
Deep Nesting16 hits · 14 pts
SeverityFileLineSnippetContext
LOWapp/ytdl.py180CODE
LOWapp/ytdl.py321CODE
LOWapp/ytdl.py548CODE
LOWapp/ytdl.py694CODE
LOWapp/ytdl.py989CODE
LOWapp/ytdl.py1242CODE
LOWapp/ytdl.py1563CODE
LOWapp/ytdl.py562CODE
LOWapp/subscriptions.py90CODE
LOWapp/subscriptions.py239CODE
LOWapp/subscriptions.py766CODE
LOWapp/dl_formats.py96CODE
LOWapp/main.py487CODE
LOWapp/main.py697CODE
LOWapp/tests/test_state_store.py77CODE
LOWapp/tests/test_subscriptions.py197CODE
Unused Imports15 hits · 12 pts
SeverityFileLineSnippetContext
LOWapp/state_store.py1CODE
LOWapp/ytdl.py2CODE
LOWapp/subscriptions.py3CODE
LOWapp/tests/conftest.py3CODE
LOWapp/tests/test_nightly_update.py3CODE
LOWapp/tests/test_state_store.py1CODE
LOWapp/tests/test_subscriptions.py1CODE
LOWapp/tests/test_dl_formats.py3CODE
LOWapp/tests/test_config.py3CODE
LOWapp/tests/test_main_helpers.py3CODE
LOWapp/tests/test_api.py3CODE
LOWapp/tests/test_download_queue.py3CODE
LOWapp/tests/test_ytdl_utils.py3CODE
LOWapp/tests/test_bg_tasks.py3CODE
LOWapp/tests/test_persistent_queue.py3CODE
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippetContext
LOWapp/main.py635 # Check if this path matches our YTDL_OPTIONS_FILECOMMENT
LOW.github/workflows/update-yt-dlp.yml28 # Check if yt-dlp has updates availableCOMMENT
LOW.github/workflows/main.yml198 # Check if release exists and delete itCOMMENT
LOW.github/workflows/main.yml207 # Check if tag exists (locally or remotely) and delete itCOMMENT
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHapp/dl_formats.py40 Returns yt-dlp format selector. Args: download_type (str): selected content type (video, audio, captionsSTRING
AI Structural Patterns3 hits · 2 pts
SeverityFileLineSnippetContext
LOWapp/ytdl.py253CODE
LOWapp/ytdl.py1409CODE
LOWapp/ytdl.py1476CODE