Repository Analysis

alexta69/metube

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

11.8 Low AI signal View on GitHub
11.8
Adjusted Score
11.8
Raw Score
100%
Time Factor
2026-05-30
Last Push
13,690
Stars
Python
Language
19,143
Lines of Code
76
Files
198
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 1MEDIUM 1LOW 196

Pattern Findings

198 matches across 6 categories. Click a row to expand file-level details.

Hyper-Verbose Identifiers148 hits · 169 pts
SeverityFileLineSnippet
LOWapp/ytdl.py87def _sanitize_entry_for_pickle(obj, _depth=0):
LOWapp/ytdl.py358def _download_info_from_record(record: dict[str, Any]) -> DownloadInfo:
LOWapp/subscriptions.py130def _is_subscriber_only_entry(entry: dict) -> bool:
LOWapp/subscriptions.py225def _normalize_subscription_record(rec: dict[str, Any]) -> dict[str, Any]:
LOWapp/subscriptions.py243def _subscription_from_record(record: Any) -> Optional[SubscriptionInfo]:
LOWapp/subscriptions.py256def _normalize_title_regex_value(value: Any) -> str:
LOWapp/subscriptions.py372 async def _queue_subscription_entries(
LOWapp/dl_formats.py19def _normalize_subtitle_language(language: str) -> str:
LOWapp/main.py245def _parse_ytdl_options_overrides(value, *, enabled: bool) -> dict:
LOWapp/main.py309def _parse_clip_timestamp_value(value) -> float:
LOWapp/main.py339def _clip_field_provided_in_post(raw) -> bool:
LOWapp/main.py347def _extract_t_query_from_url(url: str) -> tuple[str, float | None]:
LOWapp/main.py373def _parse_ytdl_options_presets(post: dict) -> list[str]:
LOWapp/main.py492async def _subscription_loop_startup(app):
LOWapp/tests/test_state_store.py12 def test_save_and_load_roundtrip(self):
LOWapp/tests/test_state_store.py24 def test_invalid_file_is_quarantined(self):
LOWapp/tests/test_state_store.py38 def test_json_compat_helpers_roundtrip_bytes_and_datetime(self):
LOWapp/tests/test_subscriptions.py84 def test_is_subscriber_only_detects_availability(self):
LOWapp/tests/test_subscriptions.py89 def test_coerce_optional_bool_defaults_and_fields(self):
LOWapp/tests/test_subscriptions.py98 def test_load_imports_legacy_subscription_shelf(self):
LOWapp/tests/test_subscriptions.py121 def test_invalid_json_is_quarantined_and_legacy_is_imported(self):
LOWapp/tests/test_subscriptions.py144 def test_load_rewrites_old_json_and_trims_seen_ids(self):
LOWapp/tests/test_subscriptions.py193 async def test_add_subscription_rolls_back_when_state_write_fails(self):
LOWapp/tests/test_subscriptions.py233 async def test_add_subscription_marks_existing_videos_seen_without_queueing(self):
LOWapp/tests/test_subscriptions.py272 async def test_add_subscription_skips_collection_tab_entries(self):
LOWapp/tests/test_subscriptions.py322 async def test_check_now_keeps_failed_queue_items_unseen_and_sets_error(self):
LOWapp/tests/test_subscriptions.py363 async def test_check_now_queues_new_video_and_updates_seen_ids(self):
LOWapp/tests/test_subscriptions.py408 async def test_check_now_queues_subscriber_only_when_skip_disabled(self):
LOWapp/tests/test_subscriptions.py459 async def test_check_now_skips_subscriber_only_when_skip_enabled(self):
LOWapp/tests/test_subscriptions.py510 async def test_update_subscription_parses_string_false_enabled(self):
LOWapp/tests/test_subscriptions.py544 async def test_update_subscription_rejects_invalid_enabled_value(self):
LOWapp/tests/test_subscriptions.py577 async def test_add_subscription_rejects_invalid_title_regex(self):
LOWapp/tests/test_subscriptions.py608 async def test_add_subscription_stores_and_exposes_title_regex(self):
LOWapp/tests/test_subscriptions.py640 async def test_check_now_title_regex_queues_only_matches_and_marks_unmatched_seen(self):
LOWapp/tests/test_subscriptions.py695 async def test_check_now_title_regex_queue_failure_keeps_matched_id_unseen(self):
LOWapp/tests/test_subscriptions.py747 async def test_update_subscription_rejects_invalid_title_regex(self):
LOWapp/tests/test_subscriptions.py779 async def test_update_subscription_persists_valid_title_regex(self):
LOWapp/tests/test_subscriptions.py812 async def test_update_subscription_skip_subscriber_only(self):
LOWapp/tests/test_subscriptions.py846 async def test_update_subscription_rejects_invalid_skip_subscriber_only(self):
LOWapp/tests/test_subscriptions.py878 def test_persistence_includes_title_regex(self):
LOWapp/tests/test_subscriptions.py920 def test_persistence_includes_skip_subscriber_only(self):
LOWapp/tests/test_subscriptions.py964 def test_descends_one_level_when_root_entries_are_nested_collections(self):
LOWapp/tests/test_dl_formats.py17 def test_audio_unknown_format_raises_value_error(self):
LOWapp/tests/test_dl_formats.py21 def test_wav_does_not_enable_thumbnail_postprocessing(self):
LOWapp/tests/test_dl_formats.py29 def test_custom_format_passthrough(self):
LOWapp/tests/test_dl_formats.py32 def test_thumbnail_and_captions_format_strings(self):
LOWapp/tests/test_dl_formats.py41 def test_video_unknown_format_raises(self):
LOWapp/tests/test_dl_formats.py45 def test_unknown_download_type_raises(self):
LOWapp/tests/test_dl_formats.py64 def test_video_ios_selector_contains_avc_pattern(self):
LOWapp/tests/test_dl_formats.py68 def test_get_opts_deepcopy_does_not_mutate_input(self):
LOWapp/tests/test_dl_formats.py84 def test_get_opts_thumbnail_skip_download(self):
LOWapp/tests/test_dl_formats.py89 def test_get_opts_captions_manual_only(self):
LOWapp/tests/test_dl_formats.py97 def test_get_opts_captions_auto_only(self):
LOWapp/tests/test_dl_formats.py105 def test_get_opts_captions_prefer_auto(self):
LOWapp/tests/test_dl_formats.py113 def test_get_opts_captions_prefer_manual_default_branch(self):
LOWapp/tests/test_dl_formats.py119 def test_get_opts_captions_txt_maps_to_srt_format(self):
LOWapp/tests/test_dl_formats.py123 def test_get_opts_merges_existing_postprocessors(self):
LOWapp/tests/test_dl_formats.py129 def test_normalize_caption_mode_invalid_defaults(self):
LOWapp/tests/test_dl_formats.py133 def test_normalize_subtitle_language_empty_defaults_en(self):
LOWapp/tests/test_config.py21 def test_url_prefix_gets_trailing_slash(self):
88 more matches not shown…
Excessive Try-Catch Wrapping19 hits · 20 pts
SeverityFileLineSnippet
LOWapp/state_store.py55 except Exception as exc:
LOWapp/state_store.py92 except Exception as exc:
LOWapp/state_store.py114 except Exception:
LOWapp/ytdl.py111 except Exception:
LOWapp/ytdl.py116 except Exception:
LOWapp/ytdl.py528 except Exception as e:
LOWapp/ytdl.py724 except Exception:
LOWapp/ytdl.py737 except Exception:
LOWapp/ytdl.py1198 except Exception as e:
MEDIUMapp/ytdl.py539def running(self):
LOWapp/subscriptions.py450 except Exception as e:
LOWapp/subscriptions.py578 except Exception:
LOWapp/subscriptions.py603 except Exception:
LOWapp/subscriptions.py651 except Exception:
LOWapp/subscriptions.py693 except Exception:
LOWapp/subscriptions.py711 except Exception:
LOWapp/subscriptions.py831 except Exception:
LOWapp/main.py226 except Exception:
LOWapp/main.py352 except Exception:
Deep Nesting13 hits · 12 pts
SeverityFileLineSnippet
LOWapp/ytdl.py120
LOWapp/ytdl.py225
LOWapp/ytdl.py416
LOWapp/ytdl.py548
LOWapp/ytdl.py896
LOWapp/ytdl.py433
LOWapp/subscriptions.py79
LOWapp/subscriptions.py225
LOWapp/subscriptions.py679
LOWapp/dl_formats.py77
LOWapp/main.py390
LOWapp/main.py559
LOWapp/tests/test_subscriptions.py193
Unused Imports13 hits · 12 pts
SeverityFileLineSnippet
LOWapp/state_store.py1
LOWapp/ytdl.py2
LOWapp/subscriptions.py3
LOWapp/tests/conftest.py3
LOWapp/tests/test_state_store.py1
LOWapp/tests/test_subscriptions.py1
LOWapp/tests/test_dl_formats.py3
LOWapp/tests/test_config.py3
LOWapp/tests/test_main_helpers.py3
LOWapp/tests/test_api.py3
LOWapp/tests/test_download_queue.py3
LOWapp/tests/test_ytdl_utils.py3
LOWapp/tests/test_persistent_queue.py3
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippet
LOWapp/main.py501 # Check if this path matches our YTDL_OPTIONS_FILE
LOW.github/workflows/update-yt-dlp.yml28 # Check if yt-dlp has updates available
LOW.github/workflows/main.yml198 # Check if release exists and delete it
LOW.github/workflows/main.yml207 # Check if tag exists (locally or remotely) and delete it
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippet
HIGHapp/dl_formats.py25 Returns yt-dlp format selector. Args: download_type (str): selected content type (video, audio, captions