Initial commit

This commit is contained in:
jkortis committed 2026-09-30 23:06:14 -04:00
commit 1d235d30e7
58 files changed
+19693

No files matched your search

+181
View File
@@ -0,0 +1,181 @@
# Changelog
All notable changes to the Media Sorter project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.1.0] - 2026-09-07
### Added
- **Robust Long-Running Anime Tokenization & Season/Episode Extraction**:
- Full support for 4-digit episode numbers (`\d{1,4}`) across standard TV tags (`S01E1171`) and standalone episode prefixes (`EP1171`, `E233`).
- Added support for anime releases with episode titles (`[Anime Time] One Piece - 0233 - Episode Title [Tags]`), space-separated formats (`[HatSubs] One Piece 1073...`), and underscore formats (`[Kaerizaki-Fansub]_One_Piece_1076...`).
- Parent directory season extraction (`Season 08 - Water Seven`) scanning ancestor paths from closest to farthest while ignoring system root folders.
- **Natural Ordering & Web UI Auto-Detection**:
- Implemented `natural_sort_key` in Python and `naturalCompare` in JavaScript so episodes never get misaligned or sequentially numbered out of order.
- Added "Auto-Detect from Filenames" button in the manual batch modal to immediately pull true season and episode numbers directly from file names.
- Increased episode numbering limit to 9999 to support long-running anime like *One Piece*.
- Fixed `clean_detected_show_name` to preserve year-like numbers (1900-2099) in movie and series titles (e.g. *Blade Runner 2049*).
- **Manual Batch Sorting & Library Management**:
- Added `POST /api/files/manual-sort-batch` and `POST /api/library/clear` endpoints.
- Added floating multi-file selection bar and 2-step manual batch sorting overlay modal.
## [1.0.7] - 2026-09-05
### Added
- **Library Catalog & Show/Movie Management (`📚 Library`)**:
- Added a dedicated top-level **📚 Library** view with full catalog tracking of all indexed shows and movies across storage drives.
- Interactive selector buttons to switch between **📺 Shows**, **🎬 Movies**, and **📂 All**, with live count badges.
- Real-time instant search input to filter titles as you type.
- Disk scanning synchronization (`POST /api/library/rescan`) that indexes directory trees, episode counts, seasons, and technical metadata.
- Persistent database tracking via `LibraryItem` table model with unique constraint protection and last-updated tracking.
- **Automatic Show Memory Routing**:
- Whenever a new show is detected or sorted, it is automatically cataloged in the Library.
- When inspecting downloads or analyzing files, media sorter queries known shows from the library and automatically routes incoming media (such as extras, behind-the-scenes, specials, and unbracketed files) into that show's folder (`SHOWS_DIR / <Show Name>`).
- **Unsure File Grouping Dropdowns**:
- Automatically clusters non-show files into dedicated collapsible dropdown cards instead of dumping them into a flat singles list:
- **Shared Subfolder Groups**: Files sharing a common subfolder in downloads form their own group card (e.g. `📁 Shared Subfolder: Dexter Extras (5 files)`).
- **Matching Name Prefix Groups**: Files sharing a common clean title stem or prefix form their own group card (e.g. `🏷️ Matching Name Prefix: Blood, Guts and Body Parts (2 files)`).
- Only truly lone, isolated files remain in the singles media list.
- Group action buttons:
- `⚡ Sort Group`: Sorts all files in the group directly via `POST /api/files/sort-group`.
- `✏️ Set Show/Movie for Group`: Opens the manual assignment modal for the entire group, allowing one-click bulk categorization to Movies or TV Shows.
- **Group Sorting Endpoint (`POST /api/files/sort-group`)**:
- Server endpoint that batch-processes unsure groups of files with show name override or movie destination formatting, atomic movement, and automatic library catalog registration.
### Fixed
- **Anime Fansub Adjacent Brackets Regex**:
- Fixed `RE_ANIME_RELEASE` regex to support adjacent bracket tags without spaces (e.g. `[Erai-raws] Bleach - 001 [1080p][MultiSub][EF0AF7BA].mkv`), ensuring anime episode fan releases are accurately classified.
- **Prevent Anime Episode Matching into SxxExx**:
- Added negative lookahead `(?![xX\w])` to prevent episodic titles like `Game of Thrones - 1x09 - Baelor` from prematurely matching `1` as an anime episode instead of `Season 1 Episode 9`.
- **Fast Local Artwork & Responsive Downloads Inspection**:
- Updated `fetch_show_poster` with `allow_network=False` during folder inspection so downloads scanning completes in under 2 seconds rather than stalling on synchronous external network queries.
## [1.0.6] - 2026-09-05
### Added
- **Targeted Show Sorting (`POST /api/files/sort-show`)**:
- The "⚡ Sort Now" button inside any show's dropdown card in the Downloads Folder Explorer now targets that specific show directly.
- Sorts all episodes of that show into `SHOWS_DIR / <Show Name> / Season XX / ...` with full transaction tracking, database history, and instant rollback support.
- Interactive UI with button loading spinner (`<span class="loading-spinner"></span> Sorting...`), disabled state during execution, success toast with count of sorted episodes, and automatic UI refresh.
- **Standalone Episode Pattern Recognition**:
- Added support for standalone `Episode \d{1,4}` and `Ep \d{1,4}` patterns (e.g., `Naruto Episode 207 The Supposed Sealed Ability.mkv`, `Bleach Episode 05.mkv`).
- Added support for anime/fansub series formatting without release group prefixes (e.g., `BLEACH꞉ Sennen Kessen-hen - 27 E89717B7].mkv`).
- Added support for anime opening/ending patterns (`S03ED01`, `S03OP01`).
- **Interactive Button Loading States**:
- Added loading spinner and disabled state to `⚡ Run Sort Now (Live)`, `⚡ Sort All Files`, and show-specific `⚡ Sort Now` buttons to prevent duplicate runs and give immediate visual feedback.
### Fixed
- **Show "Sort Now" Button Doing Nothing**:
- Fixed issue where clicking "Sort Now" inside a show dropdown appeared to do nothing because episodic shows like Naruto were failing tokenizer matching, getting classified as low-confidence movies, and being quarantined (which were flagged but not moved).
- Fixed button calling global sorting instead of targeted show sorting.
- Fixed run results panel being hidden on Dashboard tab when viewing Folder Explorer tab.
- **MKV Video Containers Misclassified as Audio/Music**:
- Fixed bug where video containers (`.mkv`, `.mp4`) containing audio streams were routed to audio-only classification if lightweight EBML header parsing didn't match a hardcoded video codec string.
- Reordered classifier pipeline so video containers and extensions are always checked as videos first before audio-only handling.
- Expanded EBML video track detection in `_parse_ebml` to recognize generic `V_` track headers (including VC-1, DivX, XviD, and MPEG2).
## [1.0.5] - 2026-09-05
### Added
- **Quarantine Top Action Buttons & Bulk Controls**:
- Action buttons at the top of the Review & Quarantine header for immediate manual actions: `🎬 Move to Movies`, `📺 Move to Shows`, `✏️ Set Show/Movie`, `↩️ Unflag`, and `↩️ Undo All Resolved`.
- Multi-item selection checkboxes with header `Select All` / `Deselect All` toggle and live selection count tracking.
- Selection toolbar that adapts dynamically based on checked items for bulk execution.
- Backend bulk endpoints:
- `POST /api/quarantine/bulk-resolve`: Bulk moves selected or all pending quarantine items to Movies or TV Shows inside a fast transaction.
- `POST /api/quarantine/bulk-undo`: Bulk unflags pending items or rollbacks all resolved quarantine files back to original source directories.
- **Manual Modal File Switcher**:
- Added file picker dropdown inside `modal-manual-sort` when multiple quarantine items are available, enabling switching between items without reopening the modal.
- **Automatic Folder Explorer & Queue Refresh**:
- Automatically re-scans and refreshes the Downloads Folder Explorer (`loadFiles`) and Quarantine queue (`loadQuarantine`) immediately whenever sorting runs (live or preview) or batch rollbacks complete.
- **Granular & Global Undo Actions**:
- Added `↩️ Undo All Resolved` button to easily restore all resolved quarantine files to their source folders.
- Per-item unflagging for pending items and per-item rollback for resolved items.
### Fixed
- **False-Positive TV Show Classifications for Movies**:
- **Resolution Dimensions**: Filenames containing dimensions like `1920x1080` or `1280x720` no longer falsely match episodic TV season/episode regex (`20x108`, `80x720`). Added negative lookbehind/lookahead and resolution fallback parser `RE_DIMENSIONS`.
- **Release Years in Torrent Tags**: Anime release regex pattern no longer treats 4-digit release years (1900–2099) in bracketed torrent tags (e.g., `[YTS.MX] Movie Title - 2024 [1080p].mkv`) as episode numbers.
- **Broad Substring Match**: Replaced broad `"tv" in path_str` check with directory boundary regex `(?i)[/\\](?:tv[/\\]|tv[-_\s]shows?|tv[-_\s]series|season[-_\s]*\d+)`, preventing movies with `HDTV`, `[rartv]`, or `Apple.TV` from routing to TV show logic.
- **Folder Explorer Subdirectories**: Fixed downloads inspector so scene/torrent movie subfolders (e.g. `The.Dark.Knight.2008.1080p.BluRay/`) are not misidentified as TV show names; movies now properly appear under `singles` targeting `MOVIES_DIR`.
- **Release Group Cleaning**: Updated `_clean_title` to cleanly strip leading bracketed group tags (e.g., `[YTS.MX]`, `[rarbg]`, `[TGx]`).
- **`.txt` Companion Cleaning & Explorer Filter**:
- Excluded `.txt` companions (e.g., torrent notes, RARBG.txt) from the folder explorer.
- Automatically cleans up companion `.txt` files and empty parent release folders when media files are deleted or organized.
- **Safe Quarantine Mode**:
- Flagged files with confidence below threshold remain in place safely rather than being automatically moved.
- **Missing Module Import**:
- Fixed missing `import re` in `src/media_sorter/classifier.py`.
### Changed
- Unified Settings and `.env` configuration into a single coherent dashboard tab.
- Expanded automated test suite to 65 tests covering movie dimension tokenization, bracketed release years, HDTV classification, folder explorer movie detection, and bulk quarantine APIs.
---
## [1.0.4] - 2026-09-05
### Added
- File renaming toggle (`RENAME_FILES`) and customizable naming templates for movies and TV shows (`MOVIE_TEMPLATE`, `TV_TEMPLATE`).
- Automatic cleanup of empty parent directories after files are moved (`CLEANUP_EMPTY_DIRS`).
---
## [1.0.3] - 2026-09-05
### Added
- TV show dropdown aggregation in downloads folder explorer with collapsible season groups.
- Local artwork and TVmaze poster lookup for series.
---
## [1.0.2] - 2026-09-05
### Added
- Instant batch rollbacks and transactional operation journaling.
- Manual file categorization modal and REST API endpoints.
---
## [1.0.1] - 2026-09-05
### Added
- Multi-signal classifier supporting audiobooks, podcasts, home videos, and archives.
- SQLite WAL operation journaling.
---
## [1.0.0] - 2026-09-05
### Added
- Initial release with atomic file sorting, dry-run simulation, and web dashboard.
## [1.0.8] - 2026-09-06
### Added
- Added missing custom themes: neon-forest, retro-retro, golden-sand, deep-space, candy-cotton.
- Implemented RGB Chroma mode UI with toggle and speed slider, keyframe animations, and persistence via localStorage.
- Added unit tests for theme availability and RGB feature.
## [1.0.9] - 2026-09-06
### Added
- Implemented `.rgb-mode` CSS class with keyframe animation for chroma glow.
- Updated project version to 1.0.9 across metadata.
### Fixed
- RGB visual effect was missing, now correctly applied.
- Version numbers were out‑of‑sync between `pyproject.toml` and package `__init__`.
## [1.0.10] - 2026-09-06
### Added
- Updated README with section on using the Antigravity bot via Direct Messages.
- Added no‑cache HTTP headers to ensure version badge updates reliably.
### Changed
- Bumped project version to 1.0.10 in `pyproject.toml` and package `__init__`.
### Fixed
- Version numbers now stay in sync across metadata files.