JavOrganizer v1.4.0
Actor & actress covers now actually show — and collections nest properly
🖼️ The cover fix
Actor and actress cards (and their collections) were mostly blank. Two real causes:
- Only
<img title="Name">was collected. Real pages serve cast portraits through lazy-loadeddata-src,srcset, CSS backgrounds, and star blocks — none of which were read. The cache confirms the damage: portraits were stored under names likeHistory of Fujie sailthat match no performer. - The site's own star id was never used. A portrait
actress/uly_a.jpgbelongs to the person whose credit link isstar/uly— that link is now the bridge between an unlabelled image and a name.
What changed:
- Every image a detail page embeds is harvested and matched to the right performer via star id, name inside the portrait file name, or the image label.
- The match is replayed at read time, so records scraped before this feature existed still yield their photos — no re-scrape needed.
- The person-image index is cached (5-minute window) instead of re-reading the whole scrape cache on every request.
- No card is ever blank: a performer with no published portrait falls back to a cover from one of their own titles.
Verified on a live Jellyfin 12.0.0 server: 198/198 performer collections now carry a poster (was 22).
🎭 Collections nest as a real hierarchy
The gender cards held 907 and 744 loose videos instead of performer cards. Root cause found in Jellyfin's own IL: CollectionManager.AddToCollectionAsync calls LinkedChild.Create(item) for movies only, so adding performer collections silently added their videos.
Membership is now written as linked children, with both sides of the parent/child relationship persisted:
Female Actresses (JavOrganizer) → 191 performer cards, 0 loose videos
Male Actors (JavOrganizer) → 7 performer cards, 0 loose videos
Open a card → see performer cards. Open a performer → see their videos, newest first. The stray videos the old build left behind are cleaned up automatically, along with performer collections that no longer meet the minimum.
✨ UI polish
- Site names are escaped before rendering into
innerHTML. - The FlareSolverr check no longer fires on page load (it is what the button is for).
- Polling timers are torn down when leaving a page, so navigating back and forth can no longer stack intervals.
- Every button restores itself with a toast when a request fails, instead of leaving the page stuck behind a loading overlay or a button permanently disabled.
🧹 Housekeeping
- Release archives and checksums are no longer committed (they are build output).
- No absolute paths from a developer machine anywhere in the tree or history.
- 117-check offline suite passing (new coverage for each photo-matching path).
- All five Jellyfin targets build with zero warnings.
Downloads
Pick the zip matching your Jellyfin version:
| Your Jellyfin | File |
|---|---|
| 12.0.x | JavOrganizer-120-v1.4.0.0.zip |
| 10.11.x | JavOrganizer-1011-v1.4.0.0.zip |
| 10.10.x | JavOrganizer-1010-v1.4.0.0.zip |
| 10.9.x | JavOrganizer-109-v1.4.0.0.zip |
| 10.8.x | JavOrganizer-108-v1.4.0.0.zip |
Extract the zip contents into {Jellyfin data}/plugins/JavOrganizer/ and restart.
Full changelog: see README.