Skip to content

JavOrganizer v1.4.0

Choose a tag to compare

@CodeW-Otis CodeW-Otis released this 15 Sep 07:37

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-loaded data-src, srcset, CSS backgrounds, and star blocks — none of which were read. The cache confirms the damage: portraits were stored under names like History of Fujie sail that match no performer.
  • The site's own star id was never used. A portrait actress/uly_a.jpg belongs to the person whose credit link is star/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.