AI Slop Code RIsk Monitor

alexta69/metube

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

21.4 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for alexta69/metube, a Python project with 14,965 GitHub stars. SynthScan examined 29,577 lines of code across 91 source files, recording 647 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 21.4 (Elevated pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

21.4
Adjusted Signal
21.4
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
15.0K
Stars
Python
Language
29.6K
Lines of Code
91
Files
647
Pattern Hits
2026-10-12
Scan Date
0.14
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 59.5/100 · HIGH

Can maintainers explain intent, assumptions, and trade-offs? 593 finding(s).

Hallucinated Dependency & Supply Chain Risk 2.4/100 · LOW

Are imports declared and package/API names verified? 19 finding(s).

Agent Over-Engineering Ratio 63.5/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 604 finding(s).

PR Review Velocity Impact 70.2/100 · HIGH

Which changes need focused human review? 647 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 13MEDIUM 2LOW 632

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 647 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers565 hits · 509 pts
SeverityFileLineSnippetContext
LOWapp/state_store.py192 def _warn_direct_write_fallback(self, exc: OSError) -> None:CODE
LOWapp/ytdl.py392def _sanitize_entry_for_pickle(obj, _depth=0):CODE
LOWapp/ytdl.py699def _short_title_for_failed_url(url: str) -> str:CODE
LOWapp/ytdl.py742def _download_info_from_record(record: dict[str, Any]) -> DownloadInfo:CODE
LOWapp/ytdl.py1473 def _seconds_until_next_probe(self) -> Optional[float]:CODE
LOWapp/ytdl.py1511 async def _probe_scheduled_download(self, download: Download) -> None:CODE
LOWapp/ytdl.py1581 async def _schedule_upcoming_download(self, download: Download) -> None:CODE
LOWapp/ytdl.py1753 def __write_feed_metadata_sync(self, entry, etype, download_type, folder,CODE
LOWapp/subscriptions.py231def _is_subscriber_only_entry(entry: dict) -> bool:CODE
LOWapp/subscriptions.py341def _normalize_subscription_record(rec: dict[str, Any]) -> dict[str, Any]:CODE
LOWapp/subscriptions.py359def _subscription_from_record(record: Any) -> Optional[SubscriptionInfo]:CODE
LOWapp/subscriptions.py372def _normalize_title_regex_value(value: Any) -> str:CODE
LOWapp/subscriptions.py393def validate_subscription_name(value: Any) -> str:CODE
LOWapp/subscriptions.py406def validate_subscription_folder(value: Any) -> str:CODE
LOWapp/subscriptions.py551 async def _queue_subscription_entries(CODE
LOWapp/dl_formats.py56def _normalize_subtitle_language(language: str) -> str:CODE
LOWapp/main.py38def seconds_until_next_daily_time(time_hhmm: str, now: datetime | None = None) -> float:CODE
LOWapp/main.py490def _parse_ytdl_options_overrides(value, *, enabled: bool) -> dict:CODE
LOWapp/main.py554def _parse_clip_timestamp_value(value) -> float:CODE
LOW⚡app/main.py584def _clip_field_provided_in_post(raw) -> bool:CODE
LOW⚡app/main.py592def _extract_t_query_from_url(url: str) -> tuple[str, float | None]:CODE
LOWapp/main.py626def _parse_ytdl_options_presets(post: dict) -> list[str]:CODE
LOWapp/main.py643def _require_configured_presets(names: list[str]) -> None:CODE
LOWapp/main.py734async def _shutdown_download_manager(app):CODE
LOWapp/main.py769async def _subscription_loop_startup(app):CODE
LOWapp/main.py790async def _start_nightly_update_schedule(app):CODE
LOWapp/main.py1235def warn_if_cookiefile_shadowed():CODE
LOWapp/url_guard.py153def _address_allowed_at_connect(addr: str, is_allowed_endpoint: bool = False) -> bool:CODE
LOW⚡app/tests/test_nightly_update.py12 def test_seconds_until_later_today(self):CODE
LOW⚡app/tests/test_nightly_update.py17 def test_seconds_until_wraps_to_next_day(self):CODE
LOW⚡app/tests/test_nightly_update.py22 def test_seconds_until_same_minute_is_next_day(self):CODE
LOWapp/tests/test_music_metadata.py14def test_album_uses_existing_order_and_total_when_track_number_is_missing():CODE
LOW⚡app/tests/test_music_metadata.py28def test_official_track_number_wins_over_album_order():CODE
LOW⚡app/tests/test_music_metadata.py38def test_inline_official_track_total_is_preserved():CODE
LOW⚡app/tests/test_music_metadata.py47def test_source_track_number_and_total_are_retained_from_flat_extraction():CODE
LOW⚡app/tests/test_music_metadata.py56def test_album_title_falls_back_to_source_playlist_title():CODE
LOW⚡app/tests/test_music_metadata.py66def test_playlist_without_extractor_album_signals_is_not_changed():CODE
LOWapp/tests/test_music_metadata.py80def test_regular_video_artwork_is_not_changed():CODE
LOWapp/tests/test_music_metadata.py91def test_music_audio_prefers_largest_existing_square_thumbnail():CODE
LOWapp/tests/test_music_metadata.py108def test_landscape_only_music_artwork_keeps_existing_order():CODE
LOW⚡app/tests/test_url_guard.py30 def test_bare_video_id_allowed(self):CODE
LOW⚡app/tests/test_url_guard.py33 def test_ytsearch_prefix_allowed(self):CODE
LOW⚡app/tests/test_url_guard.py36 def test_empty_string_allowed(self):CODE
LOW⚡app/tests/test_url_guard.py55 def test_localhost_blocked_without_lookup(self):CODE
LOW⚡app/tests/test_url_guard.py60 def test_localhost_subdomain_blocked(self):CODE
LOW⚡app/tests/test_url_guard.py63 def test_gcp_metadata_name_blocked(self):CODE
LOW⚡app/tests/test_url_guard.py72 def test_public_https_allowed(self):CODE
LOW⚡app/tests/test_url_guard.py78 def test_link_local_metadata_blocked(self):CODE
LOW⚡app/tests/test_url_guard.py87 def test_decimal_ip_form_blocked(self):CODE
LOW⚡app/tests/test_url_guard.py120 def test_loopback_blocked_by_default(self):CODE
LOW⚡app/tests/test_url_guard.py126 def test_loopback_allowed_only_when_opted_in(self):CODE
LOW⚡app/tests/test_url_guard.py130 def test_proxy_opt_in_covers_any_internal_range(self):CODE
LOW⚡app/tests/test_url_guard.py138 def test_opt_in_still_rejects_non_addresses(self):CODE
LOW⚡app/tests/test_url_guard.py141 def test_link_local_metadata_blocked(self):CODE
LOW⚡app/tests/test_url_guard.py173 def test_sixtofour_and_teredo_stay_blocked(self):CODE
LOW⚡app/tests/test_url_guard.py180 def test_plain_addresses_unaffected(self):CODE
LOW⚡app/tests/test_url_guard.py185 def test_tunnelled_form_blocked_at_ingress(self):CODE
LOW⚡app/tests/test_url_guard.py224 def test_internal_only_raises(self):CODE
LOW⚡app/tests/test_url_guard.py229 def test_filters_internal_keeps_global(self):CODE
LOW⚡app/tests/test_url_guard.py235 def test_loopback_blocked_without_matching_proxy(self):CODE
505 more matches not shown…
Empty Error Handlers12 hits · 60 pts
SeverityFileLineSnippetContext
HIGHapp/state_store.py234except OSError:CODE
HIGHapp/state_store.py167except OSError:CODE
HIGHapp/state_store.py147except OSError:CODE
HIGHapp/ytdl.py918except ValueError:CODE
HIGHapp/ytdl.py1051except (OSError, AttributeError):CODE
HIGHapp/ytdl.py1460except RuntimeError:CODE
HIGHapp/ytdl.py908except OSError:CODE
HIGHapp/ytdl.py1469except (TypeError, ValueError):CODE
HIGHapp/ytdl.py1484except asyncio.TimeoutError:CODE
HIGHapp/ytdl.py1609except OSError:CODE
HIGHapp/ytdl.py2372except FileNotFoundError:CODE
HIGHapp/main.py344except Exception:CODE
Excessive Try-Catch Wrapping23 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.py1091def running(self):CODE
MEDIUMapp/ytdl.py1826def __write_feed_metadata(self, entry, etype, download_type, folder,CODE
LOWapp/ytdl.py416 except Exception:CODE
LOWapp/ytdl.py421 except Exception:CODE
LOWapp/ytdl.py1059 except Exception as e:CODE
LOWapp/ytdl.py1330 except Exception:CODE
LOWapp/ytdl.py1344 except Exception:CODE
LOWapp/ytdl.py1503 except Exception as exc:CODE
LOWapp/ytdl.py1529 except Exception as exc:CODE
LOWapp/ytdl.py1836 except Exception as exc:CODE
LOWapp/subscriptions.py633 except Exception as e:CODE
LOWapp/subscriptions.py810 except Exception:CODE
LOWapp/subscriptions.py835 except Exception:CODE
LOWapp/subscriptions.py919 except Exception:CODE
LOWapp/subscriptions.py984 except Exception:CODE
LOWapp/subscriptions.py1003 except Exception:CODE
LOWapp/subscriptions.py1019 except Exception:CODE
LOWapp/subscriptions.py1151 except Exception:CODE
LOWapp/main.py344 except Exception:CODE
LOW⚡app/main.py602 except Exception:CODE
Unused Imports19 hits · 14 pts
SeverityFileLineSnippetContext
LOWapp/state_store.py1CODE
LOWapp/ytdl.py2CODE
LOWapp/subscriptions.py3CODE
LOWapp/music_metadata.py8CODE
LOWapp/tests/conftest.py3CODE
LOWapp/tests/test_nightly_update.py3CODE
LOWapp/tests/test_music_metadata.py3CODE
LOWapp/tests/test_url_guard.py3CODE
LOWapp/tests/test_state_store.py1CODE
LOWapp/tests/test_format_catalog.py4CODE
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
Deep Nesting16 hits · 12 pts
SeverityFileLineSnippetContext
LOWapp/ytdl.py425CODE
LOWapp/ytdl.py580CODE
LOWapp/ytdl.py832CODE
LOWapp/ytdl.py1100CODE
LOWapp/ytdl.py1479CODE
LOWapp/ytdl.py1840CODE
LOWapp/ytdl.py2337CODE
LOWapp/ytdl.py849CODE
LOWapp/subscriptions.py98CODE
LOWapp/subscriptions.py341CODE
LOWapp/subscriptions.py962CODE
LOWapp/dl_formats.py120CODE
LOWapp/main.py649CODE
LOWapp/main.py860CODE
LOWapp/tests/test_state_store.py77CODE
LOWapp/tests/test_subscriptions.py201CODE
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHapp/dl_formats.py62 Returns yt-dlp format selector. Args: download_type (str): selected content type (video, audio, captionsSTRING
Over-Commented Block5 hits · 4 pts
SeverityFileLineSnippetContext
LOWapp/ytdl.py121# (this app's only supported deployment target, per the Dockerfile) from forkCOMMENT
LOWapp/ytdl.py1121 if getattr(self.info, 'download_type', '') == 'captions':COMMENT
LOWapp/dl_formats.py1"""Maps the options in format_catalog onto yt-dlp format selectors and options."""COMMENT
LOWapp/main.py1481COMMENT
LOWapp/url_guard.py441 # The proxy resolves this hostname on its own network, so a lookup hereCOMMENT
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWapp/main.py798 # Check if this path matches our YTDL_OPTIONS_FILECOMMENT
LOW.github/workflows/update-yt-dlp.yml28 # Check if yt-dlp has updates availableCOMMENT
AI Structural Patterns4 hits · 2 pts
SeverityFileLineSnippetContext
LOWapp/ytdl.py498CODE
LOWapp/ytdl.py2088CODE
LOWapp/ytdl.py2240CODE
LOWapp/subscriptions.py675CODE