Releases: CodeW-Otis/JavOrganizer
Release list
JavOrganizer v1.5.3
Downloads
| Your Jellyfin | Download |
|---|---|
| 10.8.x | JavOrganizer-108-v1.5.3.0.zip |
| 10.9.x | JavOrganizer-109-v1.5.3.0.zip |
| 10.10.x | JavOrganizer-1010-v1.5.3.0.zip |
| 10.11.x | JavOrganizer-1011-v1.5.3.0.zip |
| 12.0.x | JavOrganizer-120-v1.5.3.0.zip |
| 12.1.x | JavOrganizer-121-v1.5.3.0.zip |
Extract the zip contents into {Jellyfin data}/plugins/JavOrganizer/ and restart.
What changed
Universal version support. Two builds now cover every Jellyfin version, and the newer one is forward-compatible with releases that have not been published yet.
The plugin resolves the Jellyfin API differences that appeared after 10.9 at runtime instead of at compile time, so a new Jellyfin release no longer needs a new build.
JavOrganizer v1.5.2
Never re-scrape metadata that is already fetched
The requirement: if there is already scanned metadata, do not scan it again - only scrape what has not been scanned. The normal scan did not honour that.
The problem
An item can come back from a scrape sparse - a site answers with a title and a cast but no genres, studio or overview, and that is what the item keeps showing. Such an item already has a provider id, so it matched no heal condition and was re-queued on every scan. On a library where the sites simply have no genres for a code, that meant re-scraping already-fetched metadata on every pass, forever.
The fix
JavCache.IsStillValid(code) reports whether a cached scrape for the code exists and is still within its TTL - that record is the authoritative answer for the code. The scan's decision now lives in JavScanTrigger.NeedsScrape, which queues an item only when:
- it was never scraped by the plugin (no provider id), or
- its scrape is title-only (no date and no cover), or
- it is sparse and its cached scrape has aged out, or
- it is Japanese-titled while the plugin language is English (bounded by the provider's retry counter)
and leaves alone anything whose cached scrape is still valid. The deep pass remains the explicit escape hatch that ignores all of this.
This is not the same as the previous sparse-heal condition: that one re-queued a sparse item every scan regardless of whether the sites had already been asked. Now a sparse item is healed once, and if the sites genuinely have no genres for it, the cached record keeps it out of the queue until the TTL expires.
Verified live on Jellyfin 12.0.0
Mid-way through a large heal pass: the scan queued only the 190 genuinely-unscraped items out of 1204 (1014 complete items skipped), every processed item came back complete with 0 still missing, and genre coverage rose from 663 to 1031 titles as the backlog drained.
Cleanup
Removed docs/logo_optimized.png - tracked but referenced nowhere.
| Your Jellyfin | File |
|---|---|
| 12.0.x | JavOrganizer-120-v1.5.2.0.zip |
| 10.11.x | JavOrganizer-1011-v1.5.2.0.zip |
| 10.10.x | JavOrganizer-1010-v1.5.2.0.zip |
| 10.9.x | JavOrganizer-109-v1.5.2.0.zip |
| 10.8.x | JavOrganizer-108-v1.5.2.0.zip |
Extract the zip contents into {Jellyfin data}/plugins/JavOrganizer/ and restart. 251 offline checks passing; all five Jellyfin targets build with zero warnings.
JavOrganizer v1.5.1
Two automation defects fixed
Both found by exercising every background path end-to-end on a live server, and both cost real work on every run.
1. Collections re-downloaded every poster on every run
A guard that skipped the download when a collection already carried the right image was lost in the 1.4.0 rewrite, so each daily pass re-fetched all ~198 performer portraits from the remote CDNs.
Measured: a run took over five minutes instead of seconds, for bytes already on disk. Downloads are now skipped when the item already holds the image that source would produce. Repeat runs measured at 5.1 seconds with all 197 posters intact.
2. A title with no English release was re-scraped forever
When the language is English, a cached record whose title is still Japanese is retried so an English variant can replace it - but nothing bounded that retry, and substantive records bypassed the 6-hour grace gate. Any title with no English release anywhere (e.g. SDMF-010) triggered a full multi-site scrape on every scan, indefinitely, for no possible gain. The retry is now capped at 3 attempts, with the count carried across the cache rewrite.
Verified live on Jellyfin 12.0.0
- Startup auto-scan fires on every boot (~38s after plugin load)
- FlareSolverr starts as a direct child of Jellyfin and reports healthy
- All three scheduled tasks carry the expected triggers: 6-hourly scan, daily cache clean at 04:00, daily collections at 04:30
- All three manual buttons work; the concurrency guard refuses a second scan while one runs, and a cancelled scan restarts immediately
- Cache cleanup removed exactly one expired record, one expired not-found marker and one orphan - no over-deletion (636 records before and after)
- Offline suite now 217 checks, all five Jellyfin targets build with zero warnings
JavOrganizer v1.5.0
jav.guru added, and six real defects fixed
This release came out of an exhaustive end-to-end test of every function against the live sites.
New site: jav.guru
Labels its cast by gender (Actress/Actor) and serves English titles - so it both fills gaps and refines the gender split the performer collections rely on. Verified live: it supplies the male actor for titles where JavBus alone has none.
Six defects found and fixed
- Zero-padded codes never matched. The canonical code is zero-free (
ADN-29) but sites publish the padded spelling in permalinks and search indexes (adn-029). Three separate places compared them literally, so a correct page was downloaded and then thrown away. - Ban detection fired on innocent text. The pattern matched the bare phrases
access deniedandtoo many requests. jav.guru shipsToo many requests. Please slow down.for its comment widget, so it was marked banned and skipped for six hours on every scrape. - OneJAV returned nothing at all. Its result selector required an
<article>ancestor; OneJAV serves<div class="card">tiles and has no<article>anywhere. - javquick returned nothing at all. Same class of bug - its
<article>anchors are bare children, not nested in an<h2>. - A bare product code could beat a real title. OneJAV's
og:titleis the literal stringOneJAV, soMIAB492could win the merge over a real English title from JavDB. - Bracketed codes were duplicated in names.
[ADN-029-MR] TitleproducedADN-029 [ADN-029-MR] Title.
All six failed silently - the sites looked healthy in the status panel while returning nothing.
Testing
- Offline suite grown from 117 to 213 checks, including ban-detection boundaries, result-link extraction for the exact markup that broke, code-normalisation edge cases, and zero-padding agreement.
- New live-network harness (
tools/LiveScrape) that scrapes real sites per-site. It reads the server's own FlareSolverr setting, so it reproduces what the plugin does instead of reporting every Cloudflare site as blocked. - All five Jellyfin targets build with zero warnings.
Verified on a live Jellyfin 12.0.0 server
18 of 19 sites reachable and 9 returning data for a sample code. Collections rebuilt cleanly afterwards: 191 actress cards, 7 actor cards, 198/198 performer posters, all three nesting levels intact, 0 loose videos in the gender cards.
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.
JavOrganizer v1.3.1 — Scan page, gender browse collections, Japanese-title self-healing
JavOrganizer v1.3.1
Pick the zip matching your Jellyfin version (a mismatched build will not load):
| Your Jellyfin | Download |
|---|---|
| 12.0.x | JavOrganizer-120-v1.3.1.0.zip |
| 10.11.x | JavOrganizer-1011-v1.3.1.0.zip |
| 10.10.x | JavOrganizer-1010-v1.3.1.0.zip |
| 10.9.x | JavOrganizer-109-v1.3.1.0.zip |
| 10.8.x | JavOrganizer-108-v1.3.1.0.zip |
New in 1.3.1
- 🎛️ Main-menu "Scan" page — the manual Scan / Deep Re-scrape / Cancel buttons (with live progress bar, elapsed time and ETA) are now one click from anywhere in Jellyfin, next to your library views.
- 🎭 Gender browse collections — Female Actresses (JavOrganizer) and Male Actors (JavOrganizer): one "browse everyone" entry point per gender, performers ordered by total views, each performer's titles by release date.
- 🇯🇵→🇬🇧 Japanese-title self-healing — items still showing a Japanese-heavy title are automatically re-scraped by the scheduled passes until an English variant replaces them.
Install
- Extract the zip contents into
{Jellyfin data}/plugins/JavOrganizer/ - Restart Jellyfin → verify JavOrganizer 1.3.1 under Dashboard → Plugins
- In your Movies library → Metadata downloaders: move JavOrganizer to the top and disable the rest
- Quick Start guide (5 min, includes optional FlareSolverr setup)
JavOrganizer is a metadata scraper and is not affiliated with Jellyfin or any scraped site. Scrape responsibly and respect each site's terms.
JavOrganizer v1.3.0 — 18-site parallel scraper, English-first titles, anti-ban system
JavOrganizer v1.3.0 — 18-site parallel JAV metadata scraper for Jellyfin
Pick the zip matching your Jellyfin version (a mismatched build will not load):
| Your Jellyfin | Download | SHA256 (in the .sha256 file) |
|---|---|---|
| 12.0.x | JavOrganizer-120-v1.3.0.0.zip |
d2fdd975… |
| 10.11.x | JavOrganizer-1011-v1.3.0.0.zip |
85879fba… |
| 10.10.x | JavOrganizer-1010-v1.3.0.0.zip |
d5023c99… |
| 10.9.x | JavOrganizer-109-v1.3.0.0.zip |
dcc1aeea… |
| 10.8.x | JavOrganizer-108-v1.3.0.0.zip |
76a9e5d4… |
Install
- Extract the zip contents into
{Jellyfin data}/plugins/JavOrganizer/ - Restart Jellyfin → verify JavOrganizer 1.3.0 under Dashboard → Plugins
- In your Movies library → Metadata downloaders: move JavOrganizer to the top and disable the rest
- Follow the Quick Start guide (5 minutes, includes optional FlareSolverr setup for Cloudflare-walled sites)
Highlights
- 18 websites scraped in parallel per code (JavLibrary, JavDB, JavBus, MissAV + mirror, OneJAV, FANZA digital + DVD, JavLand, 123AV, SEXTB, SupJav, JavGG, JavSeen, JavMix, JavQuick, JavTube, MGStage) with a per-code site cap and priority ranking
- English-first merging — Latin-script titles, cast names and studios always win over Japanese-only variants
- Advanced anti-ban system — rotating coherent browser fingerprints, jittered per-site pacing, exponential backoff, ban cooldowns, unreachable circuit breaker
- Automatic scanning — startup pass, 6-hourly scheduled task, self-healing for title-only/thin items; manual Scan + Deep Re-scrape + Cancel buttons with live progress
- Gender-aware collections — "Actress: …" / "Actor: …" per person, plus Most Viewed / Most Liked rankings
- Live-verified end to end on Jellyfin 12.0 with a 1204-video library; 82-check offline test suite; 0 warnings on all five build targets
Upgrading from 1.2.0?
Press Deep Re-scrape Everything once in the plugin settings — it repairs items stuck with title-only data, Japanese titles, or missing covers.
JavOrganizer is a metadata scraper and is not affiliated with Jellyfin or any scraped site. Scrape responsibly and respect each site's terms.