2025-12-28 16:05:34 +01:00
|
|
|
# Changelog
|
|
|
|
|
|
2026-01-24 07:50:19 +01:00
|
|
|
All notable changes to the Tagger project are documented in this file.
|
|
|
|
|
|
2026-04-09 18:04:37 +02:00
|
|
|
## [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)
|
|
|
|
|
|
2026-01-24 07:50:19 +01:00
|
|
|
## [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
|
2025-12-28 16:05:34 +01:00
|
|
|
|
2025-12-28 17:44:24 +01:00
|
|
|
## [1.0.3] - 2025-12-28
|
2025-12-28 16:05:34 +01:00
|
|
|
|
2026-01-24 07:50:19 +01:00
|
|
|
### 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
|
2025-12-28 16:05:34 +01:00
|
|
|
|
2025-12-28 17:44:24 +01:00
|
|
|
## [1.0.2] - 2025-10-03
|
2025-12-28 16:05:34 +01:00
|
|
|
|
2026-01-24 07:50:19 +01:00
|
|
|
### 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
|
2025-12-28 16:05:34 +01:00
|
|
|
|
2025-12-28 17:44:24 +01:00
|
|
|
## [1.0.0] - 2025-09-03
|
2025-12-28 16:05:34 +01:00
|
|
|
|
2026-01-24 07:50:19 +01:00
|
|
|
### 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
|