v1.17.0 keeps saved posters for deleted media, adds recovery for missing artwork, and fixes stopped viewings being merged into older History rows.
Saved posters
Jellydash now saves small copies of Jellyfin's selected posters for History, Statistics and Monthly recap. This includes custom artwork and shows without external IDs. Once a poster has been successfully saved, deleting its episode, series or movie from Jellyfin no longer removes that saved copy. Jellyfin's artwork keeps priority, and choosing a different poster refreshes the saved copy after a successful check.
For artwork that was already missing:
- Online recovery is enabled by default. Independently captured movie or series TMDB IDs can recover automatically when Jellyfin artwork is unavailable.
- Without a verified ID, Jellydash searches the saved movie or series name and prepares suggestions. Native names are supported. Title matches need your confirmation, so a remake or similarly named show is not assigned automatically.
- Managers see a notice in History or Statistics linking to Settings > Saved posters. Review suggestions there, search online or in your current Jellyfin library, and choose the poster for the affected entries. You can defer or pause recovery too.
- Older History may first need Check existing History to confirm that it belongs to the current Jellyfin server.
Recovery uses Jellyfin's TMDB remote-search provider. No separate API key is needed, and Jellydash does not change metadata in Jellyfin. Online recovery can be disabled in Settings.
Artwork deleted before its first successful save is not guaranteed to recover. A lost custom poster cannot be reconstructed. Retention covers primary posters, not backgrounds or episode stills. Saved Jellyfin copies have no expiry; external copies are renewed when possible and expire after 180 days if renewal fails.
See the saved posters guide for recovery, storage, privacy and backup details.
History fixes
- Stopping an unfinished item and starting it again could update an older viewing under its original date. Jellydash now starts a separate viewing after it observes that connection idle or playing another confirmed item. Pause and resume keep the viewing together.
- The dashboard and background worker share ordered, durable playback capture. Delayed samples and retries preserve viewing boundaries without counting an observation twice.
- History labels recorded time separately from playback position. For example, 13m recorded with Position 100% means the player reported a position at or near the end, and Jellydash counted 13 minutes. The completion indicator does not certify a fully recorded runtime.
- Playback Reporting imports show their elapsed time without inventing a playback position. Older estimated entries stay labelled, and unknown runtimes no longer produce a misleading position bar.
I reproduced the stop/restart issue and tested the fix with Findroid on an Android phone against both MariaDB and SQLite. That does not confirm why the specific Findroid viewing reported in discussion #35 was missing.
Stops entirely between collection checks can still share a viewing. Offline playback that never reaches Jellyfin's live sessions cannot be captured by the live collector. Previously merged viewings are not split retrospectively, and missing viewing time is not filled from runtime or final position.
See History and viewing time for the measurement details.
Big thanks to @Rocker2102 for reporting found issues so they could be fixed!
Updating
Schema updates run automatically on first use for MariaDB and SQLite. Existing History rows and recorded time are preserved. A play running during the upgrade may split into two rows once when the new connection tracking starts.
Saved posters live in the database, with a default image storage budget of 512 MiB per configured Jellyfin address. Include the full database in backups. History CSV exports do not contain poster images or artwork matches. Keep the existing persistent var/cache/history-samples directory too, including when moving a running installation.
The Docker image includes poster validation and the background artwork workers. For direct PHP installations, enable GD and schedule php bin/console.php artwork:poll and php bin/console.php artwork:expire once a minute. Existing History collection must remain scheduled. The saved posters guide covers these requirements.
For Compose installations using a rolling image tag:
docker compose pull && docker compose up -dIf you pin the image version, use ghcr.io/themartz90/jellydash:1.17.0. On Unraid, use the normal container update.