A User-Focused Photo & File Management System
This report presents the forensic synthetic code analysis of TagStudioDev/TagStudio, a Python project with 7,156 GitHub stars. SynthScan v2.0 examined 52,595 lines of code across 265 source files, recording 344 pattern matches distributed across 15 syntactic categories. The overall adjusted score of 13.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 344 distinct pattern matches across 15 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/qt_driver.py | 428 | self.main_window.menu_bar.open_library_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 436 | self.main_window.menu_bar.save_library_backup_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 441 | self.main_window.menu_bar.settings_action.triggered.connect(self.open_settings_modal) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 452 | self.main_window.menu_bar.open_on_start_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 457 | self.main_window.menu_bar.refresh_dir_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 462 | self.main_window.menu_bar.close_library_action.triggered.connect(self.close_library) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 467 | self.main_window.menu_bar.new_tag_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 471 | self.main_window.menu_bar.select_all_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 475 | self.main_window.menu_bar.select_inverse_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 479 | self.main_window.menu_bar.clear_select_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 485 | self.main_window.menu_bar.copy_fields_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 489 | self.main_window.menu_bar.paste_fields_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 493 | self.main_window.menu_bar.add_tag_to_selected_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 497 | self.main_window.menu_bar.delete_file_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 501 | self.main_window.menu_bar.tag_manager_action.triggered.connect(self.tag_manager.show) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 503 | self.main_window.menu_bar.color_manager_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 507 | self.main_window.menu_bar.field_template_manager_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 520 | self.main_window.menu_bar.library_info_action.triggered.connect(create_library_info_window) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 527 | self.main_window.menu_bar.show_filenames_action.triggered.connect(on_show_filenames_action) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 537 | self.main_window.menu_bar.decrease_thumbnail_size_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 546 | self.main_window.menu_bar.increase_thumbnail_size_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 559 | self.main_window.menu_bar.fix_unlinked_entries_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 568 | self.main_window.menu_bar.fix_ignored_entries_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 577 | self.main_window.menu_bar.fix_dupe_files_action.triggered.connect(create_dupe_files_modal) | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 580 | self.main_window.menu_bar.clear_thumb_cache_action.triggered.connect( | CODE |
| CRITICAL⚡ | src/tagstudio/qt/qt_driver.py | 592 | self.main_window.menu_bar.folders_to_tags_action.triggered.connect( | CODE |
| CRITICAL | src/tagstudio/qt/qt_driver.py | 604 | self.main_window.menu_bar.about_action.triggered.connect(create_about_modal) | CODE |
| CRITICAL | src/tagstudio/qt/qt_driver.py | 742 | self.main_window.menu_bar.ignore_modal_action.triggered.disconnect() | CODE |
| CRITICAL | src/tagstudio/qt/qt_driver.py | 754 | self.main_window.menu_bar.ignore_modal_action.triggered.connect(self.ignore_modal.show) | CODE |
| CRITICAL | src/tagstudio/qt/mixed/tag_color_manager.py | 129 | else self.driver.main_window.preview_panel.containers.update_from_entry( # noqa: E501 | CODE |
| CRITICAL | src/tagstudio/qt/mixed/tag_color_manager.py | 146 | else self.driver.main_window.preview_panel.containers.update_from_entry( # noqa: E501 | CODE |
| CRITICAL | src/tagstudio/qt/mixed/item_thumb.py | 493 | self.driver.main_window.preview_panel.containers.update_toggled_tag( | CODE |
| CRITICAL | src/tagstudio/previews/file_renderer.py | 15 | from tagstudio.core.exceptions import NoRendererError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_base_driver.py | 33 | def test_evaluate_path_missing(): | CODE |
| LOW | tests/core/test_base_driver.py | 44 | def test_evaluate_path_last_lib_not_exists(): | CODE |
| LOW | tests/core/test_base_driver.py | 57 | def test_evaluate_path_last_lib_present(library_dir: Path): | CODE |
| LOW | tests/core/library/test_library.py | 51 | def test_library_update_alias(library: Library, generate_tag: Callable[..., Tag]): | CODE |
| LOW | tests/core/library/test_library.py | 175 | def test_search_library_case_insensitive(library: Library): | CODE |
| LOW | tests/core/library/test_library.py | 205 | def test_remove_text_field_entry_with_multiple_fields(library: Library, entry_full: Entry): | CODE |
| LOW | tests/core/library/test_library.py | 232 | def test_update_entry_with_multiple_identical_text_fields(library: Library, entry_full: Entry): | CODE |
| LOW | tests/core/library/test_library.py | 356 | def test_remove_tags_from_entries(library: Library, entry_full: Entry): | CODE |
| LOW⚡ | tests/core/library/test_library.py | 393 | def test_path_search_default_with_sep(library: Library): | CODE |
| LOW⚡ | tests/core/library/test_library.py | 399 | def test_path_search_glob_after(library: Library): | CODE |
| LOW⚡ | tests/core/library/test_library.py | 405 | def test_path_search_glob_in_front(library: Library): | CODE |
| LOW⚡ | tests/core/library/test_library.py | 411 | def test_path_search_glob_both_sides(library: Library): | CODE |
| LOW⚡ | tests/core/library/test_library.py | 418 | def test_path_search_ilike_glob_equality(library: Library): | CODE |
| LOW | tests/core/library/test_library.py | 441 | def test_path_search_like_glob_equality(library: Library): | CODE |
| LOW | tests/core/library/test_library.py | 470 | def test_filetype_return_one_filetype( | CODE |
| LOW | tests/core/library/test_refresh.py | 34 | def test_refresh_multi_byte_filenames(library: Library): | CODE |
| LOW | tests/core/library/test_unlinked_entries.py | 20 | def test_refresh_unlinked_entries(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 | 15 | def test_update_selection_empty(qt_driver: QtDriver): | CODE |
| LOW | tests/qt/test_field_containers.py | 28 | def test_update_selection_single(qt_driver: QtDriver, entry_full: Entry): | CODE |
| LOW | tests/qt/test_field_containers.py | 40 | def test_update_selection_multiple(qt_driver: QtDriver): | CODE |
| LOW | tests/qt/test_field_containers.py | 55 | def test_add_tag_to_selection_single(qt_driver: QtDriver, entry_full: Entry): | CODE |
| LOW | tests/qt/test_field_containers.py | 72 | def test_add_same_tag_to_selection_single(qt_driver: QtDriver, entry_full: Entry): | CODE |
| LOW | tests/qt/test_field_containers.py | 89 | def test_add_tag_to_selection_multiple(qt_driver: QtDriver): | CODE |
| LOW⚡ | tests/qt/test_field_containers.py | 190 | def test_exclude_tag_category( | 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 | 24 | def test_tag_widget_actions_replaced_correctly(qtbot: QtBot, library: Library): | CODE |
| LOW | tests/qt/test_tag_search_panel.py | 49 | 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 | 162 | def test_build_tag_panel_set_tag(qtbot: QtBot, library: Library, generate_tag: Callable[..., Tag]): | CODE |
| LOW⚡ | tests/qt/test_build_tag_panel.py | 171 | def test_build_tag_panel_build_tag(qtbot: QtBot, library: Library): | CODE |
| LOW⚡ | tests/qt/test_build_tag_panel.py | 180 | def test_build_tag_panel_show_category_from_parent( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 21 | def test_build_tag_panel_add_sub_tag_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 35 | def test_build_tag_panel_remove_subtag_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 58 | def test_build_tag_panel_add_alias_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 71 | def test_build_tag_panel_remove_alias_callback( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 96 | def test_build_tag_panel_set_parent_tags( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 113 | def test_build_tag_panel_add_aliases( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 144 | def test_build_tag_panel_set_aliases( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 194 | def test_build_tag_panel_show_category_from_grandparent( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 209 | def test_build_tag_panel_add_category_through_parent( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 228 | def test_build_tag_panel_add_category_through_grandparent( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 248 | def test_build_tag_panel_remove_category_through_parent( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 266 | def test_build_tag_panel_remove_category_through_grandparent( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 285 | def test_build_tag_panel_exclude_from_category( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 307 | def test_build_tag_panel_include_in_category( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 333 | def test_build_tag_panel_remove_duplicate_category_retained( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 359 | def test_build_tag_panel_new_tag_multiple_categories( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 384 | def test_build_tag_panel_category_not_shown_for_self( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 396 | def test_build_tag_panel_remove_inherited_from_multiple_parents_during_tag_creation( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 421 | def test_build_tag_panel_add_different_category_after_removing_other_category( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 443 | def test_build_tag_panel_remove_category_inherited_directly_and_indirectly( | CODE |
| LOW | tests/qt/test_build_tag_panel.py | 467 | def __find_category_tag_widget(panel: BuildTagPanel, index: int = 0) -> TagWidget | None: | CODE |
| LOW | tests/qt/test_inspector.py | 11 | def test_update_selection_empty(qt_driver: QtDriver): | CODE |
| LOW | tests/qt/test_inspector.py | 27 | def test_update_selection_single(qt_driver: QtDriver, entry_full: Entry): | CODE |
| LOW | tests/qt/test_inspector.py | 39 | def test_update_selection_multiple(qt_driver: QtDriver): | 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/i18n/test_translations.py | 21 | def get_translation_filenames() -> list[tuple[str]]: | CODE |
| LOW | tests/i18n/test_translations.py | 58 | def test_for_unnecessary_translations(translation_filename: str): | CODE |
| 70 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/alchemy/library.py | 231 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 859 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 944 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1005 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1223 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1318 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/visitors.py | 64 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/visitors.py | 146 | CODE | |
| LOW | src/tagstudio/core/library/alchemy/migrations.py | 84 | 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/qt_driver.py | 942 | CODE | |
| LOW | src/tagstudio/qt/qt_driver.py | 1257 | CODE | |
| LOW | src/tagstudio/qt/qt_driver.py | 1338 | CODE | |
| LOW | src/tagstudio/qt/qt_driver.py | 1427 | CODE | |
| LOW | src/tagstudio/qt/mixed/folders_to_tags.py | 106 | CODE | |
| LOW | src/tagstudio/qt/mixed/drop_import_modal.py | 103 | CODE | |
| LOW | src/tagstudio/qt/mixed/drop_import_modal.py | 185 | CODE | |
| LOW | src/tagstudio/qt/mixed/build_tag.py | 360 | CODE | |
| LOW | src/tagstudio/qt/mixed/file_attributes.py | 127 | CODE | |
| LOW | src/tagstudio/qt/mixed/media_player.py | 327 | CODE | |
| LOW | src/tagstudio/qt/mixed/pagination.py | 122 | CODE | |
| LOW | src/tagstudio/qt/utils/file_opener.py | 18 | CODE | |
| LOW | src/tagstudio/qt/controllers/autofill_line_edit.py | 40 | CODE | |
| LOW | src/tagstudio/qt/controllers/inspector.py | 171 | CODE | |
| LOW | src/tagstudio/qt/controllers/inspector.py | 227 | CODE | |
| LOW | src/tagstudio/qt/controllers/tag_suggest_box.py | 94 | CODE | |
| LOW | src/tagstudio/qt/controllers/modal_content.py | 35 | CODE | |
| LOW | src/tagstudio/qt/controllers/preview_thumb.py | 41 | CODE | |
| LOW | src/tagstudio/qt/controllers/preview_thumb.py | 114 | CODE | |
| LOW | src/tagstudio/qt/helpers/mnemonics.py | 38 | CODE | |
| LOW | src/tagstudio/qt/helpers/mnemonics.py | 126 | CODE | |
| LOW | src/tagstudio/previews/file_renderer.py | 539 | CODE | |
| LOW | src/tagstudio/previews/file_renderer.py | 731 | CODE | |
| LOW | src/tagstudio/previews/renderers/ebook.py | 21 | CODE | |
| LOW | src/tagstudio/previews/renderers/paint_dot_net.py | 17 | CODE | |
| LOW | src/tagstudio/previews/renderers/archive.py | 101 | CODE | |
| LOW | src/tagstudio/previews/renderers/medibang_paint.py | 19 | CODE | |
| LOW | src/tagstudio/previews/renderers/audio.py | 23 | CODE | |
| LOW | src/tagstudio/previews/renderers/audio.py | 64 | CODE | |
| LOW | src/tagstudio/previews/renderers/video.py | 19 | CODE | |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 178 | CODE | |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 488 | CODE | |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 644 | CODE | |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 854 | CODE | |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 1079 | CODE | |
| LOW | src/tagstudio/previews/vendored/pydub/utils.py | 17 | CODE |
| 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 | 1630 | def update_color(self, old_color_group: TagColorGroup, new_color_group: TagColorGroup) -> None: | CODE |
| LOW | src/tagstudio/core/library/alchemy/migrations.py | 159 | def _set_version(self, session: Session, key: str, value: int) -> None: | CODE |
| LOW | src/tagstudio/qt/qt_driver.py | 1338 | def update_completions_list(self, text: str) -> None: | CODE |
| LOW | src/tagstudio/qt/qt_driver.py | 1474 | def update_browsing_state(self, state: BrowsingState | None = None) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/build_tag.py | 428 | def update_category_exclusion(category_tag: Tag, checked: bool) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 116 | def set_copy_callback(self, callback: Callable[[], None] | None = None) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 124 | def set_edit_callback(self, callback: Callable[[], None] | None = None) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 132 | def set_remove_callback(self, callback: Callable[[], None] | None = None) -> None: | CODE |
| LOW⚡ | src/tagstudio/qt/mixed/field_widget.py | 140 | def set_inner_widget(self, widget: FieldWidget) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_widget.py | 155 | def set_title(self, title: str) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/tag_widget.py | 176 | 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 | 277 | def set_tint_opacity(self, opacity: int) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/media_player.py | 458 | def _update_controls(self, size: QSize) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 331 | def set_mode(self, mode: ItemType | None) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 357 | def set_extension(self, filename: Path) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/item_thumb.py | 389 | def set_count(self, count: str) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_containers.py | 103 | def update_from_entry(self, entry_id: int, update_badges: bool = True) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_containers.py | 139 | def update_toggled_tag(self, tag_id: int, toggle_value: bool) -> None: | CODE |
| LOW | src/tagstudio/qt/mixed/field_containers.py | 460 | def update_datetime_field(self, field: DatetimeField, name: str, value: str) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/tag_box.py | 35 | def set_entries(self, entries: list[int]) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/file_opener_label.py | 30 | def set_file_path(self, filepath: Path) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/field_template_widget.py | 30 | def set_field_template(self, field_template: BaseFieldTemplate | None) -> None: | CODE |
| LOW | …/tagstudio/qt/controllers/edit_field_template_modal.py | 45 | def set_field_template(self, field_template: BaseFieldTemplate | None = None) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/field_suggest_box.py | 89 | def _update_hint_icon(self) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/field_suggest_box.py | 100 | def _set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/inspector.py | 163 | def _set_selection_callback(self) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/inspector.py | 227 | def set_selection(self, selected: list[int], update_preview: bool = True) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/tag_suggest_box.py | 94 | def _update_hint_icon(self) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/tag_suggest_box.py | 118 | def _set_item_widget(self, item: Tag | None, index: int) -> None: | CODE |
| LOW | …agstudio/qt/controllers/field_template_search_panel.py | 119 | def set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/search_panel.py | 92 | def set_limit_items(self, limit_items: list[tuple[str, int]]) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/search_panel.py | 103 | def set_limit_index(self, index: int) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/search_panel.py | 197 | def update_items(self, query: str | None = None) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/search_panel.py | 253 | def set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter] | CODE |
| LOW | src/tagstudio/qt/controllers/tag_search_panel.py | 123 | def set_item_widget(self, item: Tag | None, index: int) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/suggest_box.py | 81 | def set_placeholder_text(self, text: str) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/suggest_box.py | 104 | def set_hint_icon(self, icon: Image.Image | None) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/suggest_box.py | 211 | def _update_hint_icon(self) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/suggest_box.py | 214 | def _update_items(self, query: str | None = None) -> None: | CODE |
| LOW | src/tagstudio/qt/controllers/suggest_box.py | 277 | def _set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter] | CODE |
| LOW | src/tagstudio/qt/views/thumb_button.py | 93 | def set_selected(self, value: bool) -> None: | CODE |
| LOW | src/tagstudio/qt/views/tag_box_view.py | 35 | def set_tags(self, tags: Iterable[Tag]) -> None: | CODE |
| LOW | src/tagstudio/qt/views/styles/palette.py | 23 | def set_palette(palette: QPalette) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/library/test_migrations.py | 54 | except Exception as e: | CODE |
| LOW | src/tagstudio/__main__.py | 65 | except Exception: | CODE |
| LOW | src/tagstudio/core/ts_core.py | 34 | 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 | 321 | except Exception as e: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 479 | except Exception as e: | CODE |
| LOW | src/tagstudio/core/library/alchemy/library.py | 1810 | except Exception as e: | CODE |
| LOW | src/tagstudio/core/library/alchemy/migrations.py | 124 | except Exception as e: | CODE |
| LOW | src/tagstudio/core/library/alchemy/migrations.py | 156 | except Exception: | CODE |
| LOW | src/tagstudio/qt/qt_driver.py | 1638 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/build_tag.py | 225 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/build_tag.py | 634 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/migration_modal.py | 379 | except Exception as e: | CODE |
| LOW | src/tagstudio/qt/mixed/migration_modal.py | 423 | 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 | 99 | 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/controllers/inspector.py | 275 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/file_renderer.py | 622 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/clip_studio.py | 38 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/ebook.py | 43 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/raster_image.py | 80 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/blender.py | 39 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/paint_dot_net.py | 47 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/archive.py | 131 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/medibang_paint.py | 55 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/renderers/audio.py | 146 | except Exception as e: | CODE |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 25 | except Exception: | CODE |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 188 | except Exception: | CODE |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 283 | except Exception: | CODE |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 403 | except Exception: | CODE |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 528 | except Exception: | CODE |
| LOW | src/tagstudio/previews/vendored/pydub/audio_segment.py | 687 | except Exception: | CODE |
| MEDIUM | src/tagstudio/previews/vendored/pydub/audio_segment.py | 280 | def __eq__(self, other): | CODE |
| 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/previews/file_renderer.py | 115 | # NOTE: This method will be replaced with frontend specific decorations (Qt painting) | COMMENT |
| LOW | src/tagstudio/previews/file_renderer.py | 139 | # NOTE: This method will be replaced with frontend specific decorations (Qt painting) | COMMENT |
| LOW | src/tagstudio/previews/file_renderer.py | 201 | # NOTE: This method will be replaced with frontend specific decorations (Qt painting) | COMMENT |
| LOW | src/tagstudio/previews/file_renderer.py | 232 | # NOTE: This method will be replaced with frontend specific decorations (Qt painting) | COMMENT |
| LOW | src/tagstudio/previews/file_renderer.py | 502 | # NOTE: This method will be replaced with frontend specific decorations (Qt painting) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/qt/test_field_containers.py | 144 | # Check if the container is the Meta Tags category | COMMENT |
| LOW | tests/qt/test_field_containers.py | 148 | # Check if the container is the Tags category | COMMENT |
| LOW⚡ | tests/qt/test_field_containers.py | 177 | # Check if the container is the Meta Tags category | COMMENT |
| LOW⚡ | tests/qt/test_field_containers.py | 181 | # Check if the container is the custom "foo" category | COMMENT |
| LOW | src/tagstudio/previews/file_renderer.py | 683 | # Check if the file is supposed to be ignored and render an overlay if needed | COMMENT |
| 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/previews/renderers/vector_image.py | 30 | # Create an image to draw the svg to and a painter to do the drawing | COMMENT |
| MEDIUM | src/tagstudio/previews/renderers/vector_image.py | 34 | # Create an svg renderer, then render to the painter | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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.top_container.setLayout(self.top_layout) | 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 | 137 | CODE | |
| LOW | src/tagstudio/core/utils/silent_subprocess.py | 15 | CODE | |
| LOW | src/tagstudio/core/utils/silent_subprocess.py | 92 | CODE | |
| LOW | src/tagstudio/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 |
|---|---|---|---|---|
| LOW | src/tagstudio/qt/views/underlined_widget_view.py | 18 | # HACK: I don't know why I can't just use a QFrame for the outline. | COMMENT |
| LOW | src/tagstudio/previews/vendored/pydub/utils.py | 54 | # If ffprobe didn't give any information, just return it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tagstudio/core/library/alchemy/fields.py | 5 | CODE | |
| LOW | src/tagstudio/qt/qt_driver.py | 42 | CODE | |
| LOW | src/tagstudio/previews/renderers/raster_image.py | 26 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/tagstudio/qt/qt_driver.py | 1481 | self.browsing_history.push(state) | CODE |