Important
⚠️ As always, export your database before upgrading. Safety first!
Hi everyone! Here is DVinyl v3.2.1, a focused patch release following up on 3.2.0 to resolve a few edge cases reported by the community and ensure seamless imports and navigation.
A big thank you to @teaboyteaboy and @guillaumegay13 for their contributions to this release!
🎬 Movies & TV Shows: TMDB ID Scoping
TMDB reuses numeric IDs across media types (e.g. movie 155 is The Dark Knight, while TV show 155 is 3rd Rock from the Sun). Previously, the duplicate checks and season holder lookup matched on tmdb_id alone, which could cause a newly added TV show to be flagged as a duplicate of an owned movie, with its seasons filed under that movie.
- Scoped duplicate checks:
tmdb_idis now always checked alongsidemedia_type. - Automatic legacy backfill: When starting up, a database migration automatically backfills any existing DVD/movie items missing a
media_typefield with'movie', ensuring historical items deduplicate properly without conflicts. - Season holder safety: Adding seasons is strictly scoped to
media_type: 'tv'.
Reported and fixed by @teaboyteaboy, with legacy backfill on boot.
📚 Books: Open Library Editions on Goodreads Import
The Goodreads RSS import looks up ISBNs on Open Library to automatically populate the publisher, language and format guessing (manga/comics). Open Library recently deprecated and removed its legacy /api/books?jscmd=data endpoint (returning 404s without language data).
- Editions API: DVinyl now queries the modern
/isbn/{isbn}.jsonendpoint, correctly retrieving edition publishers and MARC language codes (eng,fre,spa, etc.). - Resilient parsing: Handles both string and structured publisher entries, direct language codes, and cleanly treats unknown ISBNs as "no data" rather than logged network errors.
Identified and fixed by @guillaumegay13.
🧭 Navigation & Shortcuts Fix
Under specific circumstances (such as disabled modules, manual password resets, or fresh collections), evaluating navbar shortcuts could throw a TypeError: Cannot read properties of undefined (reading 'music') in the header template.
header.ejsandsettingsMiddlewarenow safely guard against missing or uninitialized module dictionaries (whether stored as Mongoose Maps or plain JavaScript objects), preventing header render crashes.
Reported by @oliverjunker.
🧊 ZimaOS / CasaOS App Store
DVinyl is now officially installable on ZimaOS and CasaOS through the community TwoBytes Store! Check out the updated Getting started guide or README for one-click installation instructions.
🛠️ Verification & Test Suite
This release adds comprehensive automated tests covering Open Library edition parsing, TMDB media scoping, settings fallbacks, and instance backup guardrails.
Thank you so much for contributing to the app, whether with your ideas, bug reports, or pull requests. Thanks <3