Skip to main content

Integrating Plex, Jellyfin & Emby

Level: πŸ”΅ Intermediate Β· Time: ~30 minutes

Two separate things live behind the words "media server integration", and it is worth knowing which one you are setting up:

Media-server refreshMedia Server Analytics
WhatUltraTorrent tells your server "rescan, there is new media".UltraTorrent reads your server: who is watching what, history, recently added, reports, newsletters.
WhereMedia Management β†’ Media Settings (/media/settings)Media Server Analytics β†’ Server Connections (/media-server-analytics/connections)
WhyNew downloads appear in Plex without you clicking Scan.You get Tautulli-style insight into your server.

Both are built on the same provider layer and the same encrypted-connection model. Set up the first; the second is a bonus you should not skip.

Overview​

Purpose​

By the end:

  • New media appears in your server automatically, correctly named, with a poster.
  • You can see who is watching what, right now.
  • You have watch history, reports and (optionally) newsletters.

When to use this tutorial​

Use it when…Use something else when…
Your server does not see new downloads.Your downloads are not being renamed at all β†’ Building a movie library.
You want watch analytics.You want to acquire media β†’ Smart RSS rules.

Prerequisites​

  • A working library whose items are renamed and identified β€” see Building a movie library. Do that first; there is no point refreshing a server at a folder full of scene names.
  • A running Plex / Jellyfin / Emby / Kodi that can see the same files.
  • Its base URL and an auth token.
  • Permissions: media_manager.manage_integrations; for analytics, media_server_analytics.view and media_server_analytics.manage_connections.
Both sides must see the same files, at paths each understands

UltraTorrent writes to (say) /downloads/movies inside its container. Your Plex container must have the same media mounted, and Plex's library must point at Plex's path for it.

They do not have to be the same string β€” but they must be the same files. If Plex's library points somewhere else entirely, a refresh will do exactly nothing and you will blame the integration.

Concepts​

TermMeaning
Media server providerThe abstraction behind Plex/Jellyfin/Emby/Kodi. Business logic never touches a vendor client.
Capability setWhat a given server can actually serve: libraries, recentlyAdded, sessions, watchHistory, refresh.
RefreshUltraTorrent pushing "rescan this library" to the server.
ConnectionA stored server: name, type, base URL, encrypted token, enabled/default flags, health, version, platform, capabilities.

What each server can do​

ServerAuthCapabilities
PlexX-Plex-TokenFull capability set
JellyfinX-Emby-TokenFull capability set
EmbyX-Emby-TokenFull capability set
KodiJSON-RPC (optional basic auth)A client library β€” no section list, no sessions. Declares those capabilities false.
Capabilities degrade gracefully, not noisily

A capability a provider genuinely cannot serve returns a clean, typed "not supported" result rather than a generic failure. Kodi will not pretend to have sessions. Analytics simply shows less for that server.


Step-by-step​

Step 1 β€” Get your server's base URL and token​

ServerBase URLToken
Plexhttp://plex:32400 (container) or http://192.168.1.x:32400An X-Plex-Token.
Jellyfinhttp://jellyfin:8096An API key from Jellyfin's Dashboard β†’ API Keys.
Embyhttp://emby:8096An API key from Emby's dashboard.
Kodihttp://kodi:8080/jsonrpcOptional basic auth.
localhost will not work

From inside the UltraTorrent backend container, localhost is the backend. Use the container name (if they share a Docker network) or the host's LAN IP.

Expected result: a base URL and a token you can paste.


Step 2 β€” Add the connection for post-download refreshes​

Go to Media Management β†’ Media Settings (/media/settings). This page hosts Metadata Providers, Artwork, Subtitle preferences, NFO tooling and Media Server Integrations.

Add your server: kind, base URL, token.

Test the connection.

Your token is encrypted at rest

Integration secrets β€” media-server tokens, keys and passwords β€” are AES-GCM encrypted at rest and redacted in API responses. They are never logged and never returned to the browser.

Expected result: a successful test, and the connection saved.

Media server integration configured in Media Settings


Step 3 β€” Make sure your server's library points at the right place​

Open your media server (not UltraTorrent) and check that the library points at the same media UltraTorrent is writing.

If UltraTorrent's Movies library is /downloads/movies and its container shares a volume with Plex mounted at /media/movies, then Plex's Movies library must point at /media/movies.

Expected result: browsing the server's library shows the files UltraTorrent renamed.


Step 4 β€” Trigger it, and watch the refresh happen​

Download something into a library root (or re-run a scan + rename).

The post-download pipeline ends with a media-server refresh:

Expected result: the new item appears in your server within a minute or two, correctly named, with a poster.

A refresh failure is a trigger, not a dead end

media.server_refresh_failed is an automation trigger. Build a rule on it β€” a webhook, say β€” otherwise a silently broken integration can go unnoticed for weeks.


Step 5 β€” Turn on Media Server Analytics​

Now the second half.

Go to Media Server Analytics β†’ Server Connections (/media-server-analytics/connections) and add your server here too.

  • Unlimited connections, including multiple of the same type β€” e.g. "Plex Home" and "Plex Remote".
  • Each stores name, type, base URL, encrypted token, enabled + default flags, health status, server version, platform, capabilities and notes.
  • Click Test β€” it probes the server and persists its health, version, platform and capabilities.

Expected result: the connection shows healthy, with a detected version and a capability set.

Media server connections with health and capabilities


Step 6 β€” Explore what analytics gives you​

PageRouteShows
Analytics Dashboard/media-server-analyticsServer counts, health, connection summaries.
Live Activity/media-server-analytics/liveCurrent now-playing sessions. Polled every 30 seconds; you can also reconcile on demand.
Watch History/media-server-analytics/watch-historyCompleted playback.
Recently Added/media-server-analytics/recently-addedWhat has landed lately.
Analytics Reports/media-server-analytics/reportsUsage reporting.
Newsletters/media-server-analytics/newsletters"Here's what's new" digests.
Import Analytics/media-server-analytics/importHistorical analytics import.
Tautulli import is a later phase

Tautulli is not a media server β€” it is a historical analytics/newsletter import source, behind a separate import-provider abstraction. The import itself lands in a later phase; do not plan a migration around it yet.

Expected result: Live Activity shows a session when you press play on your server.

Live activity showing a now-playing session

Watch this tutorial

Video coming soon.


Examples​

Two Plex servers, one UltraTorrent​

ConnectionTypeBase URLDefault
Plex Homeplexhttp://plex:32400βœ…
Plex Remoteplexhttps://plex.example.com

Multiple connections of the same type are explicitly supported.

The two integrations, side by side​

Media Settings (/media/settings)Analytics (/media-server-analytics/connections)
DirectionPush β€” refresh after importPull β€” read sessions and history
Needed forNew media appearing automaticallyLive activity, history, reports, newsletters
Set up first?βœ… YesAfterwards

Troubleshooting​

SymptomCauseFix
Test fails: connection refusedWrong host. localhost from inside the backend container is the backend.Use the container name or the LAN IP.
Test fails: unauthorizedBad or expired token.Regenerate it in the server's own UI.
Refresh "succeeds" but nothing appearsYour server's library points at different files.Make the server's library path resolve to the same media.
Items appear with wrong titlesThe files are badly named β€” this is not a server problem.Fix identification and renaming β†’ Building a movie library.
Posters missing in PlexNo artwork fetched, or Plex is using its own agent.Configure a metadata/artwork provider in /media/settings; check Plex's agent settings.
Kodi shows no sessionsCorrect. Kodi is a client library β€” it declares sessions and section-list as unsupported.Nothing to fix. Use Plex/Jellyfin/Emby for session analytics.
Live Activity is emptyNothing is playing, or the server does not support sessions.Press play. Check the connection's capability badges.
Refresh silently stopped workingToken rotated, or the server moved.Re-test the connection, and check the connection's health on /media-server-analytics/connections.
Secrets look like β€’β€’β€’β€’β€’β€’Correct. They are encrypted at rest and redacted on read.Leave the field blank on edit to keep the stored value.

Tips​

Fix your naming before you blame your server

90% of "Plex shows the wrong thing" is a naming problem, not an integration problem. The library's preset (plex/jellyfin/emby/kodi) exists precisely to name files the way your server expects.

NFO sidecars help servers that read them

UltraTorrent generates Kodi-style movie/tvshow/season/episode NFO sidecars as the last enrichment stage, inside the hard roots only. Servers that read them get better metadata for free. Servers that ignore them are unharmed.

Do not point two writers at one library

If Plex's own agent is renaming/moving files while UltraTorrent's rename engine is also managing them, you will get a fight. Let UltraTorrent own the filesystem; let the server read it.

Analytics is capability-aware

Ask a server for something it cannot do and you get a clean "unsupported" answer, not an error. That is why Kodi appears with fewer panels rather than a broken one.


FAQ​

Do I need Plex at all? No. UltraTorrent's library is a filesystem; any server can read it. The integration just saves you clicking Scan.

Can I connect more than one server? Yes β€” unlimited connections, including several of the same type.

Does UltraTorrent replace Tautulli? Media Server Analytics covers live activity, watch history, recently-added, reports and newsletters. Tautulli import (bringing your historical data across) is behind a separate import-provider abstraction and lands in a later phase.

Is my Plex token safe? It is AES-256-GCM encrypted at rest, redacted in every API response, and never logged.

Why does Kodi show fewer features? Because it is a client library, not a server. It genuinely has no session list or library sections, and it declares those capabilities as false rather than pretending.

Will UltraTorrent delete things from my server? No. The integration pushes refreshes. Deletion of media files is a Media Manager action, permission-gated (media_manager.delete) and audited.


Checklist​

Verification​

  • My library is renamed and identified before I touched the integration.
  • My media server can see the same files.
  • A connection exists in Media Settings (/media/settings) and its Test passes.
  • A download into the library root caused the server to refresh on its own.
  • The new item appears in the server, correctly named, with a poster.
  • A connection exists in Server Connections (/media-server-analytics/connections), healthy, with a detected version and capabilities.
  • Live Activity shows a session when I press play.
  • Watch History is populating.

Expected results​

ScreenExpected
/media/settingsA media-server integration, Test OK
Your media serverNew items appearing without manual scans
/media-server-analytics/connectionsHealthy, with version + capabilities
/media-server-analytics/liveA session when something is playing

Next steps​

  1. Automating TV shows β€” fill the library that now refreshes itself.
  2. Media Server Analytics β€” the full module reference.

See also​