Modern YouTube downloader with a clean PySide6 interface. Download videos in any quality, extract audio, fetch subtitles, sponsorBlock, and view video metadata. Built with yt-dlp for reliable performance.
This report summarizes scanner evidence for oop7/YTSage, a Python project with 4,658 GitHub stars. SynthScan examined 38,328 lines of code across 73 source files, recording 422 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 14.8 (Moderate 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.
Can maintainers explain intent, assumptions, and trade-offs? 151 finding(s).
Are imports declared and package/API names verified? 58 finding(s).
Are wrappers, guards, and repeated structures necessary? 259 finding(s).
Which changes need focused human review? 422 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 422 distinct pattern matches across 12 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 | build_release.py | 50 | except Exception as e: | CODE |
| MEDIUM | build_release.py | 51 | print(f"Error during build: {e}") | CODE |
| LOW | ytsage/main.py | 34 | except Exception as e: | CODE |
| MEDIUM | ytsage/main.py | 19 | def main(): | CODE |
| LOW | ytsage/core/ytsage_deno.py | 104 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 198 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 204 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 425 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 455 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 458 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 518 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 642 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 749 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 778 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 99 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 156 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 472 | except Exception as copy_error: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 530 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 575 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 601 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 604 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 752 | except Exception as e: | CODE |
| MEDIUM | ytsage/core/ytsage_yt_dlp.py | 111 | def run(self) -> None: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 143 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 209 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 252 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 306 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 318 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 357 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 366 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 419 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 438 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 473 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 510 | except Exception as e: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 118 | except Exception as e: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 128 | except Exception as e: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 150 | except Exception as e: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 544 | except Exception as e: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 546 | except Exception as e: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 767 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 61 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 174 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 200 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 224 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 262 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 316 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 319 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 345 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 362 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 368 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 389 | except Exception: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 400 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 415 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 427 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 488 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 494 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 577 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 630 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 634 | except Exception as e: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 662 | except Exception as e: | CODE |
| 94 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | ytsage/core/ytsage_deno.py | 204 | except Exception: | CODE |
| HIGH | ytsage/core/ytsage_ffmpeg.py | 318 | except Exception: | CODE |
| HIGH | ytsage/core/ytsage_ffmpeg.py | 366 | except Exception: | CODE |
| HIGH | ytsage/core/ytsage_utils.py | 61 | except Exception: | CODE |
| HIGH | ytsage/core/ytsage_utils.py | 389 | except Exception: | CODE |
| HIGH | ytsage/core/ytsage_downloader.py | 206 | except Exception: | CODE |
| HIGH | ytsage/core/ytsage_downloader.py | 810 | except (ValueError, IndexError): | CODE |
| HIGH | ytsage/core/ytsage_downloader.py | 906 | except Exception: | CODE |
| HIGH | ytsage/core/ytsage_downloader.py | 186 | except (ProcessLookupError, PermissionError): | CODE |
| HIGH | ytsage/core/ytsage_downloader.py | 200 | except Exception: | CODE |
| HIGH | ytsage/utils/ytsage_constants.py | 68 | except Exception: | CODE |
| HIGH | ytsage/utils/ytsage_constants.py | 65 | except (ImportError, AttributeError, FileNotFoundError): | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 1162 | except Exception: | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 1990 | except RuntimeError: | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 2028 | except RuntimeError: | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 2071 | except RuntimeError: | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 2105 | except RuntimeError: | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 1522 | except RuntimeError: | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 1622 | except RuntimeError: | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 1682 | except (ValueError, TypeError): | CODE |
| HIGH | ytsage/gui/ytsage_gui_main.py | 1710 | except (ValueError, TypeError): | CODE |
| HIGH | ytsage/gui/ytsage_gui_analysis.py | 447 | except Exception: | CODE |
| HIGH | ytsage/gui/ytsage_gui_format_table.py | 771 | except: | CODE |
| HIGH | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 354 | except ValueError: | CODE |
| HIGH | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 359 | except ValueError: | CODE |
| HIGH | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 399 | except (ValueError, TypeError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/build-macos.yml | 204 | # Check if this lib dir is a python library dir (contains asyncio or PySide6 or ytsage) | COMMENT |
| LOW | ytsage/core/ytsage_deno.py | 122 | os.close(temp_zip_fd) # Close the file descriptor | CODE |
| LOW | ytsage/core/ytsage_ffmpeg.py | 259 | # Check if already installed | COMMENT |
| LOW | ytsage/core/ytsage_ffmpeg.py | 448 | # Check if Homebrew is installed | COMMENT |
| LOW⚡ | ytsage/core/ytsage_utils.py | 137 | # Check if we need to refresh cache | COMMENT |
| LOW⚡ | ytsage/core/ytsage_utils.py | 161 | # Check if we need to refresh cache | COMMENT |
| LOW⚡ | ytsage/core/ytsage_utils.py | 557 | # Check if auto-update is enabled | COMMENT |
| LOW⚡ | ytsage/core/ytsage_utils.py | 758 | # Check if URL is empty | COMMENT |
| LOW⚡ | ytsage/core/ytsage_utils.py | 771 | # Check if scheme is http or https | COMMENT |
| LOW⚡ | ytsage/core/ytsage_utils.py | 775 | # Check if netloc (domain) exists | COMMENT |
| LOW | ytsage/core/ytsage_utils.py | 186 | # Check if we need to refresh cache | COMMENT |
| LOW | ytsage/core/ytsage_utils.py | 441 | # Check if this is an app-managed binary by comparing paths safely | COMMENT |
| LOW | ytsage/core/ytsage_utils.py | 794 | # Check if domain is YouTube | COMMENT |
| LOW⚡ | ytsage/core/ytsage_downloader.py | 215 | # Check if file exists before trying to delete | COMMENT |
| LOW⚡ | ytsage/core/ytsage_downloader.py | 693 | # Check if this is an audio-only download by looking in the previous lines | COMMENT |
| LOW⚡ | ytsage/core/ytsage_downloader.py | 700 | # Check if the format ID is mentioned earlier in the line | COMMENT |
| LOW | ytsage/core/ytsage_downloader.py | 644 | # Check if it was cancelled | COMMENT |
| LOW | ytsage/core/ytsage_downloader.py | 712 | # Check if this is explicitly an audio stream download | COMMENT |
| LOW | ytsage/utils/ytsage_history_manager.py | 63 | # Check if file exists to know if we need to migrate or just create schema | COMMENT |
| LOW | ytsage/utils/ytsage_constants.py | 33 | # Check if running as a frozen executable (PyInstaller, cx_Freeze, etc.) | COMMENT |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 343 | # Check if the notification sound file exists | COMMENT |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 360 | # Check if the user wants to remember cookies across sessions | COMMENT |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 1249 | # Check if auto-update should be performed | COMMENT |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 1260 | # Check if a download is currently running or analysis is in progress | COMMENT |
| LOW | ytsage/gui/ytsage_gui_main.py | 1980 | # Check if the main window has a graphics effect (blur) active. | COMMENT |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 242 | # Check if we need to rebuild the table (first time or formats changed) | COMMENT |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py | 155 | # Check if FFmpeg is already installed | COMMENT |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py | 180 | # Display the messages | COMMENT |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py | 257 | # Check if dialog is closing to avoid unnecessary updates | COMMENT |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py | 334 | # Check if dialog is closing to avoid unnecessary updates | COMMENT |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 614 | float(limit_str) # Check if convertible to float | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 802 | # Open file dialog to select cookie file | COMMENT |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 854 | # Check if it starts with a valid scheme | COMMENT |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 887 | # Check if there are saved settings | COMMENT |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py | 562 | # Check if the path is our managed binary | COMMENT |
| LOW | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 148 | checkbox.setChecked(item_text in self.previously_selected) # Check if previously selected | CODE |
| LOW | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 470 | # Check if all items are selected | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ytsage/core/ytsage_deno.py | 2 | CODE | |
| LOW | ytsage/core/ytsage_deno.py | 24 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 3 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 10 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 10 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 39 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 42 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 70 | CODE | |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 5 | CODE | |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 5 | CODE | |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 5 | CODE | |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 8 | CODE | |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 15 | CODE | |
| LOW | ytsage/gui/ytsage_smooth_tab_widget.py | 2 | CODE | |
| LOW | ytsage/gui/ytsage_gui_video_info.py | 21 | CODE | |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 10 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 8 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 9 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 12 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 12 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 12 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 20 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 20 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 20 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 20 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 24 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 24 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 46 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py | 19 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py | 19 | CODE | |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 10 | CODE | |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 11 | CODE | |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 12 | CODE | |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 13 | CODE | |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 36 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 15 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 15 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 16 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 16 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 17 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 17 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 18 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 19 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 19 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 19 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 24 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 24 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 25 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 25 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 25 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 25 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 26 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 11 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 11 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 12 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 13 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 26 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 44 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ytsage/core/ytsage_deno.py | 37 | CODE | |
| LOW | ytsage/core/ytsage_deno.py | 479 | CODE | |
| LOW | ytsage/core/ytsage_deno.py | 523 | CODE | |
| LOW | ytsage/core/ytsage_deno.py | 686 | CODE | |
| LOW | ytsage/core/ytsage_deno.py | 117 | CODE | |
| LOW | ytsage/core/ytsage_yt_dlp.py | 44 | CODE | |
| LOW | ytsage/core/ytsage_yt_dlp.py | 626 | CODE | |
| LOW | ytsage/core/ytsage_yt_dlp.py | 717 | CODE | |
| LOW | ytsage/core/ytsage_yt_dlp.py | 111 | CODE | |
| LOW | ytsage/core/ytsage_yt_dlp.py | 400 | CODE | |
| LOW | ytsage/core/ytsage_ffmpeg.py | 35 | CODE | |
| LOW | ytsage/core/ytsage_ffmpeg.py | 148 | CODE | |
| LOW | ytsage/core/ytsage_ffmpeg.py | 257 | CODE | |
| LOW | ytsage/core/ytsage_ffmpeg.py | 478 | CODE | |
| LOW | ytsage/core/ytsage_ffmpeg.py | 515 | CODE | |
| LOW | ytsage/core/ytsage_ffmpeg.py | 79 | CODE | |
| LOW | ytsage/core/ytsage_utils.py | 267 | CODE | |
| LOW | ytsage/core/ytsage_utils.py | 330 | CODE | |
| LOW | ytsage/core/ytsage_utils.py | 373 | CODE | |
| LOW | ytsage/core/ytsage_utils.py | 432 | CODE | |
| LOW | ytsage/core/ytsage_utils.py | 552 | CODE | |
| LOW | ytsage/core/ytsage_utils.py | 582 | CODE | |
| LOW | ytsage/core/ytsage_downloader.py | 243 | CODE | |
| LOW | ytsage/core/ytsage_downloader.py | 492 | CODE | |
| LOW | ytsage/core/ytsage_downloader.py | 516 | CODE | |
| LOW | ytsage/core/ytsage_downloader.py | 673 | CODE | |
| LOW | ytsage/utils/ytsage_history_manager.py | 122 | CODE | |
| LOW | ytsage/utils/ytsage_history_manager.py | 201 | CODE | |
| LOW | ytsage/utils/ytsage_history_manager.py | 248 | CODE | |
| LOW | ytsage/utils/ytsage_history_manager.py | 389 | CODE | |
| LOW | ytsage/utils/ytsage_config_manager.py | 115 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 120 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 158 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 355 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 792 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 966 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 1052 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 1509 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 1610 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 1651 | CODE | |
| LOW | ytsage/gui/ytsage_gui_main.py | 1755 | CODE | |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 105 | CODE | |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 406 | CODE | |
| LOW | ytsage/gui/ytsage_gui_video_info.py | 292 | CODE | |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 257 | CODE | |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 336 | CODE | |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 412 | CODE | |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 744 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 55 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 113 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py | 376 | CODE | |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 942 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 736 | CODE | |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 765 | CODE | |
| LOW | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 339 | CODE | |
| LOW | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 370 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ytsage/core/ytsage_yt_dlp.py | 717 | def check_ytdlp_deno_integration() -> bool: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 108 | def load_version_cache_from_config() -> None: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 122 | def save_version_cache_to_config() -> None: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 155 | def get_ffmpeg_version_cached() -> str: | CODE |
| LOW⚡ | ytsage/core/ytsage_utils.py | 552 | def should_check_for_auto_update() -> bool: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 267 | def get_ffmpeg_version_direct() -> str: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 582 | def check_and_update_ytdlp_auto() -> bool: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 654 | def update_auto_update_settings(enabled: bool, frequency: str) -> bool: | CODE |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 355 | def _initialize_cookie_settings_from_config(self) -> None: | CODE |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 701 | def _get_speed_limit_tooltip_text(self) -> str: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 120 | def _fetch_github_beta_version(self) -> tuple[str | None, str | None, str | None]: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 728 | def show_download_settings_dialog(self) -> None: # Renamed method | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 1388 | def handle_redownload_from_history(self, entry: dict) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 1486 | def _embed_panel_target_geometry(self) -> QRect: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 1628 | def open_playlist_selection_dialog(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 1755 | def toggle_analysis_dependent_controls(self, enabled=True) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 2057 | def set_widget_visible_animated(self, widget: QWidget, visible: bool) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 2095 | def set_status_message_animated(self, message: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 105 | def _analyze_url_with_subprocess(self, url: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 370 | def _handle_analysis_progress(self, value: int) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_video_info.py | 213 | def setup_playlist_info_section(self) -> QLabel: | CODE |
| LOW | ytsage/gui/ytsage_gui_video_info.py | 363 | def _update_sponsorblock_display(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 336 | def _build_playlist_preset_table(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py | 477 | def on_context_menu_requested(self, pos): | STRING |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py | 256 | def on_version_check_finished(self, current_version, latest_version, error_message) -> None: | CODE |
| LOW⚡ | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 644 | def get_force_audio_format_enabled(self) -> bool: | CODE |
| LOW⚡ | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 648 | def get_preferred_audio_format(self) -> str: | CODE |
| LOW⚡ | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 653 | def get_audio_normalization_enabled(self) -> bool: | CODE |
| LOW⚡ | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 661 | def _create_styled_message_box(self, icon, title, text) -> QMessageBox: | CODE |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 582 | def _on_audio_normalization_toggled(self, state: int) -> None: | CODE |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 592 | def _on_force_audio_format_toggled(self, state: int) -> None: | CODE |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 1012 | def _create_styled_message_box(self, icon, title, text) -> QMessageBox: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 678 | def _initialize_cookie_settings(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 707 | def _update_cookies_active_status(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 723 | def _initialize_proxy_settings(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 823 | def get_browser_cookies_option(self) -> str | None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py | 271 | def _create_system_info_section(self) -> QWidget: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 48 | def get_latest_ffmpeg_version() -> Optional[str]: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 732 | def get_app_update_checker_setting(self) -> bool: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 912 | def _on_ffmpeg_check_finished(self, update_available, current_version, latest_version): | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 984 | def _update_deno_check_results(self, update_available: bool, current_version: str, latest_version: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 1066 | def _handle_deno_update_result(self, success: bool, output: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 674 | def _load_auto_update_settings(self) -> None: | STRING |
| LOW | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 466 | def get_selected_items_string(self) -> str | None: | CODE |
| LOW | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 727 | def get_selected_categories_string(self) -> str: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/build-linux.yml | 489 | # Create a specific desktop file for Flatpak | COMMENT |
| MEDIUM | ytsage/core/ytsage_utils.py | 468 | # Create a temporary file | COMMENT |
| MEDIUM | ytsage/gui/ytsage_gui_main.py | 660 | # Create a horizontal layout for status label and open folder button | COMMENT |
| MEDIUM | ytsage/gui/ytsage_gui_main.py | 2186 | # Create a QGraphicsScene to apply the effect to the pixmap | COMMENT |
| MEDIUM | ytsage/gui/ytsage_gui_video_info.py | 48 | # Create a horizontal layout for thumbnail and video info | COMMENT |
| MEDIUM | ytsage/gui/ytsage_gui_format_table.py | 468 | # Create a container widget for the checkbox | COMMENT |
| MEDIUM | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py | 273 | # Create main container with compact styling | COMMENT |
| MEDIUM | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 228 | # Create a widget to hold all content | COMMENT |
| MEDIUM | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 567 | # Create a container widget for each category | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | ytsage/core/ytsage_deno.py | 0 | qmessagebox { background-color: #15181b; color: #ffffff; } qmessagebox qlabel { color: #ffffff; } qmessagebox qpushbutto | STRING |
| HIGH | ytsage/core/ytsage_yt_dlp.py | 0 | qmessagebox { background-color: #15181b; color: #ffffff; } qmessagebox qlabel { color: #ffffff; } qmessagebox qpushbutto | STRING |
| HIGH | ytsage/gui/ytsage_stylesheet.py | 0 | qmessagebox { background-color: #15181b; color: #ffffff; } qmessagebox qlabel { color: #ffffff; } qmessagebox qpushbutto | STRING |
| HIGH | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 0 | qmessagebox { background-color: #15181b; color: #ffffff; } qmessagebox qlabel { color: #ffffff; } qmessagebox qpushbutto | STRING |
| HIGH | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py | 0 | qmessagebox { background-color: #15181b; color: #ffffff; } qmessagebox qlabel { color: #ffffff; } qmessagebox qpushbutto | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ytsage/core/ytsage_deno.py | 364 | def update_progress(self, value) -> None: | CODE |
| LOW | ytsage/core/ytsage_deno.py | 367 | def update_status(self, status: str) -> None: | CODE |
| LOW | ytsage/core/ytsage_yt_dlp.py | 357 | def update_progress(self, value) -> None: | CODE |
| LOW | ytsage/core/ytsage_utils.py | 91 | def update_version_cache(tool_name: str, version_info: str, path: Optional[str], force_save: bool = False) -> None: | CODE |
| LOW | ytsage/utils/ytsage_logger.py | 56 | __all__ = ["logger"] | CODE |
| LOW | ytsage/utils/ytsage_localization.py | 245 | def set_language(cls, language_code: str) -> None: | CODE |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 707 | def _update_settings_tooltip(self) -> None: | CODE |
| LOW⚡ | ytsage/gui/ytsage_gui_main.py | 717 | def _update_url_placeholder(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 1107 | def update_progress_bar(self, value) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 2057 | def set_widget_visible_animated(self, widget: QWidget, visible: bool) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_main.py | 2095 | def set_status_message_animated(self, message: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_analysis.py | 388 | def _update_fake_progress(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_video_info.py | 236 | def update_video_info(self, info) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_video_info.py | 363 | def _update_sponsorblock_display(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 662 | def _update_format_table(self, formats) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_format_table.py | 737 | def update_format_table(self, formats) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py | 174 | def update_progress(self, message) -> None: | CODE |
| LOW | …sage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py | 942 | def update_next_check_label(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/__init__.py | 28 | __all__ = [ | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py | 707 | def _update_cookies_active_status(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py | 475 | def update_system_info(self) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 881 | def _update_channel_status(self, channel: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 921 | def _update_check_results(self, update_available: bool, current_version: str, latest_version: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 984 | def _update_deno_check_results(self, update_available: bool, current_version: str, latest_version: str) -> None: | CODE |
| LOW | ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py | 1020 | def update_deno(self) -> None: | CODE |
| LOW | …age/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py | 178 | def update_selection(self, state) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | ytsage/core/ytsage_downloader.py | 684 | # Use a slightly more robust regex looking for the start of the line | COMMENT |
| LOW | ytsage/utils/ytsage_history_manager.py | 63 | # Check if file exists to know if we need to migrate or just create schema | COMMENT |
| LOW | ytsage/gui/ytsage_gui_main.py | 1889 | # Keep these methods for backwards compatibility - they just call the new dialog now | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | ytsage/utils/ytsage_constants.py | 185 | # ============================================================================= | COMMENT |
| MEDIUM | ytsage/utils/ytsage_constants.py | 187 | # ============================================================================= | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ytsage/core/ytsage_downloader.py | 48 | CODE |