Merge remote-tracking branch 'meisnate12/nightly' into nightly

This commit is contained in:
bullmoose20 2024-02-03 15:27:16 -05:00
commit fac8c7f399
30 changed files with 152 additions and 64 deletions

View file

@ -1 +1 @@
1.20.0-develop24 1.20.0-develop29

View file

@ -596,6 +596,7 @@ dynamic_collections:
- Haoliners Huimeng Animation - Haoliners Huimeng Animation
- Haoliners Animation - Haoliners Animation
Illumination Entertainment: Illumination Entertainment:
- Illumination
- Illumination Films - Illumination Films
J.C.Staff: J.C.Staff:
- J.C. Staff - J.C. Staff

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -72,12 +72,6 @@ vars:
v1-4: &v1-4 {vertical_offset: 198} v1-4: &v1-4 {vertical_offset: 198}
v1-5: &v1-5 {vertical_offset: 259} v1-5: &v1-5 {vertical_offset: 259}
v0-1: &v0-1 {vertical_offset: -122}
v0-2: &v0-2 {vertical_offset: -61}
v0-3: &v0-3 {vertical_offset: 0}
v0-4: &v0-4 {vertical_offset: 61}
v0-5: &v0-5 {vertical_offset: 122}
v2-1: &v2-1 {vertical_offset: 150} v2-1: &v2-1 {vertical_offset: 150}
v2-2: &v2-2 {vertical_offset: 211} v2-2: &v2-2 {vertical_offset: 211}
v2-3: &v2-3 {vertical_offset: 272} v2-3: &v2-3 {vertical_offset: 272}
@ -90,6 +84,24 @@ vars:
v3-4: &v3-4 {vertical_offset: 406} v3-4: &v3-4 {vertical_offset: 406}
v3-5: &v3-5 {vertical_offset: 467} v3-5: &v3-5 {vertical_offset: 467}
vct-1: &vct-1 {vertical_offset: -244}
vct-2: &vct-2 {vertical_offset: -183}
vct-3: &vct-3 {vertical_offset: -122}
vct-4: &vct-4 {vertical_offset: -61}
vct-5: &vct-5 {vertical_offset: 0}
vc-1: &vc-1 {vertical_offset: -122}
vc-2: &vc-2 {vertical_offset: -61}
vc-3: &vc-3 {vertical_offset: 0}
vc-4: &vc-4 {vertical_offset: 61}
vc-5: &vc-5 {vertical_offset: 122}
vcb-1: &vcb-1 {vertical_offset: 0}
vcb-2: &vcb-2 {vertical_offset: 61}
vcb-3: &vcb-3 {vertical_offset: 122}
vcb-4: &vcb-4 {vertical_offset: 183}
vcb-5: &vcb-5 {vertical_offset: 244}
vc-c: &vc-c {vertical_offset: 0} vc-c: &vc-c {vertical_offset: 0}
vc-t: &vc-t {vertical_offset: -30} vc-t: &vc-t {vertical_offset: -30}
vc-b: &vc-b {vertical_offset: 30} vc-b: &vc-b {vertical_offset: 30}
@ -155,29 +167,29 @@ queues:
vertical_top3_right2: [<<: [*top_right, *v3-1, *h1-2], *v3-2, *v3-3, *v3-4, *v3-5] vertical_top3_right2: [<<: [*top_right, *v3-1, *h1-2], *v3-2, *v3-3, *v3-4, *v3-5]
vertical_top3_right: [<<: [*top_right, *v3-1, *h1-1], *v3-2, *v3-3, *v3-4, *v3-5] vertical_top3_right: [<<: [*top_right, *v3-1, *h1-1], *v3-2, *v3-3, *v3-4, *v3-5]
vertical_center_top_left: [<<: [*center_left, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_top_left: [<<: [*center_left, *vct-1, *h1-1], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_top_left2: [<<: [*center_left, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_top_left2: [<<: [*center_left, *vct-1, *h1-2], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_top_center_left: [<<: [*center_center, *v0-1, *hc-l], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_top_center_left: [<<: [*center_center, *vct-1, *hc-l], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_top_center: [<<: [*center_center, *v0-1, *hc-c], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_top_center: [<<: [*center_center, *vct-1, *hc-c], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_top_center_right: [<<: [*center_center, *v0-1, *hc-r], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_top_center_right: [<<: [*center_center, *vct-1, *hc-r], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_top_right2: [<<: [*center_right, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_top_right2: [<<: [*center_right, *vct-1, *h1-2], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_top_right: [<<: [*center_right, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_top_right: [<<: [*center_right, *vct-1, *h1-1], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_left: [<<: [*center_left, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_left: [<<: [*center_left, *vc-1, *h1-1], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_left2: [<<: [*center_left, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_left2: [<<: [*center_left, *vc-1, *h1-2], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_center_left: [<<: [*center_center, *v0-1, *hc-l], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_center_left: [<<: [*center_center, *vc-1, *hc-l], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_center: [<<: [*center_center, *v0-1, *hc-c], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_center: [<<: [*center_center, *vc-1, *hc-c], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_center_right: [<<: [*center_center, *v0-1, *hc-r], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_center_right: [<<: [*center_center, *vc-1, *hc-r], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_right2: [<<: [*center_right, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_right2: [<<: [*center_right, *vc-1, *h1-2], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_right: [<<: [*center_right, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_right: [<<: [*center_right, *vc-1, *h1-1], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_bottom_left: [<<: [*center_left, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_bottom_left: [<<: [*center_left, *vcb-1, *h1-1], *vcb-2, *vcb-3, *vcb-4, *vcb-5]
vertical_center_bottom_left2: [<<: [*center_left, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_bottom_left2: [<<: [*center_left, *vcb-1, *h1-2], *vcb-2, *vcb-3, *vcb-4, *vcb-5]
vertical_center_bottom_center_left: [<<: [*center_center, *v0-1, *hc-l], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_bottom_center_left: [<<: [*center_center, *vcb-1, *hc-l], *vcb-2, *vcb-3, *vcb-4, *vcb-5]
vertical_center_bottom_center: [<<: [*center_center, *v0-1, *hc-c], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_bottom_center: [<<: [*center_center, *vcb-1, *hc-c], *vcb-2, *vcb-3, *vcb-4, *vcb-5]
vertical_center_bottom_center_right: [<<: [*center_center, *v0-1, *hc-r], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_bottom_center_right: [<<: [*center_center, *vcb-1, *hc-r], *vcb-2, *vcb-3, *vcb-4, *vcb-5]
vertical_center_bottom_right2: [<<: [*center_right, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_bottom_right2: [<<: [*center_right, *vcb-1, *h1-2], *vcb-2, *vcb-3, *vcb-4, *vcb-5]
vertical_center_bottom_right: [<<: [*center_right, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5] vertical_center_bottom_right: [<<: [*center_right, *vcb-1, *h1-1], *vcb-2, *vcb-3, *vcb-4, *vcb-5]
vertical_bottom3_left: [<<: [*bottom_left, *v3-1, *h1-1], *v3-2, *v3-3, *v3-4, *v3-5] vertical_bottom3_left: [<<: [*bottom_left, *v3-1, *h1-1], *v3-2, *v3-3, *v3-4, *v3-5]
vertical_bottom3_left2: [<<: [*bottom_left, *v3-1, *h1-2], *v3-2, *v3-3, *v3-4, *v3-5] vertical_bottom3_left2: [<<: [*bottom_left, *v3-1, *h1-2], *v3-2, *v3-3, *v3-4, *v3-5]

View file

@ -69,6 +69,10 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
7mate:
variables: { weight: 10}
template: [name: standard, name: networks]
ABC: ABC:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, {name: networks, search: [ABC, ABC.com]}] template: [name: standard, {name: networks, search: [ABC, ABC.com]}]
@ -125,6 +129,10 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, {name: networks, search: [Animal Planet, Animal Planet Brasil, Animal Planet Deutschland]}] template: [name: standard, {name: networks, search: [Animal Planet, Animal Planet Brasil, Animal Planet Deutschland]}]
Angel Studios:
variables: { weight: 10}
template: [name: standard, {name: networks, search: [Angel Studios, VidAngel]}]
Antena 3: Antena 3:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
@ -565,6 +573,10 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
Kanal 5:
variables: { weight: 10}
template: [name: standard, name: networks]
KBS2: KBS2:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
@ -777,6 +789,10 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
Seven Network:
variables: { weight: 10}
template: [name: standard, name: networks]
Shahid: Shahid:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
@ -837,6 +853,14 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, {name: networks, search: [Sundance TV, SundanceTV]}] template: [name: standard, {name: networks, search: [Sundance TV, SundanceTV]}]
SVT:
variables: { weight: 10}
template: [name: standard, name: networks]
SVT Play:
variables: { weight: 10}
template: [name: standard, name: networks]
SVT1: SVT1:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
@ -885,6 +909,10 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, {name: networks, search: [The CW, CW seed]}] template: [name: standard, {name: networks, search: [The CW, CW seed]}]
The Daily Wire:
variables: { weight: 10}
template: [name: standard, name: networks]
The Roku Channel: The Roku Channel:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
@ -945,6 +973,10 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
TV4 Play:
variables: { weight: 10}
template: [name: standard, name: networks]
TVB Jade: TVB Jade:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]

View file

@ -980,7 +980,7 @@ overlays:
template: [name: standard, name: studios] template: [name: standard, name: studios]
Illumination Entertainment: Illumination Entertainment:
template: [name: standard, {name: studios, search: [Illumination Entertainment, Illumination Films]}] template: [name: standard, {name: studios, search: [Illumination, Illumination Entertainment, Illumination Films]}]
Imagin: Imagin:
template: [name: standard, name: studios] template: [name: standard, name: studios]

View file

@ -40,6 +40,7 @@ dynamic_collections:
default: true default: true
include: include:
- "#0" - "#0"
- 7mate
- ABC - ABC
- ABC Family - ABC Family
- ABC Kids - ABC Kids
@ -54,6 +55,7 @@ dynamic_collections:
- AMC - AMC
- AMC+ - AMC+
- Animal Planet - Animal Planet
- Angel Studios
- Antena 3 - Antena 3
- Apple TV+ - Apple TV+
- ARD - ARD
@ -166,6 +168,7 @@ dynamic_collections:
- joyn - joyn
- JTBC - JTBC
- Kan 11 - Kan 11
- Kanal 5
- KBS2 - KBS2
- Kids WB - Kids WB
- La 1 - La 1
@ -219,6 +222,7 @@ dynamic_collections:
- SAT.1 - SAT.1
- SBS - SBS
- Science - Science
- Seven Network
- Shahid - Shahid
- Showcase - Showcase
- Showmax - Showmax
@ -234,6 +238,8 @@ dynamic_collections:
- Starz - Starz
- STAR+ - STAR+
- Sundance TV - Sundance TV
- SVT
- SVT Play
- SVT1 - SVT1
- Syfy - Syfy
- Syndication - Syndication
@ -246,6 +252,7 @@ dynamic_collections:
- Tencent Video - Tencent Video
- TF1 - TF1
- The CW - The CW
- The Daily Wire
- The Roku Channel - The Roku Channel
- The WB - The WB
- TLC - TLC
@ -261,6 +268,7 @@ dynamic_collections:
- TV Tokyo - TV Tokyo
- TV3 - TV3
- TV4 - TV4
- TV4 Play
- TVB Jade - TVB Jade
- tving - tving
- tvN - tvN
@ -306,6 +314,8 @@ dynamic_collections:
Animal Planet: Animal Planet:
- Animal Planet Brasil - Animal Planet Brasil
- Animal Planet Deutschland - Animal Planet Deutschland
Angel Studios:
- VidAngel
BET: BET:
- BET Her - BET Her
Canal+: Canal+:

View file

@ -58,10 +58,10 @@ work. Any value not specified will use its default value if it has one if not it
| `name_<<key>>`<sup>1</sup> | **Description:** Changes the name of the specified key's playlist.<br>**Values:** New Playlist Name | | `name_<<key>>`<sup>1</sup> | **Description:** Changes the name of the specified key's playlist.<br>**Values:** New Playlist Name |
| `summary_<<key>>`<sup>1</sup> | **Description:** Changes the summary of the specified key's playlist.<br>**Values:** New Playlist Summary | | `summary_<<key>>`<sup>1</sup> | **Description:** Changes the summary of the specified key's playlist.<br>**Values:** New Playlist Summary |
| `libraries` | **Description:** Sets the names of the libraries to use for the Playlists.<br>**Default:** `Movies, TV Shows`<br>**Values:** Comma-separated string or list of library mapping names defined in the `libraries` attribute in the base of your [Configuration File](../config/overview.md. | | `libraries` | **Description:** Sets the names of the libraries to use for the Playlists.<br>**Default:** `Movies, TV Shows`<br>**Values:** Comma-separated string or list of library mapping names defined in the `libraries` attribute in the base of your [Configuration File](../config/overview.md. |
| `sync_to_user` | **Description:** Sets the users to sync all playlists to.<br>**Default:** `playlist_sync_to_users` Global Setting Value<br>**Values:** Comma-separated string or list of user names. | | `sync_to_users` | **Description:** Sets the users to sync all playlists to.<br>**Default:** `playlist_sync_to_users` Global Setting Value<br>**Values:** Comma-separated string or list of user names. |
| `sync_to_user_<<key>>`<sup>1</sup> | **Description:** Sets the users to sync the specified key's playlist to.<br>**Default:** `sync_to_user` Value<br>**Values:** Comma-separated string or list of user names. | | `sync_to_users_<<key>>`<sup>1</sup> | **Description:** Sets the users to sync the specified key's playlist to.<br>**Default:** `sync_to_user` Value<br>**Values:** Comma-separated string or list of user names. |
| `exclude_user` | **Description:** Sets the users to exclude from sync for all playlists.<br>**Default:** `playlist_sync_to_users` Global Setting Value<br>**Values:** Comma-separated string or list of user names. | | `exclude_user` | **Description:** Sets the users to exclude from sync for all playlists.<br>**Default:** `playlist_sync_to_users` Global Setting Value<br>**Values:** Comma-separated string or list of user names. |
| `exclude_user_<<key>>`<sup>1</sup> | **Description:** Sets the users to exclude from sync the specified key's playlist.<br>**Default:** `sync_to_user` Value<br>**Values:** Comma-separated string or list of user names. | | `exclude_user_<<key>>`<sup>1</sup> | **Description:** Sets the users to exclude from sync the specified key's playlist.<br>**Default:** `sync_to_users` Value<br>**Values:** Comma-separated string or list of user names. |
| `trakt_list_<<key>>`<sup>1</sup> | **Description:** Adds the Movies in the Trakt List to the specified key's playlist. Overrides the [default trakt_list](#default-trakt_list) for that playlist if used.<br>**Values:** List of Trakt List URLs | | | | | `trakt_list_<<key>>`<sup>1</sup> | **Description:** Adds the Movies in the Trakt List to the specified key's playlist. Overrides the [default trakt_list](#default-trakt_list) for that playlist if used.<br>**Values:** List of Trakt List URLs | | | |
| `delete_playlist` | **Description:** Will delete all playlists for the users defined by sync_to_users.<br>**Values:** `true` or `false` | | `delete_playlist` | **Description:** Will delete all playlists for the users defined by sync_to_users.<br>**Values:** `true` or `false` |
| `delete_playlist_<<key>>`<sup>1</sup> | **Description:** Will delete the specified key's playlists for the users defined by sync_to_users.<br>**Values:** `true` or `false` | | `delete_playlist_<<key>>`<sup>1</sup> | **Description:** Will delete the specified key's playlists for the users defined by sync_to_users.<br>**Values:** `true` or `false` |

View file

@ -161,7 +161,7 @@ In addition, templates also have a few special attributes that they can use:
3. Using the exists modifier by appending `.exists` to the key template variable: 3. Using the exists modifier by appending `.exists` to the key template variable:
* While `ture` the template variable specified must exist in the template call. * While `true` the template variable specified must exist in the template call.
* While anything but `true` the template variable specified must not exist in the template call. * While anything but `true` the template variable specified must not exist in the template call.
???+ example "Example" ???+ example "Example"

View file

@ -64,9 +64,11 @@ To install a container from docker hub, you will need community applications - a
3. Choose which branch you want to run `latest`, `develop`, or `nightly`. 3. Choose which branch you want to run `latest`, `develop`, or `nightly`.
4. Click `Show more settings...` to set any [Environmental Variables](../environmental.md) you wish to use. **For the purposes of this walkthrough, the** `Container Path: /config` **path for the unRAID app is** `/mnt/user/appdata/plex-meta-manager` 4. Set the `Console shell command:` to `Bash`
5. Hit `Apply`, and allow unRAID to download the docker container. 5. Click `Show more settings...` to set any [Environmental Variables](../environmental.md) you wish to use. **For the purposes of this walkthrough, the** `Container Path: /config` **path for the unRAID app is** `/mnt/user/appdata/plex-meta-manager`. Other than this, set the `PMM_TIME` variable to `5:00` under the `Show more settings...`
6. Hit `Apply`, and allow unRAID to download the docker container.
#### Important note on Docker images #### Important note on Docker images
@ -74,19 +76,29 @@ This tutorial uses the official image, and you should, too. Don't change `meisn
The great thing about Docker is that all the setup you'd have to do to run PMM is already done inside the docker image. The great thing about Docker is that all the setup you'd have to do to run PMM is already done inside the docker image.
That means we can just jump right into running it. Open a `Console` by left-clicking on the running Plex-Meta-Manager container and selecting `>_Console`. This will open up an interactive session within the container to be able to run the commands we want. First let's start the container. Oops! The container won't start?
```
python plex_meta_manager.py --run
```
This is going to fail with an error. That's expected. This is going to fail with an error. That's expected.
You should see something like this: You should see something like this in the unRAID logs for the container:
``` ```
Config Error: config not found at //config Config Error: config not found at //config
``` ```
This is going to fail with an error, which you will then fix. We need to have a file called `config.yml` in the correct directory for PMM to start. Open up an unRAID terminal session by clicking on the terminal icon `>_` in the top right of unRAID.
=== ":fontawesome-brands-linux: Linux"
[type this into your terminal]
```
mkdir /mnt/user/appdata/plex-meta-manager/config
touch /mnt/user/appdata/plex-meta-manager/config/config.yml
```
You can now close the unRAID terminal and start the PMM container.
**_From this point forward, you can Console `>_Console` into the running container as it will stay running_**
Open a Console by left-clicking on the running Plex-Meta-Manager container and selecting `>_Console`. This will open up an interactive session within the container to be able to run the commands we want.
### Create a directory to quiet an error later ### Create a directory to quiet an error later

View file

@ -695,16 +695,16 @@
"minimum": 1 "minimum": 1
}, },
"default_collection_order": { "default_collection_order": {
"description": "Used to set the collection_order for every collection run.\nSet the collection_order for every collection run by PMM unless the collection has a specific collection_order", "description": "Used to set the collection_order for every collection run.\nSet the collection_order for every collection run by PMM unless the collection has a specific collection_order\nTIP: 'custom' cannot be used if more than one builder is being used for the collection (such as imdb_list and trakt_list within the same collection). ",
"type": ["string", "null"], "type": ["string", "null"],
"enum": [ "enum": [
"added.asc", "added.desc", "audience_rating.asc", "added.asc", "added.desc", "alpha", "audience_rating.asc",
"audience_rating.desc", "bitrate.asc", "bitrate.desc", "audience_rating.desc", "bitrate.asc", "bitrate.desc",
"content_rating.asc", "content_rating.desc", "critic_rating.asc", "content_rating.asc", "content_rating.desc", "critic_rating.asc",
"critic_rating.desc", "duration.asc", "duration.desc", "critic_rating.desc", "custom", "duration.asc", "duration.desc",
"originally_available.asc", "originally_available.desc", "originally_available.asc", "originally_available.desc",
"plays.asc", "plays.desc", "progress.asc", "progress.desc", "plays.asc", "plays.desc", "progress.asc", "progress.desc",
"random", "release.asc", "release.desc", "random", "release", "release.asc", "release.desc",
"resolution.asc", "resolution.desc", "title.asc", "title.desc", "resolution.asc", "resolution.desc", "title.asc", "title.desc",
"user_rating.asc", "user_rating.desc", "viewed.asc", "viewed.desc", "user_rating.asc", "user_rating.desc", "viewed.asc", "viewed.desc",
"year.asc", "year.desc", null "year.asc", "year.desc", null
@ -944,7 +944,7 @@
"properties": { "properties": {
"pmm": { "pmm": {
"type": "string", "type": "string",
"enum": ["actor", "anilist","aspect","audio_language","bafta","based","basic","berlinale","cannes","cesar","choice","collectionless","content_rating_cs","content_rating_de","content_rating_mal","content_rating_uk","content_rating_us","continent","country","decade","director","emmy","flixpatrol","franchise","genre","golden","imdb","myanimelist","network","nfr","oscars","other_chart","pca","producer","razzie","region","resolution","sag","seasonal","separator_award","separator_chart","spirit","streaming","studio","subtitle_language","sundance","tautulli","tiff","tmdb","trakt","universe","venice","writer","year"] "enum": ["actor", "anilist","aspect","audio_language","bafta","based","basic","berlinale","cannes","cesar","choice","collectionless","content_rating_au","content_rating_cs","content_rating_de","content_rating_mal","content_rating_uk","content_rating_us","continent","country","decade","director","emmy","flixpatrol","franchise","genre","golden","imdb","myanimelist","network","nfr","oscars","other_chart","pca","producer","razzie","region","resolution","sag","seasonal","separator_award","separator_chart","spirit","streaming","studio","subtitle_language","sundance","tautulli","tiff","tmdb","trakt","universe","venice","writer","year"]
}, },
"schedule": { "schedule": {
"type": "string" "type": "string"
@ -1568,12 +1568,13 @@
"location": { "type": "string", "enum": ["world","albania","argentina","armenia","australia","austria","azerbaijan","bahamas","bahrain","bangladesh","belarus","belgium","belize","benin","bolivia","bosnia_and_herzegovina","botswana","brazil","bulgaria","burkina_faso","cambodia","canada","chile","colombia","costa_rica","croatia","cyprus","czech_republic","denmark","dominican_republic","ecuador","egypt","estonia","finland","france","gabon","germany","ghana","greece","guatemala","guinea_bissau","haiti","honduras","hong_kong","hungary","iceland","india","indonesia","ireland","israel","italy","ivory_coast","jamaica","japan","jordan","kazakhstan","kenya","kuwait","kyrgyzstan","laos","latvia","lebanon","lithuania","luxembourg","malaysia","maldives","mali","malta","mexico","moldova","mongolia","montenegro","morocco","mozambique","namibia","netherlands","new_zealand","nicaragua","niger","nigeria","north_macedonia","norway","oman","pakistan","panama","papua_new_guinea","paraguay","peru","philippines","poland","portugal","qatar","romania","russia","rwanda","salvador","saudi_arabia","senegal","serbia","singapore","slovakia","slovenia","south_africa","south_korea","spain","sri_lanka","sweden","switzerland","taiwan","tajikistan","tanzania","thailand","togo","trinidad_and_tobago","turkey","turkmenistan","uganda","ukraine","united_arab_emirates","united_kingdom","united_states","uruguay","uzbekistan","venezuela","vietnam","zambia","zimbabwe"] }, "location": { "type": "string", "enum": ["world","albania","argentina","armenia","australia","austria","azerbaijan","bahamas","bahrain","bangladesh","belarus","belgium","belize","benin","bolivia","bosnia_and_herzegovina","botswana","brazil","bulgaria","burkina_faso","cambodia","canada","chile","colombia","costa_rica","croatia","cyprus","czech_republic","denmark","dominican_republic","ecuador","egypt","estonia","finland","france","gabon","germany","ghana","greece","guatemala","guinea_bissau","haiti","honduras","hong_kong","hungary","iceland","india","indonesia","ireland","israel","italy","ivory_coast","jamaica","japan","jordan","kazakhstan","kenya","kuwait","kyrgyzstan","laos","latvia","lebanon","lithuania","luxembourg","malaysia","maldives","mali","malta","mexico","moldova","mongolia","montenegro","morocco","mozambique","namibia","netherlands","new_zealand","nicaragua","niger","nigeria","north_macedonia","norway","oman","pakistan","panama","papua_new_guinea","paraguay","peru","philippines","poland","portugal","qatar","romania","russia","rwanda","salvador","saudi_arabia","senegal","serbia","singapore","slovakia","slovenia","south_africa","south_korea","spain","sri_lanka","sweden","switzerland","taiwan","tajikistan","tanzania","thailand","togo","trinidad_and_tobago","turkey","turkmenistan","uganda","ukraine","united_arab_emirates","united_kingdom","united_states","uruguay","uzbekistan","venezuela","vietnam","zambia","zimbabwe"] },
"minimum": { "type": "integer"}, "minimum": { "type": "integer"},
"offset": { "type": "integer", "minimum": 0 }, "offset": { "type": "integer", "minimum": 0 },
"overlay_limit": { "type": "integer", "minimum": 1, "maximum": 5 }, "originals_only": { "description": "Changes Streaming Service overlays to only apply to original content produced by the service.\nNote: Cannot be used with region, and only produces overlays for amazon, appletv, disney, max, hulu, netflix, paramount, peacock", "type": "boolean" },
"overlay_limit": { "description": "Choose the number of overlay this queue displays.\nDefault: 3\nValues: 1, 2, 3, 4, or 5", "type": "integer", "minimum": 1, "maximum": 5 },
"position": { "type": "string", "enum": ["left","right"] }, "position": { "type": "string", "enum": ["left","right"] },
"post_nr_text": { "type": "string" }, "post_nr_text": { "description": "Choose the text after the 'nr' key for the Overlay.\nValues: Any String", "type": "string" },
"post_text": { "type": "string" }, "post_text": { "description": "Choose the text after the key for the Overlay.\nDefault: +\nValues: Any String", "type": "string" },
"pre_nr_text": { "type": "string" }, "pre_nr_text": { "description": "Choose the text before the 'nr' key for the Overlay.\nValues: Any String","type": "string" },
"pre_text": { "type": "string" }, "pre_text": { "description": "Choose the text before the key for the Overlay.\nValues: Any String", "type": "string" },
"rating_alignment": { "type": "string", "enum": ["vertical", "horizontal"] }, "rating_alignment": { "type": "string", "enum": ["vertical", "horizontal"] },
"rating1": { "type": "string", "enum": ["critic", "audience", "user"] }, "rating1": { "type": "string", "enum": ["critic", "audience", "user"] },
"rating1_image": { "type": "string", "enum": ["anidb", "imdb", "letterboxd", "tmdb", "metacritic", "rt_popcorn", "rt_tomato", "trakt", "mal", "mdb", "star"] }, "rating1_image": { "type": "string", "enum": ["anidb", "imdb", "letterboxd", "tmdb", "metacritic", "rt_popcorn", "rt_tomato", "trakt", "mal", "mdb", "star"] },
@ -1594,7 +1595,7 @@
"repo": { "type": "string" }, "repo": { "type": "string" },
"stroke_color": { "type": "string", "pattern": "^\\#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$" }, "stroke_color": { "type": "string", "pattern": "^\\#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$" },
"stroke_width": { "type": "integer", "exclusiveMinimum": 0 }, "stroke_width": { "type": "integer", "exclusiveMinimum": 0 },
"style": { "type": "string", "enum": ["compact","standard","bigger","round","square","half", "red", "black", "yellow", "gray"] }, "style": { "type": "string", "enum": ["compact","standard","bigger","round","square","half", "red", "black", "yellow", "gray", "color", "white"] },
"text": { "type": "string" }, "text": { "type": "string" },
"time_window": { "type": "string", "enum": ["today","yesterday","this_week","last_week","this_month","last_month","this_year","last_year"] }, "time_window": { "type": "string", "enum": ["today","yesterday","this_week","last_week","this_month","last_month","this_year","last_year"] },
"url": { "type": "string", "format": "uri", "pattern": "^(https?)://" }, "url": { "type": "string", "format": "uri", "pattern": "^(https?)://" },
@ -1608,6 +1609,7 @@
}, },
"patternProperties": { "patternProperties": {
"^back_color_.*$": { "type": "string", "pattern": "^\\#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$" }, "^back_color_.*$": { "type": "string", "pattern": "^\\#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$" },
"^font_color_.*$": { "type": "string", "pattern": "^\\#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$" },
"^country_.*$": { "type": "string", "pattern": "^[A-Z]{2}$" }, "^country_.*$": { "type": "string", "pattern": "^[A-Z]{2}$" },
"^file_.*$": { "type": "string" }, "^file_.*$": { "type": "string" },
"^git_.*$": { "type": "string" }, "^git_.*$": { "type": "string" },

View file

@ -59,6 +59,7 @@ item_false_details = ["item_lock_background", "item_lock_poster", "item_lock_tit
item_bool_details = ["item_tmdb_season_titles", "revert_overlay", "item_assets", "item_refresh"] + item_false_details item_bool_details = ["item_tmdb_season_titles", "revert_overlay", "item_assets", "item_refresh"] + item_false_details
item_details = ["non_item_remove_label", "item_label", "item_genre", "item_edition", "item_radarr_tag", "item_sonarr_tag", "item_refresh_delay"] + item_bool_details + list(plex.item_advance_keys.keys()) item_details = ["non_item_remove_label", "item_label", "item_genre", "item_edition", "item_radarr_tag", "item_sonarr_tag", "item_refresh_delay"] + item_bool_details + list(plex.item_advance_keys.keys())
none_details = ["label.sync", "item_label.sync", "item_genre.sync", "radarr_taglist", "sonarr_taglist", "item_edition"] none_details = ["label.sync", "item_label.sync", "item_genre.sync", "radarr_taglist", "sonarr_taglist", "item_edition"]
none_builders = ["radarr_tag_list", "sonarr_taglist"]
radarr_details = [ radarr_details = [
"radarr_add_missing", "radarr_add_existing", "radarr_upgrade_existing", "radarr_monitor_existing", "radarr_folder", "radarr_monitor", "radarr_add_missing", "radarr_add_existing", "radarr_upgrade_existing", "radarr_monitor_existing", "radarr_folder", "radarr_monitor",
"radarr_search", "radarr_availability", "radarr_quality", "radarr_tag", "item_radarr_tag", "radarr_ignore_cache", "radarr_search", "radarr_availability", "radarr_quality", "radarr_tag", "item_radarr_tag", "radarr_ignore_cache",
@ -966,7 +967,7 @@ class CollectionBuilder:
logger.debug(f"Validating Method: {method_key}") logger.debug(f"Validating Method: {method_key}")
logger.debug(f"Value: {method_data}") logger.debug(f"Value: {method_data}")
try: try:
if method_data is None and method_name in all_builders + plex.searches: if method_data is None and method_name in all_builders + plex.searches and method_final not in none_builders:
raise Failed(f"{self.Type} Error: {method_final} attribute is blank") raise Failed(f"{self.Type} Error: {method_final} attribute is blank")
elif method_data is None and method_final not in none_details: elif method_data is None and method_final not in none_details:
logger.warning(f"Collection Warning: {method_final} attribute is blank") logger.warning(f"Collection Warning: {method_final} attribute is blank")

View file

@ -918,7 +918,7 @@ class ConfigFile:
default_path = os.path.join(default_dir, f"{str(library_name)}_Metadata_Backup.yml") default_path = os.path.join(default_dir, f"{str(library_name)}_Metadata_Backup.yml")
if "path" not in input_dict: if "path" not in input_dict:
logger.warning(f"Config Warning: path attribute not found using default: {default_path}") logger.warning(f"Config Warning: path attribute not found using default: {default_path}")
if "path" in input_dict and not input_dict["path"]: elif "path" in input_dict and not input_dict["path"]:
logger.warning(f"Config Warning: path attribute blank using default: {default_path}") logger.warning(f"Config Warning: path attribute blank using default: {default_path}")
else: else:
default_path = input_dict["path"] default_path = input_dict["path"]

View file

@ -1123,10 +1123,14 @@ class Operations:
if "year" in mv: if "year" in mv:
special_names[f"{mv['title']} ({mv['year']})"] = mk special_names[f"{mv['title']} ({mv['year']})"] = mk
items = self.library.get_all(load=True) items = self.library.get_all(load=True)
titles = [i.title for i in items] titles = []
year_titles = []
for item in items:
titles.append(item.title)
year_titles.append(f"{item.title} ({item.year})")
for i, item in enumerate(items, 1): for i, item in enumerate(items, 1):
logger.ghost(f"Processing: {i}/{len(items)} {item.title}") logger.ghost(f"Processing: {i}/{len(items)} {item.title}")
map_key, attrs = self.library.get_locked_attributes(item, titles) map_key, attrs = self.library.get_locked_attributes(item, titles, year_titles)
if map_key in special_names: if map_key in special_names:
map_key = special_names[map_key] map_key = special_names[map_key]
og_dict = yaml.data["metadata"][map_key] if map_key in yaml.data["metadata"] and yaml.data["metadata"][map_key] and isinstance(yaml.data["metadata"][map_key], dict) else {} og_dict = yaml.data["metadata"][map_key] if map_key in yaml.data["metadata"] and yaml.data["metadata"][map_key] and isinstance(yaml.data["metadata"][map_key], dict) else {}

View file

@ -1494,27 +1494,40 @@ class Plex(Library):
imdb_id = self.get_imdb_from_map(item) imdb_id = self.get_imdb_from_map(item)
return tmdb_id, tvdb_id, imdb_id return tmdb_id, tvdb_id, imdb_id
def get_locked_attributes(self, item, titles=None): def get_locked_attributes(self, item, titles=None, year_titles=None):
item = self.reload(item) item = self.reload(item)
attrs = {} attrs = {}
match_dict = {}
fields = {f.name: f for f in item.fields if f.locked} fields = {f.name: f for f in item.fields if f.locked}
if isinstance(item, (Movie, Show)) and titles and titles.count(item.title) > 1: if isinstance(item, (Movie, Show)) and titles and titles.count(item.title) > 1:
map_key = f"{item.title} ({item.year})" if year_titles.count(f"{item.title} ({item.year})") > 1:
attrs["title"] = item.title match_dict["title"] = item.title
attrs["year"] = item.year match_dict["year"] = item.year
if item.editionTitle:
map_key = f"{item.title} ({item.year}) [{item.editionTitle}]"
match_dict["edition"] = item.editionTitle
else:
map_key = f"{item.title} ({item.year})"
match_dict["blank_edition"] = True
else:
map_key = f"{item.title} ({item.year})"
match_dict["title"] = item.title
match_dict["year"] = item.year
elif isinstance(item, (Season, Episode, Track)) and item.index: elif isinstance(item, (Season, Episode, Track)) and item.index:
map_key = int(item.index) map_key = int(item.index)
else: else:
map_key = item.title map_key = item.title
if "title" in fields: if "title" in fields:
attrs["title"] = item.title
if isinstance(item, (Movie, Show)): if isinstance(item, (Movie, Show)):
tmdb_id, tvdb_id, imdb_id = self.get_ids(item) tmdb_id, tvdb_id, imdb_id = self.get_ids(item)
tmdb_item = self.config.TMDb.get_item(item, tmdb_id, tvdb_id, imdb_id, is_movie=isinstance(item, Movie)) tmdb_item = self.config.TMDb.get_item(item, tmdb_id, tvdb_id, imdb_id, is_movie=isinstance(item, Movie))
if tmdb_item: if tmdb_item:
attrs["alt_title"] = tmdb_item.title match_dict["title"] = [item.title, tmdb_item.title]
elif isinstance(item, (Season, Episode, Track)):
attrs["title"] = item.title if match_dict:
attrs["match"] = match_dict
def check_field(plex_key, pmm_key, var_key=None): def check_field(plex_key, pmm_key, var_key=None):
if plex_key in fields and pmm_key not in self.metadata_backup["exclude"]: if plex_key in fields and pmm_key not in self.metadata_backup["exclude"]:
@ -1532,6 +1545,7 @@ class Plex(Library):
attrs[pmm_key] = plex_value attrs[pmm_key] = plex_value
check_field("titleSort", "sort_title") check_field("titleSort", "sort_title")
check_field("editionTitle", "edition")
check_field("originalTitle", "original_artist" if self.is_music else "original_title") check_field("originalTitle", "original_artist" if self.is_music else "original_title")
check_field("originallyAvailableAt", "originally_available") check_field("originallyAvailableAt", "originally_available")
check_field("contentRating", "content_rating") check_field("contentRating", "content_rating")