Jellyfin plugin that finds what's missing and related across your library and builds a todo list to fill the gaps: collections, series, cast & crew filmographies, and recommendations. Adds where-to-watch links and can optionally show missing entries as placeholders.
27
stars
285
commits
C#
primary language
Sep 8, 2026
updated
Finds what's missing and what's related across your Jellyfin library and builds an easy todo list for filling the gaps: movies absent from a collection, episodes absent from a series, films your cast and crew made that you don't own, and related titles worth adding.
A scheduled task scans your library; a dashboard page (Dashboard > Gaps Report) shows the results: filterable by tab and media type, searchable, with links out (TMDB, IMDb, and more) and an on-demand "Where to watch" for each item. What it scans for is on its own page (Dashboard > Mind the Gaps), which is also where the plugin's Settings button lands.
More screenshots throughout the report guide and the configuration reference.
Every gap is one of three kinds, surfaced as the report's three tabs:
| Tab | What it finds | Examples |
|---|---|---|
| Set completion | a missing piece of something you partly own | a movie missing from a collection or franchise; a missing season or episode; a music artist's missing albums |
| Creator works | other work by a person or artist you own | a film or series an owned actor or director made; a music artist's wider catalog; an author's other books |
| Recommendations (the Discover tab) | related titles worth exploring and adding (off by default) | TMDB "similar" titles for what you own, plus the unowned titles on a TMDB, MDBList, Trakt, or IMDb list and on your JustWatch watchlist, each list shown as its own group |
Movies and shows work out of the box; music and books are on by default too. Discogs, Trakt, TheTVDB, MDBList, and JustWatch are opt-in cross-checks and sources that need their own credentials. IMDb lists are opt-in but need no credential.
How the pieces connect: the providers and lists you enable feed three gap patterns, and each pattern surfaces as one report tab, labelled for the media type you are viewing.
flowchart LR
classDef movies fill:#e3f2fd,stroke:#1565c0,color:#0d47a1;
classDef shows fill:#ede7f6,stroke:#5e35b1,color:#311b92;
classDef music fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
classDef books fill:#fff3e0,stroke:#ef6c00,color:#e65100;
col["TMDB collections and BoxSets"]:::movies --> SET
cur["Curated studios and keywords"]:::movies --> SET
ser["Series content (Jellyfin, TheMovieDb, TVmaze, TheTVDB)"]:::shows --> SET
mbd["MusicBrainz discography, Discogs labels"]:::music --> SET
ppl["TMDB people"]:::movies --> CRE
trk["Trakt filmography"]:::movies --> CRE
ipl["IMDb people lists"]:::movies --> CRE
art["MusicBrainz and Discogs artists"]:::music --> CRE
aut["OpenLibrary authors"]:::books --> CRE
sim["TMDB similar titles"] --> DIS
tli["TMDB lists"] --> DIS
mli["MDBList lists"] --> DIS
ili["IMDb watchlists and lists"] --> DIS
jwl["JustWatch watchlist"] --> DIS
mwl["MDBList watchlist"] --> DIS
twl["Trakt watchlist"] --> DIS
tmw["TMDB watchlist and favorites"] --> DIS
tvf["TheTVDB favorites"]:::shows --> DIS
dwl["Discogs wantlist"]:::music --> DIS
owl["OpenLibrary want to read"]:::books --> DIS
SET["Set completion<br/>Movies: Set completion<br/>Shows: Series completion<br/>Music: Discography"]
CRE["Creator works<br/>Movies and Shows: Creator works<br/>Music: Artist works<br/>Books: Author works"]
DIS["Discover<br/>related titles and curated lists"]
Series content is the one source that consults several providers at once, so it gets a closer look. For each owned series the plugin gathers every reachable provider's episode list, merges them season by season in your library's own provider order, and reconciles what is left against the episodes you already hold:
flowchart TD
classDef provider fill:#ede7f6,stroke:#5e35b1,color:#311b92;
classDef merge fill:#e3f2fd,stroke:#1565c0,color:#0d47a1;
classDef lib fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
classDef out fill:#fff3e0,stroke:#ef6c00,color:#e65100;
S["Owned series"]:::lib --> Q{"Any provider reachable? library lists it as a<br/>fetcher, has credentials, and the series carries its id"}
Q -->|no| B["Surface missing episodes from the library's<br/>own virtual episodes alone"]:::lib
Q -->|yes| A["Ask each reachable provider for its episode list<br/>(TheMovieDb, TheTVDB, TVmaze)"]:::provider
A --> R["Rank by the library's fetcher order; TVmaze ranks last,<br/>and no configured order means every credentialed provider"]:::provider
R --> M["Merge season by season"]:::merge
M --> M1["The top-ranked provider owns each season it lists"]:::merge
M --> M2["A lower-ranked provider may add a season none above it<br/>lists, but never contradict a covered one"]:::merge
M1 --> L["Append the library's own virtual episodes last-chance,<br/>dropping a stale season the authority contradicts"]:::lib
M2 --> L
L --> D["Reconcile the merged list against owned episodes<br/>by air date and folded title, not just number"]:::merge
D --> O1["Owned, even if renumbered, reordered,<br/>or a merged two-parter"]:::out
D --> O2["Missing, reported as a gap"]:::out
B --> O2
In the dashboard: Plugins > Repositories > +.
Add the repository (any name) with this URL:
https://raw.githubusercontent.com/IDisposable/jellyfin-plugin-mindthegaps/main/manifest.json
Open the Catalog tab, find Mind the Gaps under General, and click Install.
Restart Jellyfin.
New releases show up in the catalog automatically.
To get pre-release builds before they reach the stable channel, add this repository URL instead of the one above:
https://raw.githubusercontent.com/IDisposable/jellyfin-plugin-mindthegaps/main/manifest-beta.json
The beta channel carries every release (stable and pre-release); the stable channel carries only stable releases. Both publish the same plugin, so Jellyfin always offers the highest version it sees and a stable release supersedes the betas that led up to it. Use one channel or the other, not both.
Download the .zip from the latest release,
extract it into a folder under your server's config/plugins/ directory (e.g.
config/plugins/MindTheGaps/), and restart Jellyfin.
Requires a server matching the plugin's targetAbi (currently 10.11.0.0, net9.0).
Open Dashboard > Mind the Gaps and click Rescan now. For collection gaps, your BoxSets need a TMDB id (from the TMDB box-set provider). The scan also runs on a schedule (editable under Dashboard > Scheduled Tasks).
See the report guide for the three pattern tabs (Set completion, Creator works, Recommendations), the filters and saved views, and the per-row actions (where to watch, send, mint, dismiss).
In the dashboard, go to Plugins > Mind the Gaps. The source toggles are grouped into Complete what you own (collections, studios, keywords, Discogs labels, series, music discography, books, and an owned actor or director's filmography) and Discover new titles (recommendations, TMDB lists, MDBList lists, Trakt lists, IMDb watchlists, and your JustWatch watchlist). For every setting, what it does, and what changes when you set or clear it, see the configuration reference. In brief, alongside those toggles:
| Setting | Description |
|---|---|
| Metadata country / language | Locale for TMDB lookups and availability. |
| Max related per item | Caps how many "similar" titles each owned item contributes. |
| Max creators scanned per run | Caps the filmography scan; people are scanned stalest-first, so coverage accumulates over runs and a higher cap covers a large cast and crew faster. |
| Relevance floors | Minimum TMDB votes for filmography and recommendation gaps (plus an optional cast-billing limit), so Creator works and Recommendations stay actionable on a large library. |
| Track curated sets | Gates the studio and keyword sets (the ids below feed it). |
| Curated studio / keyword ids | TMDB company and keyword ids to complete, picked with a type-ahead chip picker. |
| Scan TMDB lists | Gates the TMDB discovery lists (the list ids beside it feed it). |
| Availability | Turns "Where to watch" on or off (the per-item lookups and the background pass). |
| Acquisition stack | Optional Radarr / Sonarr / Jellyseerr/Overseerr base URLs, keys, and add settings; enables the per-row Send action. |
| Webhook URL | Optional; posted to (Discord-compatible) when a scan or the "where to watch" pass finishes. |
| Detailed API logging | Off by default; turn it on to log every external API request and response (the sources, the acquisition sends, TMDB, and the webhook) to the server log while debugging a misbehaving target, then turn it back off. |
| Trakt client id | Enables the opt-in Trakt filmography cross-check. |
| TheTVDB API key | Your own v4 key; enables the TheTVDB series-content cross-check. |
| Discogs token | Enables the opt-in Discogs label and artist source. |
| TMDB API key | Optional; falls back to the built-in public key. |
| MDBList API key | Optional (free); enables MDBList community lists as a discovery source. |
| Scan IMDb lists | Gates the IMDb discovery lists (the ur... watchlist and ls... list ids beside it feed it). Needs no key, but IMDb serves only what the account has made public. |
| Follow IMDb people lists | Reads an IMDb people list from the same ids as a filmography seed, so a director or actor you own nothing by still lands on Creator works. Resolves 50 people per run, stalest first, so a long list is covered over several scans. |
| Scan TMDB watchlist | Your TMDB watchlist, and optionally your favorites. Needs your own TMDB API key plus a connected account (a two-step button; no callback, so the server needs no public address). |
| Scan Trakt watchlist | A Trakt user's watchlist. Needs the Trakt client id and a username; the profile has to be public. |
| Scan MDBList watchlist | Your own MDBList watchlist (not a community list). The API key identifies the account, so there is nothing else to enter. |
| Scan Discogs wantlist | A Discogs wantlist as Music gaps. Needs the Discogs token and a username. |
| Scan OpenLibrary want to read | An OpenLibrary "Want to Read" shelf as Books gaps. Needs a username and nothing else; the shelf has to be public. |
| Scan TheTVDB favorites | Your favorited series. Needs the TheTVDB key and the subscriber PIN. Expect few results: a favorite is usually a show you already hold. |
| TheTVDB subscriber PIN | Optional. Only needed to read your TheTVDB account (the favorites); the episode cross-check works without it. |
| JustWatch token | Enables your own JustWatch watchlist (and, optionally, your likes) as a discovery source. JustWatch issues no api keys, so this is the bearer token from a signed-in browser session, and it expires. |
Off by default, the plugin can mint pathless "virtual" placeholder items so a gap renders greyed-out in place. It is a stand-in for proper server support: the server does not reconcile or garbage-collect these, so the plugin does it itself, and everything minted is tagged and fully reversible.
Minting is driven from the report, one gap at a time: each movie row has a Mint button, and you can checkbox several rows and Mint selected. Both run in the background with progress. A collection gap mints into its BoxSet; anything else mints into a catch-all "Mind the Gaps (minted)" collection, and a filmography gap also attaches the person so it shows on that person's page. Every minted item queues a metadata refresh, and at the end of every scan a reconcile pass drops any minted movie the library now owns for real. The settings page keeps only Remove minted movies (with a dry-run preview) to undo everything at once. Missing episodes are not minted here: the server already synthesizes those.
Mind the Gaps is self-contained, so it does not depend on any other plugin and will not clash with them. Its links are still extensible without any setup: it folds in whatever your server's own link providers emit, so TMDB and IMDb links come from core, and a JustWatch link lights up automatically if the separate Jellyfin.Plugin.JustWatch is installed. For the architecture behind this, see CONTRIBUTING.
Every outbound link in the report (the per-row provider links, the links on a creator or set group header, and the ids in the Diagnose popup) is tagged so a stylesheet can target a specific service, for example to inject a service icon. Each link carries:
cgProvider-<service>, with the service name lowercased and stripped to letters
and digits: cgProvider-tmdb, cgProvider-imdb, cgProvider-thetvdb, cgProvider-tvmaze,
cgProvider-trakt, cgProvider-musicbrainz, cgProvider-discogs, cgProvider-openlibrary,
cgProvider-justwatch;data-provider attribute with the original service name (data-provider="TheTVDB"), for attribute
selectors.Drop CSS into your server via the community Custom CSS or File Transformation plugins (this plugin ships no CSS or icons itself).
Here is a ready-to-paste snippet using Simple Icons (CC0), pulled from their CDN at display time and masked to each link's text color, so the icons match your theme and recolor on hover. Simple Icons carries TMDB, IMDb, Trakt, MusicBrainz, and Discogs; it does not carry TheTVDB, TVmaze, OpenLibrary, or JustWatch, so those are left for you to point at your own hosted SVG.
/* Mind the Gaps: provider icons. Paste into your custom CSS. */
.cgProvider-tmdb::before,
.cgProvider-imdb::before,
.cgProvider-trakt::before,
.cgProvider-musicbrainz::before,
.cgProvider-discogs::before {
content: "";
display: inline-block;
width: 1em;
height: 1em;
margin-right: .35em;
vertical-align: text-bottom;
background-color: currentColor;
-webkit-mask: var(--mtg-icon) center / contain no-repeat;
mask: var(--mtg-icon) center / contain no-repeat;
}
.cgProvider-tmdb { --mtg-icon: url("https://cdn.simpleicons.org/themoviedatabase"); }
.cgProvider-imdb { --mtg-icon: url("https://cdn.simpleicons.org/imdb"); }
.cgProvider-trakt { --mtg-icon: url("https://cdn.simpleicons.org/trakt"); }
.cgProvider-musicbrainz { --mtg-icon: url("https://cdn.simpleicons.org/musicbrainz"); }
.cgProvider-discogs { --mtg-icon: url("https://cdn.simpleicons.org/discogs"); }
/* Not in Simple Icons. To add one, list its ::before in the rule above and host your own SVG, e.g.:
.cgProvider-thetvdb { --mtg-icon: url("/path/to/thetvdb.svg"); } */
The icons load from the Simple Icons CDN; self-host the SVGs instead if you prefer no external request. The logos are trademarks of their respective services, so this is your choice to display them. These class and attribute names are a stable contract; the link text and layout around them are not.
To go icon-only (hide the text label, show just the icon), add this alongside the snippet above:
.cgProvider-tmdb,
.cgProvider-imdb,
.cgProvider-trakt,
.cgProvider-musicbrainz,
.cgProvider-discogs {
font-size: 0; /* collapses the text label */
}
.cgProvider-tmdb::before,
.cgProvider-imdb::before,
.cgProvider-trakt::before,
.cgProvider-musicbrainz::before,
.cgProvider-discogs::before {
font-size: 1rem; /* the icon is sized in em, so give it a real size again */
margin-right: 0;
vertical-align: middle;
}
Each link carries a title and an aria-label (for example "Open on TheTVDB"), so it stays labeled for
tooltips and screen readers even when shown icon-only.
Bug reports, ideas, and pull requests are welcome. See CONTRIBUTING for how to build, test, release, and find your way around the code.
MIT. See LICENSE.
C#
80.4%
JavaScript
14.8%
HTML
4.0%
Jellyfin plugin that finds what's missing and related across your library and builds a todo list to fill the gaps: collections, series, cast & crew filmographies, and recommendations. Adds where-to-watch links and can optionally show missing entries as placeholders.
27
stars
285
commits
C#
primary language
Sep 8, 2026
updated
Finds what's missing and what's related across your Jellyfin library and builds an easy todo list for filling the gaps: movies absent from a collection, episodes absent from a series, films your cast and crew made that you don't own, and related titles worth adding.
A scheduled task scans your library; a dashboard page (Dashboard > Gaps Report) shows the results: filterable by tab and media type, searchable, with links out (TMDB, IMDb, and more) and an on-demand "Where to watch" for each item. What it scans for is on its own page (Dashboard > Mind the Gaps), which is also where the plugin's Settings button lands.
More screenshots throughout the report guide and the configuration reference.
Every gap is one of three kinds, surfaced as the report's three tabs:
| Tab | What it finds | Examples |
|---|---|---|
| Set completion | a missing piece of something you partly own | a movie missing from a collection or franchise; a missing season or episode; a music artist's missing albums |
| Creator works | other work by a person or artist you own | a film or series an owned actor or director made; a music artist's wider catalog; an author's other books |
| Recommendations (the Discover tab) | related titles worth exploring and adding (off by default) | TMDB "similar" titles for what you own, plus the unowned titles on a TMDB, MDBList, Trakt, or IMDb list and on your JustWatch watchlist, each list shown as its own group |
Movies and shows work out of the box; music and books are on by default too. Discogs, Trakt, TheTVDB, MDBList, and JustWatch are opt-in cross-checks and sources that need their own credentials. IMDb lists are opt-in but need no credential.
How the pieces connect: the providers and lists you enable feed three gap patterns, and each pattern surfaces as one report tab, labelled for the media type you are viewing.
flowchart LR
classDef movies fill:#e3f2fd,stroke:#1565c0,color:#0d47a1;
classDef shows fill:#ede7f6,stroke:#5e35b1,color:#311b92;
classDef music fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
classDef books fill:#fff3e0,stroke:#ef6c00,color:#e65100;
col["TMDB collections and BoxSets"]:::movies --> SET
cur["Curated studios and keywords"]:::movies --> SET
ser["Series content (Jellyfin, TheMovieDb, TVmaze, TheTVDB)"]:::shows --> SET
mbd["MusicBrainz discography, Discogs labels"]:::music --> SET
ppl["TMDB people"]:::movies --> CRE
trk["Trakt filmography"]:::movies --> CRE
ipl["IMDb people lists"]:::movies --> CRE
art["MusicBrainz and Discogs artists"]:::music --> CRE
aut["OpenLibrary authors"]:::books --> CRE
sim["TMDB similar titles"] --> DIS
tli["TMDB lists"] --> DIS
mli["MDBList lists"] --> DIS
ili["IMDb watchlists and lists"] --> DIS
jwl["JustWatch watchlist"] --> DIS
mwl["MDBList watchlist"] --> DIS
twl["Trakt watchlist"] --> DIS
tmw["TMDB watchlist and favorites"] --> DIS
tvf["TheTVDB favorites"]:::shows --> DIS
dwl["Discogs wantlist"]:::music --> DIS
owl["OpenLibrary want to read"]:::books --> DIS
SET["Set completion<br/>Movies: Set completion<br/>Shows: Series completion<br/>Music: Discography"]
CRE["Creator works<br/>Movies and Shows: Creator works<br/>Music: Artist works<br/>Books: Author works"]
DIS["Discover<br/>related titles and curated lists"]
Series content is the one source that consults several providers at once, so it gets a closer look. For each owned series the plugin gathers every reachable provider's episode list, merges them season by season in your library's own provider order, and reconciles what is left against the episodes you already hold:
flowchart TD
classDef provider fill:#ede7f6,stroke:#5e35b1,color:#311b92;
classDef merge fill:#e3f2fd,stroke:#1565c0,color:#0d47a1;
classDef lib fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
classDef out fill:#fff3e0,stroke:#ef6c00,color:#e65100;
S["Owned series"]:::lib --> Q{"Any provider reachable? library lists it as a<br/>fetcher, has credentials, and the series carries its id"}
Q -->|no| B["Surface missing episodes from the library's<br/>own virtual episodes alone"]:::lib
Q -->|yes| A["Ask each reachable provider for its episode list<br/>(TheMovieDb, TheTVDB, TVmaze)"]:::provider
A --> R["Rank by the library's fetcher order; TVmaze ranks last,<br/>and no configured order means every credentialed provider"]:::provider
R --> M["Merge season by season"]:::merge
M --> M1["The top-ranked provider owns each season it lists"]:::merge
M --> M2["A lower-ranked provider may add a season none above it<br/>lists, but never contradict a covered one"]:::merge
M1 --> L["Append the library's own virtual episodes last-chance,<br/>dropping a stale season the authority contradicts"]:::lib
M2 --> L
L --> D["Reconcile the merged list against owned episodes<br/>by air date and folded title, not just number"]:::merge
D --> O1["Owned, even if renumbered, reordered,<br/>or a merged two-parter"]:::out
D --> O2["Missing, reported as a gap"]:::out
B --> O2
In the dashboard: Plugins > Repositories > +.
Add the repository (any name) with this URL:
https://raw.githubusercontent.com/IDisposable/jellyfin-plugin-mindthegaps/main/manifest.json
Open the Catalog tab, find Mind the Gaps under General, and click Install.
Restart Jellyfin.
New releases show up in the catalog automatically.
To get pre-release builds before they reach the stable channel, add this repository URL instead of the one above:
https://raw.githubusercontent.com/IDisposable/jellyfin-plugin-mindthegaps/main/manifest-beta.json
The beta channel carries every release (stable and pre-release); the stable channel carries only stable releases. Both publish the same plugin, so Jellyfin always offers the highest version it sees and a stable release supersedes the betas that led up to it. Use one channel or the other, not both.
Download the .zip from the latest release,
extract it into a folder under your server's config/plugins/ directory (e.g.
config/plugins/MindTheGaps/), and restart Jellyfin.
Requires a server matching the plugin's targetAbi (currently 10.11.0.0, net9.0).
Open Dashboard > Mind the Gaps and click Rescan now. For collection gaps, your BoxSets need a TMDB id (from the TMDB box-set provider). The scan also runs on a schedule (editable under Dashboard > Scheduled Tasks).
See the report guide for the three pattern tabs (Set completion, Creator works, Recommendations), the filters and saved views, and the per-row actions (where to watch, send, mint, dismiss).
In the dashboard, go to Plugins > Mind the Gaps. The source toggles are grouped into Complete what you own (collections, studios, keywords, Discogs labels, series, music discography, books, and an owned actor or director's filmography) and Discover new titles (recommendations, TMDB lists, MDBList lists, Trakt lists, IMDb watchlists, and your JustWatch watchlist). For every setting, what it does, and what changes when you set or clear it, see the configuration reference. In brief, alongside those toggles:
| Setting | Description |
|---|---|
| Metadata country / language | Locale for TMDB lookups and availability. |
| Max related per item | Caps how many "similar" titles each owned item contributes. |
| Max creators scanned per run | Caps the filmography scan; people are scanned stalest-first, so coverage accumulates over runs and a higher cap covers a large cast and crew faster. |
| Relevance floors | Minimum TMDB votes for filmography and recommendation gaps (plus an optional cast-billing limit), so Creator works and Recommendations stay actionable on a large library. |
| Track curated sets | Gates the studio and keyword sets (the ids below feed it). |
| Curated studio / keyword ids | TMDB company and keyword ids to complete, picked with a type-ahead chip picker. |
| Scan TMDB lists | Gates the TMDB discovery lists (the list ids beside it feed it). |
| Availability | Turns "Where to watch" on or off (the per-item lookups and the background pass). |
| Acquisition stack | Optional Radarr / Sonarr / Jellyseerr/Overseerr base URLs, keys, and add settings; enables the per-row Send action. |
| Webhook URL | Optional; posted to (Discord-compatible) when a scan or the "where to watch" pass finishes. |
| Detailed API logging | Off by default; turn it on to log every external API request and response (the sources, the acquisition sends, TMDB, and the webhook) to the server log while debugging a misbehaving target, then turn it back off. |
| Trakt client id | Enables the opt-in Trakt filmography cross-check. |
| TheTVDB API key | Your own v4 key; enables the TheTVDB series-content cross-check. |
| Discogs token | Enables the opt-in Discogs label and artist source. |
| TMDB API key | Optional; falls back to the built-in public key. |
| MDBList API key | Optional (free); enables MDBList community lists as a discovery source. |
| Scan IMDb lists | Gates the IMDb discovery lists (the ur... watchlist and ls... list ids beside it feed it). Needs no key, but IMDb serves only what the account has made public. |
| Follow IMDb people lists | Reads an IMDb people list from the same ids as a filmography seed, so a director or actor you own nothing by still lands on Creator works. Resolves 50 people per run, stalest first, so a long list is covered over several scans. |
| Scan TMDB watchlist | Your TMDB watchlist, and optionally your favorites. Needs your own TMDB API key plus a connected account (a two-step button; no callback, so the server needs no public address). |
| Scan Trakt watchlist | A Trakt user's watchlist. Needs the Trakt client id and a username; the profile has to be public. |
| Scan MDBList watchlist | Your own MDBList watchlist (not a community list). The API key identifies the account, so there is nothing else to enter. |
| Scan Discogs wantlist | A Discogs wantlist as Music gaps. Needs the Discogs token and a username. |
| Scan OpenLibrary want to read | An OpenLibrary "Want to Read" shelf as Books gaps. Needs a username and nothing else; the shelf has to be public. |
| Scan TheTVDB favorites | Your favorited series. Needs the TheTVDB key and the subscriber PIN. Expect few results: a favorite is usually a show you already hold. |
| TheTVDB subscriber PIN | Optional. Only needed to read your TheTVDB account (the favorites); the episode cross-check works without it. |
| JustWatch token | Enables your own JustWatch watchlist (and, optionally, your likes) as a discovery source. JustWatch issues no api keys, so this is the bearer token from a signed-in browser session, and it expires. |
Off by default, the plugin can mint pathless "virtual" placeholder items so a gap renders greyed-out in place. It is a stand-in for proper server support: the server does not reconcile or garbage-collect these, so the plugin does it itself, and everything minted is tagged and fully reversible.
Minting is driven from the report, one gap at a time: each movie row has a Mint button, and you can checkbox several rows and Mint selected. Both run in the background with progress. A collection gap mints into its BoxSet; anything else mints into a catch-all "Mind the Gaps (minted)" collection, and a filmography gap also attaches the person so it shows on that person's page. Every minted item queues a metadata refresh, and at the end of every scan a reconcile pass drops any minted movie the library now owns for real. The settings page keeps only Remove minted movies (with a dry-run preview) to undo everything at once. Missing episodes are not minted here: the server already synthesizes those.
Mind the Gaps is self-contained, so it does not depend on any other plugin and will not clash with them. Its links are still extensible without any setup: it folds in whatever your server's own link providers emit, so TMDB and IMDb links come from core, and a JustWatch link lights up automatically if the separate Jellyfin.Plugin.JustWatch is installed. For the architecture behind this, see CONTRIBUTING.
Every outbound link in the report (the per-row provider links, the links on a creator or set group header, and the ids in the Diagnose popup) is tagged so a stylesheet can target a specific service, for example to inject a service icon. Each link carries:
cgProvider-<service>, with the service name lowercased and stripped to letters
and digits: cgProvider-tmdb, cgProvider-imdb, cgProvider-thetvdb, cgProvider-tvmaze,
cgProvider-trakt, cgProvider-musicbrainz, cgProvider-discogs, cgProvider-openlibrary,
cgProvider-justwatch;data-provider attribute with the original service name (data-provider="TheTVDB"), for attribute
selectors.Drop CSS into your server via the community Custom CSS or File Transformation plugins (this plugin ships no CSS or icons itself).
Here is a ready-to-paste snippet using Simple Icons (CC0), pulled from their CDN at display time and masked to each link's text color, so the icons match your theme and recolor on hover. Simple Icons carries TMDB, IMDb, Trakt, MusicBrainz, and Discogs; it does not carry TheTVDB, TVmaze, OpenLibrary, or JustWatch, so those are left for you to point at your own hosted SVG.
/* Mind the Gaps: provider icons. Paste into your custom CSS. */
.cgProvider-tmdb::before,
.cgProvider-imdb::before,
.cgProvider-trakt::before,
.cgProvider-musicbrainz::before,
.cgProvider-discogs::before {
content: "";
display: inline-block;
width: 1em;
height: 1em;
margin-right: .35em;
vertical-align: text-bottom;
background-color: currentColor;
-webkit-mask: var(--mtg-icon) center / contain no-repeat;
mask: var(--mtg-icon) center / contain no-repeat;
}
.cgProvider-tmdb { --mtg-icon: url("https://cdn.simpleicons.org/themoviedatabase"); }
.cgProvider-imdb { --mtg-icon: url("https://cdn.simpleicons.org/imdb"); }
.cgProvider-trakt { --mtg-icon: url("https://cdn.simpleicons.org/trakt"); }
.cgProvider-musicbrainz { --mtg-icon: url("https://cdn.simpleicons.org/musicbrainz"); }
.cgProvider-discogs { --mtg-icon: url("https://cdn.simpleicons.org/discogs"); }
/* Not in Simple Icons. To add one, list its ::before in the rule above and host your own SVG, e.g.:
.cgProvider-thetvdb { --mtg-icon: url("/path/to/thetvdb.svg"); } */
The icons load from the Simple Icons CDN; self-host the SVGs instead if you prefer no external request. The logos are trademarks of their respective services, so this is your choice to display them. These class and attribute names are a stable contract; the link text and layout around them are not.
To go icon-only (hide the text label, show just the icon), add this alongside the snippet above:
.cgProvider-tmdb,
.cgProvider-imdb,
.cgProvider-trakt,
.cgProvider-musicbrainz,
.cgProvider-discogs {
font-size: 0; /* collapses the text label */
}
.cgProvider-tmdb::before,
.cgProvider-imdb::before,
.cgProvider-trakt::before,
.cgProvider-musicbrainz::before,
.cgProvider-discogs::before {
font-size: 1rem; /* the icon is sized in em, so give it a real size again */
margin-right: 0;
vertical-align: middle;
}
Each link carries a title and an aria-label (for example "Open on TheTVDB"), so it stays labeled for
tooltips and screen readers even when shown icon-only.
Bug reports, ideas, and pull requests are welcome. See CONTRIBUTING for how to build, test, release, and find your way around the code.
MIT. See LICENSE.
C#
80.4%
JavaScript
14.8%
HTML
4.0%