Emby subtitles out of sync? Fix drift with release matching and a sync check

Most Romanian subtitles drift in Emby because they were made for a different release. Here is how Rosub's release matching and ffprobe sync check fix a constant offset, using your own free API keys.

Why subtitles drift in the first place

If you have ever searched "emby subtitles out of sync", you already know the symptom: the first line lands roughly on time, then the gap slowly grows until the dialogue is a few seconds off. The usual cause is not a broken subtitle file. It is a subtitle made for a different release of the same title. A WEB-DL, a BluRay and an HDTV rip of one movie are rarely identical: different sources, different cuts, sometimes different frame rates. A subtitle timed for one of them will not sit correctly on another.

Rosub is an Emby plugin that fetches Romanian subtitles from subs.ro and OpenSubtitles and picks the subtitle made for the same release name as your file. It then runs a sync check with ffprobe that compares subtitle timing against the video and corrects a constant offset. You bring your own API keys (both providers have free tiers), and the plugin never ships shared keys.

This tutorial is written for self-hosters running Emby at home, including Romanian viewers in Germany, France, Spain and Italy who keep a library of Romanian subs next to their media. The steps follow the Rosub product page and the user guide.

Prerequisites

  • Emby Server 4.10.1 or newer.
  • ffprobe available to Emby. It is bundled with Emby on most installs; the sync check depends on it.
  • A subs.ro account and/or an OpenSubtitles account, so you can create your own API keys.
  • A little patience with the backlog: new items are processed first, then the rest of the library.

Step 1 — Get your own free API keys

Both providers have free tiers, and Rosub uses your keys only:

  1. Create a subs.ro account and generate an API key. The free tier is 300 requests/day.
  2. Optionally create an opensubtitles.com account and generate an API key. The free tier is 5 downloads/24 h.

Keep both keys somewhere safe. You will paste them into the plugin in the next step. Because the keys are yours, quotas are tracked per key and you are not competing with anyone else's usage.

Step 2 — Install Rosub in Emby

  1. Sign in to your MediaLab Works account, open Licenses and download the plugin DLL. It is available on an active subscription, a lifetime license within its update window, or during the free 30-day trial.
  2. Copy the DLL into the Emby plugins folder and restart Emby Server:
    • Linux (package): /var/lib/emby/plugins/
    • Docker: the plugins folder inside your Emby config volume
    • Windows: %AppData%\Emby-Server\programdata\plugins\
  3. Open Emby Dashboard → Plugins, click the plugin, paste your license key and save. The plugin contacts the license server, binds the key to this Emby server and shows the license as Active.

The license is checked once a day and at every Emby start. Without internet the plugin keeps working for 7 days after the last successful check. If the license is not valid, automatic tasks stop, but subtitles already downloaded stay next to your files and everything resumes once the license is valid again.

Step 3 — Configure keys, libraries and the priority queue

Open Dashboard → Plugins → Rosub and fill in the settings:

Setting What to do
subs.ro API key Paste the key from your subs.ro account.
OpenSubtitles API key Paste the key from opensubtitles.com. Optional, but useful as a second source.
Libraries Select which Emby libraries to watch.
Automatic download On by default. New items are processed first, then the backlog.
Sync check Uses ffprobe to detect a constant offset and fix it.
Overwrite existing Off by default; existing Romanian subtitles are kept.

That priority queue is the reason a freshly added episode gets its subtitle within minutes, while the older backlog is worked through in the background. Leave Overwrite existing off unless you deliberately want to replace files you already have.

The plugin page shows the queue, recent downloads and errors (for example a provider daily limit reached), so it is the first place to look when something seems stuck.

Step 4 — How release matching picks the right subtitle

When Rosub looks for a subtitle, it uses the release name of your file to find the subtitle made for the same release group and source. A subtitle tagged for a WEB-DL will not be chosen for a BluRay file if a matching one exists, because the timing would not fit. This is the single most effective fix for drift: the right subtitle for the right release.

A practical consequence: keep your file names informative. If your file is named after the original release, matching has something to work with. If it has been renamed into something generic, the plugin may not find a good match — the guide's own troubleshooting advice is that renaming to the original release name helps matching.

Step 5 — The sync check: what it fixes and what it cannot

With Sync check enabled, Rosub uses ffprobe to compare the subtitle timing against the video and corrects a constant offset. That is exactly the drift pattern where the whole subtitle is uniformly early or late: one correction and everything lines up.

What it cannot fix is a subtitle that was cut for a different edit of the film, where the offset changes partway through. In that case the honest answer is a different subtitle file: search manually for one that matches your release.

Step 6 — Manual search and Romanian diacritics

Sometimes you want a different subtitle, or the automatic pass found nothing you like. Open the item in Emby, go to Edit subtitles → Search, and pick a Rosub result. The manual search runs from the server, so it uses the same keys and quotas as the automatic tasks.

Subtitles are stored as ordinary external files named <video>.ro.srt next to the video, which is why they show up in any client that displays external subtitles — in production Emby lists them as "Romanian (SRT)". Because they are plain UTF-8 .srt files, the Romanian ș/ț diacritics render correctly as long as your player uses UTF-8, which modern clients do. If you ever see garbled characters, check the file encoding rather than the plugin.

Tips and troubleshooting

  • No subtitle found. Check the release name of your file; renaming to the original release name helps matching. Also confirm the right libraries are selected.
  • Still out of sync. Enable the sync check, or search manually for a subtitle matching your release. Remember that a constant offset is fixable; a different cut is not.
  • Provider limit reached. Both providers have daily limits per key (subs.ro 250 and OpenSubtitles 5 requests by default in the plugin's daily budgets), and the queue resumes the next day. Check the plugin page for the error.
  • Subtitles not showing on TV. The files are ordinary .srt files next to the video. If one client does not show them, check that the file exists with the .ro.srt suffix and that the client displays external subtitles. Individual native apps are not tested per the compatibility notes.
  • Privacy check. subs.ro receives only the IMDb or TMDb id and the language — no titles, file names, release names or hashes. OpenSubtitles receives languages, the id (or series id plus season/episode) and the OpenSubtitles hash computed locally from file size and the first/last 64 KB; content is never sent. Sync checking and release matching run locally with ffprobe.
  • Keys at rest. Your subs.ro key, OpenSubtitles key and OpenSubtitles password are stored encrypted in secrets.enc.json in the plugin data folder (AES-256-GCM, key bound to the server id, files mode 600) and never sent to the browser.
  • Series work too. Rosub handles movies and series; new items are processed first, then the rest of the library.
  • Not on Jellyfin or Plex. Rosub is an Emby plugin. For Jellyfin there is a separate plugin, Rosub for Jellyfin; there is no Plex version.

Conclusion

Drift is almost always a release mismatch, not a bad subtitle. With Rosub you get release-name matching to pick the right file, an ffprobe sync check to correct a constant offset, and your own free API keys so quotas stay under your control. Install it, set the libraries and the priority queue, and let the backlog clear itself.

Start on the Rosub product page, follow the user guide for the exact settings, and check the changelog for updates. More self-hosting material is in our knowledge base, and you can reach us via contact or the FAQ.

This post was written with AI assistance from our product documentation or the sources listed and checked automatically before publication.

Read next

Running Emby, Jellyfin or Nextcloud?

Our plugins and apps add Live TV, subtitles, sign-up and security to your own server, with a free trial.