Repository Analysis

TagStudioDev/TagStudio

A User-Focused Photo & File Management System

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

13.8
Adjusted Score
13.8
Raw Score
100%
Time Factor
2026-08-28
Last Push
7.2K
Stars
Python
Language
52.6K
Lines of Code
265
Files
344
Pattern Hits
2026-08-29
Scan Date
0.13
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 33HIGH 1MEDIUM 5LOW 305

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

Hallucination Indicators33 hits · 400 pts
SeverityFileLineSnippetContext
CRITICALsrc/tagstudio/qt/qt_driver.py428 self.main_window.menu_bar.open_library_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py436 self.main_window.menu_bar.save_library_backup_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py441 self.main_window.menu_bar.settings_action.triggered.connect(self.open_settings_modal)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py452 self.main_window.menu_bar.open_on_start_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py457 self.main_window.menu_bar.refresh_dir_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py462 self.main_window.menu_bar.close_library_action.triggered.connect(self.close_library)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py467 self.main_window.menu_bar.new_tag_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py471 self.main_window.menu_bar.select_all_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py475 self.main_window.menu_bar.select_inverse_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py479 self.main_window.menu_bar.clear_select_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py485 self.main_window.menu_bar.copy_fields_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py489 self.main_window.menu_bar.paste_fields_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py493 self.main_window.menu_bar.add_tag_to_selected_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py497 self.main_window.menu_bar.delete_file_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py501 self.main_window.menu_bar.tag_manager_action.triggered.connect(self.tag_manager.show)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py503 self.main_window.menu_bar.color_manager_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py507 self.main_window.menu_bar.field_template_manager_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py520 self.main_window.menu_bar.library_info_action.triggered.connect(create_library_info_window)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py527 self.main_window.menu_bar.show_filenames_action.triggered.connect(on_show_filenames_action)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py537 self.main_window.menu_bar.decrease_thumbnail_size_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py546 self.main_window.menu_bar.increase_thumbnail_size_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py559 self.main_window.menu_bar.fix_unlinked_entries_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py568 self.main_window.menu_bar.fix_ignored_entries_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py577 self.main_window.menu_bar.fix_dupe_files_action.triggered.connect(create_dupe_files_modal)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py580 self.main_window.menu_bar.clear_thumb_cache_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py592 self.main_window.menu_bar.folders_to_tags_action.triggered.connect(CODE
CRITICALsrc/tagstudio/qt/qt_driver.py604 self.main_window.menu_bar.about_action.triggered.connect(create_about_modal)CODE
CRITICALsrc/tagstudio/qt/qt_driver.py742 self.main_window.menu_bar.ignore_modal_action.triggered.disconnect()CODE
CRITICALsrc/tagstudio/qt/qt_driver.py754 self.main_window.menu_bar.ignore_modal_action.triggered.connect(self.ignore_modal.show)CODE
CRITICALsrc/tagstudio/qt/mixed/tag_color_manager.py129 else self.driver.main_window.preview_panel.containers.update_from_entry( # noqa: E501CODE
CRITICALsrc/tagstudio/qt/mixed/tag_color_manager.py146 else self.driver.main_window.preview_panel.containers.update_from_entry( # noqa: E501CODE
CRITICALsrc/tagstudio/qt/mixed/item_thumb.py493 self.driver.main_window.preview_panel.containers.update_toggled_tag(CODE
CRITICALsrc/tagstudio/previews/file_renderer.py15from tagstudio.core.exceptions import NoRendererErrorCODE
Hyper-Verbose Identifiers130 hits · 128 pts
SeverityFileLineSnippetContext
LOWtests/core/test_base_driver.py33def test_evaluate_path_missing():CODE
LOWtests/core/test_base_driver.py44def test_evaluate_path_last_lib_not_exists():CODE
LOWtests/core/test_base_driver.py57def test_evaluate_path_last_lib_present(library_dir: Path):CODE
LOWtests/core/library/test_library.py51def test_library_update_alias(library: Library, generate_tag: Callable[..., Tag]):CODE
LOWtests/core/library/test_library.py175def test_search_library_case_insensitive(library: Library):CODE
LOWtests/core/library/test_library.py205def test_remove_text_field_entry_with_multiple_fields(library: Library, entry_full: Entry):CODE
LOWtests/core/library/test_library.py232def test_update_entry_with_multiple_identical_text_fields(library: Library, entry_full: Entry):CODE
LOWtests/core/library/test_library.py356def test_remove_tags_from_entries(library: Library, entry_full: Entry):CODE
LOWtests/core/library/test_library.py393def test_path_search_default_with_sep(library: Library):CODE
LOWtests/core/library/test_library.py399def test_path_search_glob_after(library: Library):CODE
LOWtests/core/library/test_library.py405def test_path_search_glob_in_front(library: Library):CODE
LOWtests/core/library/test_library.py411def test_path_search_glob_both_sides(library: Library):CODE
LOWtests/core/library/test_library.py418def test_path_search_ilike_glob_equality(library: Library):CODE
LOWtests/core/library/test_library.py441def test_path_search_like_glob_equality(library: Library):CODE
LOWtests/core/library/test_library.py470def test_filetype_return_one_filetype(CODE
LOWtests/core/library/test_refresh.py34def test_refresh_multi_byte_filenames(library: Library):CODE
LOWtests/core/library/test_unlinked_entries.py20def test_refresh_unlinked_entries(library: Library):CODE
LOWtests/qt/test_flow_widget.py11def test_flow_layout_happy_path():CODE
LOWtests/qt/test_field_containers.py15def test_update_selection_empty(qt_driver: QtDriver):CODE
LOWtests/qt/test_field_containers.py28def test_update_selection_single(qt_driver: QtDriver, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py40def test_update_selection_multiple(qt_driver: QtDriver):CODE
LOWtests/qt/test_field_containers.py55def test_add_tag_to_selection_single(qt_driver: QtDriver, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py72def test_add_same_tag_to_selection_single(qt_driver: QtDriver, entry_full: Entry):CODE
LOWtests/qt/test_field_containers.py89def test_add_tag_to_selection_multiple(qt_driver: QtDriver):CODE
LOWtests/qt/test_field_containers.py190def test_exclude_tag_category(CODE
LOWtests/qt/test_theme_system.py23def test_theme_colorscheme_handling(theme: Theme, expected_call):CODE
LOWtests/qt/test_tag_search_panel.py24def test_tag_widget_actions_replaced_correctly(qtbot: QtBot, library: Library):CODE
LOWtests/qt/test_tag_search_panel.py49def 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.py162def test_build_tag_panel_set_tag(qtbot: QtBot, library: Library, generate_tag: Callable[..., Tag]):CODE
LOWtests/qt/test_build_tag_panel.py171def test_build_tag_panel_build_tag(qtbot: QtBot, library: Library):CODE
LOWtests/qt/test_build_tag_panel.py180def test_build_tag_panel_show_category_from_parent(CODE
LOWtests/qt/test_build_tag_panel.py21def test_build_tag_panel_add_sub_tag_callback(CODE
LOWtests/qt/test_build_tag_panel.py35def test_build_tag_panel_remove_subtag_callback(CODE
LOWtests/qt/test_build_tag_panel.py58def test_build_tag_panel_add_alias_callback(CODE
LOWtests/qt/test_build_tag_panel.py71def test_build_tag_panel_remove_alias_callback(CODE
LOWtests/qt/test_build_tag_panel.py96def test_build_tag_panel_set_parent_tags(CODE
LOWtests/qt/test_build_tag_panel.py113def test_build_tag_panel_add_aliases(CODE
LOWtests/qt/test_build_tag_panel.py144def test_build_tag_panel_set_aliases(CODE
LOWtests/qt/test_build_tag_panel.py194def test_build_tag_panel_show_category_from_grandparent(CODE
LOWtests/qt/test_build_tag_panel.py209def test_build_tag_panel_add_category_through_parent(CODE
LOWtests/qt/test_build_tag_panel.py228def test_build_tag_panel_add_category_through_grandparent(CODE
LOWtests/qt/test_build_tag_panel.py248def test_build_tag_panel_remove_category_through_parent(CODE
LOWtests/qt/test_build_tag_panel.py266def test_build_tag_panel_remove_category_through_grandparent(CODE
LOWtests/qt/test_build_tag_panel.py285def test_build_tag_panel_exclude_from_category(CODE
LOWtests/qt/test_build_tag_panel.py307def test_build_tag_panel_include_in_category(CODE
LOWtests/qt/test_build_tag_panel.py333def test_build_tag_panel_remove_duplicate_category_retained(CODE
LOWtests/qt/test_build_tag_panel.py359def test_build_tag_panel_new_tag_multiple_categories(CODE
LOWtests/qt/test_build_tag_panel.py384def test_build_tag_panel_category_not_shown_for_self(CODE
LOWtests/qt/test_build_tag_panel.py396def test_build_tag_panel_remove_inherited_from_multiple_parents_during_tag_creation(CODE
LOWtests/qt/test_build_tag_panel.py421def test_build_tag_panel_add_different_category_after_removing_other_category(CODE
LOWtests/qt/test_build_tag_panel.py443def test_build_tag_panel_remove_category_inherited_directly_and_indirectly(CODE
LOWtests/qt/test_build_tag_panel.py467def __find_category_tag_widget(panel: BuildTagPanel, index: int = 0) -> TagWidget | None:CODE
LOWtests/qt/test_inspector.py11def test_update_selection_empty(qt_driver: QtDriver):CODE
LOWtests/qt/test_inspector.py27def test_update_selection_single(qt_driver: QtDriver, entry_full: Entry):CODE
LOWtests/qt/test_inspector.py39def test_update_selection_multiple(qt_driver: QtDriver):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/i18n/test_translations.py21def get_translation_filenames() -> list[tuple[str]]:CODE
LOWtests/i18n/test_translations.py58def test_for_unnecessary_translations(translation_filename: str):CODE
70 more matches not shown…
Deep Nesting52 hits · 50 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/alchemy/library.py231CODE
LOWsrc/tagstudio/core/library/alchemy/library.py859CODE
LOWsrc/tagstudio/core/library/alchemy/library.py944CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1005CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1223CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1318CODE
LOWsrc/tagstudio/core/library/alchemy/visitors.py64CODE
LOWsrc/tagstudio/core/library/alchemy/visitors.py146CODE
LOWsrc/tagstudio/core/library/alchemy/migrations.py84CODE
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/qt_driver.py942CODE
LOWsrc/tagstudio/qt/qt_driver.py1257CODE
LOWsrc/tagstudio/qt/qt_driver.py1338CODE
LOWsrc/tagstudio/qt/qt_driver.py1427CODE
LOWsrc/tagstudio/qt/mixed/folders_to_tags.py106CODE
LOWsrc/tagstudio/qt/mixed/drop_import_modal.py103CODE
LOWsrc/tagstudio/qt/mixed/drop_import_modal.py185CODE
LOWsrc/tagstudio/qt/mixed/build_tag.py360CODE
LOWsrc/tagstudio/qt/mixed/file_attributes.py127CODE
LOWsrc/tagstudio/qt/mixed/media_player.py327CODE
LOWsrc/tagstudio/qt/mixed/pagination.py122CODE
LOWsrc/tagstudio/qt/utils/file_opener.py18CODE
LOWsrc/tagstudio/qt/controllers/autofill_line_edit.py40CODE
LOWsrc/tagstudio/qt/controllers/inspector.py171CODE
LOWsrc/tagstudio/qt/controllers/inspector.py227CODE
LOWsrc/tagstudio/qt/controllers/tag_suggest_box.py94CODE
LOWsrc/tagstudio/qt/controllers/modal_content.py35CODE
LOWsrc/tagstudio/qt/controllers/preview_thumb.py41CODE
LOWsrc/tagstudio/qt/controllers/preview_thumb.py114CODE
LOWsrc/tagstudio/qt/helpers/mnemonics.py38CODE
LOWsrc/tagstudio/qt/helpers/mnemonics.py126CODE
LOWsrc/tagstudio/previews/file_renderer.py539CODE
LOWsrc/tagstudio/previews/file_renderer.py731CODE
LOWsrc/tagstudio/previews/renderers/ebook.py21CODE
LOWsrc/tagstudio/previews/renderers/paint_dot_net.py17CODE
LOWsrc/tagstudio/previews/renderers/archive.py101CODE
LOWsrc/tagstudio/previews/renderers/medibang_paint.py19CODE
LOWsrc/tagstudio/previews/renderers/audio.py23CODE
LOWsrc/tagstudio/previews/renderers/audio.py64CODE
LOWsrc/tagstudio/previews/renderers/video.py19CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py178CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py488CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py644CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py854CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py1079CODE
LOWsrc/tagstudio/previews/vendored/pydub/utils.py17CODE
Modern Structural Boilerplate48 hits · 49 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.py1630 def update_color(self, old_color_group: TagColorGroup, new_color_group: TagColorGroup) -> None:CODE
LOWsrc/tagstudio/core/library/alchemy/migrations.py159 def _set_version(self, session: Session, key: str, value: int) -> None:CODE
LOWsrc/tagstudio/qt/qt_driver.py1338 def update_completions_list(self, text: str) -> None:CODE
LOWsrc/tagstudio/qt/qt_driver.py1474 def update_browsing_state(self, state: BrowsingState | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/build_tag.py428 def update_category_exclusion(category_tag: Tag, checked: bool) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py116 def set_copy_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py124 def set_edit_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py132 def set_remove_callback(self, callback: Callable[[], None] | None = None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py140 def set_inner_widget(self, widget: FieldWidget) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_widget.py155 def set_title(self, title: str) -> None:CODE
LOWsrc/tagstudio/qt/mixed/tag_widget.py176 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.py277 def set_tint_opacity(self, opacity: int) -> None:CODE
LOWsrc/tagstudio/qt/mixed/media_player.py458 def _update_controls(self, size: QSize) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py331 def set_mode(self, mode: ItemType | None) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py357 def set_extension(self, filename: Path) -> None:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py389 def set_count(self, count: str) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py103 def update_from_entry(self, entry_id: int, update_badges: bool = True) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py139 def update_toggled_tag(self, tag_id: int, toggle_value: bool) -> None:CODE
LOWsrc/tagstudio/qt/mixed/field_containers.py460 def update_datetime_field(self, field: DatetimeField, name: str, value: str) -> None:CODE
LOWsrc/tagstudio/qt/controllers/tag_box.py35 def set_entries(self, entries: list[int]) -> None:CODE
LOWsrc/tagstudio/qt/controllers/file_opener_label.py30 def set_file_path(self, filepath: Path) -> None:CODE
LOWsrc/tagstudio/qt/controllers/field_template_widget.py30 def set_field_template(self, field_template: BaseFieldTemplate | None) -> None:CODE
LOW…/tagstudio/qt/controllers/edit_field_template_modal.py45 def set_field_template(self, field_template: BaseFieldTemplate | None = None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/field_suggest_box.py89 def _update_hint_icon(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/field_suggest_box.py100 def _set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/inspector.py163 def _set_selection_callback(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/inspector.py227 def set_selection(self, selected: list[int], update_preview: bool = True) -> None:CODE
LOWsrc/tagstudio/qt/controllers/tag_suggest_box.py94 def _update_hint_icon(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/tag_suggest_box.py118 def _set_item_widget(self, item: Tag | None, index: int) -> None:CODE
LOW…agstudio/qt/controllers/field_template_search_panel.py119 def set_item_widget(self, item: BaseFieldTemplate | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py92 def set_limit_items(self, limit_items: list[tuple[str, int]]) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py103 def set_limit_index(self, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py197 def update_items(self, query: str | None = None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/search_panel.py253 def set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter]CODE
LOWsrc/tagstudio/qt/controllers/tag_search_panel.py123 def set_item_widget(self, item: Tag | None, index: int) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py81 def set_placeholder_text(self, text: str) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py104 def set_hint_icon(self, icon: Image.Image | None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py211 def _update_hint_icon(self) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py214 def _update_items(self, query: str | None = None) -> None:CODE
LOWsrc/tagstudio/qt/controllers/suggest_box.py277 def _set_item_widget(self, item: T | None, index: int) -> None: # pyright: ignore[reportUnusedParameter]CODE
LOWsrc/tagstudio/qt/views/thumb_button.py93 def set_selected(self, value: bool) -> None:CODE
LOWsrc/tagstudio/qt/views/tag_box_view.py35 def set_tags(self, tags: Iterable[Tag]) -> None:CODE
LOWsrc/tagstudio/qt/views/styles/palette.py23 def set_palette(palette: QPalette) -> None:CODE
Excessive Try-Catch Wrapping35 hits · 36 pts
SeverityFileLineSnippetContext
LOWtests/core/library/test_migrations.py54 except Exception as e:CODE
LOWsrc/tagstudio/__main__.py65 except Exception:CODE
LOWsrc/tagstudio/core/ts_core.py34 except Exception as e:CODE
LOWsrc/tagstudio/core/library/json/library.py397 except Exception:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py321 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py479 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/library.py1810 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/migrations.py124 except Exception as e:CODE
LOWsrc/tagstudio/core/library/alchemy/migrations.py156 except Exception:CODE
LOWsrc/tagstudio/qt/qt_driver.py1638 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/build_tag.py225 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/build_tag.py634 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/migration_modal.py379 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/migration_modal.py423 except Exception as e:CODE
LOWsrc/tagstudio/qt/mixed/item_thumb.py55 except Exception:CODE
LOWsrc/tagstudio/qt/utils/file_opener.py99 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/controllers/inspector.py275 except Exception as e:CODE
LOWsrc/tagstudio/previews/file_renderer.py622 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/clip_studio.py38 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/ebook.py43 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/raster_image.py80 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/blender.py39 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/paint_dot_net.py47 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/archive.py131 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/medibang_paint.py55 except Exception as e:CODE
LOWsrc/tagstudio/previews/renderers/audio.py146 except Exception as e:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py25except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py188 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py283 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py403 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py528 except Exception:CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py687 except Exception:CODE
MEDIUMsrc/tagstudio/previews/vendored/pydub/audio_segment.py280def __eq__(self, other):CODE
Structural Annotation Overuse10 hits · 16 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/previews/file_renderer.py115 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py139 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py201 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py232 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
LOWsrc/tagstudio/previews/file_renderer.py502 # NOTE: This method will be replaced with frontend specific decorations (Qt painting)COMMENT
Redundant / Tautological Comments5 hits · 9 pts
SeverityFileLineSnippetContext
LOWtests/qt/test_field_containers.py144 # Check if the container is the Meta Tags categoryCOMMENT
LOWtests/qt/test_field_containers.py148 # Check if the container is the Tags categoryCOMMENT
LOWtests/qt/test_field_containers.py177 # Check if the container is the Meta Tags categoryCOMMENT
LOWtests/qt/test_field_containers.py181 # Check if the container is the custom "foo" categoryCOMMENT
LOWsrc/tagstudio/previews/file_renderer.py683 # Check if the file is supposed to be ignored and render an overlay if neededCOMMENT
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMsrc/tagstudio/core/library/ignore.py61 # Create a version of a prefix-less pattern that starts with "**/"COMMENT
MEDIUMsrc/tagstudio/previews/renderers/vector_image.py30 # Create an image to draw the svg to and a painter to do the drawingCOMMENT
MEDIUMsrc/tagstudio/previews/renderers/vector_image.py34 # Create an svg renderer, then render to the painterCOMMENT
Over-Commented Block13 hits · 8 pts
SeverityFileLineSnippetContext
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.top_container.setLayout(self.top_layout)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.py137CODE
LOWsrc/tagstudio/core/utils/silent_subprocess.py15CODE
LOWsrc/tagstudio/core/utils/silent_subprocess.py92CODE
LOWsrc/tagstudio/previews/vendored/pydub/audio_segment.py854CODE
Decorative Section Separators1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/tagstudio/qt/mixed/pagination.py36 # --------------------------------------COMMENT
AI Slop Vocabulary2 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/qt/views/underlined_widget_view.py18 # HACK: I don't know why I can't just use a QFrame for the outline.COMMENT
LOWsrc/tagstudio/previews/vendored/pydub/utils.py54 # If ffprobe didn't give any information, just return itCOMMENT
Unused Imports3 hits · 2 pts
SeverityFileLineSnippetContext
LOWsrc/tagstudio/core/library/alchemy/fields.py5CODE
LOWsrc/tagstudio/qt/qt_driver.py42CODE
LOWsrc/tagstudio/previews/renderers/raster_image.py26CODE
Cross-Language Confusion1 hit · 2 pts
SeverityFileLineSnippetContext
HIGHsrc/tagstudio/qt/qt_driver.py1481 self.browsing_history.push(state)CODE