An Emby channel plugin for browsing YouTube content with the official YouTube Data API v3.
The plugin adds a YouTube entry to Emby and lets you browse saved channels, playlists, Watch Later-style playlists, trending videos, categories, and Shorts from one place.
- Add YouTube channels by
@handleor channel ID. - Add playlists as their own Emby folders.
- Add search folders for occasional YouTube searches.
- Create Watch Later-style folders from playlist IDs.
- Show Trending and category folders for a selected region.
- Split channels into Videos and Shorts when those folders have content.
- Hide Shorts globally if you prefer a long-form-only view.
- Hide empty playlists, categories, and Shorts folders.
- Optionally show YouTube root folders at the top level and, on Emby 4.10+, add one latest-videos home row per saved channel while reversibly hiding both forms of combined YouTube-latest row.
- Track estimated daily YouTube API quota usage.
- An Emby Server.
- A YouTube Data API v3 key from Google Cloud. The built-in Setup Guide walks you through creating one.
- .NET 8 SDK, only if you want to build the plugin from source.
The API key only needs access to public YouTube data. After installation, open the plugin settings and use the built-in Setup Guide to create and restrict the key.
- Download the latest
Emby.YouTubePlugin.dllrelease. - Copy the DLL into Emby's
programdata/pluginsfolder. - Restart Emby.
- Open the YouTube plugin settings.
- Use the Setup Guide tab to create a YouTube Data API v3 key.
- Paste the API key into the Settings tab.
- Add at least one channel, playlist, or search entry.
- Save the settings.
Useful Google Cloud pages:
- YouTube Data API v3: https://console.cloud.google.com/apis/library/youtube.googleapis.com
- Credentials: https://console.cloud.google.com/apis/credentials
The My YouTube Content field accepts:
@handle, for example@MrBeast- Channel IDs starting with
UC... - Playlist IDs starting with
PL... - Plain search text
Handles, channel IDs, and playlist IDs are the best options because they avoid the separate daily search.list limit. Plain search text works too, but each result page uses one Search Queries call.
The Watch Later Playlists field accepts playlist IDs. Each playlist becomes its own top-level folder and can be checked regularly for new videos.
Saved channels open in the cleanest layout the plugin can provide:
- If a channel only has normal videos, Emby opens the video list directly.
- If Shorts exist, the channel shows subfolders.
- Empty Shorts folders are hidden.
- Empty playlists and empty category folders are hidden.
By default, Emby shows one top-level YouTube entry and keeps saved channels inside it. Enable Show saved YouTube channels on Emby's home screen to expose the YouTube root folders at Emby's top level. On Emby 4.10 and newer, the same option also creates one latest-videos home row per saved channel for every user who can access YouTube. Playlists, searches, Trending, and Categories are not turned into home rows. Once all channel rows are confirmed, the option also hides mixed latest-video rows so the same videos are not shown again in one combined YouTube row.
After all per-channel rows have been created and confirmed, the plugin can temporarily remove the old combined Neueste YouTube-Videos row. This happens only when a fresh HomeSections read finds exactly one row with the verified legacy signature: an items section with no parent, Episode items sorted by DateCreated descending, and an excluded-folder set containing every current non-YouTube view (including Live TV when present) and no current YouTube channel root. Extra stale or no-longer-materialized exclusions are tolerated because they can only narrow the row. The stored name must match exactly; CustomName may be absent but must also match when present. The name alone is never sufficient, ambiguous matches are left unchanged, and resume rows such as YouTube weiterschauen are never touched. Before removal, the complete per-user section and its original position are saved durably. Turning the option off restores the exact original section id and uses Emby's optional move API to return it to the saved position. If a server lacks that move API, the restored row safely remains appended. If another similarly shaped aggregate row already exists, the plugin does not create a duplicate and retains the snapshot for a later safe restore.
Emby's standard latestmediablock can independently expand the top-level YouTube provider into another mixed row, usually named Latest YouTube or Neueste YouTube. While the option is enabled, the plugin keeps that block and all of its movie/TV expansions but adds only the YouTube provider id to its ExcludedFolders. A durable per-user journal records only ids actually added by the plugin. Turning the option off removes only those journalled ids, preserving user exclusions, concurrent edits, row order, movie/TV latest rows, and all continue-watching rows.
Emby 4.9 keeps only the top-level-folder behavior. Its API cannot write HomeSections, so it neither creates per-channel rows nor suppresses or restores the legacy combined row.
Shorts detection uses YouTube metadata such as tags, #shorts, and vertical player dimensions. It does not rely on video length alone, because many normal videos are short without being YouTube Shorts.
Most browsing uses low-cost YouTube API endpoints:
| Action | Endpoint | Typical cost |
|---|---|---|
| Channel uploads | playlistItems.list |
1 unit |
| Playlist videos | playlistItems.list |
1 unit |
| Video details | videos.list |
1 unit per batch |
| Categories | videoCategories.list |
1 unit |
| Search folders | search.list |
1 Search Queries call |
The plugin caches responses on disk. Search results are cached longer because
search.list has a separate default limit of 100 calls per day, while most
other endpoints share the regular 10,000-unit daily bucket.
- This plugin uses the official YouTube Data API v3.
- Playback stays on official YouTube watch/embed players. The plugin clears stale Emby audio-track selections so the YouTube player can choose the video's own source track, but YouTube's official IFrame API does not expose a command for selecting the "original" audio track. For signed-in YouTube players, add the languages you normally watch under YouTube's Preferred languages setting; YouTube then keeps original audio when it matches one of those languages.
- YouTube may serve ads in its official embedded player; the plugin does not suppress them. In Emby's server-loaded Windows WebView path, the YouTube controls remain available and the embedded player is removed deterministically when playback stops or ends, so it cannot remain over the next library item. If Chromium blocks the first unmuted autoplay attempt, that WebView path retries once muted; use the visible YouTube controls to restore sound. Bundled Theater/Xbox/Windows player code may not use this server-side compatibility path.
- The plugin does not download, expose, or pass through YouTube caption tracks. During plugin playback, the patched server web players keep the official YouTube IFrame caption module disabled, and Emby subtitle-selection commands cannot enable it. The native Emby Android app uses its own bundled player, which a server plugin cannot patch; use Emby Web or its PWA on Android when server-side caption suppression is required. YouTube's own Audio track menu is available only where the client exposes YouTube's controls.
- Private YouTube account data is not supported. Use playlists that your API key can read.
- If the settings page looks stale after an update, restart Emby and clear the browser cache for the Emby web app.
This project is licensed under the MIT License. See LICENSE for details.
This plugin is free and open-source, maintained with a lot of love in my spare time. If it brings value to your Emby setup, a small donation would mean the world to me.







