Files
Aniworld/Docs/CHANGELOG.md
2026-08-16 19:53:38 +02:00

16 KiB
Raw Permalink Blame History

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 principles and adheres to Semantic Versioning.


[Unreleased] - 2026-06-20

Added

  • Delete Anime Feature — Right-click on any anime card and select "Delete Anime" to remove a series. Three modes are available: database only, folder only, or both. A typed-confirmation (delete) is required to prevent accidental deletions. The operation is broadcast via WebSocket so all connected clients remove the card in real-time. Path traversal protection prevents folder deletion outside the anime base directory.

    • DELETE /api/anime/{key} endpoint (src/server/api/anime.py)
    • AnimeService.delete_series() orchestrator (src/server/services/anime_service.py)
    • broadcast_series_deleted() WebSocket broadcast (src/server/services/websocket_service.py)
    • DeleteSeriesRequest / DeleteSeriesResult Pydantic models (src/server/models/anime.py)
    • Frontend modal with typed confirmation (src/server/web/static/js/index/delete-modal.js)
    • Right-click "Delete Anime" context menu item (src/server/web/static/js/index/context-menu.js)
    • SERIES_DELETED WebSocket event handling (src/server/web/static/js/index/socket-handler.js)
    • SeriesManager.removeSeries() grid cleanup (src/server/web/static/js/index/series-manager.js)
    • Full test suite: tests/unit/test_delete_anime_service.py, tests/api/test_delete_anime_endpoint.py, tests/frontend/test_delete_modal.py, tests/security/test_delete_anime_security.py
    • Documentation: Docs/DELETE_ANIME_FEATURE.md
  • Anime Settings page — renamed from "NFO Diagnostics". Right-click on any anime card → "Anime Settings" navigates to /anime/settings?key=<series>. The new page lets the user view and edit name, folder, tmdb_id, tvdb_id, and site directly in the database, with options to rename the on-disk folder and regenerate tvshow.nfo in one click.

  • New API endpoints under /api/anime/{key}/:

    • GET /settings — return full editable settings payload
    • PUT /settings — update fields with validation
    • POST /regenerate-nfo — regenerate tvshow.nfo from TMDB
  • Pydantic models: AnimeSettingsResponse, AnimeSettingsUpdateRequest, AnimeSettingsRegenerateNfoResponse in src/server/models/anime.py.

  • Frontend module: AniWorld.AnimeSettingsManager IIFE in src/server/web/static/js/pages/anime-settings.js with public API: init, loadSeries, saveSettings, regenerateNfo, validateField, populateForm, showSaveSuccess, showError.

  • Vitest JS unit tests covering every public function on AnimeSettingsManager — 31 tests in tests/frontend/unit/anime_settings.test.js.

  • Playwright E2E test for the right-click → settings page flow in tests/frontend/e2e/anime_settings_page.spec.js.

Changed

  • Right-click context menu on the library page: "NFO Diagnostics" → "Anime Settings" (data-action="nfo-diagnostics"data-action="anime-settings").
  • Configuration modal link: "Open NFO Diagnostics" → "Open Anime Settings", target URL /settings/nfo/anime/settings.
  • Page route: /settings/nfo returns a 301 redirect to /anime/settings for backwards compatibility with bookmarks.
  • Pydantic model rename in src/server/models/nfo.py:
    • NfoDiagnosticsResponseNfoSettingsResponse
    • NfoSeriesDiagnosticsNfoSeriesSettings
  • Function rename in src/server/api/nfo.py:
    • get_nfo_diagnosticsget_nfo_settings
    • repair_nforepair_nfo_settings

Fixed

  • Queue view blank after adding items: queue-init.js's loadQueueData() called API.QUEUE_STATUS directly, but API is a local variable inside AniWorld.QueueAPI's IIFE — not accessible globally. Items added to the queue were persisted server-side but the queue page could not fetch them, leaving the view empty with an API is not defined console error. Fixed by replacing the inline fetch with AniWorld.QueueAPI.loadQueueData(), which already exists and correctly accesses the endpoint through its own closure. The same file already uses AniWorld.QueueAPI.* for all other queue operations (startQueue, stopQueue, removeFromQueue, etc.).

  • Bug: src/server/api/nfo.py called the non-existent anime_service.update_series_nfo_status(...) method, which would raise AttributeError after a successful NFO repair. Renamed the call to the existing update_nfo_status(...) method (matching its signature (key, has_nfo, tmdb_id=None, tvdb_id=None, db=None)) and added an explicit AnimeSeriesService.update(db, id, nfo_path=...) call to keep nfo_path in sync. Covered by regression tests in TestBugFixCreateOrUpdateNfo.

  • Bug: Right-clicking a series card and choosing "Anime Settings" opened /anime/settings?key=null instead of carrying the series key. Root cause: the click handler in src/server/web/static/js/index/context-menu.js called hide() BEFORE building the URL — and hide() cleared currentSeriesKey to null. Fix captures the key into a local const before calling hide(). Regression-locked by tests/frontend/unit/context_menu.test.js (5 tests).


[Unreleased] - 2026-06-05

Fixed

  • Folder scan series key resolution: Fixed "Could not resolve series key for folder, skipping" warnings during library setup. _resolve_key_via_search() now uses fuzzy title matching instead of exact string comparison.
    • Added _normalize_title() to strip anime suffixes: (TV), (Anime), (OAD), (OVA), (Special), (Movie), (Spin-Off)
    • Added _titles_match() using difflib.SequenceMatcher with 0.85 similarity threshold for tolerance of minor title variations
    • Added debug logging for title mismatches and multiple search results

[1.3.1] - 2026-02-22

Added

  • Encoding detection for HTML parsing (src/server/providers/aniworld_provider.py): Added _decode_html_content() function that uses chardet to detect the actual encoding of HTML content before parsing. Falls back to UTF-8 with errors='replace' to handle pages with mismatched encoding declarations. Applied to all BeautifulSoup parsing calls to prevent "Some characters could not be decoded" warnings.
  • chardet dependency: Added chardet>=5.2.0 to requirements.txt for encoding detection.
  • Temp file cleanup after every download (src/server/providers/aniworld_provider.py, src/server/providers/enhanced_provider.py): Module-level helper _cleanup_temp_file() removes the working temp file and any yt-dlp .part fragments after each download attempt — on success, on failure, and on exceptions (including BrokenPipeError and cancellation). Ensures that no partial files accumulate in ./Temp/ across multiple runs.
  • Temp folder purge on server start (src/server/fastapi_app.py): The FastAPI lifespan startup now iterates ./Temp/ and deletes every file and sub-directory before the rest of the initialisation sequence runs. If the folder does not exist it is created. Errors are caught and logged as warnings so that they never abort startup.

[1.3.0] - 2026-02-22

Added

  • NFO tag completeness (src/server/nfo/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/server/nfo/nfo_mapper.py: New module containing tmdb_to_nfo_model(), _extract_rating_by_country(), and _extract_fsk_rating(). Extracted to keep files under 500 lines and isolate pure mapping logic.
  • src/server/nfo/nfo_generator.py: XML serialiser for NFO files (generate_tvshow_nfo).
  • US MPAA rating: _extract_rating_by_country(ratings, "US") now maps the US TMDB content rating to the <mpaa> NFO tag.
  • NfoScanService (src/server/services/nfo_scan_service.py): New service that detects incomplete tvshow.nfo files and regenerates them from TMDB. Provides scan_all(), _scan_series(), _create_nfo(), _update_nfo_if_needed(), and _regenerate_nfo(). 17 NFO tags are written.
  • ScanService (src/server/services/scan_service.py): New service for library rescans — detects new and removed episode files and syncs the episodes table accordingly.
  • FolderNamingService (src/server/services/folder_naming_service.py): Renames series folders to the Title (YYYY) convention using the year from tvshow.nfo. Prevents double-year accumulation on repeated runs.

Changed

  • src/server/nfo/nfo_mapper.py and src/server/nfo/nfo_generator.py replaced the monolithic NFO logic from the previous service.
  • NFO generation moved to src/server/nfo/nfo_generator.py.

[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 (MonSun) 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

Deprecated

  • Legacy Series Files (key/data): File-based series storage is deprecated. key and data files in anime folders will be removed in v3.0.0. Database storage is now the primary method. See docs/MIGRATION_GUIDE.md for details.

Sections for Each Release

## [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.