A User-Focused Photo & File Management System
This report presents the forensic synthetic code analysis of TagStudioDev/TagStudio, a Python project with 7,030 GitHub stars. SynthScan v2.0 examined 49,941 lines of code across 241 source files, recording 357 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 14.8 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).
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.
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.
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.
The scanner identified 357 distinct pattern matches across 16 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 409 | self.main_window.menu_bar.open_library_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 417 | self.main_window.menu_bar.save_library_backup_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 422 | self.main_window.menu_bar.settings_action.triggered.connect(self.open_settings_modal) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 433 | self.main_window.menu_bar.open_on_start_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 438 | self.main_window.menu_bar.refresh_dir_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 443 | self.main_window.menu_bar.close_library_action.triggered.connect(self.close_library) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 448 | self.main_window.menu_bar.new_tag_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 452 | self.main_window.menu_bar.select_all_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 456 | self.main_window.menu_bar.select_inverse_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 460 | self.main_window.menu_bar.clear_select_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 466 | self.main_window.menu_bar.copy_fields_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 470 | self.main_window.menu_bar.paste_fields_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 474 | self.main_window.menu_bar.add_tag_to_selected_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 478 | self.main_window.menu_bar.delete_file_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 482 | self.main_window.menu_bar.tag_manager_action.triggered.connect(self.tag_manager_panel.show) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 484 | self.main_window.menu_bar.color_manager_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 488 | self.main_window.menu_bar.field_template_manager_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 501 | self.main_window.menu_bar.library_info_action.triggered.connect(create_library_info_window) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 508 | self.main_window.menu_bar.show_filenames_action.triggered.connect(on_show_filenames_action) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 518 | self.main_window.menu_bar.decrease_thumbnail_size_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 527 | self.main_window.menu_bar.increase_thumbnail_size_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 540 | self.main_window.menu_bar.fix_unlinked_entries_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 549 | self.main_window.menu_bar.fix_ignored_entries_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 558 | self.main_window.menu_bar.fix_dupe_files_action.triggered.connect(create_dupe_files_modal) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 561 | self.main_window.menu_bar.clear_thumb_cache_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/ts_qt.py | 573 | self.main_window.menu_bar.folders_to_tags_action.triggered.connect( | CODE |
| CRITICAL | src/tagstudio/qt/ts_qt.py | 585 | self.main_window.menu_bar.about_action.triggered.connect(create_about_modal) | CODE |
| CRITICAL | src/tagstudio/qt/ts_qt.py | 721 | self.main_window.menu_bar.ignore_modal_action.triggered.disconnect() | CODE |
| CRITICAL | src/tagstudio/qt/ts_qt.py | 733 | self.main_window.menu_bar.ignore_modal_action.triggered.connect(self.ignore_modal.show) | CODE |
| CRITICAL | src/tagstudio/qt/ts_qt.py | 957 | self.main_window.preview_panel.preview_thumb.media_player.stop() | CODE |
| CRITICAL | src/tagstudio/qt/mixed/tag_color_manager.py | 128 | else self.driver.main_window.preview_panel.field_containers_widget.update_from_entry( # noqa: E | CODE |
| CRITICAL | src/tagstudio/qt/mixed/tag_color_manager.py | 145 | else self.driver.main_window.preview_panel.field_containers_widget.update_from_entry( # | CODE |
| CRITICAL | src/tagstudio/qt/mixed/item_thumb.py | 503 | self.driver.main_window.preview_panel.field_containers_widget.update_toggled_tag( | CODE |
| CRITICAL | src/tagstudio/qt/previews/renderer.py | 70 | from tagstudio.core.exceptions import NoRendererError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_library.py | 51 | def test_library_update_alias(library: Library, generate_tag: Callable[..., Tag]): | CODE |
| LOW | tests/test_library.py | 177 | def test_search_library_case_insensitive(library: Library): | CODE |
| LOW | tests/test_library.py | 207 | def test_remove_text_field_entry_with_multiple_fields(library: Library, entry_full: Entry): | CODE |
| LOW | tests/test_library.py | 234 | def test_update_entry_with_multiple_identical_text_fields(library: Library, entry_full: Entry): | CODE |
| LOW | tests/test_library.py | 365 | def test_remove_tags_from_entries(library: Library, entry_full: Entry): | CODE |
| LOW⚡ | tests/test_library.py | 402 | def test_path_search_default_with_sep(library: Library): | CODE |
| LOW⚡ | tests/test_library.py | 408 | def test_path_search_glob_after(library: Library): | CODE |
| LOW⚡ | tests/test_library.py | 414 | def test_path_search_glob_in_front(library: Library): | CODE |
| LOW⚡ | tests/test_library.py | 420 | def test_path_search_glob_both_sides(library: Library): | CODE |
| LOW⚡ | tests/test_library.py | 427 | def test_path_search_ilike_glob_equality(library: Library): | CODE |
| LOW | tests/test_library.py | 450 | def test_path_search_like_glob_equality(library: Library): | CODE |
| LOW | tests/test_library.py | 479 | def test_filetype_return_one_filetype( | CODE |
| LOW | tests/test_driver.py | 32 | def test_evaluate_path_missing(): | CODE |
| LOW | tests/test_driver.py | 43 | def test_evaluate_path_last_lib_not_exists(): | CODE |
| LOW | tests/test_driver.py | 56 | def test_evaluate_path_last_lib_present(library_dir: Path): | CODE |
| LOW | tests/test_translations.py | 21 | def get_translation_filenames() -> list[tuple[str]]: | CODE |
| LOW | tests/test_translations.py | 58 | def test_for_unnecessary_translations(translation_filename: str): | CODE |
| LOW | tests/qt/test_preview_panel.py | 11 | def test_update_selection_empty(qt_driver: QtDriver, library: Library): | CODE |
| LOW | tests/qt/test_preview_panel.py | 23 | def test_update_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry): | CODE |
| LOW | tests/qt/test_preview_panel.py | 34 | def test_update_selection_multiple(qt_driver: QtDriver, library: Library): | CODE |
| LOW | tests/qt/test_flow_widget.py | 11 | def test_flow_layout_happy_path(): | CODE |
| LOW | tests/qt/test_field_containers.py | 12 | def test_update_selection_empty(qt_driver: QtDriver, library: Library): | CODE |
| LOW | tests/qt/test_field_containers.py | 25 | def test_update_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry): | CODE |
| LOW | tests/qt/test_field_containers.py | 37 | def test_update_selection_multiple(qt_driver: QtDriver, library: Library): | CODE |
| LOW | tests/qt/test_field_containers.py | 52 | def test_add_tag_to_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry): | CODE |
| LOW | tests/qt/test_field_containers.py | 69 | def test_add_same_tag_to_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry): | CODE |
| LOW | tests/qt/test_field_containers.py | 86 | def test_add_tag_to_selection_multiple(qt_driver: QtDriver, library: Library): | CODE |
| LOW | tests/qt/test_theme_system.py | 23 | def test_theme_colorscheme_handling(theme: Theme, expected_call): | CODE |
| LOW | tests/qt/test_tag_search_panel.py | 25 | def test_tag_widget_actions_replaced_correctly(qtbot: QtBot, qt_driver: QtDriver, library: Library): | CODE |
| LOW | tests/qt/test_tag_search_panel.py | 51 | def ensure_one_receiver_per_action(should_replace_actions): | CODE |
| LOW | tests/qt/test_folders_to_tags.py | 9 | def test_generate_preview_data(library: Library, snapshot: BranchData): | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 16 | def test_build_tag_panel_add_sub_tag_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 30 | def test_build_tag_panel_remove_subtag_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 53 | def test_build_tag_panel_add_alias_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 66 | def test_build_tag_panel_remove_alias_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 91 | def test_build_tag_panel_set_parent_tags( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 108 | def test_build_tag_panel_add_aliases( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 139 | def test_build_tag_panel_set_aliases( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 157 | def test_build_tag_panel_set_tag(qtbot: QtBot, library: Library, generate_tag: Callable[..., Tag]): | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 166 | def test_build_tag_panel_build_tag(qtbot: QtBot, library: Library): | CODE |
| LOW | tests/qt/test_about_modal.py | 10 | def test_github_api_unavailable(qtbot: QtBot, mocker) -> None: | CODE |
| LOW | tests/qt/test_qt_driver.py | 10 | def test_browsing_state_update(qt_driver: QtDriver): | CODE |
| LOW | tests/macros/test_refresh_dir.py | 34 | def test_refresh_multi_byte_filenames(library: Library): | CODE |
| LOW | tests/macros/test_missing_files.py | 20 | def test_refresh_missing_files(library: Library): | CODE |
| LOW | src/tagstudio/core/ts_core.py | 26 | def get_most_recent_release_version() -> str | None: | CODE |
| LOW | src/tagstudio/core/query_lang/tokenizer.py | 99 | def __unquoted_string_or_constraint_type(self) -> Token: | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 683 | # def _map_filenames_to_entry_ids(self): | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 677 | def _map_filenames_to_entry_ids(self): | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 753 | def save_library_backup_to_disk(self) -> str: | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 1257 | def get_entry_id_from_filepath(self, filename: Path): | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 1865 | def add_generic_data_to_entry(self, data, entry_id: int): | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 2098 | def _map_tag_strings_to_tag_id(self, tag: Tag) -> None: | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 2170 | def _map_collation_id_to_index(self, collation: Collation, index: int) -> None: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 175 | def get_default_field_templates() -> tuple[BaseFieldTemplate, ...]: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 746 | def __migrate_sql_to_ts_ignore(self, session: Session, library_dir: Path): | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1831 | def save_library_backup_to_disk(self) -> Path: | CODE |
| LOW | src/tagstudio/core/library/alchemy/visitors.py | 37 | def get_filetype_equivalency_list(item: str) -> list[str] | set[str]: | CODE |
| LOW | …o/core/library/alchemy/registries/unlinked_registry.py | 46 | def match_unlinked_file_entry(self, match_entry: Entry) -> list[Path]: | CODE |
| LOW⚡ | src/tagstudio/qt/ts_qt.py | 429 | def set_open_last_loaded_on_startup(checked: bool): | CODE |
| LOW⚡ | src/tagstudio/qt/ts_qt.py | 496 | def create_library_info_window(): | CODE |
| 44 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tagstudio/core/query_lang/tokenizer.py | 71 | CODE | |
| LOW | src/tagstudio/core/query_lang/tokenizer.py | 99 | CODE | |
| LOW | src/tagstudio/core/query_lang/ast.py | 101 | CODE | |
| LOW | src/tagstudio/core/library/ignore.py | 198 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 109 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 117 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 443 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 814 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 987 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 1185 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 1265 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 1495 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 1759 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 1812 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 1841 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 1865 | CODE | |
| LOW | src/tagstudio/core/library/json/library.py | 2007 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 258 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1248 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1333 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1394 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1612 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/visitors.py | 64 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/visitors.py | 146 | CODE | |
| LOW | …o/core/library/alchemy/registries/unlinked_registry.py | 70 | CODE | |
| LOW | …core/library/alchemy/registries/dupe_files_registry.py | 29 | CODE | |
| LOW | src/tagstudio/qt/cache_manager.py | 150 | CODE | |
| LOW | src/tagstudio/qt/ts_qt.py | 915 | CODE | |
| LOW | src/tagstudio/qt/ts_qt.py | 1230 | CODE | |
| LOW | src/tagstudio/qt/ts_qt.py | 1311 | CODE | |
| LOW | src/tagstudio/qt/ts_qt.py | 1400 | CODE | |
| LOW | src/tagstudio/qt/mnemonics.py | 38 | CODE | |
| LOW | src/tagstudio/qt/mnemonics.py | 126 | CODE | |
| LOW | src/tagstudio/qt/mixed/folders_to_tags.py | 105 | CODE | |
| LOW | src/tagstudio/qt/mixed/drop_import_modal.py | 109 | CODE | |
| LOW | src/tagstudio/qt/mixed/drop_import_modal.py | 191 | CODE | |
| LOW | src/tagstudio/qt/mixed/file_attributes.py | 127 | CODE | |
| LOW | src/tagstudio/qt/mixed/media_player.py | 326 | CODE | |
| LOW | src/tagstudio/qt/mixed/pagination.py | 122 | CODE | |
| LOW | src/tagstudio/qt/mixed/field_containers.py | 163 | CODE | |
| LOW | src/tagstudio/qt/utils/file_opener.py | 23 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 651 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 692 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 872 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 898 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 1221 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 1385 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 1429 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 1471 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 1572 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 1791 | CODE | |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 178 | CODE | |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 488 | CODE | |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 644 | CODE | |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 854 | CODE | |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 1079 | CODE | |
| LOW | src/tagstudio/qt/previews/vendored/pydub/utils.py | 21 | CODE | |
| LOW | …c/tagstudio/qt/controllers/preview_thumb_controller.py | 40 | CODE | |
| LOW | …c/tagstudio/qt/controllers/preview_thumb_controller.py | 113 | CODE | |
| LOW | src/tagstudio/qt/views/preview_panel_view.py | 166 | CODE | |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tagstudio/core/library/json/library.py | 1694 | def update_tag(self, tag: Tag) -> None: | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 1833 | def update_entry_path(self, entry_id: int, path: str | Path) -> None: | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 1837 | def update_entry_filename(self, entry_id: int, filename: str | Path) -> None: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 2007 | def update_color(self, old_color_group: TagColorGroup, new_color_group: TagColorGroup) -> None: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 2153 | def set_version(self, session: Session, key: str, value: int) -> None: | CODE |
| LOW | src/tagstudio/qt/ts_qt.py | 1311 | def update_completions_list(self, text: str) -> None: | CODE |
| LOW | src/tagstudio/qt/ts_qt.py | 1447 | def update_browsing_state(self, state: BrowsingState | None = None) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 112 | def set_copy_callback(self, callback: Callable[[], None] | None = None) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 120 | def set_edit_callback(self, callback: Callable[[], None] | None = None) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 128 | def set_remove_callback(self, callback: Callable[[], None] | None = None) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 136 | def set_inner_widget(self, widget: "FieldWidget") -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_widget.py | 149 | def set_title(self, title: str) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/tag_widget.py | 178 | def set_tag(self, tag: Tag | None) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/tag_color_label.py | 98 | def set_color(self, color: TagColorGroup | None) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/file_attributes.py | 94 | def update_date_label(self, filepath: Path | None = None) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/media_player.py | 276 | def set_tint_opacity(self, opacity: int) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/media_player.py | 457 | def _update_controls(self, size: QSize) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 341 | def set_mode(self, mode: ItemType | None) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 367 | def set_extension(self, filename: Path) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 399 | def set_count(self, count: str) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_containers.py | 109 | def update_from_entry(self, entry_id: int, update_badges: bool = True) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_containers.py | 145 | def update_toggled_tag(self, tag_id: int, toggle_value: bool) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_containers.py | 463 | def update_datetime_field(self, field: DatetimeField, name: str, value: str) -> None: | CODE |
| LOW | src/tagstudio/qt/utils/file_opener.py | 147 | def set_file_path(self, filepath: Path) -> None: | CODE |
| LOW | …dio/qt/controllers/field_template_widget_controller.py | 29 | def set_field_template(self, field_template: BaseFieldTemplate | None) -> None: | CODE |
| LOW | …/tagstudio/qt/controllers/edit_field_template_modal.py | 44 | def set_field_template(self, field_template: BaseFieldTemplate | None = None) -> None: | CODE |
| LOW | …agstudio/qt/controllers/tag_search_panel_controller.py | 145 | def set_item_widget(self, item: Tag | None, index: int) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/tag_box_controller.py | 34 | def set_entries(self, entries: list[int]) -> None: | CODE |
| LOW | …/controllers/field_template_search_panel_controller.py | 135 | def set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/search_panel_controller.py | 100 | def set_driver(self, driver: "QtDriver") -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/search_panel_controller.py | 161 | def update_items(self, query: str | None = None) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/search_panel_controller.py | 217 | def set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter] | CODE |
| LOW | …c/tagstudio/qt/controllers/preview_panel_controller.py | 40 | def _set_selection_callback(self) -> None: | CODE |
| LOW | src/tagstudio/qt/views/preview_panel_view.py | 163 | def _set_selection_callback(self) -> None: | CODE |
| LOW | src/tagstudio/qt/views/preview_panel_view.py | 166 | def set_selection(self, selected: list[int], update_preview: bool = True) -> None: | CODE |
| LOW | src/tagstudio/qt/views/thumb_button.py | 139 | def set_selected(self, value: bool) -> None: | CODE |
| LOW | src/tagstudio/qt/views/tag_box_view.py | 34 | def set_tags(self, tags: Iterable[Tag]) -> None: | CODE |
| LOW | src/tagstudio/qt/views/search_panel_view.py | 114 | def set_limit_items(self, limit_items: list[tuple[str, int]]) -> None: | CODE |
| LOW | src/tagstudio/qt/views/search_panel_view.py | 125 | def set_limit_index(self, index: int) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tagstudio/core/library/json/library.py | 22 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/fields.py | 5 | CODE | |
| LOW | src/tagstudio/qt/ts_qt.py | 42 | CODE | |
| LOW | src/tagstudio/qt/mixed/folders_to_tags.py | 35 | CODE | |
| LOW | src/tagstudio/qt/mixed/datetime_picker.py | 16 | CODE | |
| LOW | src/tagstudio/qt/mixed/fix_unlinked.py | 11 | CODE | |
| LOW | src/tagstudio/qt/mixed/fix_unlinked.py | 22 | CODE | |
| LOW | src/tagstudio/qt/mixed/landing.py | 21 | CODE | |
| LOW | src/tagstudio/qt/mixed/tag_color_manager.py | 37 | CODE | |
| LOW | src/tagstudio/qt/mixed/file_attributes.py | 30 | CODE | |
| LOW | src/tagstudio/qt/mixed/media_player.py | 44 | CODE | |
| LOW | src/tagstudio/qt/mixed/remove_unlinked_modal.py | 26 | CODE | |
| LOW | src/tagstudio/qt/mixed/settings_panel.py | 36 | CODE | |
| LOW | src/tagstudio/qt/mixed/remove_ignored_modal.py | 26 | CODE | |
| LOW | src/tagstudio/qt/mixed/merge_dupe_entries.py | 9 | CODE | |
| LOW | src/tagstudio/qt/mixed/merge_dupe_entries.py | 16 | CODE | |
| LOW | src/tagstudio/qt/mixed/mirror_entries_modal.py | 18 | CODE | |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 27 | CODE | |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 28 | CODE | |
| LOW | src/tagstudio/qt/mixed/fix_dupe_files.py | 18 | CODE | |
| LOW | src/tagstudio/qt/mixed/fix_dupe_files.py | 26 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 95 | CODE | |
| LOW | src/tagstudio/qt/previews/renderer.py | 105 | CODE | |
| LOW | src/tagstudio/qt/controllers/tag_box_controller.py | 20 | CODE | |
| LOW | …tudio/qt/controllers/library_info_window_controller.py | 20 | CODE | |
| LOW | …tudio/qt/controllers/library_info_window_controller.py | 29 | CODE | |
| LOW | …gstudio/qt/controllers/fix_ignored_modal_controller.py | 10 | CODE | |
| LOW | …gstudio/qt/controllers/fix_ignored_modal_controller.py | 20 | CODE | |
| LOW | …c/tagstudio/qt/controllers/preview_panel_controller.py | 17 | CODE | |
| LOW | src/tagstudio/qt/views/main_window.py | 52 | CODE | |
| LOW | src/tagstudio/qt/views/preview_panel_view.py | 34 | CODE | |
| LOW | src/tagstudio/qt/views/fix_ignored_modal_view.py | 11 | CODE | |
| LOW | src/tagstudio/qt/views/fix_ignored_modal_view.py | 16 | CODE | |
| LOW | src/tagstudio/qt/views/tag_box_view.py | 17 | CODE | |
| LOW | src/tagstudio/qt/views/library_info_window_view.py | 31 | CODE | |
| LOW | src/tagstudio/qt/views/library_info_window_view.py | 32 | CODE | |
| LOW | src/tagstudio/qt/views/search_panel_view.py | 25 | CODE | |
| LOW | src/tagstudio/qt/views/preview_thumb_view.py | 25 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_db_migrations.py | 54 | except Exception as e: | CODE |
| LOW | src/tagstudio/main.py | 72 | except Exception: | CODE |
| LOW | src/tagstudio/core/ts_core.py | 32 | except Exception as e: | CODE |
| LOW | src/tagstudio/core/library/json/library.py | 397 | except Exception: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 350 | except Exception as e: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 498 | except Exception as e: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 2150 | except Exception: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 2193 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/ts_qt.py | 1611 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/build_tag.py | 198 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/build_tag.py | 484 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/migration_modal.py | 386 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/migration_modal.py | 431 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 55 | except Exception: | CODE |
| LOW | src/tagstudio/qt/utils/file_opener.py | 104 | except Exception: | CODE |
| LOW | src/tagstudio/qt/utils/file_deleter.py | 41 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/utils/file_deleter.py | 55 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 774 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 802 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 922 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 969 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 1159 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 1465 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 1501 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 1530 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/previews/renderer.py | 1666 | except Exception as e: | CODE |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 25 | except Exception: | CODE |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 188 | except Exception: | CODE |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 283 | except Exception: | CODE |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 403 | except Exception: | CODE |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 528 | except Exception: | CODE |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 687 | except Exception: | CODE |
| MEDIUM | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 280 | def __eq__(self, other): | CODE |
| LOW | src/tagstudio/qt/views/preview_panel_view.py | 219 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/tagstudio/core/library/ignore.py | 61 | # Create a version of a prefix-less pattern that starts with "**/" | COMMENT |
| MEDIUM | src/tagstudio/qt/previews/renderer.py | 1192 | # Create an image to draw the svg to and a painter to do the drawing | COMMENT |
| MEDIUM | src/tagstudio/qt/previews/renderer.py | 1196 | # Create an svg renderer, then render to the painter | COMMENT |
| MEDIUM | src/tagstudio/qt/previews/renderer.py | 1277 | # # Create a new plot | COMMENT |
| MEDIUM | src/tagstudio/qt/previews/vendored/blender_renderer.py | 9 | ## This file is a modified script that gets the thumbnail data stored in a blend file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/qt/test_field_containers.py | 141 | # Check if the container is the Meta Tags category | COMMENT |
| LOW | tests/qt/test_field_containers.py | 145 | # Check if the container is the Tags category | COMMENT |
| LOW | tests/qt/test_field_containers.py | 176 | # Check if the container is the Meta Tags category | COMMENT |
| LOW | tests/qt/test_field_containers.py | 180 | # Check if the container is the custom "foo" category | COMMENT |
| LOW | src/tagstudio/qt/previews/renderer.py | 835 | # Check if the file exists in the zip | COMMENT |
| LOW | src/tagstudio/qt/previews/renderer.py | 858 | # Check if the file exists in the zip | COMMENT |
| LOW | src/tagstudio/qt/previews/renderer.py | 882 | # Check if the file exists in the zip | COMMENT |
| LOW | src/tagstudio/qt/previews/renderer.py | 1248 | # Check if the file exists in the zip | COMMENT |
| LOW | src/tagstudio/qt/previews/renderer.py | 1728 | # Check if the file is supposed to be ignored and render an overlay if needed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_json_migration.py | 21 | # Entries ================================================================== | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 61 | # self.mask: list[id] = None | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 301 | COMMENT | |
| LOW | src/tagstudio/core/library/json/library.py | 341 | self.ext_list: list[str] = [] | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 681 | self.filename_to_entry_id_map[(entry.path / entry.filename)] = entry.id | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 1161 | COMMENT | |
| LOW | src/tagstudio/core/library/json/library.py | 1421 | # Assume that this ID from the cluster is not in the Entry. | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 1441 | # Since this term could technically map to multiple IDs, iterate over it | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 1501 | context: list[str] = None, | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 1521 | # # print( | COMMENT |
| LOW | …tudio/resources/templates/ts_ignore_template_blank.txt | 1 | # This is a '.ts_ignore' file for TagStudio. | COMMENT |
| LOW | …c/tagstudio/resources/templates/ts_ignore_template.txt | 1 | # This is a '.ts_ignore' file for TagStudio. | COMMENT |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 141 | # |*--------*| | COMMENT |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 161 | self.thumb_layout.addWidget(self.top_container) | COMMENT |
| LOW | src/tagstudio/qt/previews/renderer.py | 1281 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/tagstudio/core/library/json/library.py | 493 | # Step 1: Verify default built-in tags are present. | COMMENT |
| LOW⚡ | src/tagstudio/core/library/json/library.py | 497 | # Step 2: Create a Tag object and append it to the internal Tags list, | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 532 | # Step 3: Map each Tag's subtags together now that all Tag objects in it. | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 633 | # Step 1: Create a Collation object and append it to | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 1934 | # NOTE: The following commented-out code enables the ability | COMMENT |
| LOW | src/tagstudio/qt/mixed/add_field.py | 27 | # NOTE: This class doesn't inherit from PanelWidget? Seems like it predates that system? | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/tagstudio/core/library/json/library.py | 493 | # Step 1: Verify default built-in tags are present. | COMMENT |
| LOW⚡ | src/tagstudio/core/library/json/library.py | 497 | # Step 2: Create a Tag object and append it to the internal Tags list, | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 532 | # Step 3: Map each Tag's subtags together now that all Tag objects in it. | COMMENT |
| LOW | src/tagstudio/core/library/json/library.py | 633 | # Step 1: Create a Collation object and append it to | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tagstudio/core/library/alchemy/models.py | 127 | CODE | |
| LOW | src/tagstudio/core/utils/silent_subprocess.py | 15 | CODE | |
| LOW | src/tagstudio/core/utils/silent_subprocess.py | 92 | CODE | |
| LOW | …/tagstudio/qt/previews/vendored/pydub/audio_segment.py | 854 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/tagstudio/qt/mixed/pagination.py | 36 | # -------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/tagstudio/qt/ts_qt.py | 1454 | self.browsing_history.push(state) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/tagstudio/core/library/json/library.py | 1239 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tagstudio/qt/previews/vendored/pydub/utils.py | 58 | # If ffprobe didn't give any information, just return it | COMMENT |