# Changelog All notable changes to the Tagger project are documented in this file. ## [1.2.0] - 2026-04-09 ### Added - **Undo/redo** - `Ctrl+Z` / `Ctrl+Y` vrátí/zopakuje tag operace (assign, remove, rename, merge) - Zásobník 50 kroků, čistí se při zavření složky - Edit menu zobrazuje popis poslední operace - Pokrývá: přiřazení tagu, odebrání tagu, přejmenování tagu/kategorie, sloučení tagu/kategorie - **CSFD cache** - Movie data cached in `.!tag` after first fetch, no re-fetching on reopen - `CSFDMovie.to_dict()` / `from_dict()` for serialization - `File.get_cached_movie()` - returns cached data without network access - Cache versioning (`CSFD_CACHE_VERSION`) for future schema invalidation - Cache invalidated automatically when CSFD URL changes - **Orphaned sidecar detection** - On folder scan, `.!tag` files without a matching media file are reported - `FileManager.on_orphaned_tags` callback for UI notification - `FileManager.find_orphaned_tags()` for manual scan - **OR/NOT tag filtering** - Extended `filter_files_by_tags()` with new parameters - `any_of` - file must have at least one of these tags (OR) - `must_not` - file must not have any of these tags (NOT) - Fully backward compatible - **ffprobe threading** - Video resolution detection now runs in background (`VideoResolutionWorker`) - Status bar shows live progress: `Zjišťuji rozlišení (3/12)…` - Menu action disabled during processing - **Export to CSV** - Soubor → "Exportovat do CSV..." - UTF-8 BOM encoding (Excel compatible) - Columns: filename, path, date, tags, CSFD URL, size - **Drag & drop** - Drag folder or file onto the app window to open it ### Changed - **Global config location** - Moved from app directory to `~/.config/Tagger/` - Automatic one-time migration from old location - Fixes crash on read-only PyInstaller build directories - **Python version** - Bumped to 3.14+ ### Dependencies - Removed: Pillow (unused) - Moved: python-dotenv from dev to runtime dependencies ### Tests - 274 tests (all passing) ## [1.1.0] - 2026-01-23 ### Changed - **GUI rewrite to PySide6/Qt6** - Complete UI rewrite from Tkinter to Qt - Modern QMainWindow with menu bar, toolbar, and status bar - QTreeWidget for tag sidebar with category colors - QTableWidget for file list with sorting and filtering - QSplitter for resizable sidebar - Native Qt dialogs (QFileDialog, QInputDialog, QMessageBox) - Keyboard shortcuts using QShortcut - Window geometry persistence - **UI utilities updated** - `src/ui/utils.py` now uses Qt (QIcon, QPixmap) - **Python version restricted** - Requires Python >=3.13,<3.15 for PySide6 compatibility ### Dependencies - Added PySide6 (>=6.10.1) - Removed Tkinter dependency ## [1.0.5] - 2026-01-23 ### Added - **Tag and category renaming** - New context menu functionality - Right-click on tag → "Rename tag" - Automatic update of all files with the tag - Support for renaming entire categories - **Tag merging** - When renaming to an existing tag - Confirmation dialog for merge - Merge removes source tag and updates files - **Tag.from_string()** - New class method for parsing tags - Parses "category/name" format - Eliminates duplicate code across the project - **Dynamic version loading** - Version is loaded from pyproject.toml - Fallback to `_version.py` if toml is not available - DEBUG mode support from `.env` (adds " DEV" suffix) - APP_NAME includes version: "Tagger v1.0.5 DEV" - **UI utilities module** - `src/ui/utils.py` - Moved `load_icon()` function from core to UI layer ### Changed - **FileManager refactoring** - New methods `assign_tag_to_files()` and `remove_tag_from_files()` - Old methods kept as deprecated aliases - `Tag` import at module level (eliminates duplicate imports) - **Dead code removal** - Deleted unused `ListManager` module - Removed legacy functions `load_config()` and `save_config()` from config.py - **Missing import fix** - Added `import subprocess` to media_utils.py ### Tests - 274 tests (all passing) - New tests for Tag.from_string() (6 tests) - New tests for rename/merge tags (24 tests) ## [1.0.4] - 2025-12-29 ### Added - **CSFD.cz integration** - Fetching movie information - `fetch_movie()` - load movie details from URL - `search_movies()` - search for movies - Automatic tag assignment (genres, year, country, director) - **Close folder** - Safe folder closing with metadata saving ### Tests - 249 tests covering CSFD integration ## [1.0.3] - 2025-12-28 ### Added - **Hardlink structure** - New functionality for creating directory structure using hardlinks - `HardlinkManager` class in `src/core/hardlink_manager.py` - Creating hardlinks based on file tags (e.g., `output/genre/Comedy/movie.mkv`) - Structure synchronization - detection and removal of outdated hardlinks when tags change - Support for filtering by categories - Preview mode (dry run) - **Menu items for hardlinks** - "Set hardlink folder..." - configure output folder and categories (saved to `.tagger.json`) - "Update hardlink structure" - quick sync with saved settings - "Create hardlink structure..." - manual folder and category selection - **Three-level configuration system** - Global config (`config.json`) - application settings (window geometry, last folder) - Folder config (`.tagger.json`) - project settings (ignore patterns, hardlink settings) - File tags (`.filename.!tag`) - individual file metadata - **Default tags** - "Rating" category with stars (1-5 stars) - "Color" category with color labels - Exclusive selection in Rating category (only one tag) - **Tests** - 189 tests covering all modules - Tests for hardlink manager including synchronization - **Poetry** - Dependency management using Poetry ### Changed - Modernized GUI inspired by qBittorrent - Window geometry saved to global config - Ignore patterns saved to folder config ## [1.0.2] - 2025-10-03 ### Added - **Modern GUI** - Redesigned interface in qBittorrent style - Side panel with categories and tags - File table with column sorting - Context menus for files and tags - Search field - Status bar with file count and selection size - **Bulk tag assignment** - Dialog for assigning tags to multiple files at once - Tri-state checkboxes (checked/unchecked/mixed) - Color-coded categories - **Video resolution detection** - Automatic detection using ffprobe - **Keyboard shortcuts** - Ctrl+O - Open folder - Ctrl+T - Assign tags - Ctrl+D - Set date - F5 - Refresh - Delete - Remove from index ### Changed - Project structure refactored into modules (`src/core/`, `src/ui/`) - Using dataclass for Tag and File objects ## [1.0.0] - 2025-09-03 ### Added - Basic file tagging functionality - Storing tags in hidden files (`.filename.!tag`) - Category and tag management - Recursive folder scanning - Ignore patterns for file filtering - Basic GUI in Tkinter