Plex / Kodi / Emby / Jellyfin Naming Schemes

All about user-defined episode / movie / file name format expressions
Locked
User avatar
rednoah
The Source
Posts: 23529
Joined: 16 Nov 2011, 08:59
Location: Taipei
Contact:

Plex / Kodi / Emby / Jellyfin Naming Schemes

Post by rednoah »

⭑⭑ General Advice: If are organizing files for Plex, then you must pick a database and episode order first (i.e. TheMovieDB::TV with Airdate Order is recommended) and then stick to that no matter what in both FileBot and Plex. DO NOT mix databases and episode orders within the same Plex library folder. ⭑⭑


⭑⭑ The {plex} binding manual applies equally to the {kodi} and {emby} and {jellyfin} bindings as well. ⭑⭑



Plex Naming Standard

:idea: Plex has strict standards for naming and organizing your media files. Please read How do I organize files for Plex? for details.

The {plex} binding gives you the appropriate Plex path for movies and TV episodes:

Format: Select all

{ plex }

Code: Select all

Movies/Avatar (2009)/Avatar (2009)
TV Shows/Alias/Season 01/Alias - S01E01 - Truth Be Told

The {plex.id} binding additionally appends the numeric ID to the movie / series folder name to guarantee and speedup movie / series detection:

Format: Select all

{ plex.id }

Code: Select all

TV Shows/Alias {tmdb-2046}/Season 01/Alias - S01E01 - Truth Be Told
Movies/Avatar (2009) {tmdb-19995}/Avatar (2009)
:idea: Make sure to Disable Local Media Assets for all your media libraries to make Plex not give preference to the embedded media title.

Screenshot


:idea: You can reuse some path components and omit others. {plex.name} and {plex.tail} are particularly useful if you want to rename files in place or if you want the {plex} path but without the top-level Movies or TV Shows folder.

e.g. Avatar (2009)

Format: Select all

{ plex.name }
e.g. Firefly/Season 01/Firefly - S01E01 - Serenity

Format: Select all

{ plex.tail }
e.g. Firefly/Firefly - S01E01 - Serenity

Format: Select all

{ plex.tail.root } / { plex.name }

e.g. Movies/Avatar (2009)/Avatar (2009) {imdb-tt0499549}

Format: Select all

{ plex.derive{ " {imdb-$imdbid}" } }
e.g. Movies/Avatar (2009)/Avatar (2009) {tmdb-19995}

Format: Select all

{ plex.derive{ " {tmdb-$id}" } }
e.g. Avatar (2009) by James Cameron [720p, x264, AC3].eng

Format: Select all

{ plex.derive{ " by $director" }{ " [$vf, $vc, $ac]" }.name }
:idea: plex.derive() can be used to insert additional information after the file name but before the subtitle language suffix and file extension.



Advanced {plex} operators

~ ... remove the leading Movies and TV Shows category folder level
% ... append values to the file name (but before the part index and subtitle language suffix)
* ... append values to the movie / series folder name
** ... append values to both the file name and the movie / series folder name
<< ... append values to the season folder name
>> ... inject subcategory folder level after the category folder level (but before the movie / series folder level)
^ ... replace subtitle language suffix
id ... add {id-123} tags to the movie folder name / series folder name
year ... {plex} path with Name (Year) pattern for series folder and series name
unix ... {plex} path without file name validation (i.e. allow : colon and ? question mark in file paths)


e.g. Avatar (2009)/Avatar (2009)

Format: Select all

{ ~plex }
e.g. Avatar (2009) {tmdb-19995}/Avatar (2009)

Format: Select all

{ ~plex.id }
e.g. Avatar (2009) {tmdb-19995} {edition-Extended Edition}/Avatar (2009) {edition-Extended Edition}
Multiple Editions

Format: Select all

{ ~plex.id ** { " {edition-$edition}" } }
e.g. Avatar (2009) {tmdb-19995}/Avatar (2009) {edition-Extended Edition} [720p, x264, AAC]

Format: Select all

{ ~plex.id % { " {edition-$edition}" } % { " [$vf, $vc, $ac]" } }
e.g. Avatar (2009) [M19995]/Avatar (2009)

Format: Select all

{ ~plex * " [M$id]" }
e.g. Avatar (2009) [M19995]/Avatar (2009) [M19995]

Format: Select all

{ ~plex ** " [M$id]" }
e.g. Firefly/Season 01 [2002-2003]/Firefly - S01E01 - Serenity

Format: Select all

{ ~plex << sy.bounds().joining('-', ' [', ']') }
e.g. Avatar (2009)/Avatar (2009).en

Format: Select all

{ ~plex ^ { '.'+lang.ISO2 } }
e.g. Movies/Avatar (2009)/Avatar (2009) (i.e. {plex} without subtitle language suffix)

Format: Select all

{ plex ^ null }
e.g. Movies/A/Æon Flux (2005)/Æon Flux (2005)

Format: Select all

{ plex >> az }
e.g. A/AEon Flux (2005)/AEon Flux (2005)

Format: Select all

{ (~plex >> az).ascii() }
e.g. Movies/James Bond Collection/GoldenEye (1995) {tmdb-710}/GoldenEye (1995) {edition-Extended Edition}

Format: Select all

{ plex.id % { " {edition-$edition}" } >> { collection } }



Kodi Naming Standard

The {kodi} binding and the {plex} binding work exactly the same, with slightly different implementation details, e.g. SxE formatting and multi-episode formatting.

e.g. TV Shows/Alias (2001) {tmdb=2046}/Season 1/Alias (2001) - 1x01 - Truth Be Told

Format: Select all

{ kodi.id }


Emby Naming Standard

The {emby} binding and the {plex} binding work exactly the same, with slightly different implementation details, e.g. series name and series folder formatting and [tmdbid=12345] ID tag formatting.

e.g. TV Shows/Alias (2001) [tmdbid=2046]/Season 01/Alias (2001) - S01E01 - Truth Be Told

Format: Select all

{ emby.id }


Jellyfin Naming Standard

The {jellyfin} binding and the {plex} binding work exactly the same, with slightly different implementation details, e.g. series name and series folder formatting and [tmdbid-12345] ID tag formatting.

e.g. TV Shows/Alias (2001) [tmdbid-2046]/Season 01/Alias (2001) - S01E01 - Truth Be Told

Format: Select all

{ jellyfin.id }



Custom Naming Scheme

If you need to make very specific customizations to the standard Plex naming scheme, you'll want you write your own format expression so you have full control over all the bits and pieces. You can get started by copying the following examples and modifying them to your liking.

Movies

Format: Select all

Movies/{n} ({y})/{n} ({y}){' CD'+pi}{'.'+lang}
TV Series

Format: Select all

TV Shows/{n}/{episode.special ? 'Specials' : 'Season '+s.pad(2)}/{n} - {episode.special ? 'S00E'+special.pad(2) : s00e00} - {t.replaceAll(/[`´‘’ʻ]/, /'/).replaceAll(/[!?.]+$/).replacePart(', Part $1')}{'.'+lang}
Anime

Format: Select all

Anime/{primaryTitle}/{primaryTitle} - {sxe} - {t.replaceAll(/[!?.]+$/).replaceAll(/[`´‘’ʻ]/, /'/).replacePart(', Part $1')}
Music

Format: Select all

Music/{n}/{album+'/'}{pi.pad(2)+'. '}{artist} - {t}
:idea: Please read the FAQ and How to Request Help.
Locked