v1.15.0 update

master
meisnate12 2 years ago
parent f44159d1aa
commit 2b5b2c62d9

@ -0,0 +1,136 @@
You can have the script edit the metadata of Artists, Albums, and Tracks by adding them to the `metadata` mapping of a Metadata File.
An example of multiple metadata edits in a music library is below:
```yaml
metadata:
"Avatar: The Last Airbender":
sort_title: Avatar 01
seasons:
1:
title: "Book One: Water"
summary: >-
After a lapse of 100 years, the Avatar-spiritual master of the elements-has returned. And just in
the nick of time. The Four Nations (Water, Earth, Fire, and Air) have become unbalanced. The Fire
Nation wants to rule the world, and its first conquest will be the Northern Water Tribe. It's up to
a 12-year-old Airbender named Aang to find a way to stop it. Join Aang, Katara, Sokka, Momo, and
Appa as they head north on the adventure of a lifetime.
episodes:
1:
rating: 9.1
2:
title: "Book Two: Earth"
summary: >-
Avatar Aang continues his quest to master the four elements before the end of summer. Together with
Katara, Sokka, Momo, and Appa, he journeys across the Earth Kingdom in search of an Earthbending
mentor. Along the way, he confronts Princess Azula, treacherous daughter of Firelord Ozai and
sister to Prince Zuko. More powerful than her brother, Azula will stop nothing to defeat the Avatar.
But Aang and the gang find plenty of Earth Kingdom allies to help them along the way. From the swamps
of the South to the Earth King's palace, Avatar: Book 2 is an adventure like no other.
3:
title: "Book Three: Fire"
summary: >-
Having survived the terrible battle with Azula, Aang faces new challenges as he and his brave
friends secretly enter the Fire Nation. Their quest is to find and defeat Firelord Ozai. Along
the way, they discover that Ozai has plans of his own. The leader of the Fire Nation intends to
use the massive power of Sozin's comet to spread his dominion permanently across the four nations.
Short on time, Aang has a lot of bending to learn and no master to help him learn it. However, his
friends are there to help, and he finds unexpected allies deep in the heart of the Fire Nation. In
the spectacular four-part conclusion, Aang must fulfill his destiny and become a fully realized
Avatar, or watch the world go up in smoke.
episodes:
21:
summary: The Epic Series Final of Avatar The Last Airbender
"Avatar: The Legend of Korra":
sort_title: Avatar 02
alt_title: The Legend of Korra
original_title: The Legend of Korra
seasons:
1:
title: "Book One: Air"
2:
title: "Book Two: Spirits"
3:
title: "Book Three: Change"
4:
title: "Book Four: Balance"
```
## Artist
Each artist is defined by the mapping name which must be the same as the artist name in the library unless an `alt_title` is specified.
### Albums
To edit the metadata of a particular Album for an Artist use the `albums` attribute on its artist.
The mapping name is the album name.
### Tracks
To edit the metadata of a particular Track on an Album use the `tracks` attribute on its album.
The mapping name is the episode number in that season or the title of the episode.
## Metadata Edits
The available attributes for editing artists, albums, and tracks are as follows
### Special Attributes
| Name | Attribute | Allowed Values | Artists | Tracks | Tracks |
| :--- | :--- | :--- | :---: | :---: | :---: |
| Alternative Title | `alt_title` | Alternative title to look for | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Albums | `albums` | Mapping to define Albums | :heavy_check_mark: | :x: | :x: |
| Tracks | `tracks` | Mapping to define Tracks | :x: | :heavy_check_mark: | :x: |
* If you know of another Title your item might exist under, but you want it titled differently you can use `alt_title` to specify another title to look under and then be changed to the mapping name. For Example TMDb uses the name `The Legend of Korra`, but I want it as `Avatar: The Legend of Korra` (Which must be surrounded by quotes since it uses the character `:`):
```yaml
metadata:
"Avatar: The Legend of Korra":
alt_title: The Legend of Korra
```
This would change the name of the TMDb default `The Legend of Korra` to `Avatar: The Legend of Korra` and would not mess up any subsequent runs.
``
### General Attributes
| Name | Attribute | Allowed Values | Artists | Tracks | Tracks |
| :--- | :--- | :--- | :---: | :---: | :---: |
| Sort Title | `sort_title` | Text to change Sort Title | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Rating | `rating` | Number to change Rating | :x:| :heavy_check_mark: | :heavy_check_mark: |
| Originally Available | `originally_available` | Date to change Originally Available<br>**Format:** YYYY-MM-DD | :x: | :heavy_check_mark: | :x: |
| Record Label | `record_label` | Text to change Record Label | :x: | :heavy_check_mark: | :x: |
| Summary | `summary` | Text to change Summary | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Track | `track` | Text to change Track | :x: | :x: | :heavy_check_mark: |
| Disc | `disc` | Text to change Disc | :x: | :x: | :heavy_check_mark: |
| Original Artist | `original_artist` | Text to change Original Artist | :x: | :x: | :heavy_check_mark: |
### Tag Attributes
You can add `.remove` to any tag attribute to only remove those tags i.e. `genre.remove`.
You can add `.sync` to any tag attribute to sync all tags vs just appending the new ones i.e. `genre.sync`.
| Name | Attribute | Allowed Values | Artists | Tracks | Tracks |
| :--- | :--- | :--- | :---: | :---: | :---: |
| Genre | `genre` | List or comma-separated text of each Genre Tag | :heavy_check_mark: | :heavy_check_mark: | :x: |
| Collection | `collection` | List or comma-separated text of each Collection Tag | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Label | `label` | List or comma-separated text of each Label Tag | :x: | :heavy_check_mark: | :x: |
| Style | `style` | List or comma-separated text of each Style Tag | :heavy_check_mark: | :heavy_check_mark: | :x: |
| Mood | `mood` | List or comma-separated text of each Mood Tag | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Country | `country` | List or comma-separated text of each Country Tag | :heavy_check_mark: | :x: | :x: |
| Similar Artist | `similar_artist` | List or comma-separated text of each Similar Artist Tag | :heavy_check_mark: | :x: | :x: |
## Image Attributes
| Name | Attribute | Description | Allowed Values | Artists | Tracks | Tracks |
| :--- | :--- | :--- | :--- | :---: | :---: | :---: |
| URL Poster | `url_poster` | Used to change the item's poster to the URL | URL of image publicly available on the internet | :heavy_check_mark: | :heavy_check_mark: | :x: |
| File Poster | `file_poster` | Used to change the item's poster to the image in the file system | Path to image in the file system | :heavy_check_mark: | :heavy_check_mark: | :x: |
| URL Background | `url_background` | Use to change the item's background to the URL | URL of image publicly available on the internet | :heavy_check_mark: | :heavy_check_mark: | :x: |
| File Background | `file_background` | Used to change the item's background to the image in the file system | Path to image in the file system | :heavy_check_mark: | :heavy_check_mark: | :x: |
### Advance Attributes
All these attributes only work with Artists.
| Name | Attribute | Allowed Values |
| :--- | :--- | :--- |
| Album Sorting | `album_sorting` | `default`: Library default<br>`oldest`: Oldest first<br>`newest`: Newest first<br>`name`: Alphabetical |

@ -1,122 +0,0 @@
A simple `Dockerfile` is available in this repo if you'd like to build it yourself. The official build is also available from dockerhub here: https://hub.docker.com/r/meisnate12/plex-meta-manager
```shell
docker run -it -v <PATH_TO_CONFIG>:/config:rw meisnate12/plex-meta-manager
```
* The `-it` allows you to interact with the script when needed.
* For example, it's required in order to go through the OAuth flow while connecting to Trakt or MyAnimeList.
* The `-v <PATH_TO_CONFIG>:/config:rw` mounts the location you choose as a persistent volume to store your files.
* Change `<PATH_TO_CONFIG>` to a folder where your config.yml and other files are.
* The docker image defaults to running the config named `config.yml` in your persistent volume.
* Use quotes around the whole thing if your path has spaces i.e. `-v "<PATH_TO_CONFIG>:/config:rw"`
Example
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager
```
### Commands
| Name | Shell Command | Environmental<br>Variable | Allowed Values | Default Value |
| :--- | :--- | :--- | :--- | :--- |
| [Config](#config) | `-c` or `--config` | `PMM_CONFIG` | Path to YAML config file | `config/config.yml` alongside<br>`plex_meta_manager.py` |
| [Time to Run](#time-to-run) | `-t` or `--time` | `PMM_TIME` | comma-separated list of times to update each day<br>**Format:** HH:MM | `03:00` |
| [Run](#run) | `-r` or `--run` | `PMM_RUN` | Run without the scheduler | `False` |
| [Run Tests](#run-tests) | `-rt`, `--tests`, or `--run-tests` | `PMM_TEST` | Run in debug mode with only collections that have `test: true` | `False` |
| [Run Collections Only](#collections-only) | `-co` or `--collections-only` | `PMM_COLLECTIONS_ONLY` | Process only collections during the run | `False` |
| [Run Libraries Only](#libraries-only) | `-lo` or `--libraries-only` | `PMM_LIBRARIES_ONLY` | Process everything but collections during the run | `False` |
| [Run Collections](#run-collections) | `-rc` or `--run-collections` | `PMM_COLLECTIONS` | comma-separated list of collection names to process | All Collections |
| [Run Libraries](#run-libraries) | `-rl` or `--run-libraries` | `PMM_LIBRARIES` | comma-separated list of library names to process | All libraries |
| [Resume Run](#resume-run) | `-re` or `--resume` | `PMM_RESUME` | Name of the Collection you want to resume the run at | ` ` |
| [No Countdown](#no-countdown) | `-nc` or `--no-countdown` | `PMM_NO_COUNTDOWN` | Run without displaying the countdown | `False` |
| [No Missing](#no-missing) | `-nm` or `--no-missing` | `PMM_NO_MISSING` | Run without any of the missing movie/show functions | `False` |
| [Divider Character](#divider-character--screen-width) | `-d` or `--divider` | `PMM_DIVIDER` | Character that divides the sections | `=` |
| [Screen Width](#divider-character--screen-width) | `-w` or `--width` | `PMM_WIDTH` | Integer between 90 and 300 | `100` |
* Environmental Variable values are used over Shell Command values
## Config
To choose the location of the YAML config file use the `--config` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config <path_to_config>
```
## Time to Run
To choose the times when the script will run each day use a comma-separated list with the `--time` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --time 22:00,03:00
```
## Run
To just run the script without having it continuously run use the `--run` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --run
```
## Run Tests
To run the script in debug mode while only running collections that have `test: true` use the `--run-tests` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --run-tests
```
## Collections Only
To have the script run only collections and not any library operations use the `--collections-only` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --collections-only
```
## Libraries Only
To have the script run only library operations and not any collections use the `--libraries-only` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --libraries-only
```
## Run Collections
To have the script run only using the collections in the comma-separated list use the `--run-collections` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --run-collections "Harry Potter, Star Wars"
```
## Run Libraries
To have the script run only the libraries in the comma-separated list use the `--run-libraries` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --run-libraries "TV Shows"
```
## Resume Run
To have the script resume a run from a specific collection use the `--resume` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --resume "Star Wars"
```
## No Countdown
To have the script run without displaying a countdown use the `--no-countdown` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --no-countdown
```
## No Missing
To have the script run without any of the missing movie/show functions use the `--no-missing` option
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config /configs/config.yml --no-missing
```
## Divider Character & Screen Width
To change the terminal output divider character or width use `--divider` and `--width`
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --divider * --width 200
```

@ -27,12 +27,14 @@ String filters can take multiple values **only as a list**.
### Attribute
| String Filter | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `title` | Uses the title attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `studio` | Uses the studio attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `filepath` | Uses the item's filepath to match | :heavy_check_mark: | :heavy_check_mark: |
| `audio_track_title` | Uses the audio track titles to match | :heavy_check_mark: | :x: |
| String Filter | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `title` | Uses the title attribute to match | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `summary` | Uses the summary attribute to match | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `studio` | Uses the studio attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `record_label` | Uses the record label attribute to match | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :x: |
| `filepath` | Uses the item's filepath to match | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `audio_track_title` | Uses the audio track titles to match | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
## Tag Filters
Tag filters can be used with either no modifier or with `.not`.
@ -50,33 +52,33 @@ The `original_language` filter will also filter out movies from being added to R
### Attribute
| Tag Filters | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `actor` | Uses the actor tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `collection` | Uses the collection tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating` | Uses the content rating tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `network` | Uses the network tags to match | :x: | :heavy_check_mark: |
| `country` | Uses the country tags to match | :heavy_check_mark: | :x: |
| `director` | Uses the director tags to match | :heavy_check_mark: | :x: |
| `genre` | Uses the genre tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `label` | Uses the label tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `producer` | Uses the actor tags to match | :heavy_check_mark: | :x: |
| `year` | Uses the year tag to match | :heavy_check_mark: | :heavy_check_mark: |
| `writer` | Uses the writer tags to match | :heavy_check_mark: | :x: |
| `original_language` | Uses TMDb original language [ISO 639-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) to match<br>Example: `original_language: en, ko` | :heavy_check_mark: | :heavy_check_mark: |
| `resolution` | Uses the resolution tag to match | :heavy_check_mark: | :x: |
| `audio_language` | Uses the audio language tags to match | :heavy_check_mark: | :x: |
| `subtitle_language` | Uses the subtitle language tags to match | :heavy_check_mark: | :x: |
| Tag Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `actor` | Uses the actor tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `collection` | Uses the collection tags to match | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating` | Uses the content rating tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `network` | Uses the network tags to match | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `country` | Uses the country tags to match | :heavy_check_mark: | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: |
| `director` | Uses the director tags to match | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `genre` | Uses the genre tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `label` | Uses the label tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :heavy_check_mark: | :x: |
| `producer` | Uses the actor tags to match | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `year` | Uses the year tag to match | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| `writer` | Uses the writer tags to match | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `original_language` | Uses TMDb original language [ISO 639-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) to match<br>Example: `original_language: en, ko` | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `resolution` | Uses the resolution tag to match | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `audio_language` | Uses the audio language tags to match | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `subtitle_language` | Uses the subtitle language tags to match | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
## Boolean Filters
Boolean Filters have no modifiers.
### Attribute
| Boolean Filter | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `has_collection` | Matches every item that has or does not have a collection | :heavy_check_mark: | :heavy_check_mark: |
| `has_overlay` | Matches every item that has or does not have an overlay | :heavy_check_mark: | :heavy_check_mark: |
| Boolean Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `has_collection` | Matches every item that has or does not have a collection | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `has_overlay` | Matches every item that has or does not have an overlay | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
## Date Filters
Date filters can be used with either no modifier or with `.not`, `.before`, `.after`, or `.regex`.
@ -97,13 +99,13 @@ The `first_episode_aired` and `last_episode_aired` filters will also filter out
### Attribute
| Date Filter | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `release` | Uses the release date attribute (originally available) to match | :heavy_check_mark: | :heavy_check_mark: |
| `added` | Uses the date added attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `last_played` | Uses the date last played attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `first_episode_aired` | Uses the first episode aired date to match | :x: | :heavy_check_mark: |
| `last_episode_aired` | Uses the last episode aired date to match | :x: | :heavy_check_mark: |
| Date Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `release` | Uses the release date attribute (originally available) to match | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `added` | Uses the date added attribute to match | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `last_played` | Uses the date last played attribute to match | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `first_episode_aired` | Uses the first episode aired date to match | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `last_episode_aired` | Uses the last episode aired date to match | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
## Number Filters
Number filters must use `.gt`, `.gte`, `.lt`, or `.lte` as a modifier.
@ -123,25 +125,25 @@ The `tmdb_vote_count` and `tmdb_year` filters will also filter out movies/shows
### Attribute
| Number Filters | Description | Restrictions | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `year` | Uses the year attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `tmdb_year` | Uses the year on TMDb to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `critic_rating` | Uses the critic rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `audience_rating` | Uses the audience rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `user_rating` | Uses the user rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `tmdb_vote_count` | Uses the tmdb vote count to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `plays` | Uses the plays attribute to match | minimum: `1` | :heavy_check_mark: | :x: |
| `duration` | Uses the duration attribute to match using minutes | minimum: `1` | :heavy_check_mark: | :x: |
| Number Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `year` | Uses the year attribute to match<br>minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| `tmdb_year` | Uses the year on TMDb to match<br>minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `critic_rating` | Uses the critic rating attribute to match<br>`0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `audience_rating` | Uses the audience rating attribute to match<br> `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `user_rating` | Uses the user rating attribute to match<br>`0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `tmdb_vote_count` | Uses the tmdb vote count to match<br>minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `plays` | Uses the plays attribute to match<br>minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `duration` | Uses the duration attribute to match using minutes<br>minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
## Special Filters
Special Filters each have their own set of rules for how they're used.
### Attribute
| Special Filters | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `history` | Uses the release date attribute (originally available) to match dates throughout history<br>`day`: Match the Day and Month to Today's Date<br>`month`: Match the Month to Today's Date<br>`1-30`: Match the Day and Month to Today's Date or `1-30` days before Today's Date | :heavy_check_mark: | :heavy_check_mark: |
| Special Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `history` | Uses the release date attribute (originally available) to match dates throughout history<br>`day`: Match the Day and Month to Today's Date<br>`month`: Match the Month to Today's Date<br>`1-30`: Match the Day and Month to Today's Date or `1-30` days before Today's Date | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
## Collection Filter Examples

@ -7,32 +7,55 @@ This wiki should tell you everything you need to know about the script to get it
[![Docker Image Version (latest semver)](https://img.shields.io/docker/v/meisnate12/plex-meta-manager?label=docker&sort=semver&style=plastic)](https://hub.docker.com/r/meisnate12/plex-meta-manager)
[![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/meisnate12/plex-meta-manager?style=plastic)](https://hub.docker.com/r/meisnate12/plex-meta-manager)
[![Docker Pulls](https://img.shields.io/docker/pulls/meisnate12/plex-meta-manager?style=plastic)](https://hub.docker.com/r/meisnate12/plex-meta-manager)
[![Discord](https://img.shields.io/discord/822460010649878528?label=Discord&style=plastic)](https://discord.gg/TsdpsFYqqm)
[![Discord](https://img.shields.io/discord/822460010649878528?label=Discord&style=plastic)](https://discord.gg/NfH6mGFuAB)
[![Sponsor or Donate](https://img.shields.io/badge/-Sponsor_or_Donate-blueviolet?style=plastic)](https://github.com/sponsors/meisnate12)
The original concept for Plex Meta Manager is [Plex Auto Collections](https://github.com/mza921/Plex-Auto-Collections), but this is rewritten from the ground up to be able to include a scheduler, metadata edits, multiple libraries, and logging. Plex Meta Manager is a Python 3 script that can be continuously run using YAML configuration files to update on a schedule the metadata of the movies, shows, and collections in your libraries as well as automatically build collections based on various methods all detailed in the wiki. Some collection examples that the script can automatically build and update daily include Plex Based Searches like actor, genre, or studio collections or Collections based on TMDb, IMDb, Trakt, TVDb, AniDB, or MyAnimeList lists and various other services.
The script can update many metadata fields for movies, shows, collections, seasons, and episodes and can act as a backup if your plex DB goes down. If the time is put into the metadata configuration file you can have a way to recreate your library and all its metadata changes with the click of a button.
The script works with most Metadata agents including the New Plex Movie Agent, New Plex TV Agent, [Hama Anime Agent](https://github.com/ZeroQI/Hama.bundle), [MyAnimeList Anime Agent](https://github.com/Fribb/MyAnimeList.bundle), and [XBMC NFO Movie and TV Agents](https://github.com/gboudreau/XBMCnfoMoviesImporter.bundle).
![Colletions1](https://raw.githubusercontent.com/wiki/meisnate12/Plex-Meta-Manager/collections1.png)
![Colletions2](https://raw.githubusercontent.com/wiki/meisnate12/Plex-Meta-Manager/collections2.png)
## Getting Started
1. Install Plex Meta Manager either by installing Python3 and following the [Local Installation Guide](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Installation)
or by installing Docker and following the [Docker Installation Guide](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Docker-Installation) or the [unRAID Installation Guide](https://github.com/meisnate12/Plex-Meta-Manager/wiki/unRAID-Walkthrough).
1. Install Plex Meta Manager either by installing Python3 and following the [Local Walkthrough](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Local-Walkthrough)
or by installing Docker and following the [Docker Walkthrough](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Docker-Walkthrough) or the [unRAID Walkthrough](https://github.com/meisnate12/Plex-Meta-Manager/wiki/unRAID-Walkthrough).
2. Once installed, you have to create a [Configuration File](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Configuration-File) filled with all your values to connect to the various services.
3. After that you can start updating Metadata and building automatic Collections by creating a [Metadata File](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Metadata-and-Playlist-File) for each Library you want to interact with.
4. Explore the [Wiki](https://github.com/meisnate12/Plex-Meta-Manager/wiki) to see all the different Collection Builders that can be used to create collections.
## IBRACORP Video Walkthrough
## Wiki
The [Wiki](https://github.com/meisnate12/Plex-Meta-Manager/wiki) details evey available option you have with Plex Meta Manager its Table of Contents is below.
[IBRACORP](https://ibracorp.io/) made a video walkthough for installing Plex Meta Manager on Unraid. While you might not be using Unraid the video goes over many key accepts of Plex Meta Manager and can be a great place to start learning how to use the script.
## Example Community Metadata Files
To see user submitted Metadata configuration files, and you to even add your own, go to the [Plex Meta Manager Configs](https://github.com/meisnate12/Plex-Meta-Manager-Configs).
[![Plex Meta Manager](https://img.youtube.com/vi/dF69MNoot3w/0.jpg)](https://www.youtube.com/watch?v=dF69MNoot3w "Plex Meta Manager")
## Support Discord
Before posting on GitHub about an enhancement, error, or configuration question please visit the [Plex Meta Manager Discord Server](https://discord.gg/NfH6mGFuAB) **it is without a doubt the best place to get support**.
## Support
## Feature Requests, Errors, and Configuration Questions
* If you have an idea for how to enhance Plex Meta Manager please open a new [Feature Request](https://github.com/meisnate12/Plex-Meta-Manager/issues/new?assignees=meisnate12&labels=status%3Anot-yet-viewed%2C+enhancement&template=feature_request.md&title=Feature+Request%3A+).
* If you're getting an Error please update to the latest develop branch and then open a [Bug Report](https://github.com/meisnate12/Plex-Meta-Manager/issues/new?assignees=meisnate12&labels=status%3Anot-yet-viewed%2C+bug&template=bug_report.md&title=Bug%3A+) if it's still happening.
* If you have a metadata configuration question post in the [Discussions](https://github.com/meisnate12/Plex-Meta-Manager/discussions).
* Before posting on Github about an enhancement, error, or configuration question please visit the [Plex Meta Manager Discord Server](https://discord.gg/TsdpsFYqqm).
* If you're getting an Error or have an Enhancement post in the [Issues](https://github.com/meisnate12/Plex-Meta-Manager/issues).
* If you have a configuration question post in the [Discussions](https://github.com/meisnate12/Plex-Meta-Manager/discussions).
* To see user submitted Metadata configuration files, and you to even add your own, go to the [Plex Meta Manager Configs](https://github.com/meisnate12/Plex-Meta-Manager-Configs).
## Development Build
* There is a [develop](https://github.com/meisnate12/Plex-Meta-Manager/tree/develop) branch which will have the most updated fixes and enhancements to the script.
* to access the Docker Image for the develop branch use the `develop` tag by adding `:develop` to the image name. i.e. `meisnate12/plex-meta-manager:develop`
## Contributing
* Pull Request are welcome but please submit them to the develop branch.
* If you wish to contribute to the Wiki please fork and send a pull request on the [Plex Meta Manager Wiki Repository](https://github.com/meisnate12/Plex-Meta-Manager-Wiki).
## IBRACORP Video Walkthrough
[IBRACORP](https://ibracorp.io/) made a video walkthough for installing Plex Meta Manager on unRAID. While you might not be using unRAID the video goes over many key accepts of Plex Meta Manager and can be a great place to start learning how to use the script.
[![Plex Meta Manager](https://img.youtube.com/vi/dF69MNoot3w/0.jpg)](https://www.youtube.com/watch?v=dF69MNoot3w "Plex Meta Manager")
## Table of Contents
- [Home](Home)
- [Installation](Installation)
@ -56,11 +79,11 @@ This wiki should tell you everything you need to know about the script to get it
- [Sonarr Attributes](Sonarr-Attributes)
- [Trakt Attributes](Trakt-Attributes)
- [MyAnimeList Attributes](MyAnimeList-Attributes)
- [Metadata and Playlist File](Metadata-and-Playlist-File)
- [Metadata and Playlist File](Metadata-and-Playlist-Files)
- [Metadata Attributes](Metadata-Attributes)
- [Seasons Attributes](Seasons-Attributes)
- [Episodes Attributes](Episodes-Attributes)
- [Template Attributes](Template-Attributes)
- [Template Attributes](Templates)
- Builders
- [Plex Builders](Plex-Builders)
- [Smart Builders](Smart-Builders)

@ -37,11 +37,38 @@ config
│ ├── overlay.png
```
### Alternative URL Images
The alternative way to specify your overlay image is do use the `name` and either `url` or `git` attributes like so.
```yaml
collections:
4K Overlay:
plex_search:
all:
resolution: 4K
item_overlay:
name: 4K
url: https://raw.githubusercontent.com/wiki/meisnate12/Plex-Meta-Manager/overlay.png
build_collection: false
```
```yaml
collections:
4K Overlay:
plex_search:
all:
resolution: 4K
item_overlay:
name: 4K
git: yozora/Overlays/4K/overlay
build_collection: false
```
### Examples Collection Configs
#### 4K Overlay Only
![4K Overlay](https://raw.githubusercontent.com/wiki/meisnate12/Plex-Meta-Manager/overlay.png)
![4K Overlay](https://raw.githubusercontent.com/wiki/meisnate12/Plex-Meta-Manager/overlay1.png)
Add a 4K overlay to all 4K Movies
@ -136,4 +163,8 @@ collections:
resolution.not: 4K
item_overlay: Dolby
build_collection: false
```
```
## User Generated Overlays
![Language Overlay](https://raw.githubusercontent.com/wiki/meisnate12/Plex-Meta-Manager/overlay2.png)

@ -50,6 +50,9 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
| [Run Libraries Only](#libraries-only) | `-lo` or `--libraries-only` | `PMM_LIBRARIES_ONLY` | Process everything but collections during the run | `False` |
| [Run Collections](#run-collections) | `-rc` or `--run-collections` | `PMM_COLLECTIONS` | comma-separated list of collection names to process | All Collections |
| [Run Libraries](#run-libraries) | `-rl` or `--run-libraries` | `PMM_LIBRARIES` | comma-separated list of library names to process | All libraries |
| [Run Libraries First](#run-libraries-first) | `-lf` or `--libraries-first` | `PMM_LIBRARIES_FIRST` | Run library operations first before collections during the run | `False` |
| [Ignore Schedules](#ignore-schedules) | `-is` or `--ignore-schedules` | `PMM_IGNORE_SCHEDULES` | Ignore all schedules during the run except for range schedules | `False` |
| [Delete Collections](#delete-collections) | `-dc` or `--delete-collections` | `PMM_DELETE_COLLECTIONS` | Delete all collections in a Library before a run | `False` |
| [Resume Run](#resume-run) | `-re` or `--resume` | `PMM_RESUME` | Name of the Collection you want to resume the run at | ` ` |
| [No Countdown](#no-countdown) | `-nc` or `--no-countdown` | `PMM_NO_COUNTDOWN` | Run without displaying the countdown | `False` |
| [No Missing](#no-missing) | `-nm` or `--no-missing` | `PMM_NO_MISSING` | Run without any of the missing movie/show functions | `False` |
@ -60,7 +63,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
* Environmental Variable values are used over Shell Command values
### Config
To choose the location of the YAML config file use the `--config` option
To choose the location of the YAML config file use the `--config` option.
<details>
<summary>Local</summary>
@ -80,7 +83,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Time to Run
To choose the times when the script will run each day use a comma-separated list with the `--time` option
To choose the times when the script will run each day use a comma-separated list with the `--time` option.
<details>
<summary>Local</summary>
@ -100,7 +103,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Run
To just run the script without having it continuously run use the `--run` option
To just run the script without having it continuously run use the `--run` option.
<details>
<summary>Local</summary>
@ -120,7 +123,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Run Tests
To run the script in debug mode while only running collections that have `test: true` use the `--run-tests` option
To run the script in debug mode while only running collections that have `test: true` use the `--run-tests` option.
<details>
<summary>Local</summary>
@ -140,7 +143,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Collections Only
To have the script run only collections and not any library operations use the `--collections-only` option
To have the script run only collections and not any library operations use the `--collections-only` option.
<details>
<summary>Local</summary>
@ -160,7 +163,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Libraries Only
To have the script run only library operations and not any collections use the `--libraries-only` option
To have the script run only library operations and not any collections use the `--libraries-only` option.
<details>
<summary>Local</summary>
@ -180,7 +183,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Run Collections
To have the script run only using the collections in the comma-separated list use the `--run-collections` option
To have the script run only using the collections in the comma-separated list use the `--run-collections` option.
<details>
<summary>Local</summary>
@ -200,7 +203,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Run Libraries
To have the script run only the libraries in the comma-separated list use the `--run-libraries` option
To have the script run only the libraries in the comma-separated list use the `--run-libraries` option.
<details>
<summary>Local</summary>
@ -219,8 +222,68 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Run Libraries First
To have the script run library operations first before collections during the run use the `--libraries-first` option.
<details>
<summary>Local</summary>
```shell
python plex_meta_manager.py --libraries-first
```
</details>
<details>
<summary>Docker</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --libraries-first
```
</details>
### Ignore Schedules
To have the script ignore all schedules during the run except for range schedules use the `--ignore-schedules` option.
<details>
<summary>Local</summary>
```shell
python plex_meta_manager.py --ignore-schedules
```
</details>
<details>
<summary>Docker</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --ignore-schedules
```
</details>
### Delete Collections
To have the script delete all collections in a Library before a run use the `--delete-collections` option.
<details>
<summary>Local</summary>
```shell
python plex_meta_manager.py --delete-collections
```
</details>
<details>
<summary>Docker</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --delete-collections
```
</details>
### Resume Run
To have the script resume a run from a specific collection use the `--resume` option
To have the script resume a run from a specific collection use the `--resume` option.
<details>
<summary>Local</summary>
@ -240,7 +303,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### No Countdown
To have the script run without displaying a countdown use the `--no-countdown` option
To have the script run without displaying a countdown use the `--no-countdown` option.
<details>
<summary>Local</summary>
@ -260,7 +323,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### No Missing
To have the script run without any of the missing movie/show functions use the `--no-missing` option
To have the script run without any of the missing movie/show functions use the `--no-missing` option.
<details>
<summary>Local</summary>
@ -280,7 +343,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
</details>
### Read Only Config
To have the script run without writing to the config use the `--read-only-config` option
To have the script run without writing to the config use the `--read-only-config` option.
<details>
<summary>Local</summary>
@ -301,7 +364,7 @@ docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex
### Divider Character & Screen Width
To change the terminal output divider character or width use `--divider` and `--width`
To change the terminal output divider character or width use the `--divider` and `--width` options.
<details>
<summary>Local</summary>

@ -10,15 +10,19 @@ All the following attributes update various details of the collection/playlist's
| Label Remove | `label.remove` | Used to remove existing labels from the collection | Comma-separated string of labels to remove | :x: |
| Label Sync | `label.sync` | Matches the labels of the collection to the labels provided (Leave blank to remove all labels) | Comma-separated string of labels to sync | :x: |
| Collection Mode | `collection_mode` | Used to change the Collection Mode | `default`: Library default<br>`hide`: Hide Collection<br>`hide_items`: Hide Items in this Collection<br>`show_items`: Show this Collection and its Items | :x: |
| Collection Order | `collection_order` | Used to change the Collection Order | `release`: Order Collection by Release Dates<br>`alpha`: Order Collection Alphabetically<br>`custom`: Order Collection Via the Builder Order | :heavy_check_mark: | :heavy_check_mark: | :x: |
| Collection Level | `collection_level` | Used to make episode or season collections from `plex_search`, `trakt_list`, or `imdb_list` Builders | `season`: Collection contains seasons<br>`episode`: Collection contains episodes | :x: |
| Visible on Library | `visible_library` | Used to change collection visible on Library | `true`: Visible<br>`false`: Not Visible<br>Any [`schedule`](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Schedule-Detail) | :x: |
| Visible on Home | `visible_home` | Used to change collection visible on Home | `true`: Visible<br>`false`: Not Visible<br>Any [`schedule`](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Schedule-Detail) | :x: |
| Visible on Shared | `visible_shared` | Used to change collection visible on Shared Users' Home | `true`: Visible<br>`false`: Not Visible<br>Any [`schedule`](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Schedule-Detail) | :x: |
| Collection Order | `collection_order` | Used to change the Collection Order | `release`: Order Collection by Release Dates<br>`alpha`: Order Collection Alphabetically<br>`custom`: Order Collection Via the Builder Order<br>[Any `plex_search` Sort Option](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Plex-Builders#sort-options) | :heavy_check_mark: | :heavy_check_mark: | :x: |
| Collection Level | `collection_level` | Used to make season, episode, album or track collections from `plex_all`, `plex_search`, `trakt_list`, or `imdb_list` Builders and Filters | `season`: Collection contains seasons<br>`episode`: Collection contains episodes<br>`album`: Collection contains albums<br>`track`: Collection contains tracks | :x: |
| Visible on Library | `visible_library` | Used to change collection visible on Library (Only works with Plex Pass) | `true`: Visible<br>`false`: Not Visible<br>Any [`schedule`](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Schedule-Detail) | :x: |
| Visible on Home | `visible_home` | Used to change collection visible on Home (Only works with Plex Pass) | `true`: Visible<br>`false`: Not Visible<br>Any [`schedule`](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Schedule-Detail) | :x: |
| Visible on Shared | `visible_shared` | Used to change collection visible on Shared Users' Home (Only works with Plex Pass) | `true`: Visible<br>`false`: Not Visible<br>Any [`schedule`](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Schedule-Detail) | :x: |
* **Sort Title:** You can use `sort_title` to "promote" certain collections to the top of a library by creating a sort title starting with a `+` or "demote" certain collections to the bottom of a library by creating a sort title starting with a `~`.
* **Custom Collection Order:** When using `collection_order: custom` you can only have a single builder in the collection.
* Here's an example of how the collections can look on the Home Page.
![Display](https://raw.githubusercontent.com/wiki/meisnate12/Plex-Meta-Manager/display.png)
## Item Metadata Details
All the following attributes update various details of the metadata for every item in the collection/playlist.

@ -11,7 +11,7 @@ There are three mappings allowed in the Metadata File's root:
| Name | Attribute | Description |
| :--- | :--- | :--- |
| [Metadata](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Metadata-Attributes) | `metadata` | mapping where metadata changes go |
| [Templates](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Template-Attributes) | `templates` | mapping where templates for automatic collections go |
| [Templates](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Templates) | `templates` | mapping where templates for automatic collections go |
| [Collections](#collections-and-playlists-mappings) | `collections` | mapping where automatic collections and collection metadata go |
* Either `metadata` or `collections` is required in order to run the Metadata File.
@ -21,9 +21,11 @@ There are three mappings allowed in the Metadata File's root:
There are two mappings allowed in the Playlist File's root:
++Note: Many players cannot resume playing a playlist in order vote for this [Feature](https://forums.plex.tv/t/playlists-remember-position-for-subsequent-resume/84866) to be added.**
| Name | Attribute | Description |
| :--- | :--- | :--- |
| [Templates](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Template-Attributes) | `templates` | mapping where templates for automatic collections go |
| [Templates](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Templates) | `templates` | mapping where templates for automatic collections go |
| [Playlists](#additional-playlist-attributes) | `playlists` | mapping where automatic playlists and playlist metadata go |
* `playlists` is required in order to run the Playlist File.

@ -0,0 +1,162 @@
You can have the script edit the metadata of Movies by adding them to the `metadata` mapping of a Metadata File.
An example of multiple metadata edits in a movie library is below:
```yaml
metadata:
Godzilla (1954):
title: Godzilla
year: 1954
content_rating: R
Godzilla (1998):
title: Godzilla
year: 1998
sort_title: Godzilla 03
content_rating: PG-13
Shin Godzilla:
sort_title: Godzilla 06
content_rating: R
Godzilla 1985:
content_rating: PG
"Godzilla 2000: Millennium":
originally_available: 1999-08-18
Godzilla Against MechaGodzilla:
originally_available: 2002-03-23
Godzilla Raids Again:
content_rating: G
originally_available: 1955-05-21
Godzilla vs. Biollante:
content_rating: PG
Godzilla vs. Destoroyah:
content_rating: PG
originally_available: 1995-01-19
Godzilla vs. Gigan:
content_rating: G
originally_available: 1972-09-14
Godzilla vs. Hedorah:
content_rating: G
originally_available: 1971-04-01
Godzilla vs. King Ghidorah:
content_rating: PG
originally_available: 1991-04-28
Godzilla vs. Mechagodzilla:
content_rating: G
originally_available: 1974-03-24
Godzilla vs. Mechagodzilla II:
content_rating: PG
Godzilla vs. Megaguirus:
content_rating: PG
originally_available: 2000-08-31
Godzilla vs. Megalon:
content_rating: G
originally_available: 1973-03-17
Godzilla vs. Mothra:
content_rating: PG
originally_available: 1992-04-28
Godzilla vs. SpaceGodzilla:
content_rating: PG
originally_available: 1994-01-19
Godzilla, King of the Monsters!:
content_rating: G
"Godzilla, Mothra and King Ghidorah: Giant Monsters All-Out Attack":
content_rating: PG
originally_available: 2001-08-31
"Godzilla: Final Wars":
content_rating: PG
originally_available: 2004-12-13
"Godzilla: Tokyo S.O.S.":
originally_available: 2003-12-14
Halloween (Rob Zombie):
alt_title: Halloween
year: 2007
"Halo 4: Forward Unto Dawn":
alt_title: Halo 4 Forward Unto Dawn
tmdb_id: 56295
content_rating: R
```
## Movies
Each movie is defined by the mapping name which must be the same as the movie name in the library unless an `alt_title` is specified.
## Metadata Edits
The available attributes for editing movies are as follows
### Special Attributes
| Name | Attribute | Allowed Values |
| :--- | :--- | :--- |
| Title | `title` | Title if different from the mapping value useful when you have multiple movies with the same name |
| Alternative Title | `alt_title` | Alternative title to look for |
| Year | `year` | Year of movie for better identification |
| TMDb Show ID | `tmdb_show` | TMDb Show ID to use for metadata useful for miniseries that have been compiled into a movie |
| TMDb Movie ID | `tmdb_movie` | TMDb Movie ID to use for metadata useful for movies that have been split into segments |
* YAML files cannot have two items with the same mapping name so if you have two movies with the same name you would change the mapping values to whatever you want. Then use the `title` attribute to specify the real title and use the `year` attribute to specify which of the multiple movies to choose.
```yaml
metadata:
Godzilla1:
title: Godzilla
year: 1954
content_rating: R
Godzilla2:
title: Godzilla
year: 1998
content_rating: PG-13
```
* If you know of another Title your movie might exist under, but you want it titled differently you can use `alt_title` to specify another title to look under and then be changed to the mapping name. For Example TMDb uses the name `The Legend of Korra`, but I want it as `Avatar: The Legend of Korra` (Which must be surrounded by quotes since it uses the character `:`):
```yaml
metadata:
"Avatar: The Legend of Korra":
alt_title: The Legend of Korra
```
This would change the name of the TMDb default `The Legend of Korra` to `Avatar: The Legend of Korra` and would not mess up any subsequent runs.
### General Attributes
| Name | Attribute | Allowed Values |
| :--- | :--- | :--- |
| Sort Title | `sort_title` | Text to change Sort Title |
| Original Title | `original_title` | Text to change Original Title |
| Originally Available | `originally_available` | Date to change Originally Available<br>**Format:** YYYY-MM-DD |
| Content Rating | `content_rating` | Text to change Content Rating |
| Rating | `rating` | Number to change Rating |
| Studio | `studio` | Text to change Studio |
| Tagline | `tagline` | Text to change Tagline |
| Summary | `summary` | Text to change Summary |
### Tag Attributes
You can add `.remove` to any tag attribute to only remove those tags i.e. `genre.remove`.
You can add `.sync` to any tag attribute to sync all tags vs just appending the new ones i.e. `genre.sync`.
| Name | Attribute | Allowed Values |
| :--- | :--- | :--- |
| Director | `director` | List or comma-separated text of each Director Tag |
| Country | `country` | List or comma-separated text of each Country Tag |
| Genre | `genre` | List or comma-separated text of each Genre Tag |
| Writer | `writer` | List or comma-separated text of each Writer Tag |
| Producer | `producer` | List or comma-separated text of each Producer Tag |
| Collection | `collection` | List or comma-separated text of each Collection Tag |
| Label | `label` | List or comma-separated text of each Label Tag |
### Advance Attributes
| Name | Attribute | Allowed Values |
| :--- | :--- | :--- |
| Metadata Language* | `metadata_language` | `default`, `ar-SA`, `ca-ES`, `cs-CZ`, `da-DK`, `de-DE`, `el-GR`, `en-AU`, `en-CA`, `en-GB`, `en-US`, `es-ES`, `es-MX`, `et-EE`, `fa-IR`, `fi-FI`, `fr-CA`, `fr-FR`, `he-IL`, `hi-IN`, `hu-HU`, `id-ID`, `it-IT`, `ja-JP`, `ko-KR`, `lt-LT`, `lv-LV`, `nb-NO`, `nl-NL`, `pl-PL`, `pt-BR`, `pt-PT`, `ro-RO`, `ru-RU`, `sk-SK`, `sv-SE`, `th-TH`, `tr-TR`, `uk-UA`, `vi-VN`, `zh-CN`, `zh-HK`, `zh-TW` |
| Use Original Title* | `use_original_title` | `default`: Library default<br>`no`: No<br>`yes`: Yes |
\* Must be using the **New Plex Movie Agent*
## Image Attributes
| Name | Attribute | Description | Allowed Values |
| :--- | :--- | :--- | :--- |
| URL Poster | `url_poster` | Used to change the movie's poster to the URL | URL of image publicly available on the internet |
| File Poster | `file_poster` | Used to change the movie's poster to the image in the file system | Path to image in the file system |
| URL Background | `url_background` | Use to change the movie's background to the URL | URL of image publicly available on the internet |
| File Background | `file_background` | Used to change the movie's background to the image in the file system | Path to image in the file system |

@ -18,7 +18,8 @@ The available operations attributes for each library are as follows
| Name | Attribute | Description | Allowed Values |
| :--- | :--- | :--- | :--- |
| [TMDb Collections](#tmdb-collections) | `tmdb_collections` | Builds Collections for every movie in your library based on TMDb Collections | [`tmdb_collections` mapping details](#tmdb-collections) |
| [Genre Mapper](#genre-mapper) | `genre_mapper` |Will check every item in your library and changed mapped genres | [`genre_mapper` mapping details](#genre-mapper) |
| [Genre Collections](#genre-collections) | `genre_collections` | Builds Collections for every genre in your library | [`genre_collections` mapping details](#genre-collections) |
| [Genre Mapper](#genre-mapper) | `genre_mapper` | Will check every item in your library and changed mapped genres | [`genre_mapper` mapping details](#genre-mapper) |
| Image Assets For All | `assets_for_all` | Search in assets for images for every item in your library | `true` or `false` |
| Delete Collections With Less | `delete_collections_with_less` | Deletes every collection with less then the given number | number greater then 0 |
| Delete Unmanaged Collections | `delete_unmanaged_collections` | Deletes every unmanaged collection | `true` or `false` |
@ -39,7 +40,7 @@ The available operations attributes for each library are as follows
## TMDb Collections
This operation will scan every movie in your library and create collections based on a `template` for those collections.
To run the most basic way you can just leave `tmdb_collections` Blank like so:
To run the most basic way you can just leave `tmdb_collections` blank like so:
```yaml
library:
@ -48,7 +49,18 @@ library:
tmdb_collections:
```
This will run all collections found with the template that simply has `tmdb_collection_details: <<collection_id>>` in it.
This will run all collections found with this default template:
```yaml
library:
Movies:
operations:
tmdb_collections:
template:
tmdb_collection_details: <<collection_id>>
```
Where `<<collection_id>>` is the TMDb Collection ID.
To change the template for more complex runs you can use the `template` attribute to define the template that is used for the operation like so:
@ -62,13 +74,13 @@ library:
collection_order: release
```
* Remember if you define your own template you need to use the `<<collection_id>>` still to make the collection
* Remember if you define your own template you need to use the `<<collection_id>>` template variable to differentiate the collections.
There are two other attributes that can be used under `tmdb_collections`
There are other attributes that can be used under `tmdb_collections`
* `exclude_ids`: list or comma separate list of TMDb Collection IDs to ignore
* `remove_suffix`: Removes the suffix given from the TMDb Collection names. i.e. `Star Wars Collection` -> `Star Wars`. Multiple suffixes can be given as a list or comma separated string.
* `dictionary_variables`: Variable changes by TMDb Collection ID This can allow you to have other attributes change per Collection.
* `dictionary_variables`: Variable changes by TMDb Collection ID this can allow you to have other attributes change per Collection.
```yaml
library:
@ -92,6 +104,82 @@ library:
* If the Collection is defined in another Metadata file (i.e. you define your own `Star Wars` Collection) then it will not run under `tmdb_collections` as long as the collection names match.
## Genre Collections
This operation will build a collection for every genre in your library based on a `template` for those collections.
To run the most basic way you can just leave `genre_collections` blank like so:
```yaml
library:
Movies:
operations:
genre_collections:
```
This will run all genres found with this default template:
```yaml
library:
Movies:
operations:
genre_collections:
title_format: "Top <<genre>> <<library_type>>s"
template:
smart_filter:
limit: 50
sort_by: critic_rating.desc
all:
genre: <<genre>>
```
Where `<<genre>>` is the Genre found in Plex and `<<library_type>>` is either `Movie`, `Show`, or `Artist` depending on your library type.
To change the template for more complex runs you can use the `template` attribute to define the template that is used for the operation like so:
```yaml
library:
Movies:
operations:
genre_collections:
template:
smart_filter:
limit: 50
sort_by: critic_rating.desc
all:
genre: <<genre>>
collection_mode: hide
```
* Remember if you define your own template you need to use the `<<genre>>` template variable to differentiate the collections.
There are other attributes that can be used under `genre_collections`
* `exclude_genres`: list or comma separate list of Genres to ignore
* `title_format`: Format you want the title in.
* `dictionary_variables`: Variable changes by Genre this can allow you to have other attributes change per Collection.
```yaml
library:
Movies:
operations:
tmdb_collections:
exclude_genres:
- Family
title_format: "Top <<genre>> <<library_type>>s on IMDb"
dictionary_variables:
my_collection_poster:
Action: https://theposterdb.com/api/assets/69195
Comedy: https://theposterdb.com/api/assets/69200
template:
optional:
- my_collection_poster
imdb_list: https://www.imdb.com/search/title/?title_type=feature&release_date=1990-01-01,&user_rating=5.0,10.0&num_votes=100000,&genres=<<genre>>
collection_order: custom
url_poster: <<my_collection_poster>>
```
* If the Collection is defined in another Metadata file (i.e. you define your own `Action` Collection) then it will not run under `genre_collections` as long as the collection names match.
## Genre Mapper
You can use the `genre_mapper` operation to map genres in your library.

@ -1,4 +1,4 @@
Since playlists are not specific to one library they will need their own special [Playlist File](Metadata-and-Playlist-File) to work.
Since playlists are not specific to one library they will need their own special [Playlist File](Metadata-and-Playlist-Files) to work.
You can define Playlist Files by using `playlist_files`. They can either be on the local system, online at an url, or directly from the [Plex Meta Manager Configs](https://github.com/meisnate12/Plex-Meta-Manager-Configs) repository.

@ -66,29 +66,40 @@ There are a couple other attributes you can have at the top level only along wit
| Special Option | Attribute | Description | Default |
| :--- | :--- | :--- | :---: |
| Type | `type` | The Type of items inside this collection/playlist<br>**Options**: `movies`, `shows`, `seasons`, and `episodes` | `movies` for Movies Libraries and `shows` for Show Libraries |
| Type | `type` | The Type of items inside this collection/playlist<br>**Options**: `movies`, `shows`, `seasons`, `episodes`, `artists`, `albums`, or `tracks` | `movies` for Movies Libraries, `shows` for Show Libraries, and `artists` for Music Libraries |
| Limit | `limit` | The max number of item for the search | all |
| Sort By | `sort_by` | This will control how the search is sorted in your library. You can use any sort options for your search type in the [Sorts Table](#sorts-table) | `random` |
| Sort By | `sort_by` | This will control how the search is sorted in your library. You can use any sort options for your search type in the [Sorts Options Table](#sort-options) | `random` |
| Validate | `validate` | Determines if a collection/playlist will fail on a validation error<br>**Options**: `true` or `false` | `true` |
## Sort Options
| Sort Option | Description | Movies | Shows | Seasons | Episodes |
| :--- | :--- | :---: | :---: | :---: | :---: |
| `title.asc`/`title.desc` | Sort by Title | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `season.asc`/`season.desc` | Sort by Season | :x: | :x: | :heavy_check_mark: | :x: |
| `show.asc`/`show.desc` | Sort by Show | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| `year.asc`/`year.desc` | Sort by Year | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `release.asc`/<br>`release.desc` | Sort by Release Date (Originally Available) | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `critic_rating.asc`/<br>`critic_rating.desc` | Sort by Critic Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `audience_rating.asc`/<br>`audience_rating.desc` | Sort by Audience Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `user_rating.asc`/<br>`user_rating.desc` | Sort by User Rating | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating.asc`/<br>`content_rating.desc` | Sort by Content Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: |
| `duration.asc`/`duration.desc` | Sort by Duration | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `plays.asc`/`plays.desc` | Sort by Number of Plays | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `added.asc`/`added.desc` | Sort by Date Added | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `episode_added.asc`/<br>`episode_added.desc` | Sort by Last Episode Date Added | :x: | :heavy_check_mark: | :x: | :x: |
| `random` | Sort by Random | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Sort Option | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Tracks |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `title.asc`/`title.desc` | Sort by Title | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `season.asc`/`season.desc` | Sort by Season | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: |
| `show.asc`/`show.desc` | Sort by Show | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: |
| `album_artist.asc`/`album_artist.desc` | Sort by Album Artist | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| `artist.asc`/`artist.desc` | Sort by Artist | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `album.asc`/`album.desc` | Sort by Album | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `year.asc`/`year.desc` | Sort by Year | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `release.asc`/<br>`release.desc` | Sort by Release Date (Originally Available) | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `critic_rating.asc`/<br>`critic_rating.desc` | Sort by Critic Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `audience_rating.asc`/<br>`audience_rating.desc` | Sort by Audience Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `user_rating.asc`/<br>`user_rating.desc` | Sort by User Rating | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating.asc`/<br>`content_rating.desc` | Sort by Content Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `duration.asc`/`duration.desc` | Sort by Duration | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `progress.asc`/`progress.desc` | Sort by Progress | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `played.asc`/`played.desc` | Sort by Date Last Played | :x: | :x: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `plays.asc`/`plays.desc` | Sort by Number of Plays | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `unplayed.asc`/<br>`unplayed.desc` | Sort by Unplayed | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `episode_added.asc`/<br>`episode_added.desc` | Sort by Last Episode Date Added | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `added.asc`/`added.desc` | Sort by Date Added | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `viewed.asc`/`viewed.desc` | Sort by Date Last Viewed | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `rated.asc`/`rated.desc` | Sort by Date Last Rated | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `popularity.asc`/`popularity.desc` | Sort by Popularity | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `resolution.asc`/`resolution.desc` | Sort by Resolution | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `bitrate.asc`/`bitrate.desc` | Sort by Bitrate | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `random` | Sort by Random | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
## Searches
@ -112,11 +123,15 @@ String search can take multiple values **only as a list**.
### String Attributes
| String Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `title` | Uses the title attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_title` | Uses the title attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| `studio` | Uses the studio attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| String Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `title` | Uses the title attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_title` | Uses the title attribute of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `studio` | Uses the studio attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `artist_title` | Uses the Artist's Title attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_title` | Uses the Album's Title attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_title` | Uses the Track's Title attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_record_label` | Uses the Album's Record Label attribute to match | :x: | :x: | :heavy_check_mark: |
## Tag Searches
Tag searches can be used with either no modifier or with `.not` except for `decade` and `resolution` which can only be used with no modifier.
@ -132,24 +147,39 @@ Tag search can take multiple values as a **list or a comma-separated string**.
### Tag Attributes
| Tag Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `actor` | Uses the actor tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `audio_language` | Uses the audio language tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `collection` | Uses the collection tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating` | Uses the content rating tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `country` | Uses the country tags to match | :heavy_check_mark: | :x: |
| `decade` | Uses the year tag to match the decade | :heavy_check_mark: | :x: |
| `director` | Uses the director tags to match | :heavy_check_mark: | :x: |
| `genre` | Uses the genre tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `label` | Uses the label tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `network` | Uses the network tags to match<br>**Only works with the New Plex TV Agent** | :x: | :heavy_check_mark: |
| `producer` | Uses the actor tags to match | :heavy_check_mark: | :x: |
| `resolution` | Uses the resolution tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `subtitle_language` | Uses the subtitle language tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `writer` | Uses the writer tags to match | :heavy_check_mark: | :x: |
| `year` | Uses the year tag to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_year` | Uses the year tag to match | :x: | :heavy_check_mark: |
| Tag Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `actor` | Uses the actor tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `audio_language` | Uses the audio language tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `collection` | Uses the collection tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `content_rating` | Uses the content rating tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `country` | Uses the country tags to match | :heavy_check_mark: | :x: | :x: |
| `decade` | Uses the year tag to match the decade | :heavy_check_mark: | :x: | :x: |
| `director` | Uses the director tags to match | :heavy_check_mark: | :x: | :x: |
| `genre` | Uses the genre tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `label` | Uses the label tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `network` | Uses the network tags to match<br>**Only works with the New Plex TV Agent** | :x: | :heavy_check_mark: | :x: |
| `producer` | Uses the actor tags to match | :heavy_check_mark: | :x: | :x: |
| `resolution` | Uses the resolution tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `subtitle_language` | Uses the subtitle language tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `writer` | Uses the writer tags to match | :heavy_check_mark: | :x: | :x: |
| `year` | Uses the year tag to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_year` | Uses the year tag to match | :x: | :heavy_check_mark: | :x: |
| `artist_genre` | Uses the Artist's Genre attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_collection` | Uses the Artist's Collection attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_country` | Uses the Artist's Country attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_mood` | Uses the Artist's Mood attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_style` | Uses the Artist's Style attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_genre` | Uses the Album's Genre attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_mood` | Uses the Album's Mood attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_style` | Uses the Album's Style attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_format` | Uses the Album's Format attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_type` | Uses the Album's Type attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_collection` | Uses the Album's Collection attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_source` | Uses the Album's Source attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_label` | Uses the Album's Label attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_mood` | Uses the Track's Mood attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_source` | Uses the Track's Style attribute to match | :x: | :x: | :heavy_check_mark: |
## Date Searches
Date searches can be used with either no modifier or with `.not`, `.before`, or `.after`.
@ -167,14 +197,23 @@ No date search can take multiple values.
### Date Attributes
| Date Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `added` | Uses the date added attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_added` | Uses the date added attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| `release` | Uses the release date attribute (originally available) to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_air_date` | Uses the air date attribute (originally available) of the show's episodes to match | :x: | :heavy_check_mark: |
| `last_played` | Uses the date last played attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_last_played` | Uses the date last played attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| Date Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `added` | Uses the date added attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_added` | Uses the date added attribute of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `release` | Uses the release date attribute (originally available) to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_air_date` | Uses the air date attribute (originally available) of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `last_played` | Uses the date last played attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_last_played` | Uses the date last played attribute of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `artist_added` | Uses the Artist's date added attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_last_played` | Uses the Artist's last played attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_last_played` | Uses the Album's last played attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_added` | Uses the Album's date added attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_released` | Uses the Album's release date attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_last_played` | Uses the Track's date last played attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_last_skipped` | Uses the Track's date last skipped attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_last_rated` | Uses the Track's date last rated attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_added` | Uses the Track's date added attribute to match | :x: | :x: | :heavy_check_mark: |
## Number Searches
Number searches must use `.gt`, `.gte`, `.lt`, or `.lte` as a modifier.
@ -192,36 +231,48 @@ No number search can take multiple values.
### Number Attributes
| Number Search | Description | Restrictions | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: | :--: |
| `duration` | Uses the duration attribute to match using minutes | minimum: `1` | :heavy_check_mark: | :x: |
| `plays` | Uses the plays attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_plays` | Uses the plays attribute of the show's episodes to match | minimum: `1` | :x: | :heavy_check_mark: |
| `critic_rating` | Uses the critic rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `audience_rating` | Uses the audience rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `user_rating` | Uses the user rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_user_rating` | Uses the user rating attribute of the show's episodes to match | `0.0` - `10.0` | :x: | :heavy_check_mark: |
| `year` | Uses the year attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_year` | Uses the year attribute of the show's episodes to match | minimum: `1` | :x: | :heavy_check_mark: |
| Number Search | Description | Restrictions | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `duration` | Uses the duration attribute to match using minutes | minimum: `1` | :heavy_check_mark: | :x: | :x: |
| `plays` | Uses the plays attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_plays` | Uses the Episode's plays attribute to match | minimum: `1` | :x: | :heavy_check_mark: | :x: |
| `critic_rating` | Uses the critic rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `audience_rating` | Uses the audience rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `user_rating` | Uses the user rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_user_rating` | Uses the user rating attribute of the show's episodes to match | `0.0` - `10.0` | :x: | :heavy_check_mark: | :x: |
| `year` | Uses the year attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_year` | Uses the Episode's year attribute to match | minimum: `1` | :x: | :heavy_check_mark: | :x: |
| `album_year` | Uses the Album's year attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `album_decade` | Uses the Album's decade attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `album_plays` | Uses the Album's plays attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `track_plays` | Uses the Track's plays attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `track_skips` | Uses the Track's skips attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `artist_user_rating` | Uses the Artist's user rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
| `album_user_rating` | Uses the Album's user rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
| `album_critic_rating` | Uses the Album's critic rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
| `track_user_rating` | Uses the Track's user rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
## Boolean Searches
Boolean Searches take no modifier and can only be either `true` or `false`.
### Boolean Attributes
| Boolean Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `hdr` | Is HDR | :heavy_check_mark: | :heavy_check_mark: |
| `unmatched` | Is Unmatched | :heavy_check_mark: | :x: |
| `duplicate` | Is Duplicate | :heavy_check_mark: | :x: |
| `unplayed` | Is Unplayed | :heavy_check_mark: | :x: |
| `progress` | Is In Progress | :heavy_check_mark: | :x: |
| `trash` | Is Trashed | :heavy_check_mark: | :heavy_check_mark: |
| `unplayed_episodes` | Has Unplayed Episodes | :x: | :heavy_check_mark: |
| `episode_unplayed` | Has Episodes Unplayed | :x: | :heavy_check_mark: |
| `episode_duplicate` | Has Duplicate Episodes | :x: | :heavy_check_mark: |
| `episode_progress` | Has Episode Progress | :x: | :heavy_check_mark: |
| `episode_unmatched` | Has Episodes Unmatched | :x: | :heavy_check_mark: |
| Boolean Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `hdr` | Is HDR | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `unmatched` | Is Unmatched | :heavy_check_mark: | :x: | :x: |
| `duplicate` | Is Duplicate | :heavy_check_mark: | :x: | :x: |
| `unplayed` | Is Unplayed | :heavy_check_mark: | :x: | :x: |
| `progress` | Is In Progress | :heavy_check_mark: | :x: | :x: |
| `trash` | Is Trashed | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `unplayed_episodes` | Has Unplayed Episodes | :x: | :heavy_check_mark: | :x: |
| `episode_unplayed` | Has Episodes Unplayed | :x: | :heavy_check_mark: | :x: |
| `episode_duplicate` | Has Duplicate Episodes | :x: | :heavy_check_mark: | :x: |
| `episode_progress` | Has Episode Progress | :x: | :heavy_check_mark: | :x: |
| `episode_unmatched` | Has Episodes Unmatched | :x: | :heavy_check_mark: | :x: |
| `artist_unmatched` | Is Artist's Unmatched | :x: | :x: | :heavy_check_mark: |
| `album_unmatched` | Is Album's Unmatched | :x: | :x: | :heavy_check_mark: |
| `track_trash` | Is Track Trashed | :x: | :x: | :heavy_check_mark: |
## Plex Search Examples

@ -0,0 +1,304 @@
This builder finds its items by using the features of Plex.
No configuration is required for these builders.
| Name | Attribute | Description | Works with Movies | Works with Shows | Works with Playlists and Custom Sort |
| :--- | :--- | :--- | :---: | :---: | :---: |
| [Plex All](#plex-all) | `plex_all` | Gets every movie/show in your library. Useful with [Filters](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Filters) | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Plex Collectionless](#plex-collectionless) | `plex_collectionless` | Gets every movie/show that is not in a collection | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Plex Search](#plex-search) | `plex_search` | Gets every movie/show based on the search parameters provided | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
## Plex All
Finds every item in your library. Useful with [Filters](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Filters).
The expected input is either true or false.
```yaml
collections:
9.0 Movies:
plex_all: true
filters:
rating.gte: 9
```
## Plex Search
Uses Plex's [Advance Filters](https://support.plex.tv/articles/201273953-collections/) to find all items based on the search parameters provided.
Any Advance Filter made using the Plex UI should be able to be recreated using `plex_search`. If you're having trouble getting `plex_search` to work correctly, build the collection you want inside of Plex's Advance Filters and take a screenshot of the parameters in the Plex UI and post it in either the [Discussions](https://github.com/meisnate12/Plex-Meta-Manager/discussions) or on [Discord](https://discord.gg/TsdpsFYqqm) and I'll do my best to help you.
like Plex's [Advance Filters](https://support.plex.tv/articles/201273953-collections/) you have to start each search with either `any` or `all` as a base. You can only have one base attribute and all search attributes must be under the base.
Inside the base attribute you can use any search below or nest more `any` or `all`. You can have as many nested `any` or `all` next to each other as you want. If using multiple `any` or `all` you will have to do so in the form of a list.
There are a couple other attributes you can have at the top level only along with the base attribute are:
## Special Attributes
| Special Option | Attribute | Description | Default |
| :--- | :--- | :--- | :---: |
| Type | `type` | The Type of items inside this collection/playlist<br>**Options**: `movies`, `shows`, `seasons`, `episodes`, `artists`, `albums`, or `tracks` | `movies` for Movies Libraries, `shows` for Show Libraries, and `artists` for Music Libraries |
| Limit | `limit` | The max number of item for the search | all |
| Sort By | `sort_by` | This will control how the search is sorted in your library. You can use any sort options for your search type in the [Sorts Options Table](#sort-options) | `random` |
| Validate | `validate` | Determines if a collection/playlist will fail on a validation error<br>**Options**: `true` or `false` | `true` |
## Sort Options
| Sort Option | Description | Movies | Shows | Seasons | Episodes |
| :--- | :--- | :---: | :---: | :---: | :---: |
| `title.asc`/`title.desc` | Sort by Title | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `season.asc`/`season.desc` | Sort by Season | :x: | :x: | :heavy_check_mark: | :x: |
| `show.asc`/`show.desc` | Sort by Show | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| `year.asc`/`year.desc` | Sort by Year | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `release.asc`/<br>`release.desc` | Sort by Release Date (Originally Available) | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `critic_rating.asc`/<br>`critic_rating.desc` | Sort by Critic Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `audience_rating.asc`/<br>`audience_rating.desc` | Sort by Audience Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `user_rating.asc`/<br>`user_rating.desc` | Sort by User Rating | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating.asc`/<br>`content_rating.desc` | Sort by Content Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: |
| `duration.asc`/`duration.desc` | Sort by Duration | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `plays.asc`/`plays.desc` | Sort by Number of Plays | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `added.asc`/`added.desc` | Sort by Date Added | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `episode_added.asc`/<br>`episode_added.desc` | Sort by Last Episode Date Added | :x: | :heavy_check_mark: | :x: | :x: |
| `random` | Sort by Random | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
## Searches
There are three fields per search option when using Plex's Advance Filters in the Web UI. The first is the **Attribute** (what attribute you wish to search), the second is the **Modifier** (which modifier to use), and the third is the **Term** (actual term to search).
## String Searches
String searches can be used with either no modifier or with `.not`, `.is`, `.isnot`, `.begins`, or `.ends`.
String search can take multiple values **only as a list**.
### String Modifiers
| String Modifier | Description | Plex Web UI Display |
| :--- | :--- | :---: |
| No Modifier | Matches every item where the attribute contains the given string | `contains` |
| `.not` | Matches every item where the attribute does not contain the given string | `does not contain` |
| `.is` | Matches every item where the attribute exactly matches the given string | `is` |
| `.isnot` | Matches every item where the attribute does not exactly match the given string | `is not` |
| `.begins` | Matches every item where the attribute begins with the given string | `begins with` |
| `.ends` | Matches every item where the attribute ends with the given string | `ends with` |
### String Attributes
| String Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `title` | Uses the title attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_title` | Uses the title attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| `studio` | Uses the studio attribute to match | :heavy_check_mark: | :heavy_check_mark: |
## Tag Searches
Tag searches can be used with either no modifier or with `.not` except for `decade` and `resolution` which can only be used with no modifier.
Tag search can take multiple values as a **list or a comma-separated string**.
### Tag Modifiers
| Tag Modifier | Description | Plex Web UI Display |
| :--- | :--- | :---: |
| No Modifier | Matches every item where the attribute matches the given string | `is` |
| `.not` | Matches every item where the attribute does not match the given string | `is not` |
### Tag Attributes
| Tag Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `actor` | Uses the actor tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `audio_language` | Uses the audio language tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `collection` | Uses the collection tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating` | Uses the content rating tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `country` | Uses the country tags to match | :heavy_check_mark: | :x: |
| `decade` | Uses the year tag to match the decade | :heavy_check_mark: | :x: |
| `director` | Uses the director tags to match | :heavy_check_mark: | :x: |
| `genre` | Uses the genre tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `label` | Uses the label tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `network` | Uses the network tags to match<br>**Only works with the New Plex TV Agent** | :x: | :heavy_check_mark: |
| `producer` | Uses the actor tags to match | :heavy_check_mark: | :x: |
| `resolution` | Uses the resolution tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `subtitle_language` | Uses the subtitle language tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `writer` | Uses the writer tags to match | :heavy_check_mark: | :x: |
| `year` | Uses the year tag to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_year` | Uses the year tag to match | :x: | :heavy_check_mark: |
## Date Searches
Date searches can be used with either no modifier or with `.not`, `.before`, or `.after`.
No date search can take multiple values.
### Date Modifiers
| Date Modifier | Description | Format | Plex Web UI Display |
| :--- | :--- | :---: | :---: |
| No Modifier | Matches every item where the date attribute<br>is in the last X days | **Format:** number of days<br>e.g. `30` | `is in the last` |
| `.not` | Matches every item where the date attribute<br>is not in the last X days | **Format:** number of days<br>e.g. `30` | `is not in the last` |
| `.before` | Matches every item where the date attribute<br>is before the given date | **Format:** MM/DD/YYYY<br>e.g. `01/01/2000` | `is before` |
| `.after` | Matches every item where the date attribute<br>is after the given date | **Format:** MM/DD/YYYY<br>e.g. `01/01/2000` | `is after` |
### Date Attributes
| Date Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `added` | Uses the date added attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_added` | Uses the date added attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| `release` | Uses the release date attribute (originally available) to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_air_date` | Uses the air date attribute (originally available) of the show's episodes to match | :x: | :heavy_check_mark: |
| `last_played` | Uses the date last played attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_last_played` | Uses the date last played attribute of the show's episodes to match | :x: | :heavy_check_mark: |
## Number Searches
Number searches must use `.gt`, `.gte`, `.lt`, or `.lte` as a modifier.
No number search can take multiple values.
### Number Modifiers
| Number Modifier | Description | Format | Plex Web UI Display |
| :--- | :--- | :---: | :---: |
| `.gt` | Matches every item where the number attribute<br>is greater then the given number | **Format:** number<br>e.g. `30`, `1995`, or `7.5` | `is greater than` |
| `.gte` | Matches every item where the number attribute<br>is greater then or equal to the given number | **Format:** number<br>e.g. `30`, `1995`, or `7.5` | N/A |
| `.lt` | Matches every item where the number attribute<br>is less then the given number | **Format:** number<br>e.g. `30`, `1995`, or `7.5` | `is less than` |
| `.lte` | Matches every item where the number attribute<br>is less then or equal to the given number | **Format:** number<br>e.g. `30`, `1995`, or `7.5` | N/A |
### Number Attributes
| Number Search | Description | Restrictions | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: | :--: |
| `duration` | Uses the duration attribute to match using minutes | minimum: `1` | :heavy_check_mark: | :x: |
| `plays` | Uses the plays attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_plays` | Uses the plays attribute of the show's episodes to match | minimum: `1` | :x: | :heavy_check_mark: |
| `critic_rating` | Uses the critic rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `audience_rating` | Uses the audience rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `user_rating` | Uses the user rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_user_rating` | Uses the user rating attribute of the show's episodes to match | `0.0` - `10.0` | :x: | :heavy_check_mark: |
| `year` | Uses the year attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_year` | Uses the year attribute of the show's episodes to match | minimum: `1` | :x: | :heavy_check_mark: |
## Boolean Searches
Boolean Searches take no modifier and can only be either `true` or `false`.
### Boolean Attributes
| Boolean Search | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `hdr` | Is HDR | :heavy_check_mark: | :heavy_check_mark: |
| `unmatched` | Is Unmatched | :heavy_check_mark: | :x: |
| `duplicate` | Is Duplicate | :heavy_check_mark: | :x: |
| `unplayed` | Is Unplayed | :heavy_check_mark: | :x: |
| `progress` | Is In Progress | :heavy_check_mark: | :x: |
| `trash` | Is Trashed | :heavy_check_mark: | :heavy_check_mark: |
| `unplayed_episodes` | Has Unplayed Episodes | :x: | :heavy_check_mark: |
| `episode_unplayed` | Has Episodes Unplayed | :x: | :heavy_check_mark: |
| `episode_duplicate` | Has Duplicate Episodes | :x: | :heavy_check_mark: |
| `episode_progress` | Has Episode Progress | :x: | :heavy_check_mark: |
| `episode_unmatched` | Has Episodes Unmatched | :x: | :heavy_check_mark: |
## Plex Search Examples
A few examples are listed below:
```yaml
collections:
Documentaries:
plex_search:
all:
genre: Documentary
```
```yaml
collections:
Dave Chappelle Comedy:
plex_search:
all:
actor: Dave Chappelle
genre: Comedy
```
```yaml
collections:
Top Action Movies:
collection_order: custom
plex_search:
all:
genre: Action
sort_by: audience_rating.desc
limit: 20
```
```yaml
collections:
90s Movies:
plex_search:
any:
year:
- 1990
- 1991
- 1992
- 1993
- 1994
- 1995
- 1996
- 1997
- 1998
- 1999
```
```yaml
collections:
90s Movies:
plex_search:
any:
decade: 1990
```
```yaml
collections:
Best 2010+ Movies:
collection_order: custom
plex_search:
all:
year.gte: 2010
sort_by: audience_rating.desc
limit: 20
```
Here's an example of an episode collection using `plex_search`.
```yaml
collections:
Top 100 Simpsons Episodes:
collection_order: custom
collection_level: episode
plex_search:
type: episodes
sort_by: audience_rating.desc
limit: 100
all:
title.ends: "Simpsons"
summary: A collection of the highest rated simpsons epsodes.
```
If you specify TMDb Person ID's using the Detail `tmdb_person` and then tell either `actor`, `director`, `producer`, or `writer` to add `tmdb`, the script will translate the TMDb Person IDs into their names and run the search on those names.
```yaml
collections:
Robin Williams:
plex_search:
all:
actor: tmdb
tmdb_person: 2157
```
```yaml
collections:
Steven Spielberg:
plex_search:
all:
director: tmdb
tmdb_person: https://www.themoviedb.org/person/488-steven-spielberg
```
```yaml
collections:
Quentin Tarantino:
plex_search:
any:
actor: tmdb
director: tmdb
producer: tmdb
writer: tmdb
tmdb_person: 138
```

@ -3,25 +3,25 @@ All the following attributes serve various functions as how the collection/playl
| Name | Attribute | Description | Allowed Values | Works with Playlists |
| :--- | :--- | :--- | :--- | :---: |
| Collection/Playlist Name | `name` | Used to specify the name off the collection/playlist in Plex as different then the mapping name. | Any String | :heavy_check_mark: |
| Template | `template` | Used to specify a template and template variables to use for this collection | [`template` mapping details](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Template-Attributes) | :heavy_check_mark: |
| Run Again | `run_again` | Used to try and add all the items missing from the collection to the collection again after the daily run <br>**Default Mode:** `false`| **boolean:** `true` or `false` | :heavy_check_mark: |
| Sync Mode | `sync_mode` | Used to change how collection builders sync with this collection<br>**Default Mode:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | `append`: Only Add Items to the Collection<br>`sync`: Add & Remove Items from the Collection | :heavy_check_mark: |
| Collection Minimum | `collection_minimum` | Minimum items that must be found to add to a collection.<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | number greater then 0 | :heavy_check_mark: |
| Delete Below Minimum | `delete_below_minimum` | Deletes the collection if below the minimum.<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Delete Not Scheduled | `delete_not_scheduled` | Deletes the collection if its skipped because its not scheduled.<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Validate Builders | `validate_builders` | When set to false the collection will not fail if one builder fails<br>**Default Mode:** `true` | **boolean:** `true` or `false` | :heavy_check_mark: |
| Template | `template` | Used to specify a template and template variables to use for this collection/playlist. | [`template` mapping details](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Templates) | :heavy_check_mark: |
| Run Again | `run_again` | Used to try and add all the missing items to the collection/playlist again after the daily run <br>**Default Mode:** `false`| **boolean:** `true` or `false` | :heavy_check_mark: |
| Sync Mode | `sync_mode` | Used to change how builders sync with this collection/playlist<br>**Default Mode:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | `append`: Only Add Items to the Collection<br>`sync`: Add & Remove Items from the Collection | :heavy_check_mark: |
| Minimum Items | `minimum_items` | Minimum items that must be found to add to a collection/playlist.<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | number greater then 0 | :heavy_check_mark: |
| Delete Below Minimum | `delete_below_minimum` | Deletes the collection/playlist if below the minimum.<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Delete Not Scheduled | `delete_not_scheduled` | Deletes the collection/playlist if its skipped because its not scheduled.<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Validate Builders | `validate_builders` | When set to false the collection/playlist will not fail if one builder fails<br>**Default Mode:** `true` | **boolean:** `true` or `false` | :heavy_check_mark: |
| Build Collection | `build_collection` | When set to false the collection won't be created but items can still be added to Radarr/Sonarr<br>**Default Mode:** `true` | **boolean:** `true` or `false` | :x: |
| Server Pre-Roll | `server_preroll` | Used to set the `Movie pre-roll video` Text box in Plex under Settings -> Extras | Any String | :heavy_check_mark: |
| Missing Only Released | `missing_only_released` | Collection Level `missing_only_released` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` |
| Only Filter Missing | `only_filter_missing` | Collection Level `only_filter_missing` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Show Filtered Items | `show_filtered` | Collection level `show_filtered` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Show Missing Items | `show_missing` | Collection level `show_missing` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Save Missing Items | `save_missing` | Collection level `save_missing` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Ignore IDs | `ignore_ids` | Collection level `ignore_ids` which is combined with the library and global `ignore_ids`<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | List or comma-separated String of TMDb/TVDb IDs | :heavy_check_mark: |
| Ignore IMDb IDs | `ignore_imdb_ids` | Collection level `ignore_imdb_ids` which is combined with the library and global `ignore_imdb_ids`<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | List or comma-separated String of IMDb IDs | :heavy_check_mark: |
| Missing Only Released | `missing_only_released` | Collection/Playlist Level `missing_only_released` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` |
| Only Filter Missing | `only_filter_missing` | Collection/Playlist Level `only_filter_missing` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Show Filtered Items | `show_filtered` | Collection/Playlist level `show_filtered` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Show Missing Items | `show_missing` | Collection/Playlist level `show_missing` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Save Missing Items | `save_missing` | Collection/Playlist level `save_missing` toggle<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | **boolean:** `true` or `false` | :heavy_check_mark: |
| Ignore IDs | `ignore_ids` | Collection/Playlist level `ignore_ids` which is combined with the library and global `ignore_ids`<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | List or comma-separated String of TMDb/TVDb IDs | :heavy_check_mark: |
| Ignore IMDb IDs | `ignore_imdb_ids` | Collection/Playlist level `ignore_imdb_ids` which is combined with the library and global `ignore_imdb_ids`<br>**Default:** [settings library value](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Settings-Attributes) | List or comma-separated String of IMDb IDs | :heavy_check_mark: |
| Name Mapping | `name_mapping` | Used to specify the folder name in the [Image Assets Directory](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Image-Asset-Directory) | Folder Name In Assets Directory | :heavy_check_mark: |
| Test Mode | `test` | When running in Test Mode (`--run-tests` [option](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Installation#run-tests)) only collections with `test: true` will be run<br>**Default:** `false` | **boolean:** `true` or `false` | :heavy_check_mark: |
| Collection/Playlist Changes Webhooks | `collection_changes_webhooks` | Used to specify a collection changes webhook for just this collection | List of webhooks | :heavy_check_mark: |
| Test Mode | `test` | When running in Test Mode (`--run-tests` [option](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Installation#run-tests)) only collections/playlists with `test: true` will be run<br>**Default:** `false` | **boolean:** `true` or `false` | :heavy_check_mark: |
| Changes Webhooks | `changes_webhooks` | Used to specify a collection/playlist changes webhook for just this collection/playlist. | List of webhooks | :heavy_check_mark: |
* **Name Mapping:** If your collection name contains characters that are not allowed in file paths (i.e. for windows `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*` cannot be in the file path), but you want them in your collection name you can use the `name_mapping` attribute to specific this collection's name in the file system.
* **Name Mapping:** If your collection/playlist name contains characters that are not allowed in file paths (i.e. for windows `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*` cannot be in the file path), but you want them in your collection name you can use the `name_mapping` attribute to specific this collection's name in the file system.
* **Server Pre-Roll:** You can run this with a [schedule](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Schedule-Detail) to change the pre-rolls automatically.

@ -12,6 +12,7 @@ settings:
asset_depth: 0
create_asset_folders: false
dimensional_asset_rename: false
download_url_assets: false
show_missing_season_assets: false
sync_mode: append
collection_minimum: 1
@ -29,6 +30,8 @@ settings:
tvdb_language: eng
ignore_ids:
ignore_imdb_ids:
playlist_sync_to_user: all
verify_ssl: true
```
| Name | Attribute | Allowed Values | Global Level | Library Level | Collection/Playlist Level |
@ -40,9 +43,11 @@ settings:
| [Asset Depth](#asset-depth) | `asset_depth` | **integer**<br>**default: 0** | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Create Asset Folders](#create-asset-folders) | `create_asset_folders` | **boolean:** true or false<br>**default: false** | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Dimensional Asset Rename](#dimensional-asset-rename) | `dimensional_asset_rename` | **boolean:** true or false<br>**default: false** | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Download URL Assets](#download-url-assets) | `download_url_assets` | **boolean:** true or false<br>**default: false** | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Show Missing Season Assets](#show-missing-season-assets) | `show_missing_season_assets` | **boolean:** true or false<br>**default: false** | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Sync Mode](#sync-mode) | `sync_mode` | `append` or `sync`<br>**default: append** | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| [Collection Minimum](#collection-minimum) | `collection_minimum` | **integer**<br>**default: 1** | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| [Default Collection Order](#default-collection-order) | `default_collection_order` | `release`: Order Collection by Release Dates<br>`alpha`: Order Collection Alphabetically<br>`custom`: Order Collection Via the Builder Order<br>[Any `plex_search` Sort Option](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Plex-Builders#sort-options) | :heavy_check_mark: | :heavy_check_mark: | :x: |
| [Minimum Items](#minimum-items) | `minimum_items` | **integer**<br>**default: 1** | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| [Delete Below Minimum](#delete-below-minimum) | `delete_below_minimum` | **boolean:** true or false<br>**default: false** | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| [Delete Not Scheduled](#delete-not-scheduled ) | `delete_not_scheduled ` | **boolean:** true or false<br>**default: false** | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| [Run Again Delay](#run-again-delay) | `run_again_delay` | **integer**<br>**default: 0** | :heavy_check_mark: | :x: | :x: |
@ -57,6 +62,8 @@ settings:
| [Ignore IDs](#ignore-ids) | `ignore_ids` | List or comma-separated String of TMDb/TVDb IDs | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| [Ignore IMDb IDs](#ignore-imdb-ids) | `ignore_imdb_ids` | List or comma-separated String of IMDb IDs | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| [Playlist Sync to User](#playlist-sync-to-user) | `playlist_sync_to_user` | `all` or List or comma-separated String of Users to sync the playlist to.<br>**default: `all`** | :heavy_check_mark: | :x: | :heavy_check_mark: |
| [Verify SSL](#verify-ssl) | `verify_ssl` | Turn SSL Verification on or off. | :heavy_check_mark: | :x: | :x: |
| [Missing Path](#missing-path) | `missing_path` | Path to missing YAML file for the library | :x: | :heavy_check_mark: | :x: |
## Cache
Will use a cached database for faster processing. The cache file is created in the same location as your config file.
@ -75,17 +82,28 @@ When using the `assets_for_all` [Library Operation](https://github.com/meisnate1
## Dimensional Asset Rename
When using `asset_folders` this will scan the folder for image files and rename the first image found that has a height greater than its width to `poster.ext` as long as an asset poster was not found and the first image found that has a width greater than its height to `background.ext` as long as an asset background was not found.
## Download URL Assets
When using `download_url_assets` if you are using `url_poster` or `url_background` in your collection config this will download the image to your asset folder if no image is found.
## Show Missing Season Assets
When searching for assets for a show if a Season poster is found then this will display all other missing Season posters.
## Sync Mode
Set the default `sync_mode`. It can be either `append` when you want to add only and `sync` when you want to add and remove from collections.
## Collection Minimum
Minimum number of items that must be found in order to update a collection.
## Default Collection Order
Sets the `collection_order` for every collection run You can use any of these options:
* `release`: Order Collection by Release Dates
* `alpha`: Order Collection Alphabetically
* `custom`: Order Collection Via the Builder Order
* [Any `plex_search` Sort Option](https://github.com/meisnate12/Plex-Meta-Manager/wiki/Plex-Builders#sort-options)
## Minimum Items
Minimum number of items that must be found in order to update a collection/playlist.
## Delete Below Minimum
When a collection is run it will be deleted if it is below the minimum specified by `collection_minimum`.
When a collection is run it will be deleted if it is below the minimum specified by `minimum_items`.
## Delete Not Scheduled
When a collection is skipped due to it not being scheduled delete it.
@ -129,3 +147,18 @@ List or comma-separated String of IMDb IDs to ignore in all collections
## Playlist Sync to User
`all` or List or comma-separated String of Users to sync the playlist to in addition to yourself. To Sync a playlist to only yourself leave `sync_to_user` blank. Defaults to `all`.
## Verify SSL
Turn SSl Verification on or off.
## Missing Path
Path where to save the missing YAML File. Default is `/config/<<library_name>>_missing.yml` where `<<library_name>>` is your library name.
* This setting can only be set under setting for each particular library.
```yaml
libraries:
Movies:
settings:
missing_path: /config/Missing/Movies.yml
```

@ -0,0 +1,159 @@
You can have the script edit the metadata of Shows, Seasons, and Episodes by adding them to the `metadata` mapping of a Metadata File.
An example of multiple metadata edits in a show library is below:
```yaml
metadata:
"Avatar: The Last Airbender":
sort_title: Avatar 01
seasons:
1:
title: "Book One: Water"
summary: >-
After a lapse of 100 years, the Avatar-spiritual master of the elements-has returned. And just in
the nick of time. The Four Nations (Water, Earth, Fire, and Air) have become unbalanced. The Fire
Nation wants to rule the world, and its first conquest will be the Northern Water Tribe. It's up to
a 12-year-old Airbender named Aang to find a way to stop it. Join Aang, Katara, Sokka, Momo, and
Appa as they head north on the adventure of a lifetime.
episodes:
1:
rating: 9.1
2:
title: "Book Two: Earth"
summary: >-
Avatar Aang continues his quest to master the four elements before the end of summer. Together with
Katara, Sokka, Momo, and Appa, he journeys across the Earth Kingdom in search of an Earthbending
mentor. Along the way, he confronts Princess Azula, treacherous daughter of Firelord Ozai and
sister to Prince Zuko. More powerful than her brother, Azula will stop nothing to defeat the Avatar.
But Aang and the gang find plenty of Earth Kingdom allies to help them along the way. From the swamps
of the South to the Earth King's palace, Avatar: Book 2 is an adventure like no other.
3:
title: "Book Three: Fire"
summary: >-
Having survived the terrible battle with Azula, Aang faces new challenges as he and his brave
friends secretly enter the Fire Nation. Their quest is to find and defeat Firelord Ozai. Along
the way, they discover that Ozai has plans of his own. The leader of the Fire Nation intends to
use the massive power of Sozin's comet to spread his dominion permanently across the four nations.
Short on time, Aang has a lot of bending to learn and no master to help him learn it. However, his
friends are there to help, and he finds unexpected allies deep in the heart of the Fire Nation. In
the spectacular four-part conclusion, Aang must fulfill his destiny and become a fully realized
Avatar, or watch the world go up in smoke.
episodes:
21:
summary: The Epic Series Final of Avatar The Last Airbender
"Avatar: The Legend of Korra":
sort_title: Avatar 02
alt_title: The Legend of Korra
original_title: The Legend of Korra
seasons:
1:
title: "Book One: Air"
2:
title: "Book Two: Spirits"
3:
title: "Book Three: Change"
4:
title: "Book Four: Balance"
```
## Shows
Each show is defined by the mapping name which must be the same as the show name in the library unless an `alt_title` is specified.
### Seasons
To edit the metadata of a particular Season in a Show use the `seasons` attribute on its show.
The mapping name is the season number (use 0 for specials) or the season name.
### Episodes
To edit the metadata of a particular Episode in a Season use the `episodes` attribute on its season.
The mapping name is the episode number in that season or the title of the episode.
## Metadata Edits
The available attributes for editing shows, seasons, and episodes are as follows
### Special Attributes
| Name | Attribute | Allowed Values | Shows | Seasons | Episodes |
| :--- | :--- | :--- | :---: | :---: | :---: |
| Title | `title` | Title if different from the mapping value useful when you have multiple shows with the same name | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Alternative Title | `alt_title` | Alternative title to look for | :heavy_check_mark: | :x: | :x: |
| Year | `year` | Year of show for better identification | :heavy_check_mark: | :x: | :x: |
| TMDb Show ID | `tmdb_show` | TMDb Show ID to use for metadata useful for miniseries that have been compiled into a movie | :heavy_check_mark: | :x: | :x: |
| TMDb Movie ID | `tmdb_movie` | TMDb Movie ID to use for metadata useful for movies that have been split into segments | :heavy_check_mark: | :x: | :x: |
| Seasons | `seasons` | Mapping to define Seasons | :heavy_check_mark: | :x: | :x: |
| Episodes | `episodes` | Mapping to define Episodes | :x: | :heavy_check_mark: | :x: |
* YAML files cannot have two items with the same mapping name so if you have two shows with the same name you would change the mapping values to whatever you want. Then use the `title` attribute to specify the real title and use the `year` attribute to specify which of the multiple shows to choose.
```yaml
metadata:
Godzilla1:
title: Godzilla
year: 1954
content_rating: R
Godzilla2:
title: Godzilla
year: 1998
content_rating: PG-13
```
* If you know of another Title your show might exist under, but you want it titled differently you can use `alt_title` to specify another title to look under and then be changed to the mapping name. For Example TMDb uses the name `The Legend of Korra`, but I want it as `Avatar: The Legend of Korra` (Which must be surrounded by quotes since it uses the character `:`):
```yaml
metadata:
"Avatar: The Legend of Korra":
alt_title: The Legend of Korra
```
This would change the name of the TMDb default `The Legend of Korra` to `Avatar: The Legend of Korra` and would not mess up any subsequent runs.
### General Attributes
| Name | Attribute | Allowed Values | Shows | Seasons | Episodes |
| :--- | :--- | :--- | :---: | :---: | :---: |
| Sort Title | `sort_title` | Text to change Sort Title | :heavy_check_mark: | :x: | :heavy_check_mark: |
| Original Title | `original_title` | Text to change Original Title | :heavy_check_mark: | :x: | :heavy_check_mark: |
| Originally Available | `originally_available` | Date to change Originally Available<br>**Format:** YYYY-MM-DD | :heavy_check_mark: | :x: | :heavy_check_mark: |
| Content Rating | `content_rating` | Text to change Content Rating | :heavy_check_mark: | :x: | :x: |
| Rating | `rating` | Number to change Rating | :heavy_check_mark:| :x: | :heavy_check_mark: |
| Studio | `studio` | Text to change Studio | :heavy_check_mark: | :x: | :x: |
| Tagline | `tagline` | Text to change Tagline | :heavy_check_mark:| :x: | :x: |
| Summary | `summary` | Text to change Summary | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
### Tag Attributes
You can add `.remove` to any tag attribute to only remove those tags i.e. `genre.remove`.
You can add `.sync` to any tag attribute to sync all tags vs just appending the new ones i.e. `genre.sync`.
| Name | Attribute | Allowed Values | Shows | Seasons | Episodes |
| :--- | :--- | :--- | :---: | :---: | :---: |
| Director | `director` | List or comma-separated text of each Director Tag | :x: | :x: | :heavy_check_mark: |
| Genre | `genre` | List or comma-separated text of each Genre Tag | :heavy_check_mark: | :x: | :x: |
| Writer | `writer` | List or comma-separated text of each Writer Tag | :x: | :x: | :heavy_check_mark: |
| Collection | `collection` | List or comma-separated text of each Collection Tag | :heavy_check_mark: | :x: | :x: |
| Label | `label` | List or comma-separated text of each Label Tag | :heavy_check_mark: | :x: | :x: |
## Image Attributes
| Name | Attribute | Description | Allowed Values | Shows | Seasons | Episodes |
| :--- | :--- | :--- | :--- | :---: | :---: | :---: |
| URL Poster | `url_poster` | Used to change the show's poster to the URL | URL of image publicly available on the internet | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| File Poster | `file_poster` | Used to change the show's poster to the image in the file system | Path to image in the file system | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| URL Background | `url_background` | Use to change the show's background to the URL | URL of image publicly available on the internet | :heavy_check_mark: | :heavy_check_mark: | :x: |
| File Background | `file_background` | Used to change the show's background to the image in the file system | Path to image in the file system | :heavy_check_mark: | :heavy_check_mark: | :x: |
### Advance Attributes
All these attributes only work with Shows.
| Name | Attribute | Allowed Values |
| :--- | :--- | :--- |
| Episode Sorting | `episode_sorting` | `default`: Library default<br>`oldest`: Oldest first<br>`newest`: Newest first |
| Keep Episodes | `keep_episodes` | `all`: All episodes<br>`5_latest`: 5 latest episodes<br>`3_latest`: 3 latest episodes<br>`latest`: Latest episodes<br>`past_3`: Episodes added in the past 3 days<br>`past_7`: Episodes added in the past 7 days<br>`past_30`: Episodes added in the past 30 days |
| Delete Episodes | `delete_episodes` | `never`: Never<br>`day`: After a day<br>`week`: After a week<br>`refresh`: On next refresh |
| Season Display | `season_display` | `default`: Library default<br>`show`: Show<br>`hide`: Hide |
| Episode Ordering | `episode_ordering` | `default`: Library default<br>`tmdb_aired`*: The Movie Database (Aired)<br>`tvdb_aired`: TheTVDB (Aired)<br>`tvdb_dvd`: TheTVDB (DVD)<br>`tvdb_absolute`: TheTVDB (Absolute) |
| Metadata Language* | `metadata_language` | `default`, `ar-SA`, `ca-ES`, `cs-CZ`, `da-DK`, `de-DE`, `el-GR`, `en-AU`, `en-CA`, `en-GB`, `en-US`, `es-ES`, `es-MX`, `et-EE`, `fa-IR`, `fi-FI`, `fr-CA`, `fr-FR`, `he-IL`, `hi-IN`, `hu-HU`, `id-ID`, `it-IT`, `ja-JP`, `ko-KR`, `lt-LT`, `lv-LV`, `nb-NO`, `nl-NL`, `pl-PL`, `pt-BR`, `pt-PT`, `ro-RO`, `ru-RU`, `sk-SK`, `sv-SE`, `th-TH`, `tr-TR`, `uk-UA`, `vi-VN`, `zh-CN`, `zh-HK`, `zh-TW` |
| Use Original Title* | `use_original_title` | `default`: Library default<br>`no`: No<br>`yes`: Yes |
\* Must be using the **New Plex TV Agent**

@ -27,29 +27,40 @@ There are a couple other attributes you can have at the top level only along wit
| Special Option | Attribute | Description | Default |
| :--- | :--- | :--- | :---: |
| Type | `type` | The Type of items inside this collection<br>**Options**: `movies`, `shows`, `seasons`, and `episodes` | `movies` for Movies Libraries and `shows` for Show Libraries |
| Type | `type` | The Type of items inside this collection/playlist<br>**Options**: `movies`, `shows`, `seasons`, `episodes`, `artists`, `albums`, or `tracks` | `movies` for Movies Libraries, `shows` for Show Libraries, and `artists` for Music Libraries |
| Limit | `limit` | The max number of item for the filter | all |
| Sort By | `sort_by` | This will control how the filter is sorted in your library. You can use any sort options for your search type in the [Sorts Table](#sort-options) | `random` |
| Validate | `validate` | Determines if a collection will fail on a validation error<br>**Options**: `true` or `false` | `true` |
| Sort By | `sort_by` | This will control how the filter is sorted in your library. You can use any sort options for your filter type in the [Sorts Options Table](#sort-options) | `random` |
| Validate | `validate` | Determines if a collection/playlist will fail on a validation error<br>**Options**: `true` or `false` | `true` |
## Sort Options
| Sort Option | Description | Movies | Shows | Seasons | Episodes |
| :--- | :--- | :---: | :---: | :---: | :---: |
| `title.asc`/`title.desc` | Sort by Title | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `season.asc`/`season.desc` | Sort by Season | :x: | :x: | :heavy_check_mark: | :x: |
| `show.asc`/`show.desc` | Sort by Show | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| `year.asc`/`year.desc` | Sort by Year | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `release.asc`/<br>`release.desc` | Sort by Release Date (Originally Available) | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `critic_rating.asc`/<br>`critic_rating.desc` | Sort by Critic Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `audience_rating.asc`/<br>`audience_rating.desc` | Sort by Audience Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: |
| `user_rating.asc`/<br>`user_rating.desc` | Sort by User Rating | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating.asc`/<br>`content_rating.desc` | Sort by Content Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: |
| `duration.asc`/`duration.desc` | Sort by Duration | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `plays.asc`/`plays.desc` | Sort by Number of Plays | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `added.asc`/`added.desc` | Sort by Date Added | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `episode_added.asc`/<br>`episode_added.desc` | Sort by Last Episode Date Added | :x: | :heavy_check_mark: | :x: | :x: |
| `random` | Sort by Random | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Sort Option | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Tracks |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| `title.asc`/`title.desc` | Sort by Title | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `season.asc`/`season.desc` | Sort by Season | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: |
| `show.asc`/`show.desc` | Sort by Show | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: |
| `album_artist.asc`/`album_artist.desc` | Sort by Album Artist | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| `artist.asc`/`artist.desc` | Sort by Artist | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `album.asc`/`album.desc` | Sort by Album | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `year.asc`/`year.desc` | Sort by Year | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `release.asc`/<br>`release.desc` | Sort by Release Date (Originally Available) | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `critic_rating.asc`/<br>`critic_rating.desc` | Sort by Critic Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: |
| `audience_rating.asc`/<br>`audience_rating.desc` | Sort by Audience Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `user_rating.asc`/<br>`user_rating.desc` | Sort by User Rating | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating.asc`/<br>`content_rating.desc` | Sort by Content Rating | :heavy_check_mark: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `duration.asc`/`duration.desc` | Sort by Duration | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `progress.asc`/`progress.desc` | Sort by Progress | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `played.asc`/`played.desc` | Sort by Date Last Played | :x: | :x: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `plays.asc`/`plays.desc` | Sort by Number of Plays | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `unplayed.asc`/<br>`unplayed.desc` | Sort by Unplayed | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `episode_added.asc`/<br>`episode_added.desc` | Sort by Last Episode Date Added | :x: | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: |
| `added.asc`/`added.desc` | Sort by Date Added | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| `viewed.asc`/`viewed.desc` | Sort by Date Last Viewed | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `rated.asc`/`rated.desc` | Sort by Date Last Rated | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `popularity.asc`/`popularity.desc` | Sort by Popularity | :x: | :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: |
| `resolution.asc`/`resolution.desc` | Sort by Resolution | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| `bitrate.asc`/`bitrate.desc` | Sort by Bitrate | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: |
| `random` | Sort by Random | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
## Filters
@ -73,11 +84,15 @@ String filter can take multiple values **only as a list**.
### String Attributes
| String Filter | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `title` | Uses the title attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_title` | Uses the title attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| `studio` | Uses the studio attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| String Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `title` | Uses the title attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_title` | Uses the title attribute of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `studio` | Uses the studio attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `artist_title` | Uses the Artist's Title attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_title` | Uses the Album's Title attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_title` | Uses the Track's Title attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_record_label` | Uses the Album's Record Label attribute to match | :x: | :x: | :heavy_check_mark: |
## Tag Filters
Tag filters can be used with either no modifier or with `.not` except for `decade` and `resolution` which can only be used with no modifier.
@ -93,24 +108,39 @@ Tag filter can take multiple values as a **list or a comma-separated string**.
### Tag Attributes
| Tag Filter | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `actor` | Uses the actor tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `audio_language` | Uses the audio language tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `collection` | Uses the collection tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `content_rating` | Uses the content rating tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `country` | Uses the country tags to match | :heavy_check_mark: | :x: |
| `decade` | Uses the year tag to match the decade | :heavy_check_mark: | :x: |
| `director` | Uses the director tags to match | :heavy_check_mark: | :x: |
| `genre` | Uses the genre tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `label` | Uses the label tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `network` | Uses the network tags to match<br>**Only works with the New Plex TV Agent** | :x: | :heavy_check_mark: |
| `producer` | Uses the actor tags to match | :heavy_check_mark: | :x: |
| `resolution` | Uses the resolution tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `subtitle_language` | Uses the subtitle language tags to match | :heavy_check_mark: | :heavy_check_mark: |
| `writer` | Uses the writer tags to match | :heavy_check_mark: | :x: |
| `year` | Uses the year tag to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_year` | Uses the year tag to match | :x: | :heavy_check_mark: |
| Tag Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `actor` | Uses the actor tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `audio_language` | Uses the audio language tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `collection` | Uses the collection tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `content_rating` | Uses the content rating tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `country` | Uses the country tags to match | :heavy_check_mark: | :x: | :x: |
| `decade` | Uses the year tag to match the decade | :heavy_check_mark: | :x: | :x: |
| `director` | Uses the director tags to match | :heavy_check_mark: | :x: | :x: |
| `genre` | Uses the genre tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `label` | Uses the label tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `network` | Uses the network tags to match<br>**Only works with the New Plex TV Agent** | :x: | :heavy_check_mark: | :x: |
| `producer` | Uses the actor tags to match | :heavy_check_mark: | :x: | :x: |
| `resolution` | Uses the resolution tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `subtitle_language` | Uses the subtitle language tags to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `writer` | Uses the writer tags to match | :heavy_check_mark: | :x: | :x: |
| `year` | Uses the year tag to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_year` | Uses the year tag to match | :x: | :heavy_check_mark: | :x: |
| `artist_genre` | Uses the Artist's Genre attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_collection` | Uses the Artist's Collection attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_country` | Uses the Artist's Country attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_mood` | Uses the Artist's Mood attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_style` | Uses the Artist's Style attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_genre` | Uses the Album's Genre attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_mood` | Uses the Album's Mood attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_style` | Uses the Album's Style attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_format` | Uses the Album's Format attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_type` | Uses the Album's Type attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_collection` | Uses the Album's Collection attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_source` | Uses the Album's Source attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_label` | Uses the Album's Label attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_mood` | Uses the Track's Mood attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_source` | Uses the Track's Style attribute to match | :x: | :x: | :heavy_check_mark: |
## Date Filters
Date filters can be used with either no modifier or with `.not`, `.before`, or `.after`.
@ -128,14 +158,23 @@ No date filter can take multiple values.
### Date Attributes
| Date Filter | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `added` | Uses the date added attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_added` | Uses the date added attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| `release` | Uses the release date attribute (originally available) to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_air_date` | Uses the air date attribute (originally available) of the show's episodes to match | :x: | :heavy_check_mark: |
| `last_played` | Uses the date last played attribute to match | :heavy_check_mark: | :heavy_check_mark: |
| `episode_last_played` | Uses the date last played attribute of the show's episodes to match | :x: | :heavy_check_mark: |
| Date Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `added` | Uses the date added attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_added` | Uses the date added attribute of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `release` | Uses the release date attribute (originally available) to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_air_date` | Uses the air date attribute (originally available) of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `last_played` | Uses the date last played attribute to match | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_last_played` | Uses the date last played attribute of the show's episodes to match | :x: | :heavy_check_mark: | :x: |
| `artist_added` | Uses the Artist's date added attribute to match | :x: | :x: | :heavy_check_mark: |
| `artist_last_played` | Uses the Artist's last played attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_last_played` | Uses the Album's last played attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_added` | Uses the Album's date added attribute to match | :x: | :x: | :heavy_check_mark: |
| `album_released` | Uses the Album's release date attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_last_played` | Uses the Track's date last played attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_last_skipped` | Uses the Track's date last skipped attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_last_rated` | Uses the Track's date last rated attribute to match | :x: | :x: | :heavy_check_mark: |
| `track_added` | Uses the Track's date added attribute to match | :x: | :x: | :heavy_check_mark: |
## Number Filters
Number filters must use `.gt`, `.gte`, `.lt`, or `.lte` as a modifier.
@ -153,36 +192,48 @@ No number filter can take multiple values.
### Number Attributes
| Number Filter | Description | Restrictions | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: | :--: |
| `duration` | Uses the duration attribute to match using minutes | minimum: `1` | :heavy_check_mark: | :x: |
| `plays` | Uses the plays attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_plays` | Uses the plays attribute of the show's episodes to match | minimum: `1` | :x: | :heavy_check_mark: |
| `critic_rating` | Uses the critic rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `audience_rating` | Uses the audience rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `user_rating` | Uses the user rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_user_rating` | Uses the user rating attribute of the show's episodes to match | `0.0` - `10.0` | :x: | :heavy_check_mark: |
| `year` | Uses the year attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: |
| `episode_year` | Uses the year attribute of the show's episodes to match | minimum: `1` | :x: | :heavy_check_mark: |
| Number Search | Description | Restrictions | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `duration` | Uses the duration attribute to match using minutes | minimum: `1` | :heavy_check_mark: | :x: | :x: |
| `plays` | Uses the plays attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_plays` | Uses the Episode's plays attribute to match | minimum: `1` | :x: | :heavy_check_mark: | :x: |
| `critic_rating` | Uses the critic rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `audience_rating` | Uses the audience rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `user_rating` | Uses the user rating attribute to match | `0.0` - `10.0` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_user_rating` | Uses the user rating attribute of the show's episodes to match | `0.0` - `10.0` | :x: | :heavy_check_mark: | :x: |
| `year` | Uses the year attribute to match | minimum: `1` | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `episode_year` | Uses the Episode's year attribute to match | minimum: `1` | :x: | :heavy_check_mark: | :x: |
| `album_year` | Uses the Album's year attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `album_decade` | Uses the Album's decade attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `album_plays` | Uses the Album's plays attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `track_plays` | Uses the Track's plays attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `track_skips` | Uses the Track's skips attribute to match | minimum: `1` | :x: | :x: | :heavy_check_mark: |
| `artist_user_rating` | Uses the Artist's user rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
| `album_user_rating` | Uses the Album's user rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
| `album_critic_rating` | Uses the Album's critic rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
| `track_user_rating` | Uses the Track's user rating attribute to match | `0.0` - `10.0` | :x: | :x: | :heavy_check_mark: |
## Boolean Filters
Boolean Filters take no modifier and can only be either `true` or `false`.
### Boolean Attributes
| Boolean Filter | Description | Movie<br>Libraries | Show<br>Libraries |
| :--- | :--- | :---: | :---: |
| `hdr` | Is HDR | :heavy_check_mark: | :heavy_check_mark: |
| `unmatched` | Is Unmatched | :heavy_check_mark: | :x: |
| `duplicate` | Is Duplicate | :heavy_check_mark: | :x: |
| `unplayed` | Is Unplayed | :heavy_check_mark: | :x: |
| `progress` | Is In Progress | :heavy_check_mark: | :x: |
| `trash` | Is Trashed | :heavy_check_mark: | :heavy_check_mark: |
| `unplayed_episodes` | Has Unplayed Episodes | :x: | :heavy_check_mark: |
| `episode_unplayed` | Has Episodes Unplayed | :x: | :heavy_check_mark: |
| `episode_duplicate` | Has Duplicate Episodes | :x: | :heavy_check_mark: |
| `episode_progress` | Has Episode Progress | :x: | :heavy_check_mark: |
| `episode_unmatched` | Has Episodes Unmatched | :x: | :heavy_check_mark: |
| Boolean Search | Description | Movie<br>Libraries | Show<br>Libraries | Music<br>Libraries |
| :--- | :--- | :---: | :---: | :---: |
| `hdr` | Is HDR | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `unmatched` | Is Unmatched | :heavy_check_mark: | :x: | :x: |
| `duplicate` | Is Duplicate | :heavy_check_mark: | :x: | :x: |
| `unplayed` | Is Unplayed | :heavy_check_mark: | :x: | :x: |
| `progress` | Is In Progress | :heavy_check_mark: | :x: | :x: |
| `trash` | Is Trashed | :heavy_check_mark: | :heavy_check_mark: | :x: |
| `unplayed_episodes` | Has Unplayed Episodes | :x: | :heavy_check_mark: | :x: |
| `episode_unplayed` | Has Episodes Unplayed | :x: | :heavy_check_mark: | :x: |
| `episode_duplicate` | Has Duplicate Episodes | :x: | :heavy_check_mark: | :x: |
| `episode_progress` | Has Episode Progress | :x: | :heavy_check_mark: | :x: |
| `episode_unmatched` | Has Episodes Unmatched | :x: | :heavy_check_mark: | :x: |
| `artist_unmatched` | Is Artist's Unmatched | :x: | :x: | :heavy_check_mark: |
| `album_unmatched` | Is Album's Unmatched | :x: | :x: | :heavy_check_mark: |
| `track_trash` | Is Track Trashed | :x: | :x: | :heavy_check_mark: |
## Smart Filter Examples
@ -246,7 +297,7 @@ collections:
limit: 20
```
If you specify TMDb Person ID's using the Detail `tmdb_person` and then tell either `actor`, `director`, `producer`, or `writer` to add `tmdb`, the script will translate the TMDb Person IDs into their names and run the search on those names.
If you specify TMDb Person ID's using the Detail `tmdb_person` and then tell either `actor`, `director`, `producer`, or `writer` to add `tmdb`, the script will translate the TMDb Person IDs into their names and run the filter on those names.
```yaml
collections:

@ -28,7 +28,7 @@ collections:
There are three attributes unique to `templates`, `default`, `optional`, and `move_prefix`.
* `default` can set default values for template variables to be used if they're not specified in the call.
* `optional` can specify variables that if not specified on the template call will cause any attribute using one of those variables to be ignored in the template.
* `optional` can specify variables that if not specified on the template call will cause any attribute using one of those variables to be ignored in the template. You can make any template variable optional per collection by setting it to `null`.
* `move_prefix` can be given a list or comma-separated string of prefixes to move to the end of the collection/playlist name for sorting.
i.e. If you have `move_prefix: The` and a collection is called `The Avengers` then `<<collection_name>>` is replaced with `Avengers, The` instead of `The Avengers` for that collection.

@ -20,11 +20,13 @@
- [Sonarr Attributes](Sonarr-Attributes)
- [Trakt Attributes](Trakt-Attributes)
- [MyAnimeList Attributes](MyAnimeList-Attributes)
- [Metadata and Playlist File](Metadata-and-Playlist-File)
- [Metadata Attributes](Metadata-Attributes)
- [Seasons Attributes](Seasons-Attributes)
- [Episodes Attributes](Episodes-Attributes)
- [Template Attributes](Template-Attributes)
- [Metadata and Playlist Files](Metadata-and-Playlist-Files)
- Metadata
- [Movies Metadata](Movies-Metadata)
- [Shows Metadata](Shows-Metadata)
- [Artists Metadata](Artists-Metadata)
- [Templates](Templates)
- [Filters](Filters)
- Builders
- [Plex Builders](Plex-Builders)
- [Smart Builders](Smart-Builders)
@ -46,5 +48,4 @@
- [Image Overlay Detail](Image-Overlay-Detail)
- [Metadata Details](Metadata-Details)
- [Arr Details](Arr-Details)
- [Filters](Filters)
- [Acknowledgements](Acknowledgements)

Before

Width:  |  Height:  |  Size: 265 KiB

After

Width:  |  Height:  |  Size: 265 KiB

Loading…
Cancel
Save