AISub for Jellyfin — guide
Installation
You need Jellyfin Server 12.2 or newer and a MediaLab Works account with a license that covers the plugin (an active subscription, a lifetime license within its update window, the Jellyfin bundle or the free 30-day trial).
From your plugin repository (recommended). Jellyfin then installs and updates the plugin by itself.
- In your MediaLab Works account open Licenses → Jellyfin plugin repository and click Create address. Copy it: it is private (it contains a token), so do not share it; you can regenerate or revoke it at any time.
- In Jellyfin open Dashboard → Plugins → Repositories, click +, give it a name (for example MediaLab Works), paste the address and save.
- In Dashboard → Plugins → Catalog find AISub by MediaLab, click Install, then restart Jellyfin.
The repository lists only the plugins your licenses cover, and only the versions they allow. Its download links are signed and expire after a few hours, so Jellyfin always reads a fresh list.
From the public catalog. https://medialab.works/jellyfin/manifest.json lists every released MediaLab Works plugin with its public build; medialab Server adds it by itself. You can add it the same way to install a plugin before you have a key: the plugin then asks for the license, or starts the trial, on its License page. With a lifetime license whose update window has ended, keep to your private repository, which offers only the versions your license allows.
Manually, from a zip file.
- In Account → Licenses download
jf-aisub_x.y.z.zip(the SHA-256 of the file is shown next to the button). - Extract it into a new folder
AISub by MediaLab_x.y.z.0inside the Jellyfin plugins folder:- Linux (package):
/var/lib/jellyfin/plugins/ - Docker (official image):
/config/plugins/in the config volume - Windows:
%ProgramData%\Jellyfin\Server\plugins\
- Linux (package):
- Restart Jellyfin.
License activation
- Open the plugin page in Dashboard → Plugins → AISub by MediaLab and click License.
- Paste your license key and click Activate with key. The plugin contacts the license server, binds the key to this Jellyfin server and shows the license as Active.
- No key yet? On the same page enter your e-mail and start the 30-day free trial (card needed, nothing to pay today) or buy a license; the plugin activates itself when the payment is done.
The license is checked once a day and at every Jellyfin start. Without internet the plugin keeps working for 7 days after the last successful check. Without a valid license the plugin stops its work and only its License page keeps working (trial, key, renewal); nothing is deleted, and everything resumes as soon as the license is valid again. Move license (release this server) on the same page frees the key for another server.
Updates and rollback
- From the repository: Jellyfin shows new versions in Dashboard → Plugins and can update the plugin automatically; restart Jellyfin to load the new version.
- From the plugin's License page: with a valid license, Install update installs the newest version your license allows and Roll back to x.y.z goes back to the previous version (for example if something stopped working after an update). Restart Jellyfin after either. Both packages are checked against the checksum published by the license server.
- A lifetime license receives the versions released during its update window; after it, the plugin keeps working on the last version it may use.
- After a rollback, if your plugin repository is added in Jellyfin, Jellyfin's scheduled task Update Plugins (at start-up and daily) installs the newest version again. To stay on the previous version for a while, remove the triggers of that task in Dashboard → Scheduled Tasks and add them back later.
Source code
The GPL-3.0 source code of each version is in Account → Licenses (Source code), next to the download, as a .tar.gz archive made from the exact commit of that version.
Configuration
Open AISub in the Jellyfin dashboard menu. The page has four tabs: Overview, Jobs, Providers and Settings.
- Providers: add the keys for the providers you want to use. They are stored on your server, in a separate file readable only by the Jellyfin service account, and are sent only to their own provider; the page shows only their last 4 characters. Test translation and Test transcription key check the keys.
- Translation: an Anthropic key (Claude Haiku by default, Claude Sonnet for top quality), or the address of an OpenAI-compatible server: LM Studio (turn on "Serve on Local Network", port 1234), Ollama (port 11434), or an online one such as OpenRouter or DeepSeek (with its API key). Find models lists the models the server offers.
- Transcription (for titles without any subtitle): a Groq key (Whisper large-v3-turbo, the default, or Whisper large-v3) or an OpenAI key (Whisper). In 0.1.0 a local server cannot transcribe.
- Settings:
- Languages to generate: check the languages you want and put them in order of priority (the order decides which language reaches the budget first).
- Generate automatically and Which titles: only the titles added from now on, or also the existing library (every night, capped).
- Preferred source language for translation, when a title has several subtitles.
- Only when there is no human subtitle in the wanted language (on by default).
- Remove hearing-impaired cues ([door slams], NAME:) when translating.
- Maximum cost per title and per month (USD).
- With Rosub (optional, recommended): the plugin page shows whether Rosub is linked. AISub then generates only the languages Rosub searched for and did not find, so you pay only for what is really missing.
Daily use
- New movies and episodes are processed when they arrive: with Rosub, after Rosub has searched for the language; without Rosub, a few minutes after they are added.
- The scheduled task Missing AI subtitles (AISub) (daily, at 5:00 by default; Dashboard → Scheduled Tasks) goes through the rest of the library, with a cap on the number of jobs per night.
- The Jobs tab shows the queue, the progress and the cost of each job, and this month's spending. From there you can also generate for one title (optionally even if it already has a subtitle) or stop the current job.
- The typical cost for a 2-hour film, shown on the plugin page at the providers' rates, is about $0.08 to translate with Claude Haiku and about $0.08 to transcribe with Groq Whisper large-v3-turbo; with a local AI server translation costs nothing.
- When there is no subtitle to translate, AISub transcribes the audio once and reuses that transcription for all your target languages.
- Each translation is done in batches with context, and every cue is checked, so the text stays on the right line and in sync with the original.
- The result is saved next to the video as
Name.language.srtand Jellyfin refreshes the title. With Rosub, the AI subtitle is registered as provisional and the first subtitle made by a person replaces it automatically.
What it sends where
- Subtitle text, in batches of cues, to the translation provider you chose, with one line of context about the title (name, year, up to 4 genres, overview of at most 400 characters).
- For transcription, the film's audio track (mono, compressed, in chunks) to Groq or OpenAI, with the language and the title's name. The video picture is never sent.
- Nothing goes to medialab.works except the license check.
Troubleshooting
- Titles without any subtitle get no AI subtitle: transcription needs a Groq or OpenAI key; in 0.1.0 a local server only translates.
- LM Studio cannot be reached: turn on "Serve on Local Network" in LM Studio, so the Jellyfin server can connect to it.
- "The monthly cap has been reached": raise the monthly cap in Settings, or wait for the next month.
- A job is skipped with "Rosub has not finished searching this language yet": it resumes by itself when Rosub finishes.