15 KiB
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
- 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 editname,folder,tmdb_id,tvdb_id, andsitedirectly in the database, with options to rename the on-disk folder and regeneratetvshow.nfoin one click. - New API endpoints under
/api/anime/{key}/:GET /settings— return full editable settings payloadPUT /settings— update fields with validationPOST /regenerate-nfo— regeneratetvshow.nfofrom TMDB
- Pydantic models:
AnimeSettingsResponse,AnimeSettingsUpdateRequest,AnimeSettingsRegenerateNfoResponsein src/server/models/anime.py. - Frontend module:
AniWorld.AnimeSettingsManagerIIFE 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/nforeturns a 301 redirect to/anime/settingsfor backwards compatibility with bookmarks. - Pydantic model rename in src/server/models/nfo.py:
NfoDiagnosticsResponse→NfoSettingsResponseNfoSeriesDiagnostics→NfoSeriesSettings
- Function rename in src/server/api/nfo.py:
get_nfo_diagnostics→get_nfo_settingsrepair_nfo→repair_nfo_settings
Fixed
-
Queue view blank after adding items:
queue-init.js'sloadQueueData()calledAPI.QUEUE_STATUSdirectly, butAPIis a local variable insideAniWorld.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 anAPI is not definedconsole error. Fixed by replacing the inlinefetchwithAniWorld.QueueAPI.loadQueueData(), which already exists and correctly accesses the endpoint through its own closure. The same file already usesAniWorld.QueueAPI.*for all other queue operations (startQueue,stopQueue,removeFromQueue, etc.). -
Bug:
src/server/api/nfo.pycalled the non-existentanime_service.update_series_nfo_status(...)method, which would raiseAttributeErrorafter a successful NFO repair. Renamed the call to the existingupdate_nfo_status(...)method (matching its signature(key, has_nfo, tmdb_id=None, tvdb_id=None, db=None)) and added an explicitAnimeSeriesService.update(db, id, nfo_path=...)call to keepnfo_pathin sync. Covered by regression tests inTestBugFixCreateOrUpdateNfo. -
Bug: Right-clicking a series card and choosing "Anime Settings" opened
/anime/settings?key=nullinstead of carrying the series key. Root cause: the click handler in src/server/web/static/js/index/context-menu.js calledhide()BEFORE building the URL — andhide()clearedcurrentSeriesKeyto null. Fix captures the key into a localconstbefore callinghide(). Regression-locked bytests/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()usingdifflib.SequenceMatcherwith 0.85 similarity threshold for tolerance of minor title variations - Added debug logging for title mismatches and multiple search results
- Added
[1.3.1] - 2026-02-22
Added
- Encoding detection for HTML parsing (
src/server/providers/aniworld_provider.py): Added_decode_html_content()function that useschardetto detect the actual encoding of HTML content before parsing. Falls back to UTF-8 witherrors='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.0torequirements.txtfor 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.partfragments after each download attempt — on success, on failure, and on exceptions (includingBrokenPipeErrorand 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 containingtmdb_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 incompletetvshow.nfofiles and regenerates them from TMDB. Providesscan_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 theepisodestable accordingly.FolderNamingService(src/server/services/folder_naming_service.py): Renames series folders to theTitle (YYYY)convention using the year fromtvshow.nfo. Prevents double-year accumulation on repeated runs.
Changed
src/server/nfo/nfo_mapper.pyandsrc/server/nfo/nfo_generator.pyreplaced 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
SchedulerConfigfields:schedule_time(default"03:00"),schedule_days(default all 7),auto_download_after_rescan(defaultfalse) - Old
interval_minutesfield retained for backward compatibility
- Schedule rescans at a specific time of day (
- Auto-download after rescan: When
auto_download_after_rescanis 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/configreschedules the APScheduler job without restarting the application - Enriched API response: GET/POST
/api/scheduler/confignow returns{"success", "config", "status"}envelope includingnext_run,last_run, andscan_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 aSchedulerConfigargument (previously async, no arguments)- Dependencies: added
APScheduler>=3.10.4torequirements.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
episodestable after the targeted scan - Episodes are properly synced during rescan operations (added/removed based on filesystem state)
- Missing episodes are now persisted to the
- 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.pyto load series from database after sync - Modified
src/server/api/anime.pyto 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.
keyanddatafiles 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) withsanitize_folder_name(),is_safe_path(), andcreate_safe_folder()functions Serie.sanitized_folderproperty for generating filesystem-safe folder names from display namesSerieScanner.scan_single_series()method for targeted scanning of individual anime without full library rescan- Add series API response now includes
missing_episodeslist andtotal_missingcount - Database transaction support with
@transactionaldecorator andatomic()context manager - Transaction propagation modes (REQUIRED, REQUIRES_NEW, NESTED) for fine-grained control
- Savepoint support for nested transactions with partial rollback capability
TransactionManagerhelper class for manual transaction control- Bulk operations:
bulk_mark_downloaded,bulk_delete,clear_allfor batch processing rotate_sessionatomic operation for secure session rotation- Transaction utilities:
is_session_in_transaction,get_session_transaction_depth get_transactional_sessionfor sessions without auto-commit
Changed
QueueRepository.save_item()now uses atomic transactions for data consistencyQueueRepository.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.