From 5663e6232e6d7f5aa499077f1c595ca36f7d2850 Mon Sep 17 00:00:00 2001
From: Jann Stute <46534683+Computerdores@users.noreply.github.com>
Date: Tue, 12 May 2026 01:56:46 +0200
Subject: [PATCH] doc: add REUSE license information (#1361)
* doc: add REUSE comment headers
* doc: add REUSE comment headers for mkDocs overrides
The original license text was moved to the LICENSES directory
and the MIT license identifier was used since only encoding differences
to the MIT license were present.
Further, the existing copyright notice was moved to SPDX-FileCopyrightText
and one for the TagStudio Contributors was added since the files are not
entirely the same as the originals in the mkdocs-material project.
* doc: add license information files for the translations
* doc: add licence file for oxanium font
As stated on [Google Fonts](https://fonts.google.com/specimen/Oxanium/license), this font is licensed under OFL-1.1.
* doc: re-license flow_layout.py to GPL-3.0-only
This is possible because the Qt example this is based on can be licensed
under BSD-3-Clause which is GPL-3.0 compatible.
* doc: add REUSE comment header for singleton.py
Comparing our implementation with the one it is based on, they really
don't have much more in common than the general idea of the
implementation, which afaik can't be copyrighted.
* doc: Add REUSE comment header for blender_renderer.py
We can plainly license this under GPL-3.0 according to https://www.blender.org/about/license/
* doc: add REUSE comment headers to vendored files
* doc: add REUSE comment header for rounded_pixmap_style.py
Source of name for copyright notice:
Answer by eyllanesc: https://stackoverflow.com/users/6622587/eyllanesc
Profile links to Github: https://github.com/eyllanesc
Stackoverflow licensing: https://stackoverflow.com/help/licensing
* doc: add REUSE comment headers
* doc: add license information file for icon_mono.svg
* doc: add REUSE comment header for files in .github
* doc: add REUSE.toml to give license information for various files without spamming .license files
* fix: use type parameter instead of subclass
* doc: add entries for remaining files in REUSE.toml
According to info from github comment by CyanVoxel: https://github.com/TagStudioDev/TagStudio/pull/1361#issuecomment-4423632570
* ci: add REUSE check workflow
Src: 'https://reuse.software/dev/#github-actions'
* doc: add missing license
* doc: fix license for material-design-icons
* license: change license to MIT for two files only changes by Computerdores and CyanVoxel
* doc: remove unnecessary .license files
* doc: fix incorrect license entries
* doc: add missing license doc
---
.github/FUNDING.yml | 4 +
.github/ISSUE_TEMPLATE/bug_report.yml | 2 +
.github/ISSUE_TEMPLATE/feature_request.yml | 2 +
.github/PULL_REQUEST_TEMPLATE.md | 2 +
.github/workflows/mypy.yaml | 2 +
.github/workflows/publish_docs.yaml | 2 +
.github/workflows/pytest.yaml | 2 +
.github/workflows/release.yml | 2 +
.github/workflows/reuse.yaml | 12 +
.github/workflows/ruff.yaml | 2 +
LICENSES/Apache-2.0.txt | 202 ++++++
LICENSES/CC-BY-SA-4.0.txt | 428 +++++++++++
LICENSES/CC0-1.0.txt | 121 ++++
LICENSES/GPL-3.0-only.txt | 675 ++++++++++++++++++
LICENSES/GPL-3.0-or-later.txt | 1 +
LICENSES/MIT.txt | 19 +
LICENSES/OFL-1.1.txt | 97 +++
README.md | 2 +
REUSE.toml | 46 ++
docs/changelog.md | 2 +
docs/colors.md | 2 +
docs/contributing.md | 2 +
docs/developing.md | 2 +
docs/entries.md | 2 +
docs/fields.md | 2 +
docs/help/ffmpeg.md | 2 +
docs/ignore.md | 2 +
docs/index.md | 2 +
docs/install.md | 2 +
docs/libraries.md | 2 +
docs/library-changes.md | 2 +
docs/macros.md | 2 +
docs/preview-support.md | 2 +
docs/roadmap.md | 2 +
docs/search.md | 2 +
docs/style.md | 2 +
docs/stylesheets/extra.css | 4 +
docs/stylesheets/home.css | 4 +
docs/tags.md | 2 +
docs/usage.md | 2 +
flake.nix | 4 +
mkdocs.yml | 4 +
nix/package/default.nix | 4 +
nix/package/pillow-jxl-plugin.nix | 4 +
nix/package/pyexiv2.nix | 4 +
nix/shell.nix | 4 +
overrides/partials/header.html | 23 +-
overrides/partials/nav.html | 23 +-
overrides/partials/toc-item.html | 25 +-
pyproject.toml | 4 +
src/tagstudio/core/constants.py | 6 +-
src/tagstudio/core/driver.py | 4 +
src/tagstudio/core/enums.py | 6 +-
src/tagstudio/core/exceptions.py | 5 +-
.../core/library/alchemy/constants.py | 5 +-
src/tagstudio/core/library/alchemy/db.py | 5 +-
.../library/alchemy/default_color_groups.py | 5 +-
src/tagstudio/core/library/alchemy/enums.py | 4 +
src/tagstudio/core/library/alchemy/fields.py | 5 +-
src/tagstudio/core/library/alchemy/joins.py | 5 +-
src/tagstudio/core/library/alchemy/library.py | 6 +-
src/tagstudio/core/library/alchemy/models.py | 6 +-
.../alchemy/registries/dupe_files_registry.py | 4 +
.../alchemy/registries/ignored_registry.py | 5 +-
.../alchemy/registries/unlinked_registry.py | 4 +
.../core/library/alchemy/visitors.py | 6 +-
src/tagstudio/core/library/ignore.py | 6 +-
src/tagstudio/core/library/json/fields.py | 4 +
src/tagstudio/core/library/json/library.py | 6 +-
src/tagstudio/core/library/refresh.py | 5 +-
src/tagstudio/core/media_types.py | 5 +-
src/tagstudio/core/query_lang/ast.py | 9 +-
src/tagstudio/core/query_lang/parser.py | 5 +-
src/tagstudio/core/query_lang/tokenizer.py | 5 +-
src/tagstudio/core/query_lang/util.py | 5 +-
src/tagstudio/core/ts_core.py | 6 +-
src/tagstudio/core/utils/encoding.py | 6 +-
src/tagstudio/core/utils/silent_subprocess.py | 6 +-
src/tagstudio/core/utils/singleton.py | 7 +-
src/tagstudio/core/utils/str_formatting.py | 6 +-
src/tagstudio/core/utils/types.py | 5 +-
src/tagstudio/main.py | 5 +-
src/tagstudio/qt/cache_manager.py | 6 +-
.../controllers/ffmpeg_missing_message_box.py | 4 +
.../fix_ignored_modal_controller.py | 5 +-
.../qt/controllers/ignore_modal_controller.py | 5 +-
.../library_info_window_controller.py | 7 +-
.../qt/controllers/out_of_date_message_box.py | 4 +
.../qt/controllers/paged_panel_controller.py | 5 +-
.../qt/controllers/paged_panel_state.py | 5 +-
.../controllers/preview_panel_controller.py | 5 +-
.../controllers/preview_thumb_controller.py | 5 +-
.../qt/controllers/tag_box_controller.py | 4 +-
src/tagstudio/qt/global_settings.py | 5 +-
src/tagstudio/qt/helpers/color_overlay.py | 5 +-
src/tagstudio/qt/helpers/escape_text.py | 5 +-
src/tagstudio/qt/helpers/file_tester.py | 5 +-
src/tagstudio/qt/helpers/gradients.py | 5 +-
src/tagstudio/qt/helpers/image_effects.py | 5 +-
src/tagstudio/qt/helpers/text_wrapper.py | 5 +-
src/tagstudio/qt/mixed/about_modal.py | 5 +-
src/tagstudio/qt/mixed/add_field.py | 5 +-
src/tagstudio/qt/mixed/build_color.py | 5 +-
src/tagstudio/qt/mixed/build_namespace.py | 5 +-
src/tagstudio/qt/mixed/build_tag.py | 5 +-
src/tagstudio/qt/mixed/collage_icon.py | 5 +-
src/tagstudio/qt/mixed/color_box.py | 5 +-
src/tagstudio/qt/mixed/datetime_picker.py | 4 +
src/tagstudio/qt/mixed/drop_import_modal.py | 5 +-
src/tagstudio/qt/mixed/field_containers.py | 5 +-
src/tagstudio/qt/mixed/field_widget.py | 5 +-
src/tagstudio/qt/mixed/file_attributes.py | 5 +-
src/tagstudio/qt/mixed/fix_dupe_files.py | 5 +-
src/tagstudio/qt/mixed/fix_unlinked.py | 5 +-
src/tagstudio/qt/mixed/folders_to_tags.py | 5 +-
src/tagstudio/qt/mixed/item_thumb.py | 5 +-
src/tagstudio/qt/mixed/landing.py | 5 +-
src/tagstudio/qt/mixed/media_player.py | 6 +-
src/tagstudio/qt/mixed/merge_dupe_entries.py | 5 +-
src/tagstudio/qt/mixed/migration_modal.py | 5 +-
.../qt/mixed/mirror_entries_modal.py | 5 +-
src/tagstudio/qt/mixed/pagination.py | 5 +-
src/tagstudio/qt/mixed/progress_bar.py | 5 +-
.../qt/mixed/relink_entries_modal.py | 5 +-
.../qt/mixed/remove_ignored_modal.py | 5 +-
.../qt/mixed/remove_unlinked_modal.py | 5 +-
src/tagstudio/qt/mixed/settings_panel.py | 5 +-
src/tagstudio/qt/mixed/tag_color_label.py | 5 +-
src/tagstudio/qt/mixed/tag_color_manager.py | 6 +-
src/tagstudio/qt/mixed/tag_color_preview.py | 5 +-
src/tagstudio/qt/mixed/tag_color_selection.py | 5 +-
src/tagstudio/qt/mixed/tag_database.py | 5 +-
src/tagstudio/qt/mixed/tag_search.py | 5 +-
src/tagstudio/qt/mixed/tag_widget.py | 5 +-
src/tagstudio/qt/mixed/text_field.py | 5 +-
src/tagstudio/qt/mnemonics.py | 6 +-
src/tagstudio/qt/models/palette.py | 6 +-
src/tagstudio/qt/platform_strings.py | 5 +-
src/tagstudio/qt/previews/renderer.py | 5 +-
.../qt/previews/vendored/blender_renderer.py | 19 +-
src/tagstudio/qt/previews/vendored/ffmpeg.py | 6 +-
.../previews/vendored/pydub/audio_segment.py | 7 +-
.../qt/previews/vendored/pydub/utils.py | 6 +
src/tagstudio/qt/resource_manager.py | 5 +-
src/tagstudio/qt/resources.qrc | 4 +-
src/tagstudio/qt/resources_rc.py | 4 +
src/tagstudio/qt/thumb_grid_layout.py | 4 +
src/tagstudio/qt/translations.py | 4 +
src/tagstudio/qt/ts_qt.py | 10 +-
src/tagstudio/qt/utils/custom_runnable.py | 5 +-
src/tagstudio/qt/utils/file_deleter.py | 5 +-
src/tagstudio/qt/utils/file_opener.py | 6 +-
src/tagstudio/qt/utils/function_iterator.py | 5 +-
src/tagstudio/qt/views/clickable_label.py | 5 +-
src/tagstudio/qt/views/clickable_slider.py | 6 +-
src/tagstudio/qt/views/edit_text_box_modal.py | 5 +-
.../qt/views/edit_text_line_modal.py | 5 +-
.../qt/views/fix_ignored_modal_view.py | 5 +-
src/tagstudio/qt/views/ignore_modal_view.py | 5 +-
src/tagstudio/qt/views/layouts/flow_layout.py | 7 +-
.../qt/views/library_info_window_view.py | 5 +-
src/tagstudio/qt/views/main_window.py | 5 +-
src/tagstudio/qt/views/paged_body_wrapper.py | 5 +-
src/tagstudio/qt/views/panel_modal.py | 5 +-
src/tagstudio/qt/views/preview_panel_view.py | 5 +-
src/tagstudio/qt/views/preview_thumb_view.py | 5 +-
src/tagstudio/qt/views/qbutton_wrapper.py | 5 +-
src/tagstudio/qt/views/splash.py | 5 +-
.../qt/views/styles/rounded_pixmap_style.py | 8 +-
src/tagstudio/qt/views/tag_box_view.py | 4 +-
src/tagstudio/qt/views/thumb_button.py | 5 +-
.../qt/fonts/Oxanium-Bold.ttf.license | 2 +
tagstudio.spec | 4 +
tests/conftest.py | 5 +-
tests/macros/test_dupe_files.py | 6 +-
tests/macros/test_folders_tags.py | 6 +-
tests/macros/test_missing_files.py | 6 +-
tests/macros/test_refresh_dir.py | 6 +-
tests/qt/test_about_modal.py | 4 +
tests/qt/test_build_tag_panel.py | 5 +-
tests/qt/test_field_containers.py | 5 +-
tests/qt/test_file_path_options.py | 5 +-
tests/qt/test_flow_widget.py | 5 +-
tests/qt/test_folders_to_tags.py | 5 +-
tests/qt/test_global_settings.py | 5 +-
tests/qt/test_item_thumb.py | 5 +-
tests/qt/test_preview_panel.py | 5 +-
tests/qt/test_qt_driver.py | 6 +-
tests/qt/test_resource_manager.py | 5 +-
tests/qt/test_tag_panel.py | 5 +-
tests/qt/test_tag_search_panel.py | 7 +-
tests/qt/test_theme_system.py | 6 +-
tests/test_db_migrations.py | 5 +-
tests/test_driver.py | 5 +-
tests/test_json_migration.py | 5 +-
tests/test_library.py | 5 +-
tests/test_search.py | 5 +-
tests/test_translations.py | 5 +-
198 files changed, 2084 insertions(+), 467 deletions(-)
create mode 100644 .github/workflows/reuse.yaml
create mode 100644 LICENSES/Apache-2.0.txt
create mode 100644 LICENSES/CC-BY-SA-4.0.txt
create mode 100644 LICENSES/CC0-1.0.txt
create mode 100644 LICENSES/GPL-3.0-only.txt
create mode 120000 LICENSES/GPL-3.0-or-later.txt
create mode 100644 LICENSES/MIT.txt
create mode 100644 LICENSES/OFL-1.1.txt
create mode 100644 REUSE.toml
mode change 100755 => 100644 src/tagstudio/qt/views/panel_modal.py
create mode 100644 src/tagstudio/resources/qt/fonts/Oxanium-Bold.ttf.license
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index c2cdaaef..afcb7044 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,2 +1,6 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
---
patreon: cyanvoxel
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index a719991f..35ad9dc6 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
---
name: Bug Report
description: File a bug or issue report.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 32259fb6..7f8c726a 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
---
name: Feature Request
description: Suggest a new feature.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 9b1d9606..a012fd35 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,3 +1,5 @@
+
+
### Summary
+
# TagStudio: A User-Focused Photo & File Management System
[](https://github.com/TagStudioDev/TagStudio/releases)
diff --git a/REUSE.toml b/REUSE.toml
new file mode 100644
index 00000000..e4d032d7
--- /dev/null
+++ b/REUSE.toml
@@ -0,0 +1,46 @@
+version = 1
+
+[[annotations]]
+path = [
+ "tests/fixtures/**",
+
+ "contrib/.envrc-nix",
+ "contrib/.envrc-uv",
+ "contrib/.vscode/launch.json",
+ "docs/CNAME",
+ "docs/assets/**",
+ "src/tagstudio/qt/resources.json",
+ "src/tagstudio/resources/icon.*",
+ "src/tagstudio/resources/tagstudio.desktop",
+ "src/tagstudio/resources/templates/ts_ignore_template.txt",
+ "src/tagstudio/resources/templates/ts_ignore_template_blank.txt",
+ "src/tagstudio/resources/qt/images/**",
+ "tests/qt/__snapshots__/test_folders_to_tags.ambr",
+
+ ".git-blame-ignore-revs",
+ ".gitattributes",
+ ".gitignore",
+ ".pre-commit-config.yaml",
+ "flake.lock",
+]
+SPDX-FileCopyrightText = "(c) TagStudio Contributors"
+SPDX-License-Identifier = "GPL-3.0-only"
+
+[[annotations]]
+path = ["src/tagstudio/resources/translations/*.json"]
+SPDX-FileCopyrightText = "(c) TagStudio Contributors"
+SPDX-License-Identifier = "GPL-3.0-or-later"
+
+[[annotations]]
+path = [
+ "src/tagstudio/resources/qt/images/bxs-left-arrow.png",
+ "src/tagstudio/resources/qt/images/bxs-right-arrow.png",
+ "src/tagstudio/resources/qt/images/file_icons/database.png",
+]
+SPDX-FileCopyrightText = "(c) 2026 Boxicons"
+SPDX-License-Identifier = "MIT"
+
+[[annotations]]
+path = ["src/tagstudio/resources/qt/images/volume.svg", "src/tagstudio/resources/qt/images/volume_mute.svg"]
+SPDX-FileCopyrightText = "(c) github:google/material-design-icons Contributors"
+SPDX-License-Identifier = "Apache-2.0"
diff --git a/docs/changelog.md b/docs/changelog.md
index a3c6474a..2f1426aa 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -3,6 +3,8 @@ title: Changelog
icon: material/script-text
toc_depth: 2
---
+
+
# :material-script-text: Changelog
diff --git a/docs/colors.md b/docs/colors.md
index 8563388f..945f3434 100644
--- a/docs/colors.md
+++ b/docs/colors.md
@@ -1,6 +1,8 @@
---
icon: material/palette
---
+
+
# :material-palette: Colors
diff --git a/docs/contributing.md b/docs/contributing.md
index 449f73f8..0aa2e18d 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -1,6 +1,8 @@
---
icon: material/file-plus
---
+
+
# :material-file-plus: Contributing
diff --git a/docs/developing.md b/docs/developing.md
index dc49ee23..c177fb3b 100644
--- a/docs/developing.md
+++ b/docs/developing.md
@@ -1,6 +1,8 @@
---
icon: material/code-braces
---
+
+
# :material-code-braces: Developing
diff --git a/docs/entries.md b/docs/entries.md
index 6a1a9fbc..efd88129 100644
--- a/docs/entries.md
+++ b/docs/entries.md
@@ -1,6 +1,8 @@
---
icon: material/file
---
+
+
# :material-file: Entries
diff --git a/docs/fields.md b/docs/fields.md
index afcf057e..deec08ac 100644
--- a/docs/fields.md
+++ b/docs/fields.md
@@ -1,6 +1,8 @@
---
icon: material/text-box
---
+
+
# :material-text-box: Fields
diff --git a/docs/help/ffmpeg.md b/docs/help/ffmpeg.md
index 80746c6f..c526bc02 100644
--- a/docs/help/ffmpeg.md
+++ b/docs/help/ffmpeg.md
@@ -1,6 +1,8 @@
---
icon: material/movie-open-cog
---
+
+
# :material-movie-open-cog: Installing FFmpeg
diff --git a/docs/ignore.md b/docs/ignore.md
index 0e7687d0..f3c07768 100644
--- a/docs/ignore.md
+++ b/docs/ignore.md
@@ -2,6 +2,8 @@
title: Ignoring Files
icon: material/file-document-remove
---
+
+
# :material-file-document-remove: Ignoring Files & Directories
diff --git a/docs/index.md b/docs/index.md
index 62dfc1ed..51365001 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -4,6 +4,8 @@ hide:
- toc
- navigation
---
+
+
#
diff --git a/docs/install.md b/docs/install.md
index bec72c2b..51134e25 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -1,6 +1,8 @@
---
icon: material/download
---
+
+
# :material-download: Installation
diff --git a/docs/libraries.md b/docs/libraries.md
index 0afeb6ef..4b0515e5 100644
--- a/docs/libraries.md
+++ b/docs/libraries.md
@@ -1,6 +1,8 @@
---
icon: material/database
---
+
+
# :material-database: Libraries
diff --git a/docs/library-changes.md b/docs/library-changes.md
index 3ae570aa..cbd3594d 100644
--- a/docs/library-changes.md
+++ b/docs/library-changes.md
@@ -1,6 +1,8 @@
---
icon: material/database-edit
---
+
+
# :material-database-edit: Library Format
diff --git a/docs/macros.md b/docs/macros.md
index 9268d267..232bb4b6 100644
--- a/docs/macros.md
+++ b/docs/macros.md
@@ -1,6 +1,8 @@
---
icon: material/script-text
---
+
+
# :material-script-text: Tools & Macros
diff --git a/docs/preview-support.md b/docs/preview-support.md
index 7f1edd54..c1070ed7 100644
--- a/docs/preview-support.md
+++ b/docs/preview-support.md
@@ -1,6 +1,8 @@
---
icon: material/image-check
---
+
+
# :material-image-check: Supported Previews
diff --git a/docs/roadmap.md b/docs/roadmap.md
index f1417393..b0f6c48e 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -1,6 +1,8 @@
---
icon: material/map-check
---
+
+
# :material-map-check: Roadmap
diff --git a/docs/search.md b/docs/search.md
index 6d2007ed..bb6a5915 100644
--- a/docs/search.md
+++ b/docs/search.md
@@ -1,6 +1,8 @@
---
icon: material/magnify
---
+
+
# :material-magnify: Searching
diff --git a/docs/style.md b/docs/style.md
index 35b8841c..2763f642 100644
--- a/docs/style.md
+++ b/docs/style.md
@@ -1,6 +1,8 @@
---
icon: material/sign-text
---
+
+
# :material-sign-text: Style Guide
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index f1e72d90..5ae0f7eb 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -1,3 +1,7 @@
+/*
+ * SPDX-FileCopyrightText: (c) TagStudio Contributors
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
/* Dark Theme */
[data-md-color-scheme="slate"] {
--md-default-bg-color: #060617;
diff --git a/docs/stylesheets/home.css b/docs/stylesheets/home.css
index 26e9c2d1..a32f0a80 100644
--- a/docs/stylesheets/home.css
+++ b/docs/stylesheets/home.css
@@ -1,3 +1,7 @@
+/*
+ * SPDX-FileCopyrightText: (c) TagStudio Contributors
+ * SPDX-License-Identifier: GPL-3.0-only
+ * */
h2 {
margin: 1rem 0 0 0 !important;
}
diff --git a/docs/tags.md b/docs/tags.md
index b8cb65e1..525b615e 100644
--- a/docs/tags.md
+++ b/docs/tags.md
@@ -1,6 +1,8 @@
---
icon: material/tag-text
---
+
+
# :material-tag-text: Tags
diff --git a/docs/usage.md b/docs/usage.md
index aa083e8c..a533f2cd 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -1,6 +1,8 @@
---
icon: material/mouse
---
+
+
# :material-mouse: Basic Usage
diff --git a/flake.nix b/flake.nix
index c12b22b6..ffde5e2e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
description = "TagStudio";
diff --git a/mkdocs.yml b/mkdocs.yml
index aaf4b106..2a03b9ec 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
# yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json
# MkDocs: https://www.mkdocs.org/
diff --git a/nix/package/default.nix b/nix/package/default.nix
index 3aa69219..b609e5f9 100644
--- a/nix/package/default.nix
+++ b/nix/package/default.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
ffmpeg-headless,
lib,
diff --git a/nix/package/pillow-jxl-plugin.nix b/nix/package/pillow-jxl-plugin.nix
index 4df28aed..4b8ecba5 100644
--- a/nix/package/pillow-jxl-plugin.nix
+++ b/nix/package/pillow-jxl-plugin.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
buildPythonPackage,
cmake,
diff --git a/nix/package/pyexiv2.nix b/nix/package/pyexiv2.nix
index 4761db49..a9cb9c41 100644
--- a/nix/package/pyexiv2.nix
+++ b/nix/package/pyexiv2.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
autoPatchelfHook,
buildPythonPackage,
diff --git a/nix/shell.nix b/nix/shell.nix
index 81965fc8..797f1fc6 100644
--- a/nix/shell.nix
+++ b/nix/shell.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
lib,
pkgs,
diff --git a/overrides/partials/header.html b/overrides/partials/header.html
index 0db2a399..e1ffcd5d 100644
--- a/overrides/partials/header.html
+++ b/overrides/partials/header.html
@@ -1,24 +1,7 @@
-
+
+
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to
- deal in the Software without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
--->
{% set class = "md-header" %}
diff --git a/overrides/partials/nav.html b/overrides/partials/nav.html
index 119d738a..432eb57f 100644
--- a/overrides/partials/nav.html
+++ b/overrides/partials/nav.html
@@ -1,24 +1,7 @@
-
+
+
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to
- deal in the Software without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
--->
{% import "partials/nav-item.html" as item with context %}
diff --git a/overrides/partials/toc-item.html b/overrides/partials/toc-item.html
index a0922005..349f10be 100644
--- a/overrides/partials/toc-item.html
+++ b/overrides/partials/toc-item.html
@@ -1,24 +1,7 @@
-
+
+
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to
- deal in the Software without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
--->
@@ -40,4 +23,4 @@
{% endif %}
-
\ No newline at end of file
+
diff --git a/pyproject.toml b/pyproject.toml
index e070c26f..8051f01e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
diff --git a/src/tagstudio/core/constants.py b/src/tagstudio/core/constants.py
index 7c98ddd5..4cd6f582 100644
--- a/src/tagstudio/core/constants.py
+++ b/src/tagstudio/core/constants.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
VERSION: str = "9.5.7" # Major.Minor.Patch
VERSION_BRANCH: str = "" # Usually "" or "Pre-Release"
diff --git a/src/tagstudio/core/driver.py b/src/tagstudio/core/driver.py
index 4343054d..cf50c45e 100644
--- a/src/tagstudio/core/driver.py
+++ b/src/tagstudio/core/driver.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from pathlib import Path
import structlog
diff --git a/src/tagstudio/core/enums.py b/src/tagstudio/core/enums.py
index 2bc33748..f821e103 100644
--- a/src/tagstudio/core/enums.py
+++ b/src/tagstudio/core/enums.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import enum
diff --git a/src/tagstudio/core/exceptions.py b/src/tagstudio/core/exceptions.py
index 10bec533..f3ab828c 100644
--- a/src/tagstudio/core/exceptions.py
+++ b/src/tagstudio/core/exceptions.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
class NoRendererError(Exception): ...
diff --git a/src/tagstudio/core/library/alchemy/constants.py b/src/tagstudio/core/library/alchemy/constants.py
index 31065c2c..48ab5cbb 100644
--- a/src/tagstudio/core/library/alchemy/constants.py
+++ b/src/tagstudio/core/library/alchemy/constants.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from sqlalchemy import text
diff --git a/src/tagstudio/core/library/alchemy/db.py b/src/tagstudio/core/library/alchemy/db.py
index 7e728f79..de119d0a 100644
--- a/src/tagstudio/core/library/alchemy/db.py
+++ b/src/tagstudio/core/library/alchemy/db.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/default_color_groups.py b/src/tagstudio/core/library/alchemy/default_color_groups.py
index 9193fc09..4af29595 100644
--- a/src/tagstudio/core/library/alchemy/default_color_groups.py
+++ b/src/tagstudio/core/library/alchemy/default_color_groups.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/core/library/alchemy/enums.py b/src/tagstudio/core/library/alchemy/enums.py
index 020420f4..349d0e9e 100644
--- a/src/tagstudio/core/library/alchemy/enums.py
+++ b/src/tagstudio/core/library/alchemy/enums.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import enum
import random
from dataclasses import dataclass, field, replace
diff --git a/src/tagstudio/core/library/alchemy/fields.py b/src/tagstudio/core/library/alchemy/fields.py
index 5d4d6c96..729124af 100644
--- a/src/tagstudio/core/library/alchemy/fields.py
+++ b/src/tagstudio/core/library/alchemy/fields.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from __future__ import annotations
diff --git a/src/tagstudio/core/library/alchemy/joins.py b/src/tagstudio/core/library/alchemy/joins.py
index d01e6764..7cf1c486 100644
--- a/src/tagstudio/core/library/alchemy/joins.py
+++ b/src/tagstudio/core/library/alchemy/joins.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from sqlalchemy import ForeignKey
diff --git a/src/tagstudio/core/library/alchemy/library.py b/src/tagstudio/core/library/alchemy/library.py
index b04c031d..c55a10a0 100644
--- a/src/tagstudio/core/library/alchemy/library.py
+++ b/src/tagstudio/core/library/alchemy/library.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
# NOTE: This file contains necessary use of deprecated first-party code until that
# code is removed in a future version (prefs).
diff --git a/src/tagstudio/core/library/alchemy/models.py b/src/tagstudio/core/library/alchemy/models.py
index be4e1647..c2b81f66 100644
--- a/src/tagstudio/core/library/alchemy/models.py
+++ b/src/tagstudio/core/library/alchemy/models.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from datetime import datetime as dt
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py b/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py
index 95143fe2..01147920 100644
--- a/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py
+++ b/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import xml.etree.ElementTree as ET
from dataclasses import dataclass, field
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/registries/ignored_registry.py b/src/tagstudio/core/library/alchemy/registries/ignored_registry.py
index a864e248..5401c61b 100644
--- a/src/tagstudio/core/library/alchemy/registries/ignored_registry.py
+++ b/src/tagstudio/core/library/alchemy/registries/ignored_registry.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Iterator
diff --git a/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py b/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py
index 8058df85..3f2e8539 100644
--- a/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py
+++ b/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from collections.abc import Iterator
from dataclasses import dataclass, field
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/visitors.py b/src/tagstudio/core/library/alchemy/visitors.py
index 7f9fc799..35dcf56a 100644
--- a/src/tagstudio/core/library/alchemy/visitors.py
+++ b/src/tagstudio/core/library/alchemy/visitors.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import re
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/core/library/ignore.py b/src/tagstudio/core/library/ignore.py
index 79c70c54..63b7ab18 100644
--- a/src/tagstudio/core/library/ignore.py
+++ b/src/tagstudio/core/library/ignore.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from copy import deepcopy
from pathlib import Path
diff --git a/src/tagstudio/core/library/json/fields.py b/src/tagstudio/core/library/json/fields.py
index 5e3509e4..7797096a 100644
--- a/src/tagstudio/core/library/json/fields.py
+++ b/src/tagstudio/core/library/json/fields.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
BOX_FIELDS = ["tag_box", "text_box"]
TEXT_FIELDS = ["text_line", "text_box"]
DATE_FIELDS = ["datetime"]
diff --git a/src/tagstudio/core/library/json/library.py b/src/tagstudio/core/library/json/library.py
index 81367201..e3370e2a 100644
--- a/src/tagstudio/core/library/json/library.py
+++ b/src/tagstudio/core/library/json/library.py
@@ -1,8 +1,8 @@
# type: ignore
# ruff: noqa
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
"""The Library object and related methods for TagStudio."""
diff --git a/src/tagstudio/core/library/refresh.py b/src/tagstudio/core/library/refresh.py
index 531363f7..824cae52 100644
--- a/src/tagstudio/core/library/refresh.py
+++ b/src/tagstudio/core/library/refresh.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import shutil
diff --git a/src/tagstudio/core/media_types.py b/src/tagstudio/core/media_types.py
index c7c4f0fc..b18290d1 100644
--- a/src/tagstudio/core/media_types.py
+++ b/src/tagstudio/core/media_types.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import mimetypes
diff --git a/src/tagstudio/core/query_lang/ast.py b/src/tagstudio/core/query_lang/ast.py
index 0323bf26..166c9dd7 100644
--- a/src/tagstudio/core/query_lang/ast.py
+++ b/src/tagstudio/core/query_lang/ast.py
@@ -1,11 +1,10 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: MIT
from abc import ABC, abstractmethod
from enum import Enum
-from typing import Generic, TypeVar, override
+from typing import TypeVar, override
class ConstraintType(Enum):
@@ -98,7 +97,7 @@ class Not(AST):
T = TypeVar("T")
-class BaseVisitor(ABC, Generic[T]):
+class BaseVisitor[T](ABC):
def visit(self, node: AST) -> T:
if isinstance(node, ANDList):
return self.visit_and_list(node)
diff --git a/src/tagstudio/core/query_lang/parser.py b/src/tagstudio/core/query_lang/parser.py
index ff17465d..1dc336c5 100644
--- a/src/tagstudio/core/query_lang/parser.py
+++ b/src/tagstudio/core/query_lang/parser.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.query_lang.ast import (
diff --git a/src/tagstudio/core/query_lang/tokenizer.py b/src/tagstudio/core/query_lang/tokenizer.py
index 3cdb5035..fc6e6685 100644
--- a/src/tagstudio/core/query_lang/tokenizer.py
+++ b/src/tagstudio/core/query_lang/tokenizer.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from enum import Enum
diff --git a/src/tagstudio/core/query_lang/util.py b/src/tagstudio/core/query_lang/util.py
index 95e53dbe..e0c2b719 100644
--- a/src/tagstudio/core/query_lang/util.py
+++ b/src/tagstudio/core/query_lang/util.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: MIT
from typing import override
diff --git a/src/tagstudio/core/ts_core.py b/src/tagstudio/core/ts_core.py
index 85c800d6..752e1d4a 100644
--- a/src/tagstudio/core/ts_core.py
+++ b/src/tagstudio/core/ts_core.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
"""The core classes and methods of TagStudio."""
diff --git a/src/tagstudio/core/utils/encoding.py b/src/tagstudio/core/utils/encoding.py
index f5a4a0d9..73265f01 100644
--- a/src/tagstudio/core/utils/encoding.py
+++ b/src/tagstudio/core/utils/encoding.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
diff --git a/src/tagstudio/core/utils/silent_subprocess.py b/src/tagstudio/core/utils/silent_subprocess.py
index 75fb920d..d4d818a4 100644
--- a/src/tagstudio/core/utils/silent_subprocess.py
+++ b/src/tagstudio/core/utils/silent_subprocess.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import os
import subprocess
diff --git a/src/tagstudio/core/utils/singleton.py b/src/tagstudio/core/utils/singleton.py
index 76b6bf08..82b4518d 100644
--- a/src/tagstudio/core/utils/singleton.py
+++ b/src/tagstudio/core/utils/singleton.py
@@ -1,10 +1,11 @@
-# Based off example from Refactoring Guru:
-# https://refactoring.guru/design-patterns/singleton/python/example#example-1
-# Adapted for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from threading import Lock
+# See also: https://refactoring.guru/design-patterns/singleton/python/example#example-1
class Singleton(type):
"""A thread-safe implementation of a Singleton."""
diff --git a/src/tagstudio/core/utils/str_formatting.py b/src/tagstudio/core/utils/str_formatting.py
index 38151d0e..9fa41ebf 100644
--- a/src/tagstudio/core/utils/str_formatting.py
+++ b/src/tagstudio/core/utils/str_formatting.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import semver
diff --git a/src/tagstudio/core/utils/types.py b/src/tagstudio/core/utils/types.py
index d21feb95..57970334 100644
--- a/src/tagstudio/core/utils/types.py
+++ b/src/tagstudio/core/utils/types.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from typing import TypeVar
diff --git a/src/tagstudio/main.py b/src/tagstudio/main.py
index 70411a27..7997884d 100755
--- a/src/tagstudio/main.py
+++ b/src/tagstudio/main.py
@@ -1,7 +1,6 @@
#!/usr/bin/env python
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""TagStudio launcher."""
diff --git a/src/tagstudio/qt/cache_manager.py b/src/tagstudio/qt/cache_manager.py
index e15ead68..00d812ff 100644
--- a/src/tagstudio/qt/cache_manager.py
+++ b/src/tagstudio/qt/cache_manager.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import math
from collections.abc import Iterable
diff --git a/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py b/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py
index 3de27f88..a3c71176 100644
--- a/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py
+++ b/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from shutil import which
import structlog
diff --git a/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py b/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py
index 1199f3cd..0a6bd368 100644
--- a/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py
+++ b/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/controllers/ignore_modal_controller.py b/src/tagstudio/qt/controllers/ignore_modal_controller.py
index 66937d5b..e2226d66 100644
--- a/src/tagstudio/qt/controllers/ignore_modal_controller.py
+++ b/src/tagstudio/qt/controllers/ignore_modal_controller.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/qt/controllers/library_info_window_controller.py b/src/tagstudio/qt/controllers/library_info_window_controller.py
index ad4a0127..f7bef1a4 100644
--- a/src/tagstudio/qt/controllers/library_info_window_controller.py
+++ b/src/tagstudio/qt/controllers/library_info_window_controller.py
@@ -1,6 +1,7 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import os
from pathlib import Path
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/controllers/out_of_date_message_box.py b/src/tagstudio/qt/controllers/out_of_date_message_box.py
index bc7fb75a..d22c148c 100644
--- a/src/tagstudio/qt/controllers/out_of_date_message_box.py
+++ b/src/tagstudio/qt/controllers/out_of_date_message_box.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import structlog
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QMessageBox
diff --git a/src/tagstudio/qt/controllers/paged_panel_controller.py b/src/tagstudio/qt/controllers/paged_panel_controller.py
index ddffe554..f4a7e8e8 100644
--- a/src/tagstudio/qt/controllers/paged_panel_controller.py
+++ b/src/tagstudio/qt/controllers/paged_panel_controller.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import override
diff --git a/src/tagstudio/qt/controllers/paged_panel_state.py b/src/tagstudio/qt/controllers/paged_panel_state.py
index 368cc4d4..a239ca76 100644
--- a/src/tagstudio/qt/controllers/paged_panel_state.py
+++ b/src/tagstudio/qt/controllers/paged_panel_state.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtWidgets import QPushButton
diff --git a/src/tagstudio/qt/controllers/preview_panel_controller.py b/src/tagstudio/qt/controllers/preview_panel_controller.py
index 360f0558..7933e488 100644
--- a/src/tagstudio/qt/controllers/preview_panel_controller.py
+++ b/src/tagstudio/qt/controllers/preview_panel_controller.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import typing
from warnings import catch_warnings
diff --git a/src/tagstudio/qt/controllers/preview_thumb_controller.py b/src/tagstudio/qt/controllers/preview_thumb_controller.py
index 8986f06f..2c17e242 100644
--- a/src/tagstudio/qt/controllers/preview_thumb_controller.py
+++ b/src/tagstudio/qt/controllers/preview_thumb_controller.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import io
from pathlib import Path
diff --git a/src/tagstudio/qt/controllers/tag_box_controller.py b/src/tagstudio/qt/controllers/tag_box_controller.py
index 2a5865d8..a2b43482 100644
--- a/src/tagstudio/qt/controllers/tag_box_controller.py
+++ b/src/tagstudio/qt/controllers/tag_box_controller.py
@@ -1,5 +1,5 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/global_settings.py b/src/tagstudio/qt/global_settings.py
index 42a7fe38..94be1f07 100644
--- a/src/tagstudio/qt/global_settings.py
+++ b/src/tagstudio/qt/global_settings.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import platform
from datetime import datetime
diff --git a/src/tagstudio/qt/helpers/color_overlay.py b/src/tagstudio/qt/helpers/color_overlay.py
index 8fd43263..0d276210 100644
--- a/src/tagstudio/qt/helpers/color_overlay.py
+++ b/src/tagstudio/qt/helpers/color_overlay.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PIL import Image
diff --git a/src/tagstudio/qt/helpers/escape_text.py b/src/tagstudio/qt/helpers/escape_text.py
index 989ef114..0885d173 100644
--- a/src/tagstudio/qt/helpers/escape_text.py
+++ b/src/tagstudio/qt/helpers/escape_text.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
def escape_text(text: str):
diff --git a/src/tagstudio/qt/helpers/file_tester.py b/src/tagstudio/qt/helpers/file_tester.py
index d899f7e6..89e20295 100644
--- a/src/tagstudio/qt/helpers/file_tester.py
+++ b/src/tagstudio/qt/helpers/file_tester.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/qt/helpers/gradients.py b/src/tagstudio/qt/helpers/gradients.py
index 1e672868..004a3852 100644
--- a/src/tagstudio/qt/helpers/gradients.py
+++ b/src/tagstudio/qt/helpers/gradients.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PIL import Image
diff --git a/src/tagstudio/qt/helpers/image_effects.py b/src/tagstudio/qt/helpers/image_effects.py
index ca764744..3af6cf3c 100644
--- a/src/tagstudio/qt/helpers/image_effects.py
+++ b/src/tagstudio/qt/helpers/image_effects.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import numpy as np
diff --git a/src/tagstudio/qt/helpers/text_wrapper.py b/src/tagstudio/qt/helpers/text_wrapper.py
index 71d6b5be..ce4bae5d 100644
--- a/src/tagstudio/qt/helpers/text_wrapper.py
+++ b/src/tagstudio/qt/helpers/text_wrapper.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PIL import Image, ImageDraw, ImageFont
diff --git a/src/tagstudio/qt/mixed/about_modal.py b/src/tagstudio/qt/mixed/about_modal.py
index e6be1c7d..3d1092f1 100644
--- a/src/tagstudio/qt/mixed/about_modal.py
+++ b/src/tagstudio/qt/mixed/about_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/add_field.py b/src/tagstudio/qt/mixed/add_field.py
index ba83ab58..52b64e5e 100644
--- a/src/tagstudio/qt/mixed/add_field.py
+++ b/src/tagstudio/qt/mixed/add_field.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import override
diff --git a/src/tagstudio/qt/mixed/build_color.py b/src/tagstudio/qt/mixed/build_color.py
index a33ef435..07b43d88 100644
--- a/src/tagstudio/qt/mixed/build_color.py
+++ b/src/tagstudio/qt/mixed/build_color.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import contextlib
diff --git a/src/tagstudio/qt/mixed/build_namespace.py b/src/tagstudio/qt/mixed/build_namespace.py
index c7b4ed23..5b91a700 100644
--- a/src/tagstudio/qt/mixed/build_namespace.py
+++ b/src/tagstudio/qt/mixed/build_namespace.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import contextlib
diff --git a/src/tagstudio/qt/mixed/build_tag.py b/src/tagstudio/qt/mixed/build_tag.py
index 94e63f3e..a6aef61f 100644
--- a/src/tagstudio/qt/mixed/build_tag.py
+++ b/src/tagstudio/qt/mixed/build_tag.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/qt/mixed/collage_icon.py b/src/tagstudio/qt/mixed/collage_icon.py
index 13930085..105aff34 100644
--- a/src/tagstudio/qt/mixed/collage_icon.py
+++ b/src/tagstudio/qt/mixed/collage_icon.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/color_box.py b/src/tagstudio/qt/mixed/color_box.py
index 20866c43..59079412 100644
--- a/src/tagstudio/qt/mixed/color_box.py
+++ b/src/tagstudio/qt/mixed/color_box.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/datetime_picker.py b/src/tagstudio/qt/mixed/datetime_picker.py
index b059dd96..318c4768 100644
--- a/src/tagstudio/qt/mixed/datetime_picker.py
+++ b/src/tagstudio/qt/mixed/datetime_picker.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import typing
from collections.abc import Callable
from datetime import datetime as dt
diff --git a/src/tagstudio/qt/mixed/drop_import_modal.py b/src/tagstudio/qt/mixed/drop_import_modal.py
index 766ce608..570448b5 100644
--- a/src/tagstudio/qt/mixed/drop_import_modal.py
+++ b/src/tagstudio/qt/mixed/drop_import_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import enum
diff --git a/src/tagstudio/qt/mixed/field_containers.py b/src/tagstudio/qt/mixed/field_containers.py
index 12f82577..212e6a54 100644
--- a/src/tagstudio/qt/mixed/field_containers.py
+++ b/src/tagstudio/qt/mixed/field_containers.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/qt/mixed/field_widget.py b/src/tagstudio/qt/mixed/field_widget.py
index d2678b55..04ee3c37 100644
--- a/src/tagstudio/qt/mixed/field_widget.py
+++ b/src/tagstudio/qt/mixed/field_widget.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/file_attributes.py b/src/tagstudio/qt/mixed/file_attributes.py
index 5704e6e9..f4786ef4 100644
--- a/src/tagstudio/qt/mixed/file_attributes.py
+++ b/src/tagstudio/qt/mixed/file_attributes.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import os
diff --git a/src/tagstudio/qt/mixed/fix_dupe_files.py b/src/tagstudio/qt/mixed/fix_dupe_files.py
index c215e862..c7c3165b 100644
--- a/src/tagstudio/qt/mixed/fix_dupe_files.py
+++ b/src/tagstudio/qt/mixed/fix_dupe_files.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/fix_unlinked.py b/src/tagstudio/qt/mixed/fix_unlinked.py
index 63a1affc..59474c1f 100644
--- a/src/tagstudio/qt/mixed/fix_unlinked.py
+++ b/src/tagstudio/qt/mixed/fix_unlinked.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/folders_to_tags.py b/src/tagstudio/qt/mixed/folders_to_tags.py
index f7051f77..45cdbc0a 100644
--- a/src/tagstudio/qt/mixed/folders_to_tags.py
+++ b/src/tagstudio/qt/mixed/folders_to_tags.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/item_thumb.py b/src/tagstudio/qt/mixed/item_thumb.py
index 49a9858f..1e112eaf 100644
--- a/src/tagstudio/qt/mixed/item_thumb.py
+++ b/src/tagstudio/qt/mixed/item_thumb.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from enum import Enum
diff --git a/src/tagstudio/qt/mixed/landing.py b/src/tagstudio/qt/mixed/landing.py
index 050994ac..7f5f6ba7 100644
--- a/src/tagstudio/qt/mixed/landing.py
+++ b/src/tagstudio/qt/mixed/landing.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/qt/mixed/media_player.py b/src/tagstudio/qt/mixed/media_player.py
index 065e73d4..f4649efe 100644
--- a/src/tagstudio/qt/mixed/media_player.py
+++ b/src/tagstudio/qt/mixed/media_player.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import typing
from pathlib import Path
diff --git a/src/tagstudio/qt/mixed/merge_dupe_entries.py b/src/tagstudio/qt/mixed/merge_dupe_entries.py
index af56a0bf..0091bb3a 100644
--- a/src/tagstudio/qt/mixed/merge_dupe_entries.py
+++ b/src/tagstudio/qt/mixed/merge_dupe_entries.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/migration_modal.py b/src/tagstudio/qt/mixed/migration_modal.py
index fc5504c3..b761d81e 100644
--- a/src/tagstudio/qt/mixed/migration_modal.py
+++ b/src/tagstudio/qt/mixed/migration_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import traceback
diff --git a/src/tagstudio/qt/mixed/mirror_entries_modal.py b/src/tagstudio/qt/mixed/mirror_entries_modal.py
index 20c37881..d06627a6 100644
--- a/src/tagstudio/qt/mixed/mirror_entries_modal.py
+++ b/src/tagstudio/qt/mixed/mirror_entries_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/pagination.py b/src/tagstudio/qt/mixed/pagination.py
index e39fc048..b3a12643 100644
--- a/src/tagstudio/qt/mixed/pagination.py
+++ b/src/tagstudio/qt/mixed/pagination.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""A pagination widget created for TagStudio."""
diff --git a/src/tagstudio/qt/mixed/progress_bar.py b/src/tagstudio/qt/mixed/progress_bar.py
index 9dba568a..e9c46c09 100644
--- a/src/tagstudio/qt/mixed/progress_bar.py
+++ b/src/tagstudio/qt/mixed/progress_bar.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/mixed/relink_entries_modal.py b/src/tagstudio/qt/mixed/relink_entries_modal.py
index c966f873..8acd7c1b 100644
--- a/src/tagstudio/qt/mixed/relink_entries_modal.py
+++ b/src/tagstudio/qt/mixed/relink_entries_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import QObject, Signal
diff --git a/src/tagstudio/qt/mixed/remove_ignored_modal.py b/src/tagstudio/qt/mixed/remove_ignored_modal.py
index 0d45f094..5977009e 100644
--- a/src/tagstudio/qt/mixed/remove_ignored_modal.py
+++ b/src/tagstudio/qt/mixed/remove_ignored_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/remove_unlinked_modal.py b/src/tagstudio/qt/mixed/remove_unlinked_modal.py
index 1b5353cb..0b4e6b6b 100644
--- a/src/tagstudio/qt/mixed/remove_unlinked_modal.py
+++ b/src/tagstudio/qt/mixed/remove_unlinked_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/settings_panel.py b/src/tagstudio/qt/mixed/settings_panel.py
index 19d33754..5e8c022d 100644
--- a/src/tagstudio/qt/mixed/settings_panel.py
+++ b/src/tagstudio/qt/mixed/settings_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, Any
diff --git a/src/tagstudio/qt/mixed/tag_color_label.py b/src/tagstudio/qt/mixed/tag_color_label.py
index 39d5d96f..8052f59d 100644
--- a/src/tagstudio/qt/mixed/tag_color_label.py
+++ b/src/tagstudio/qt/mixed/tag_color_label.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/tag_color_manager.py b/src/tagstudio/qt/mixed/tag_color_manager.py
index d381fcac..92c3b42b 100644
--- a/src/tagstudio/qt/mixed/tag_color_manager.py
+++ b/src/tagstudio/qt/mixed/tag_color_manager.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from collections.abc import Callable
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/tag_color_preview.py b/src/tagstudio/qt/mixed/tag_color_preview.py
index 8d8a7e8b..c73571d4 100644
--- a/src/tagstudio/qt/mixed/tag_color_preview.py
+++ b/src/tagstudio/qt/mixed/tag_color_preview.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/tag_color_selection.py b/src/tagstudio/qt/mixed/tag_color_selection.py
index e6bacc1a..a58d3c06 100644
--- a/src/tagstudio/qt/mixed/tag_color_selection.py
+++ b/src/tagstudio/qt/mixed/tag_color_selection.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/qt/mixed/tag_database.py b/src/tagstudio/qt/mixed/tag_database.py
index 180cee9c..1ac59ea1 100644
--- a/src/tagstudio/qt/mixed/tag_database.py
+++ b/src/tagstudio/qt/mixed/tag_database.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/qt/mixed/tag_search.py b/src/tagstudio/qt/mixed/tag_search.py
index b4193307..e309d5d0 100644
--- a/src/tagstudio/qt/mixed/tag_search.py
+++ b/src/tagstudio/qt/mixed/tag_search.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, Union
diff --git a/src/tagstudio/qt/mixed/tag_widget.py b/src/tagstudio/qt/mixed/tag_widget.py
index 85b62c4e..5907fd18 100644
--- a/src/tagstudio/qt/mixed/tag_widget.py
+++ b/src/tagstudio/qt/mixed/tag_widget.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/mixed/text_field.py b/src/tagstudio/qt/mixed/text_field.py
index c50123ea..3d958e3c 100644
--- a/src/tagstudio/qt/mixed/text_field.py
+++ b/src/tagstudio/qt/mixed/text_field.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import re
diff --git a/src/tagstudio/qt/mnemonics.py b/src/tagstudio/qt/mnemonics.py
index a5f13bda..359e7f44 100644
--- a/src/tagstudio/qt/mnemonics.py
+++ b/src/tagstudio/qt/mnemonics.py
@@ -1,5 +1,7 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import re
import structlog
diff --git a/src/tagstudio/qt/models/palette.py b/src/tagstudio/qt/models/palette.py
index 0d658a57..120dab72 100644
--- a/src/tagstudio/qt/models/palette.py
+++ b/src/tagstudio/qt/models/palette.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import traceback
from enum import IntEnum
diff --git a/src/tagstudio/qt/platform_strings.py b/src/tagstudio/qt/platform_strings.py
index 6144896f..91f12a31 100644
--- a/src/tagstudio/qt/platform_strings.py
+++ b/src/tagstudio/qt/platform_strings.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""A collection of platform-dependant strings."""
diff --git a/src/tagstudio/qt/previews/renderer.py b/src/tagstudio/qt/previews/renderer.py
index 9fc8ae6c..1f4215f6 100644
--- a/src/tagstudio/qt/previews/renderer.py
+++ b/src/tagstudio/qt/previews/renderer.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import base64
diff --git a/src/tagstudio/qt/previews/vendored/blender_renderer.py b/src/tagstudio/qt/previews/vendored/blender_renderer.py
index 10e059e1..1d83f13f 100644
--- a/src/tagstudio/qt/previews/vendored/blender_renderer.py
+++ b/src/tagstudio/qt/previews/vendored/blender_renderer.py
@@ -1,22 +1,7 @@
#!/usr/bin/env python3
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
#
diff --git a/src/tagstudio/qt/previews/vendored/ffmpeg.py b/src/tagstudio/qt/previews/vendored/ffmpeg.py
index e2d9a6c7..84d6ba19 100644
--- a/src/tagstudio/qt/previews/vendored/ffmpeg.py
+++ b/src/tagstudio/qt/previews/vendored/ffmpeg.py
@@ -1,7 +1,9 @@
-# Copyright (C) 2022 Karl Kroening (kkroening).
-# Licensed under the GPL-3.0 License.
+# SPDX-FileCopyrightText: (c) 2022 Karl Kroening (kkroening)
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
# Vendored from ffmpeg-python and ffmpeg-python PR#790 by amamic1803
+
import contextlib
import json
import os
diff --git a/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py b/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py
index 2baad076..99ce1255 100644
--- a/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py
+++ b/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py
@@ -1,7 +1,8 @@
-# type: ignore
-# Copyright (C) 2022 James Robert (jiaaro).
-# Licensed under the MIT License.
+# SPDX-FileCopyrightText: (c) 2022 James Robert (jiaaro)
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
# Vendored from pydub
+# type: ignore
import array
diff --git a/src/tagstudio/qt/previews/vendored/pydub/utils.py b/src/tagstudio/qt/previews/vendored/pydub/utils.py
index 4a4cb889..abc8ce9f 100644
--- a/src/tagstudio/qt/previews/vendored/pydub/utils.py
+++ b/src/tagstudio/qt/previews/vendored/pydub/utils.py
@@ -1,3 +1,9 @@
+# SPDX-FileCopyrightText: (c) 2011 James Robert, http://jiaaro.com
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+# Vendored from pydub
+
+
import json
import re
import subprocess
diff --git a/src/tagstudio/qt/resource_manager.py b/src/tagstudio/qt/resource_manager.py
index e3d259b2..f1d387ab 100644
--- a/src/tagstudio/qt/resource_manager.py
+++ b/src/tagstudio/qt/resource_manager.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/qt/resources.qrc b/src/tagstudio/qt/resources.qrc
index c425750b..fcaf44c8 100644
--- a/src/tagstudio/qt/resources.qrc
+++ b/src/tagstudio/qt/resources.qrc
@@ -1,3 +1,5 @@
+
+
@@ -9,4 +11,4 @@
-
\ No newline at end of file
+
diff --git a/src/tagstudio/qt/resources_rc.py b/src/tagstudio/qt/resources_rc.py
index 6e1940b3..fc514375 100644
--- a/src/tagstudio/qt/resources_rc.py
+++ b/src/tagstudio/qt/resources_rc.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 6.8.0
diff --git a/src/tagstudio/qt/thumb_grid_layout.py b/src/tagstudio/qt/thumb_grid_layout.py
index 2eba8c70..42fac679 100644
--- a/src/tagstudio/qt/thumb_grid_layout.py
+++ b/src/tagstudio/qt/thumb_grid_layout.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import math
import time
from collections.abc import Iterable
diff --git a/src/tagstudio/qt/translations.py b/src/tagstudio/qt/translations.py
index 0875bcf1..bec0b194 100644
--- a/src/tagstudio/qt/translations.py
+++ b/src/tagstudio/qt/translations.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from collections import defaultdict
from pathlib import Path
from platform import system
diff --git a/src/tagstudio/qt/ts_qt.py b/src/tagstudio/qt/ts_qt.py
index 0f818460..538c053e 100644
--- a/src/tagstudio/qt/ts_qt.py
+++ b/src/tagstudio/qt/ts_qt.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
# SIGTERM handling based on the implementation by Virgil Dupras for dupeGuru:
# https://github.com/arsenetar/dupeguru/blob/master/run.py#L71
@@ -21,7 +21,7 @@ from collections import OrderedDict
from pathlib import Path
from queue import Queue
from shutil import which
-from typing import Generic, TypeVar
+from typing import TypeVar
from warnings import catch_warnings
import structlog
@@ -148,7 +148,7 @@ T = TypeVar("T")
# | A [B]<- C |
# |[A]<- B C | Previous routes still exist
# | A ->[D] | Stack is cut from [:A] on new route
-class History(Generic[T]):
+class History[T]:
__history: list[T]
__index: int = 0
diff --git a/src/tagstudio/qt/utils/custom_runnable.py b/src/tagstudio/qt/utils/custom_runnable.py
index 6520c16f..6c10dd06 100644
--- a/src/tagstudio/qt/utils/custom_runnable.py
+++ b/src/tagstudio/qt/utils/custom_runnable.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import QObject, QRunnable, Signal
diff --git a/src/tagstudio/qt/utils/file_deleter.py b/src/tagstudio/qt/utils/file_deleter.py
index 1e264b07..d12d4a9d 100644
--- a/src/tagstudio/qt/utils/file_deleter.py
+++ b/src/tagstudio/qt/utils/file_deleter.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import os
diff --git a/src/tagstudio/qt/utils/file_opener.py b/src/tagstudio/qt/utils/file_opener.py
index e1b27c27..a009dcff 100644
--- a/src/tagstudio/qt/utils/file_opener.py
+++ b/src/tagstudio/qt/utils/file_opener.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import shutil
import subprocess
diff --git a/src/tagstudio/qt/utils/function_iterator.py b/src/tagstudio/qt/utils/function_iterator.py
index 9f213790..ef88d31e 100644
--- a/src/tagstudio/qt/utils/function_iterator.py
+++ b/src/tagstudio/qt/utils/function_iterator.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/views/clickable_label.py b/src/tagstudio/qt/views/clickable_label.py
index c7478b9f..f382d14e 100644
--- a/src/tagstudio/qt/views/clickable_label.py
+++ b/src/tagstudio/qt/views/clickable_label.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import override
diff --git a/src/tagstudio/qt/views/clickable_slider.py b/src/tagstudio/qt/views/clickable_slider.py
index a683a74a..d1ac82a1 100644
--- a/src/tagstudio/qt/views/clickable_slider.py
+++ b/src/tagstudio/qt/views/clickable_slider.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from typing import override
diff --git a/src/tagstudio/qt/views/edit_text_box_modal.py b/src/tagstudio/qt/views/edit_text_box_modal.py
index 3c3bce32..fd60ba21 100644
--- a/src/tagstudio/qt/views/edit_text_box_modal.py
+++ b/src/tagstudio/qt/views/edit_text_box_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtWidgets import QPlainTextEdit, QVBoxLayout
diff --git a/src/tagstudio/qt/views/edit_text_line_modal.py b/src/tagstudio/qt/views/edit_text_line_modal.py
index 5ee933cc..d7ce6d0d 100644
--- a/src/tagstudio/qt/views/edit_text_line_modal.py
+++ b/src/tagstudio/qt/views/edit_text_line_modal.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from collections.abc import Callable
diff --git a/src/tagstudio/qt/views/fix_ignored_modal_view.py b/src/tagstudio/qt/views/fix_ignored_modal_view.py
index b198a2b4..fdad55e6 100644
--- a/src/tagstudio/qt/views/fix_ignored_modal_view.py
+++ b/src/tagstudio/qt/views/fix_ignored_modal_view.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/views/ignore_modal_view.py b/src/tagstudio/qt/views/ignore_modal_view.py
index 7e7de161..277f5eea 100644
--- a/src/tagstudio/qt/views/ignore_modal_view.py
+++ b/src/tagstudio/qt/views/ignore_modal_view.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/qt/views/layouts/flow_layout.py b/src/tagstudio/qt/views/layouts/flow_layout.py
index 14fb411d..af14a7b2 100644
--- a/src/tagstudio/qt/views/layouts/flow_layout.py
+++ b/src/tagstudio/qt/views/layouts/flow_layout.py
@@ -1,6 +1,7 @@
-# Copyright (C) 2013 Riverbank Computing Limited.
-# Copyright (C) 2022 The Qt Company Ltd.
-# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+# SPDX-FileCopyrightText: (C) 2013 Riverbank Computing Limited.
+# SPDX-FileCopyrightText: (C) 2022 The Qt Company Ltd.
+# SPDX-FileCopyrightText: (C) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""PySide6 port of the widgets/layouts/flowlayout example from Qt v6.x."""
diff --git a/src/tagstudio/qt/views/library_info_window_view.py b/src/tagstudio/qt/views/library_info_window_view.py
index 694d9259..bfd06c0a 100644
--- a/src/tagstudio/qt/views/library_info_window_view.py
+++ b/src/tagstudio/qt/views/library_info_window_view.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/views/main_window.py b/src/tagstudio/qt/views/main_window.py
index a4c0485a..374df646 100644
--- a/src/tagstudio/qt/views/main_window.py
+++ b/src/tagstudio/qt/views/main_window.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/views/paged_body_wrapper.py b/src/tagstudio/qt/views/paged_body_wrapper.py
index cb713b3e..a6380d54 100644
--- a/src/tagstudio/qt/views/paged_body_wrapper.py
+++ b/src/tagstudio/qt/views/paged_body_wrapper.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import Qt
diff --git a/src/tagstudio/qt/views/panel_modal.py b/src/tagstudio/qt/views/panel_modal.py
old mode 100755
new mode 100644
index 241e57f7..b754c118
--- a/src/tagstudio/qt/views/panel_modal.py
+++ b/src/tagstudio/qt/views/panel_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/views/preview_panel_view.py b/src/tagstudio/qt/views/preview_panel_view.py
index 5ae7004c..f83045cd 100644
--- a/src/tagstudio/qt/views/preview_panel_view.py
+++ b/src/tagstudio/qt/views/preview_panel_view.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import traceback
import typing
diff --git a/src/tagstudio/qt/views/preview_thumb_view.py b/src/tagstudio/qt/views/preview_thumb_view.py
index e50509ad..d6c032f7 100644
--- a/src/tagstudio/qt/views/preview_thumb_view.py
+++ b/src/tagstudio/qt/views/preview_thumb_view.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import math
import time
diff --git a/src/tagstudio/qt/views/qbutton_wrapper.py b/src/tagstudio/qt/views/qbutton_wrapper.py
index e26703d5..c6f90e32 100644
--- a/src/tagstudio/qt/views/qbutton_wrapper.py
+++ b/src/tagstudio/qt/views/qbutton_wrapper.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtWidgets import QPushButton
diff --git a/src/tagstudio/qt/views/splash.py b/src/tagstudio/qt/views/splash.py
index fe139d17..220c4c5c 100644
--- a/src/tagstudio/qt/views/splash.py
+++ b/src/tagstudio/qt/views/splash.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/views/styles/rounded_pixmap_style.py b/src/tagstudio/qt/views/styles/rounded_pixmap_style.py
index df83c5a0..33395a5a 100644
--- a/src/tagstudio/qt/views/styles/rounded_pixmap_style.py
+++ b/src/tagstudio/qt/views/styles/rounded_pixmap_style.py
@@ -1,8 +1,6 @@
-# Based on the implementation by eyllanesc:
-# https://stackoverflow.com/questions/54230005/qmovie-with-border-radius
-# Licensed under the Creative Commons CC BY-SA 4.0 License:
-# https://creativecommons.org/licenses/by-sa/4.0/
-# Modified for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) 2019 Edwin Yllanes
+# SPDX-License-Identifier: CC-BY-SA-4.0
+# See: https://stackoverflow.com/questions/54230005/qmovie-with-border-radius/54231484#54231484
from typing import override
diff --git a/src/tagstudio/qt/views/tag_box_view.py b/src/tagstudio/qt/views/tag_box_view.py
index bf24a88c..e5c96462 100644
--- a/src/tagstudio/qt/views/tag_box_view.py
+++ b/src/tagstudio/qt/views/tag_box_view.py
@@ -1,5 +1,5 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Iterable
diff --git a/src/tagstudio/qt/views/thumb_button.py b/src/tagstudio/qt/views/thumb_button.py
index 88f5f906..d08f597d 100644
--- a/src/tagstudio/qt/views/thumb_button.py
+++ b/src/tagstudio/qt/views/thumb_button.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/resources/qt/fonts/Oxanium-Bold.ttf.license b/src/tagstudio/resources/qt/fonts/Oxanium-Bold.ttf.license
new file mode 100644
index 00000000..d56fe894
--- /dev/null
+++ b/src/tagstudio/resources/qt/fonts/Oxanium-Bold.ttf.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: 2019 The Oxanium Project Authors (https://github.com/sevmeyer/oxanium)
+SPDX-License-Identifier: OFL-1.1
diff --git a/tagstudio.spec b/tagstudio.spec
index e64bdecf..fbed8ea6 100644
--- a/tagstudio.spec
+++ b/tagstudio.spec
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import platform
from argparse import ArgumentParser
diff --git a/tests/conftest.py b/tests/conftest.py
index b9f4c0c5..28b1d577 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/tests/macros/test_dupe_files.py b/tests/macros/test_dupe_files.py
index 05053555..cd296e16 100644
--- a/tests/macros/test_dupe_files.py
+++ b/tests/macros/test_dupe_files.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
diff --git a/tests/macros/test_folders_tags.py b/tests/macros/test_folders_tags.py
index 7beae3d8..c3fd32be 100644
--- a/tests/macros/test_folders_tags.py
+++ b/tests/macros/test_folders_tags.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from tagstudio.core.library.alchemy.library import Library
from tagstudio.qt.mixed.folders_to_tags import folders_to_tags
diff --git a/tests/macros/test_missing_files.py b/tests/macros/test_missing_files.py
index 61bacce0..3ea463a6 100644
--- a/tests/macros/test_missing_files.py
+++ b/tests/macros/test_missing_files.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
from tempfile import TemporaryDirectory
diff --git a/tests/macros/test_refresh_dir.py b/tests/macros/test_refresh_dir.py
index ca6ce697..01578aad 100644
--- a/tests/macros/test_refresh_dir.py
+++ b/tests/macros/test_refresh_dir.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
from tempfile import TemporaryDirectory
diff --git a/tests/qt/test_about_modal.py b/tests/qt/test_about_modal.py
index 523eb6a6..7ee64735 100644
--- a/tests/qt/test_about_modal.py
+++ b/tests/qt/test_about_modal.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from pytestqt.qtbot import QtBot
from tagstudio.qt.mixed.about_modal import AboutModal
diff --git a/tests/qt/test_build_tag_panel.py b/tests/qt/test_build_tag_panel.py
index 9ae15726..b624356e 100644
--- a/tests/qt/test_build_tag_panel.py
+++ b/tests/qt/test_build_tag_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/tests/qt/test_field_containers.py b/tests/qt/test_field_containers.py
index 2b992114..0d19e4e0 100644
--- a/tests/qt/test_field_containers.py
+++ b/tests/qt/test_field_containers.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.library.alchemy.library import Library
diff --git a/tests/qt/test_file_path_options.py b/tests/qt/test_file_path_options.py
index 412cd56f..1d28f33d 100644
--- a/tests/qt/test_file_path_options.py
+++ b/tests/qt/test_file_path_options.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import os
diff --git a/tests/qt/test_flow_widget.py b/tests/qt/test_flow_widget.py
index 115ded7a..97393416 100644
--- a/tests/qt/test_flow_widget.py
+++ b/tests/qt/test_flow_widget.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import QRect
diff --git a/tests/qt/test_folders_to_tags.py b/tests/qt/test_folders_to_tags.py
index eebee999..7e48fc59 100644
--- a/tests/qt/test_folders_to_tags.py
+++ b/tests/qt/test_folders_to_tags.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.library.alchemy.library import Library
diff --git a/tests/qt/test_global_settings.py b/tests/qt/test_global_settings.py
index 95d6b5f6..63eb5195 100644
--- a/tests/qt/test_global_settings.py
+++ b/tests/qt/test_global_settings.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/tests/qt/test_item_thumb.py b/tests/qt/test_item_thumb.py
index f022f976..d5c1e904 100644
--- a/tests/qt/test_item_thumb.py
+++ b/tests/qt/test_item_thumb.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import pytest
diff --git a/tests/qt/test_preview_panel.py b/tests/qt/test_preview_panel.py
index 12282c9b..b2e3ef5a 100644
--- a/tests/qt/test_preview_panel.py
+++ b/tests/qt/test_preview_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.library.alchemy.library import Library
diff --git a/tests/qt/test_qt_driver.py b/tests/qt/test_qt_driver.py
index 3cf042aa..37bd3832 100644
--- a/tests/qt/test_qt_driver.py
+++ b/tests/qt/test_qt_driver.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from tagstudio.core.library.alchemy.enums import BrowsingState
from tagstudio.core.utils.types import unwrap
diff --git a/tests/qt/test_resource_manager.py b/tests/qt/test_resource_manager.py
index bb9ae72f..5a6d72df 100644
--- a/tests/qt/test_resource_manager.py
+++ b/tests/qt/test_resource_manager.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/tests/qt/test_tag_panel.py b/tests/qt/test_tag_panel.py
index 0d813da6..d5c70564 100644
--- a/tests/qt/test_tag_panel.py
+++ b/tests/qt/test_tag_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pytestqt.qtbot import QtBot
diff --git a/tests/qt/test_tag_search_panel.py b/tests/qt/test_tag_search_panel.py
index bc455685..04a176cc 100644
--- a/tests/qt/test_tag_search_panel.py
+++ b/tests/qt/test_tag_search_panel.py
@@ -1,6 +1,7 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from PySide6.QtCore import SIGNAL
from pytestqt.qtbot import QtBot
diff --git a/tests/qt/test_theme_system.py b/tests/qt/test_theme_system.py
index 94a0bdac..ab2eecf3 100644
--- a/tests/qt/test_theme_system.py
+++ b/tests/qt/test_theme_system.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
"""Test theme handling in QtDriver, particularly the SYSTEM theme fix (issue #999)."""
diff --git a/tests/test_db_migrations.py b/tests/test_db_migrations.py
index 6052a44a..7dee6b6c 100644
--- a/tests/test_db_migrations.py
+++ b/tests/test_db_migrations.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import shutil
diff --git a/tests/test_driver.py b/tests/test_driver.py
index 903cf1aa..5ca04b04 100644
--- a/tests/test_driver.py
+++ b/tests/test_driver.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/tests/test_json_migration.py b/tests/test_json_migration.py
index e44a08d3..3c3c15db 100644
--- a/tests/test_json_migration.py
+++ b/tests/test_json_migration.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/tests/test_library.py b/tests/test_library.py
index 64d3f961..17f0d990 100644
--- a/tests/test_library.py
+++ b/tests/test_library.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/tests/test_search.py b/tests/test_search.py
index 79812dfa..ee36af1e 100644
--- a/tests/test_search.py
+++ b/tests/test_search.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import pytest
diff --git a/tests/test_translations.py b/tests/test_translations.py
index f01be2c6..8d0533f3 100644
--- a/tests/test_translations.py
+++ b/tests/test_translations.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import string