Your self hosted YouTube media server
This report summarizes scanner evidence for tubearchivist/tubearchivist, a Python project with 8,561 GitHub stars. SynthScan examined 39,036 lines of code across 351 source files, recording 96 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 3.8 (Low 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.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 63 finding(s).
Are imports declared and package/API names verified? 9 finding(s).
Are wrappers, guards, and repeated structures necessary? 78 finding(s).
Which changes need focused human review? 96 finding(s).
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.
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.
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.
The scanner identified 96 distinct pattern matches across 10 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/video/src/meta_embed.py | 244 | def _process_embedded_playlist(self, playlist_data) -> dict | None: | CODE |
| LOW | backend/playlist/src/index.py | 180 | def remove_vids_from_playlist(self): | CODE |
| LOW | backend/playlist/src/index.py | 393 | def remove_playlist_from_video(self, video_id): | CODE |
| LOW | backend/playlist/src/index.py | 472 | def playlist_entries_contains(self, video_id): | CODE |
| LOW | backend/config/management/commands/ta_startup.py | 236 | def _create_default_schedules(self) -> None: | CODE |
| LOW | backend/config/management/commands/ta_startup.py | 316 | def _mig_fix_playlist_description(self) -> None: | CODE |
| LOW | backend/config/management/commands/ta_startup.py | 351 | def _mig_fix_channel_art_types(self) -> None: | CODE |
| LOW | backend/config/management/commands/ta_startup.py | 379 | def _mig_fix_channel_description(self) -> None: | STRING |
| LOW | backend/config/management/commands/ta_startup.py | 405 | def _mig_fix_video_description(self) -> None: | CODE |
| LOW | backend/config/management/commands/ta_envcheck.py | 94 | def _additional_auth_vars_expectations(self): | CODE |
| LOW | backend/channel/tests/test_src/test_remote_query.py | 40 | def test_build_all_queries_with_limit(default_config, empty_overwrites): | CODE |
| LOW | backend/channel/tests/test_src/test_remote_query.py | 52 | def test_build_all_queries_without_limit(default_config, empty_overwrites): | CODE |
| LOW | backend/channel/tests/test_src/test_remote_query.py | 64 | def test_build_specific_query(default_config, empty_overwrites): | CODE |
| LOW | backend/channel/tests/test_src/test_remote_query.py | 82 | def test_build_multiple_queries(default_config, empty_overwrites): | CODE |
| LOW⚡ | backend/channel/tests/test_src/test_remote_query.py | 103 | def test_no_limit_ignores_config_and_overwrites(default_config, overwrites): | CODE |
| LOW⚡ | backend/channel/tests/test_src/test_remote_query.py | 110 | def test_zero_query_not_included(default_config): | CODE |
| LOW⚡ | backend/channel/tests/test_src/test_remote_query.py | 118 | def test_zero_config_overwrite(default_config): | CODE |
| LOW | backend/channel/tests/test_src/test_remote_query.py | 137 | def test_invalid_video_type_is_ignored(default_config): | CODE |
| LOW | backend/common/views_base.py | 166 | def validate_channel_art_type(self, channel_art: str) -> None: | CODE |
| LOW | backend/common/tests/test_src/test_pagination.py | 72 | def test_result_window_boundary(make_pagination, total, page_size, last_page): | CODE |
| LOW | backend/common/tests/test_src/test_pagination.py | 87 | def test_page_beyond_result_window(make_pagination, page, page_size): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 14 | def test_randomizor_with_positive_length(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 22 | def test_date_parser_with_int(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 29 | def test_date_parser_with_digit(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 36 | def test_date_parser_with_float(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 43 | def test_date_parser_with_str(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 50 | def test_date_parser_with_invalid_input(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 57 | def test_date_parser_with_invalid_string_format(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 64 | def test_time_parser_with_numeric_string(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 71 | def test_time_parser_with_hh_mm_ss_format(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 78 | def test_time_parser_with_empty_string(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 84 | def test_time_parser_with_invalid_format(): | CODE |
| LOW⚡ | backend/common/tests/test_src/test_helper.py | 91 | def test_time_parser_with_non_numeric_input(): | CODE |
| LOW | backend/common/tests/test_src/test_streaming.py | 38 | def test_parse_range_unsupported_returns_none(range_header): | CODE |
| LOW | backend/common/tests/test_src/test_streaming.py | 53 | def test_parse_range_not_satisfiable(range_header, file_size): | CODE |
| LOW | backend/common/src/search_processor.py | 174 | def _playlist_thumb_vid_check(playlist_dict: dict): | CODE |
| LOW⚡ | backend/download/tests/test_src/test_pending_list.py | 8 | def test_returns_scientific_timestamp_if_present(): | CODE |
| LOW⚡ | backend/download/tests/test_src/test_pending_list.py | 14 | def test_returns_scientific_timestamp_string_if_present(): | CODE |
| LOW⚡ | backend/download/tests/test_src/test_pending_list.py | 20 | def test_returns_timestamp_if_present(): | CODE |
| LOW⚡ | backend/download/tests/test_src/test_pending_list.py | 26 | def test_returns_iso_date_if_upload_date_present(): | CODE |
| LOW | backend/download/src/yt_dlp_handler.py | 186 | def _build_obs_postprocessors(self): | CODE |
| LOW | backend/appsettings/tests/test_src/test_index_setup.py | 56 | def test_classify_mapping_diff( | CODE |
| LOW | backend/appsettings/tests/test_src/test_index_setup.py | 72 | def test_removed_field_cleanup( | CODE |
| LOW | backend/appsettings/src/manual.py | 191 | def _extract_id_from_filename(file_name): | CODE |
| LOW | backend/task/serializers.py | 77 | def create_dynamic_notification_serializer(): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/video/src/index.py | 238 | except (TypeError, ValueError): | CODE |
| HIGH | backend/config/settings.py | 26 | except ModuleNotFoundError: | CODE |
| HIGH | backend/config/settings.py | 227 | except ValueError: | CODE |
| HIGH | backend/channel/views.py | 175 | except FileNotFoundError: | CODE |
| HIGH | backend/common/src/env_settings.py | 14 | except ModuleNotFoundError: | CODE |
| HIGH | backend/common/src/ta_redis.py | 65 | except redis.exceptions.ResponseError: | CODE |
| HIGH | backend/download/src/queue.py | 416 | except (TypeError, ValueError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/video/src/index.py | 0 | functionality: - get metadata from youtube for a channel - index and update in es | STRING |
| HIGH | backend/playlist/src/index.py | 0 | functionality: - get metadata from youtube for a channel - index and update in es | STRING |
| HIGH | backend/channel/src/index.py | 0 | functionality: - get metadata from youtube for a channel - index and update in es | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/video/src/subtitle.py | 119 | CODE | |
| LOW | backend/playlist/src/index.py | 109 | CODE | |
| LOW | backend/common/src/ta_redis.py | 133 | CODE | |
| LOW | backend/common/src/ta_redis.py | 142 | CODE | |
| LOW | backend/appsettings/src/backup.py | 155 | CODE | |
| LOW | backend/appsettings/src/membership.py | 31 | CODE | |
| LOW | backend/appsettings/src/membership.py | 54 | CODE | |
| LOW | backend/stats/src/aggs.py | 320 | CODE | |
| LOW | backend/stats/src/aggs.py | 373 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/video/src/index.py | 165 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | backend/video/src/index.py | 389 | except Exception as err: | CODE |
| LOW | backend/video/src/meta_embed.py | 130 | except Exception as exc: # pylint: disable=broad-exception-caught | CODE |
| LOW | backend/config/management/commands/ta_connection.py | 55 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | backend/config/management/commands/ta_connection.py | 63 | except Exception as err: # pylint: disable=broad-except | CODE |
| LOW | backend/channel/src/index.py | 44 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | backend/appsettings/src/manual.py | 466 | except Exception as exc: # pylint: disable=broad-except | CODE |
| LOW | backend/task/src/notify.py | 62 | except Exception as err: # pylint: disable=broad-exception-caught | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/video/src/index.py | 351 | CODE | |
| LOW | backend/playlist/src/index.py | 402 | CODE | |
| LOW | backend/config/management/commands/ta_envcheck.py | 94 | CODE | |
| LOW | backend/common/src/searching.py | 26 | CODE | |
| LOW | backend/common/src/helper.py | 106 | CODE | |
| LOW | backend/download/src/queue.py | 459 | CODE | |
| LOW | backend/download/src/thumbnails.py | 35 | CODE | |
| LOW | backend/appsettings/src/reindex.py | 278 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/config/settings.py | 148 | CODE | |
| LOW | backend/config/settings.py | 150 | CODE | |
| LOW | backend/config/settings.py | 161 | CODE | |
| LOW | backend/config/settings.py | 167 | CODE | |
| LOW | backend/config/settings.py | 169 | CODE | |
| LOW | backend/task/__init__.py | 3 | CODE | |
| LOW | backend/task/__init__.py | 3 | CODE | |
| LOW | backend/task/__init__.py | 5 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/config/management/commands/ta_startup.py | 287 | def _update_schedule_tz(self) -> None: | CODE |
| LOW | backend/config/management/commands/ta_startup.py | 305 | def _set_ta_startup_time(self) -> None: | CODE |
| LOW | backend/user/src/user_config.py | 107 | def update_config(self, to_update: dict) -> None: | CODE |
| LOW | backend/common/src/ta_redis.py | 222 | def set_command(self, task_id: str, command: str) -> None: | CODE |
| LOW | backend/common/src/urlparser.py | 179 | def _set_cache(url, channel_id) -> None: | CODE |
| LOW | backend/download/src/yt_dlp_handler.py | 201 | def _set_overwrites(self, obs: dict, channel_id: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/download/src/queue_interact.py | 60 | ctx._source.message = null; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy.sh | 1 | #!/bin/bash | COMMENT |