203 lines
8.8 KiB
Markdown
203 lines
8.8 KiB
Markdown
# Changelog
|
||
|
||
## Document Purpose
|
||
|
||
This document tracks all notable changes to the Aniworld project.
|
||
|
||
### What This Document Contains
|
||
|
||
- **Version History**: All released versions with dates
|
||
- **Added Features**: New functionality in each release
|
||
- **Changed Features**: Modifications to existing features
|
||
- **Deprecated Features**: Features marked for removal
|
||
- **Removed Features**: Features removed from the codebase
|
||
- **Fixed Bugs**: Bug fixes with issue references
|
||
- **Security Fixes**: Security-related changes
|
||
- **Breaking Changes**: Changes requiring user action
|
||
|
||
### What This Document Does NOT Contain
|
||
|
||
- Internal refactoring details (unless user-facing)
|
||
- Commit-level changes
|
||
- Work-in-progress features
|
||
- Roadmap or planned features
|
||
|
||
### Target Audience
|
||
|
||
- All users and stakeholders
|
||
- Operators planning upgrades
|
||
- Developers tracking changes
|
||
- Support personnel
|
||
|
||
---
|
||
|
||
## Format
|
||
|
||
This changelog follows [Keep a Changelog](https://keepachangelog.com/) principles and adheres to [Semantic Versioning](https://semver.org/).
|
||
|
||
---
|
||
|
||
## [Unreleased] - 2026-02-22
|
||
|
||
### Added
|
||
|
||
- **NFO tag completeness (`nfo_mapper.py`)**: All 17 required NFO tags are now
|
||
explicitly populated during creation: `originaltitle`, `sorttitle`, `year`,
|
||
`plot`, `outline`, `tagline`, `runtime`, `premiered`, `status`, `imdbid`,
|
||
`genre`, `studio`, `country`, `actor`, `watched`, `dateadded`, `mpaa`.
|
||
- **`src/core/utils/nfo_mapper.py`**: New module containing
|
||
`tmdb_to_nfo_model()`, `_extract_rating_by_country()`, and
|
||
`_extract_fsk_rating()`. Extracted from `NFOService` to keep files under
|
||
500 lines and isolate pure mapping logic.
|
||
- **US MPAA rating**: `_extract_rating_by_country(ratings, "US")` now maps the
|
||
US TMDB content rating to the `<mpaa>` NFO tag.
|
||
- **`NfoRepairService` (`src/core/services/nfo_repair_service.py`)**: New service
|
||
that detects incomplete `tvshow.nfo` files and triggers TMDB re-fetch.
|
||
Provides `parse_nfo_tags()`, `find_missing_tags()`, `nfo_needs_repair()`, and
|
||
`NfoRepairService.repair_series()`. 13 required tags are checked.
|
||
- **`perform_nfo_repair_scan()` startup hook
|
||
(`src/server/services/initialization_service.py`)**: New async function
|
||
called during application startup. Iterates every series directory, checks
|
||
whether `tvshow.nfo` is missing required tags using `nfo_needs_repair()`, and
|
||
either queues the series for background reload (when a `background_loader` is
|
||
provided) or calls `NfoRepairService.repair_series()` directly. Skips
|
||
gracefully when `tmdb_api_key` or `anime_directory` is not configured.
|
||
- **NFO repair wired into startup lifespan (`src/server/fastapi_app.py`)**:
|
||
`perform_nfo_repair_scan(background_loader)` is called at the end of the
|
||
FastAPI lifespan startup, after `perform_media_scan_if_needed`, ensuring
|
||
every existing series NFO is checked and repaired on each server start.
|
||
|
||
### Changed
|
||
|
||
- `NFOService._tmdb_to_nfo_model()` and `NFOService._extract_fsk_rating()` moved
|
||
to `src/core/utils/nfo_mapper.py` as module-level functions
|
||
`tmdb_to_nfo_model()` and `_extract_fsk_rating()`.
|
||
- `src/core/services/nfo_service.py` reduced from 640 → 471 lines.
|
||
|
||
---
|
||
|
||
## [Unreleased] - 2026-01-18
|
||
|
||
### Added
|
||
|
||
- **Cron-based Scheduler**: Replaced the asyncio sleep-loop with APScheduler's `AsyncIOScheduler + CronTrigger`
|
||
- Schedule rescans at a specific **time of day** (`HH:MM`) on selected **days of the week**
|
||
- New `SchedulerConfig` fields: `schedule_time` (default `"03:00"`), `schedule_days` (default all 7), `auto_download_after_rescan` (default `false`)
|
||
- Old `interval_minutes` field retained for backward compatibility
|
||
- **Auto-download after rescan**: When `auto_download_after_rescan` is enabled, missing episodes are automatically queued for download after each scheduled rescan
|
||
- **Day-of-week UI**: New day-of-week pill toggles (Mon–Sun) in the Settings → Scheduler section
|
||
- **Live config reload**: POST `/api/scheduler/config` reschedules the APScheduler job without restarting the application
|
||
- **Enriched API response**: GET/POST `/api/scheduler/config` now returns `{"success", "config", "status"}` envelope including `next_run`, `last_run`, and `scan_in_progress`
|
||
|
||
### Changed
|
||
|
||
- Scheduler API response format: previously returned flat config; now returns `{"success": true, "config": {...}, "status": {...}}`
|
||
- `reload_config()` is now a synchronous method accepting a `SchedulerConfig` argument (previously async, no arguments)
|
||
- Dependencies: added `APScheduler>=3.10.4` to `requirements.txt`
|
||
|
||
### Fixed
|
||
|
||
- **Series Visibility**: Fixed issue where series added to the database weren't appearing in the API/UI
|
||
- Series are now loaded from database into SeriesApp's in-memory cache on startup
|
||
- Added `_load_series_from_db()` call after initial database sync in FastAPI lifespan
|
||
- **Episode Tracking**: Fixed missing episodes not being saved to database when adding new series
|
||
- Missing episodes are now persisted to the `episodes` table after the targeted scan
|
||
- Episodes are properly synced during rescan operations (added/removed based on filesystem state)
|
||
- **Database Synchronization**: Improved data consistency between database and in-memory cache
|
||
- Rescan process properly updates episodes: adds new missing episodes, removes downloaded ones
|
||
- All series operations now maintain database and cache synchronization
|
||
|
||
### Technical Details
|
||
|
||
- Modified `src/server/fastapi_app.py` to load series from database after sync
|
||
- Modified `src/server/api/anime.py` to save scanned episodes to database
|
||
- Episodes table properly tracks missing episodes with automatic cleanup
|
||
|
||
---
|
||
|
||
## Sections for Each Release
|
||
|
||
```markdown
|
||
## [Version] - YYYY-MM-DD
|
||
|
||
### Added
|
||
|
||
- New features
|
||
|
||
### Changed
|
||
|
||
- Changes to existing functionality
|
||
|
||
### Deprecated
|
||
|
||
- Features that will be removed in future versions
|
||
|
||
### Removed
|
||
|
||
- Features removed in this release
|
||
|
||
### Fixed
|
||
|
||
- Bug fixes
|
||
|
||
### Security
|
||
|
||
- Security-related fixes
|
||
```
|
||
|
||
---
|
||
|
||
## Unreleased
|
||
|
||
_Changes that are in development but not yet released._
|
||
|
||
### Added
|
||
|
||
- **Comprehensive Test Suite**: Created 1,070+ tests across 4 priority tiers
|
||
- **TIER 1 (Critical)**: 159 tests - Scheduler, NFO batch operations, download queue, persistence
|
||
- **TIER 2 (High Priority)**: 390 tests - JavaScript framework, dark mode, setup page, settings modal, WebSocket, queue UI
|
||
- **TIER 3 (Medium Priority)**: 156 tests - WebSocket load, concurrent operations, retry logic, NFO performance, series parsing, TMDB integration
|
||
- **TIER 4 (Polish)**: 426 tests - Internationalization (89), user preferences (68), accessibility (250+), media server compatibility (19)
|
||
- **Frontend Testing Infrastructure**: Vitest for unit tests, Playwright for E2E tests
|
||
- **Security Test Coverage**: Complete testing for authentication, authorization, CSRF, XSS, SQL injection
|
||
- **Performance Validation**: WebSocket load (200+ concurrent clients), batch operations, concurrent access
|
||
- **Accessibility Tests**: WCAG 2.1 AA compliance testing (keyboard navigation, ARIA labels, screen readers)
|
||
- **Media Server Compatibility**: NFO format validation for Kodi, Plex, Jellyfin, and Emby
|
||
|
||
### Changed
|
||
|
||
- Updated testing documentation (TESTING_COMPLETE.md, instructions.md) to reflect 100% completion of all test tiers
|
||
|
||
### Fixed
|
||
|
||
- **Enhanced Anime Add Flow**: Automatic database persistence, targeted episode scanning, and folder creation with sanitized names
|
||
- Filesystem utility module (`src/server/utils/filesystem.py`) with `sanitize_folder_name()`, `is_safe_path()`, and `create_safe_folder()` functions
|
||
- `Serie.sanitized_folder` property for generating filesystem-safe folder names from display names
|
||
- `SerieScanner.scan_single_series()` method for targeted scanning of individual anime without full library rescan
|
||
- Add series API response now includes `missing_episodes` list and `total_missing` count
|
||
- Database transaction support with `@transactional` decorator and `atomic()` context manager
|
||
- Transaction propagation modes (REQUIRED, REQUIRES_NEW, NESTED) for fine-grained control
|
||
- Savepoint support for nested transactions with partial rollback capability
|
||
- `TransactionManager` helper class for manual transaction control
|
||
- Bulk operations: `bulk_mark_downloaded`, `bulk_delete`, `clear_all` for batch processing
|
||
- `rotate_session` atomic operation for secure session rotation
|
||
- Transaction utilities: `is_session_in_transaction`, `get_session_transaction_depth`
|
||
- `get_transactional_session` for sessions without auto-commit
|
||
|
||
### Changed
|
||
|
||
- `QueueRepository.save_item()` now uses atomic transactions for data consistency
|
||
- `QueueRepository.clear_all()` now uses atomic transactions for all-or-nothing behavior
|
||
- Service layer documentation updated to reflect transaction-aware design
|
||
|
||
### Fixed
|
||
|
||
- Scan status indicator now correctly shows running state after page reload during active scan
|
||
- Improved reliability of process status updates in the UI header
|
||
|
||
---
|
||
|
||
## Version History
|
||
|
||
_To be documented as versions are released._
|