Repository Analysis

TagStudioDev/TagStudio

A User-Focused Photo & File Management System

14.8 Low AI signal View on GitHub

Analysis Overview

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).

14.8
Adjusted Score
14.8
Raw Score
100%
Time Factor
2026-07-13
Last Push
7.0K
Stars
Python
Language
49.9K
Lines of Code
241
Files
357
Pattern Hits
2026-07-14
Scan Date
0.15
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

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.

Severity Breakdown

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.

CRITICAL 34HIGH 1MEDIUM 8LOW 314

Directory Score Breakdown

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.

Pattern Findings

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.

Hallucination Indicators34 hits · 405 pts
SeverityFileLineSnippetContext
CRITICALsrc/tagstudio/qt/ts_qt.py409 self.main_window.menu_bar.open_library_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py417 self.main_window.menu_bar.save_library_backup_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py422 self.main_window.menu_bar.settings_action.triggered.connect(self.open_settings_modal)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py433 self.main_window.menu_bar.open_on_start_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py438 self.main_window.menu_bar.refresh_dir_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py443 self.main_window.menu_bar.close_library_action.triggered.connect(self.close_library)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py448 self.main_window.menu_bar.new_tag_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py452 self.main_window.menu_bar.select_all_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py456 self.main_window.menu_bar.select_inverse_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py460 self.main_window.menu_bar.clear_select_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py466 self.main_window.menu_bar.copy_fields_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py470 self.main_window.menu_bar.paste_fields_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py474 self.main_window.menu_bar.add_tag_to_selected_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py478 self.main_window.menu_bar.delete_file_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py482 self.main_window.menu_bar.tag_manager_action.triggered.connect(self.tag_manager_panel.show)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py484 self.main_window.menu_bar.color_manager_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py488 self.main_window.menu_bar.field_template_manager_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py501 self.main_window.menu_bar.library_info_action.triggered.connect(create_library_info_window)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py508 self.main_window.menu_bar.show_filenames_action.triggered.connect(on_show_filenames_action)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py518 self.main_window.menu_bar.decrease_thumbnail_size_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py527 self.main_window.menu_bar.increase_thumbnail_size_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py540 self.main_window.menu_bar.fix_unlinked_entries_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py549 self.main_window.menu_bar.fix_ignored_entries_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py558 self.main_window.menu_bar.fix_dupe_files_action.triggered.connect(create_dupe_files_modal)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py561 self.main_window.menu_bar.clear_thumb_cache_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py573 self.main_window.menu_bar.folders_to_tags_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/ts_qt.py585 self.main_window.menu_bar.about_action.triggered.connect(create_about_modal)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py721 self.main_window.menu_bar.ignore_modal_action.triggered.disconnect()CODE
CRITICALsrc/tagstudio/qt/ts_qt.py733 self.main_window.menu_bar.ignore_modal_action.triggered.connect(self.ignore_modal.show)CODE
CRITICALsrc/tagstudio/qt/ts_qt.py957 self.main_window.preview_panel.preview_thumb.media_player.stop()CODE
CRITICALsrc/tagstudio/qt/mixed/tag_color_manager.py128 else self.driver.main_window.preview_panel.field_containers_widget.update_from_entry( # noqa: ECODE
CRITICALsrc/tagstudio/qt/mixed/tag_color_manager.py145 else self.driver.main_window.preview_panel.field_containers_widget.update_from_entry( #CODE
CRITICALsrc/tagstudio/qt/mixed/item_thumb.py503 self.driver.main_window.preview_panel.field_containers_widget.update_toggled_tag(CODE
CRITICALsrc/tagstudio/qt/previews/renderer.py70from tagstudio.core.exceptions import NoRendererErrorCODE
Hyper-Verbose Identifiers104 hits · 103 pts
SeverityFileLineSnippetContext
LOWtests/test_library.py51def test_library_update_alias(library: Library, generate_tag: Callable[..., Tag]):CODE
LOWtests/test_library.py177def test_search_library_case_insensitive(library: Library):CODE
LOWtests/test_library.py207def test_remove_text_field_entry_with_multiple_fields(library: Library, entry_full: Entry):CODE
LOWtests/test_library.py234def test_update_entry_with_multiple_identical_text_fields(library: Library, entry_full: Entry):CODE
LOWtests/test_library.py365def test_remove_tags_from_entries(library: Library, entry_full: Entry):CODE
LOWtests/test_library.py402def test_path_search_default_with_sep(library: Library):CODE
LOWtests/test_library.py408def test_path_search_glob_after(library: Library):CODE
LOWtests/test_library.py414def test_path_search_glob_in_front(library: Library):CODE
LOWtests/test_library.py420def test_path_search_glob_both_sides(library: Library):CODE
LOWtests/test_library.py427def test_path_search_ilike_glob_equality(library: Library):CODE
LOWtests/test_library.py450def test_path_search_like_glob_equality(library: Library):CODE
LOWtests/test_library.py479def test_filetype_return_one_filetype(CODE
LOWtests/test_driver.py32def test_evaluate_path_missing():CODE
LOWtests/test_driver.py43def test_evaluate_path_last_lib_not_exists():CODE
LOWtests/test_driver.py56def test_evaluate_path_last_lib_present(library_dir: Path):CODE
LOWtests/test_translations.py21def get_translation_filenames() -> list[tuple[str]]:CODE
LOWtests/test_translations.py58def test_for_unnecessary_translations(translation_filename: str):CODE
LOWtests/qt/test_preview_panel.py11def test_update_selection_empty(qt_driver: QtDriver, library: Library):CODE
LOWtests/qt/test_preview_panel.py23def test_update_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry):CODE
LOWtests/qt/test_preview_panel.py34def test_update_selection_multiple(qt_driver: QtDriver, library: Library):CODE
LOWtests/qt/test_flow_widget.py11def test_flow_layout_happy_path():CODE
LOWtests/qt/test_field_containers.py12def test_update_selection_empty(qt_driver: QtDriver, library: Library):CODE
LOWtests/qt/test_field_containers.py25def test_update_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py37def test_update_selection_multiple(qt_driver: QtDriver, library: Library):CODE
LOWtests/qt/test_field_containers.py52def test_add_tag_to_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py69def test_add_same_tag_to_selection_single(qt_driver: QtDriver, library: Library, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py86def test_add_tag_to_selection_multiple(qt_driver: QtDriver, library: Library):CODE
LOWtests/qt/test_theme_system.py23def test_theme_colorscheme_handling(theme: Theme, expected_call):CODE
LOWtests/qt/test_tag_search_panel.py25def test_tag_widget_actions_replaced_correctly(qtbot: QtBot, qt_driver: QtDriver, library: Library):CODE
LOWtests/qt/test_tag_search_panel.py51def ensure_one_receiver_per_action(should_replace_actions):CODE
LOWtests/qt/test_folders_to_tags.py9def test_generate_preview_data(library: Library, snapshot: BranchData):CODE
LOWtests/qt/test_build_tag_panel.py16def test_build_tag_panel_add_sub_tag_callback(CODE
LOWtests/qt/test_build_tag_panel.py30def test_build_tag_panel_remove_subtag_callback(CODE
LOWtests/qt/test_build_tag_panel.py53def test_build_tag_panel_add_alias_callback(CODE
LOWtests/qt/test_build_tag_panel.py66def test_build_tag_panel_remove_alias_callback(CODE
LOWtests/qt/test_build_tag_panel.py91def test_build_tag_panel_set_parent_tags(CODE
LOWtests/qt/test_build_tag_panel.py108def test_build_tag_panel_add_aliases(CODE
LOWtests/qt/test_build_tag_panel.py139def test_build_tag_panel_set_aliases(CODE
LOWtests/qt/test_build_tag_panel.py157def test_build_tag_panel_set_tag(qtbot: QtBot, library: Library, generate_tag: Callable[..., Tag]):CODE
LOWtests/qt/test_build_tag_panel.py166def test_build_tag_panel_build_tag(qtbot: QtBot, library: Library):CODE
LOWtests/qt/test_about_modal.py10def test_github_api_unavailable(qtbot: QtBot, mocker) -> None:CODE
LOWtests/qt/test_qt_driver.py10def test_browsing_state_update(qt_driver: QtDriver):CODE
LOWtests/macros/test_refresh_dir.py34def test_refresh_multi_byte_filenames(library: Library):CODE
LOWtests/macros/test_missing_files.py20def test_refresh_missing_files(library: Library):CODE
LOWsrc/tagstudio/core/ts_core.py26 def get_most_recent_release_version() -> str | None:CODE
LOWsrc/tagstudio/core/query_lang/tokenizer.py99 def __unquoted_string_or_constraint_type(self) -> Token:CODE
LOWsrc/tagstudio/core/library/json/library.py683 # def _map_filenames_to_entry_ids(self):COMMENT
LOWsrc/tagstudio/core/library/json/library.py677 def _map_filenames_to_entry_ids(self):CODE
LOWsrc/tagstudio/core/library/json/library.py753 def save_library_backup_to_disk(self) -> str:CODE
LOWsrc/tagstudio/core/library/json/library.py1257 def get_entry_id_from_filepath(self, filename: Path):CODE
LOWsrc/tagstudio/core/library/json/library.py1865 def add_generic_data_to_entry(self, data, entry_id: int):CODE
LOWsrc/tagstudio/core/library/json/library.py2098 def _map_tag_strings_to_tag_id(self, tag: Tag) -> None:CODE
LOWsrc/tagstudio/core/library/json/library.py2170 def _map_collation_id_to_index(self, collation: Collation, index: int) -> None:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py175def get_default_field_templates() -> tuple[BaseFieldTemplate, ...]:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py746 def __migrate_sql_to_ts_ignore(self, session: Session, library_dir: Path):CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1831 def save_library_backup_to_disk(self) -> Path:CODE
LOWsrc/tagstudio/core/library/alchemy/visitors.py37def get_filetype_equivalency_list(item: str) -> list[str] | set[str]:CODE
LOW…o/core/library/alchemy/registries/unlinked_registry.py46 def match_unlinked_file_entry(self, match_entry: Entry) -> list[Path]:CODE
LOWsrc/tagstudio/qt/ts_qt.py429 def set_open_last_loaded_on_startup(checked: bool):CODE
LOWsrc/tagstudio/qt/ts_qt.py496 def create_library_info_window():CODE
44 more matches not shown…
Deep Nesting61 hits · 48 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/query_lang/tokenizer.py71CODE
LOWsrc/tagstudio/core/query_lang/tokenizer.py99CODE
LOWsrc/tagstudio/core/query_lang/ast.py101CODE
LOWsrc/tagstudio/core/library/ignore.py198CODE
LOWsrc/tagstudio/core/library/json/library.py109CODE
LOWsrc/tagstudio/core/library/json/library.py117CODE
LOWsrc/tagstudio/core/library/json/library.py443CODE
LOWsrc/tagstudio/core/library/json/library.py814CODE
LOWsrc/tagstudio/core/library/json/library.py987CODE
LOWsrc/tagstudio/core/library/json/library.py1185CODE
LOWsrc/tagstudio/core/library/json/library.py1265CODE
LOWsrc/tagstudio/core/library/json/library.py1495CODE
LOWsrc/tagstudio/core/library/json/library.py1759CODE
LOWsrc/tagstudio/core/library/json/library.py1812CODE
LOWsrc/tagstudio/core/library/json/library.py1841CODE
LOWsrc/tagstudio/core/library/json/library.py1865CODE
LOWsrc/tagstudio/core/library/json/library.py2007CODE
LOWsrc/tagstudio/core/library/alchemy/library.py258CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1248CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1333CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1394CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1612CODE
LOWsrc/tagstudio/core/library/alchemy/visitors.py64CODE
LOWsrc/tagstudio/core/library/alchemy/visitors.py146CODE
LOW…o/core/library/alchemy/registries/unlinked_registry.py70CODE
LOW…core/library/alchemy/registries/dupe_files_registry.py29CODE
LOWsrc/tagstudio/qt/cache_manager.py150CODE
LOWsrc/tagstudio/qt/ts_qt.py915CODE
LOWsrc/tagstudio/qt/ts_qt.py1230CODE
LOWsrc/tagstudio/qt/ts_qt.py1311CODE
LOWsrc/tagstudio/qt/ts_qt.py1400CODE
LOWsrc/tagstudio/qt/mnemonics.py38CODE
LOWsrc/tagstudio/qt/mnemonics.py126CODE
LOWsrc/tagstudio/qt/mixed/folders_to_tags.py105CODE
LOWsrc/tagstudio/qt/mixed/drop_import_modal.py109CODE
LOWsrc/tagstudio/qt/mixed/drop_import_modal.py191CODE
LOWsrc/tagstudio/qt/mixed/file_attributes.py127CODE
LOWsrc/tagstudio/qt/mixed/media_player.py326CODE
LOWsrc/tagstudio/qt/mixed/pagination.py122CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py163CODE
LOWsrc/tagstudio/qt/utils/file_opener.py23CODE
LOWsrc/tagstudio/qt/previews/renderer.py651CODE
LOWsrc/tagstudio/qt/previews/renderer.py692CODE
LOWsrc/tagstudio/qt/previews/renderer.py872CODE
LOWsrc/tagstudio/qt/previews/renderer.py898CODE
LOWsrc/tagstudio/qt/previews/renderer.py1221CODE
LOWsrc/tagstudio/qt/previews/renderer.py1385CODE
LOWsrc/tagstudio/qt/previews/renderer.py1429CODE
LOWsrc/tagstudio/qt/previews/renderer.py1471CODE
LOWsrc/tagstudio/qt/previews/renderer.py1572CODE
LOWsrc/tagstudio/qt/previews/renderer.py1791CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py178CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py488CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py644CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py854CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py1079CODE
LOWsrc/tagstudio/qt/previews/vendored/pydub/utils.py21CODE
LOW…c/tagstudio/qt/controllers/preview_thumb_controller.py40CODE
LOW…c/tagstudio/qt/controllers/preview_thumb_controller.py113CODE
LOWsrc/tagstudio/qt/views/preview_panel_view.py166CODE
1 more matches not shown…
Modern Structural Boilerplate39 hits · 40 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/json/library.py1694 def update_tag(self, tag: Tag) -> None:CODE
LOWsrc/tagstudio/core/library/json/library.py1833 def update_entry_path(self, entry_id: int, path: str | Path) -> None:CODE
LOWsrc/tagstudio/core/library/json/library.py1837 def update_entry_filename(self, entry_id: int, filename: str | Path) -> None:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py2007 def update_color(self, old_color_group: TagColorGroup, new_color_group: TagColorGroup) -> None:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py2153 def set_version(self, session: Session, key: str, value: int) -> None:CODE
LOWsrc/tagstudio/qt/ts_qt.py1311 def update_completions_list(self, text: str) -> None:CODE
LOWsrc/tagstudio/qt/ts_qt.py1447 def update_browsing_state(self, state: BrowsingState | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py112 def set_copy_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py120 def set_edit_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py128 def set_remove_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py136 def set_inner_widget(self, widget: "FieldWidget") -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py149 def set_title(self, title: str) -> None:CODE
LOWsrc/tagstudio/qt/mixed/tag_widget.py178 def set_tag(self, tag: Tag | None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/tag_color_label.py98 def set_color(self, color: TagColorGroup | None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/file_attributes.py94 def update_date_label(self, filepath: Path | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/media_player.py276 def set_tint_opacity(self, opacity: int) -> None:CODE
LOWsrc/tagstudio/qt/mixed/media_player.py457 def _update_controls(self, size: QSize) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py341 def set_mode(self, mode: ItemType | None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py367 def set_extension(self, filename: Path) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py399 def set_count(self, count: str) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py109 def update_from_entry(self, entry_id: int, update_badges: bool = True) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py145 def update_toggled_tag(self, tag_id: int, toggle_value: bool) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py463 def update_datetime_field(self, field: DatetimeField, name: str, value: str) -> None:CODE
LOWsrc/tagstudio/qt/utils/file_opener.py147 def set_file_path(self, filepath: Path) -> None:CODE
LOW…dio/qt/controllers/field_template_widget_controller.py29 def set_field_template(self, field_template: BaseFieldTemplate | None) -> None:CODE
LOW…/tagstudio/qt/controllers/edit_field_template_modal.py44 def set_field_template(self, field_template: BaseFieldTemplate | None = None) -> None:CODE
LOW…agstudio/qt/controllers/tag_search_panel_controller.py145 def set_item_widget(self, item: Tag | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/tag_box_controller.py34 def set_entries(self, entries: list[int]) -> None:CODE
LOW…/controllers/field_template_search_panel_controller.py135 def set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel_controller.py100 def set_driver(self, driver: "QtDriver") -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel_controller.py161 def update_items(self, query: str | None = None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel_controller.py217 def set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter]CODE
LOW…c/tagstudio/qt/controllers/preview_panel_controller.py40 def _set_selection_callback(self) -> None:CODE
LOWsrc/tagstudio/qt/views/preview_panel_view.py163 def _set_selection_callback(self) -> None:CODE
LOWsrc/tagstudio/qt/views/preview_panel_view.py166 def set_selection(self, selected: list[int], update_preview: bool = True) -> None:CODE
LOWsrc/tagstudio/qt/views/thumb_button.py139 def set_selected(self, value: bool) -> None:CODE
LOWsrc/tagstudio/qt/views/tag_box_view.py34 def set_tags(self, tags: Iterable[Tag]) -> None:CODE
LOWsrc/tagstudio/qt/views/search_panel_view.py114 def set_limit_items(self, limit_items: list[tuple[str, int]]) -> None:CODE
LOWsrc/tagstudio/qt/views/search_panel_view.py125 def set_limit_index(self, index: int) -> None:CODE
Unused Imports38 hits · 36 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/json/library.py22CODE
LOWsrc/tagstudio/core/library/alchemy/fields.py5CODE
LOWsrc/tagstudio/qt/ts_qt.py42CODE
LOWsrc/tagstudio/qt/mixed/folders_to_tags.py35CODE
LOWsrc/tagstudio/qt/mixed/datetime_picker.py16CODE
LOWsrc/tagstudio/qt/mixed/fix_unlinked.py11CODE
LOWsrc/tagstudio/qt/mixed/fix_unlinked.py22CODE
LOWsrc/tagstudio/qt/mixed/landing.py21CODE
LOWsrc/tagstudio/qt/mixed/tag_color_manager.py37CODE
LOWsrc/tagstudio/qt/mixed/file_attributes.py30CODE
LOWsrc/tagstudio/qt/mixed/media_player.py44CODE
LOWsrc/tagstudio/qt/mixed/remove_unlinked_modal.py26CODE
LOWsrc/tagstudio/qt/mixed/settings_panel.py36CODE
LOWsrc/tagstudio/qt/mixed/remove_ignored_modal.py26CODE
LOWsrc/tagstudio/qt/mixed/merge_dupe_entries.py9CODE
LOWsrc/tagstudio/qt/mixed/merge_dupe_entries.py16CODE
LOWsrc/tagstudio/qt/mixed/mirror_entries_modal.py18CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py27CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py28CODE
LOWsrc/tagstudio/qt/mixed/fix_dupe_files.py18CODE
LOWsrc/tagstudio/qt/mixed/fix_dupe_files.py26CODE
LOWsrc/tagstudio/qt/previews/renderer.py95CODE
LOWsrc/tagstudio/qt/previews/renderer.py105CODE
LOWsrc/tagstudio/qt/controllers/tag_box_controller.py20CODE
LOW…tudio/qt/controllers/library_info_window_controller.py20CODE
LOW…tudio/qt/controllers/library_info_window_controller.py29CODE
LOW…gstudio/qt/controllers/fix_ignored_modal_controller.py10CODE
LOW…gstudio/qt/controllers/fix_ignored_modal_controller.py20CODE
LOW…c/tagstudio/qt/controllers/preview_panel_controller.py17CODE
LOWsrc/tagstudio/qt/views/main_window.py52CODE
LOWsrc/tagstudio/qt/views/preview_panel_view.py34CODE
LOWsrc/tagstudio/qt/views/fix_ignored_modal_view.py11CODE
LOWsrc/tagstudio/qt/views/fix_ignored_modal_view.py16CODE
LOWsrc/tagstudio/qt/views/tag_box_view.py17CODE
LOWsrc/tagstudio/qt/views/library_info_window_view.py31CODE
LOWsrc/tagstudio/qt/views/library_info_window_view.py32CODE
LOWsrc/tagstudio/qt/views/search_panel_view.py25CODE
LOWsrc/tagstudio/qt/views/preview_thumb_view.py25CODE
Excessive Try-Catch Wrapping34 hits · 34 pts
SeverityFileLineSnippetContext
LOWtests/test_db_migrations.py54 except Exception as e:CODE
LOWsrc/tagstudio/main.py72 except Exception:CODE
LOWsrc/tagstudio/core/ts_core.py32 except Exception as e:CODE
LOWsrc/tagstudio/core/library/json/library.py397 except Exception:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py350 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py498 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py2150 except Exception:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py2193 except Exception as e:CODE
LOWsrc/tagstudio/qt/ts_qt.py1611 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/build_tag.py198 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/build_tag.py484 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/migration_modal.py386 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/migration_modal.py431 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py55 except Exception:CODE
LOWsrc/tagstudio/qt/utils/file_opener.py104 except Exception:CODE
LOWsrc/tagstudio/qt/utils/file_deleter.py41 except Exception as e:CODE
LOWsrc/tagstudio/qt/utils/file_deleter.py55 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py774 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py802 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py922 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py969 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py1159 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py1465 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py1501 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py1530 except Exception as e:CODE
LOWsrc/tagstudio/qt/previews/renderer.py1666 except Exception as e:CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py25except Exception:CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py188 except Exception:CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py283 except Exception:CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py403 except Exception:CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py528 except Exception:CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py687 except Exception:CODE
MEDIUM…/tagstudio/qt/previews/vendored/pydub/audio_segment.py280def __eq__(self, other):CODE
LOWsrc/tagstudio/qt/views/preview_panel_view.py219 except Exception as e:CODE
Self-Referential Comments5 hits · 15 pts
SeverityFileLineSnippetContext
MEDIUMsrc/tagstudio/core/library/ignore.py61 # Create a version of a prefix-less pattern that starts with "**/"COMMENT
MEDIUMsrc/tagstudio/qt/previews/renderer.py1192 # Create an image to draw the svg to and a painter to do the drawingCOMMENT
MEDIUMsrc/tagstudio/qt/previews/renderer.py1196 # Create an svg renderer, then render to the painterCOMMENT
MEDIUMsrc/tagstudio/qt/previews/renderer.py1277 # # Create a new plotCOMMENT
MEDIUMsrc/tagstudio/qt/previews/vendored/blender_renderer.py9## This file is a modified script that gets the thumbnail data stored in a blend fileCOMMENT
Redundant / Tautological Comments9 hits · 14 pts
SeverityFileLineSnippetContext
LOWtests/qt/test_field_containers.py141 # Check if the container is the Meta Tags categoryCOMMENT
LOWtests/qt/test_field_containers.py145 # Check if the container is the Tags categoryCOMMENT
LOWtests/qt/test_field_containers.py176 # Check if the container is the Meta Tags categoryCOMMENT
LOWtests/qt/test_field_containers.py180 # Check if the container is the custom "foo" categoryCOMMENT
LOWsrc/tagstudio/qt/previews/renderer.py835 # Check if the file exists in the zipCOMMENT
LOWsrc/tagstudio/qt/previews/renderer.py858 # Check if the file exists in the zipCOMMENT
LOWsrc/tagstudio/qt/previews/renderer.py882 # Check if the file exists in the zipCOMMENT
LOWsrc/tagstudio/qt/previews/renderer.py1248 # Check if the file exists in the zipCOMMENT
LOWsrc/tagstudio/qt/previews/renderer.py1728 # Check if the file is supposed to be ignored and render an overlay if neededCOMMENT
Over-Commented Block15 hits · 10 pts
SeverityFileLineSnippetContext
LOWtests/test_json_migration.py21 # Entries ==================================================================COMMENT
LOWsrc/tagstudio/core/library/json/library.py61 # self.mask: list[id] = NoneCOMMENT
LOWsrc/tagstudio/core/library/json/library.py301COMMENT
LOWsrc/tagstudio/core/library/json/library.py341 self.ext_list: list[str] = []COMMENT
LOWsrc/tagstudio/core/library/json/library.py681 self.filename_to_entry_id_map[(entry.path / entry.filename)] = entry.idCOMMENT
LOWsrc/tagstudio/core/library/json/library.py1161COMMENT
LOWsrc/tagstudio/core/library/json/library.py1421 # Assume that this ID from the cluster is not in the Entry.COMMENT
LOWsrc/tagstudio/core/library/json/library.py1441 # Since this term could technically map to multiple IDs, iterate over itCOMMENT
LOWsrc/tagstudio/core/library/json/library.py1501 context: list[str] = None,COMMENT
LOWsrc/tagstudio/core/library/json/library.py1521 # # print(COMMENT
LOW…tudio/resources/templates/ts_ignore_template_blank.txt1# This is a '.ts_ignore' file for TagStudio.COMMENT
LOW…c/tagstudio/resources/templates/ts_ignore_template.txt1# This is a '.ts_ignore' file for TagStudio.COMMENT
LOWsrc/tagstudio/qt/mixed/item_thumb.py141 # |*--------*|COMMENT
LOWsrc/tagstudio/qt/mixed/item_thumb.py161 self.thumb_layout.addWidget(self.top_container)COMMENT
LOWsrc/tagstudio/qt/previews/renderer.py1281COMMENT
Structural Annotation Overuse6 hits · 10 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/json/library.py493 # Step 1: Verify default built-in tags are present.COMMENT
LOWsrc/tagstudio/core/library/json/library.py497 # Step 2: Create a Tag object and append it to the internal Tags list,COMMENT
LOWsrc/tagstudio/core/library/json/library.py532 # Step 3: Map each Tag's subtags together now that all Tag objects in it.COMMENT
LOWsrc/tagstudio/core/library/json/library.py633 # Step 1: Create a Collation object and append it toCOMMENT
LOWsrc/tagstudio/core/library/json/library.py1934 # NOTE: The following commented-out code enables the abilityCOMMENT
LOWsrc/tagstudio/qt/mixed/add_field.py27# NOTE: This class doesn't inherit from PanelWidget? Seems like it predates that system?COMMENT
Verbosity Indicators4 hits · 8 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/json/library.py493 # Step 1: Verify default built-in tags are present.COMMENT
LOWsrc/tagstudio/core/library/json/library.py497 # Step 2: Create a Tag object and append it to the internal Tags list,COMMENT
LOWsrc/tagstudio/core/library/json/library.py532 # Step 3: Map each Tag's subtags together now that all Tag objects in it.COMMENT
LOWsrc/tagstudio/core/library/json/library.py633 # Step 1: Create a Collation object and append it toCOMMENT
AI Structural Patterns4 hits · 4 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/alchemy/models.py127CODE
LOWsrc/tagstudio/core/utils/silent_subprocess.py15CODE
LOWsrc/tagstudio/core/utils/silent_subprocess.py92CODE
LOW…/tagstudio/qt/previews/vendored/pydub/audio_segment.py854CODE
Decorative Section Separators1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/tagstudio/qt/mixed/pagination.py36 # --------------------------------------COMMENT
Cross-Language Confusion1 hit · 2 pts
SeverityFileLineSnippetContext
HIGHsrc/tagstudio/qt/ts_qt.py1454 self.browsing_history.push(state)CODE
Dead Code1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMsrc/tagstudio/core/library/json/library.py1239CODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/qt/previews/vendored/pydub/utils.py58 # If ffprobe didn't give any information, just return itCOMMENT