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

pull/1866/head
bullmoose20 10 months ago
commit fac8c7f399

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

@ -596,6 +596,7 @@ dynamic_collections:
- Haoliners Huimeng Animation
- Haoliners Animation
Illumination Entertainment:
- Illumination
- Illumination Films
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.0 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

@ -72,12 +72,6 @@ vars:
v1-4: &v1-4 {vertical_offset: 198}
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-2: &v2-2 {vertical_offset: 211}
v2-3: &v2-3 {vertical_offset: 272}
@ -90,6 +84,24 @@ vars:
v3-4: &v3-4 {vertical_offset: 406}
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-t: &vc-t {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_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_left2: [<<: [*center_left, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_top_center_left: [<<: [*center_center, *v0-1, *hc-l], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_top_center: [<<: [*center_center, *v0-1, *hc-c], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_top_center_right: [<<: [*center_center, *v0-1, *hc-r], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_top_right2: [<<: [*center_right, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_top_right: [<<: [*center_right, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_left: [<<: [*center_left, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_left2: [<<: [*center_left, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_center_left: [<<: [*center_center, *v0-1, *hc-l], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_center: [<<: [*center_center, *v0-1, *hc-c], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_center_right: [<<: [*center_center, *v0-1, *hc-r], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_right2: [<<: [*center_right, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_right: [<<: [*center_right, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_bottom_left: [<<: [*center_left, *v0-1, *h1-1], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_bottom_left2: [<<: [*center_left, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_bottom_center_left: [<<: [*center_center, *v0-1, *hc-l], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_bottom_center: [<<: [*center_center, *v0-1, *hc-c], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_bottom_center_right: [<<: [*center_center, *v0-1, *hc-r], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_bottom_right2: [<<: [*center_right, *v0-1, *h1-2], *v0-2, *v0-3, *v0-4, *v0-5]
vertical_center_bottom_right: [<<: [*center_right, *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, *vct-1, *h1-2], *vct-2, *vct-3, *vct-4, *vct-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, *vct-1, *hc-c], *vct-2, *vct-3, *vct-4, *vct-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, *vct-1, *h1-2], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_top_right: [<<: [*center_right, *vct-1, *h1-1], *vct-2, *vct-3, *vct-4, *vct-5]
vertical_center_left: [<<: [*center_left, *vc-1, *h1-1], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_left2: [<<: [*center_left, *vc-1, *h1-2], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_center_left: [<<: [*center_center, *vc-1, *hc-l], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_center: [<<: [*center_center, *vc-1, *hc-c], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_center_right: [<<: [*center_center, *vc-1, *hc-r], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_right2: [<<: [*center_right, *vc-1, *h1-2], *vc-2, *vc-3, *vc-4, *vc-5]
vertical_center_right: [<<: [*center_right, *vc-1, *h1-1], *vc-2, *vc-3, *vc-4, *vc-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, *vcb-1, *h1-2], *vcb-2, *vcb-3, *vcb-4, *vcb-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, *vcb-1, *hc-c], *vcb-2, *vcb-3, *vcb-4, *vcb-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, *vcb-1, *h1-2], *vcb-2, *vcb-3, *vcb-4, *vcb-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_left2: [<<: [*bottom_left, *v3-1, *h1-2], *v3-2, *v3-3, *v3-4, *v3-5]

@ -69,6 +69,10 @@ overlays:
variables: { weight: 10}
template: [name: standard, name: networks]
7mate:
variables: { weight: 10}
template: [name: standard, name: networks]
ABC:
variables: { weight: 10}
template: [name: standard, {name: networks, search: [ABC, ABC.com]}]
@ -125,6 +129,10 @@ overlays:
variables: { weight: 10}
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:
variables: { weight: 10}
template: [name: standard, name: networks]
@ -565,6 +573,10 @@ overlays:
variables: { weight: 10}
template: [name: standard, name: networks]
Kanal 5:
variables: { weight: 10}
template: [name: standard, name: networks]
KBS2:
variables: { weight: 10}
template: [name: standard, name: networks]
@ -777,6 +789,10 @@ overlays:
variables: { weight: 10}
template: [name: standard, name: networks]
Seven Network:
variables: { weight: 10}
template: [name: standard, name: networks]
Shahid:
variables: { weight: 10}
template: [name: standard, name: networks]
@ -837,6 +853,14 @@ overlays:
variables: { weight: 10}
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:
variables: { weight: 10}
template: [name: standard, name: networks]
@ -885,6 +909,10 @@ overlays:
variables: { weight: 10}
template: [name: standard, {name: networks, search: [The CW, CW seed]}]
The Daily Wire:
variables: { weight: 10}
template: [name: standard, name: networks]
The Roku Channel:
variables: { weight: 10}
template: [name: standard, name: networks]
@ -945,6 +973,10 @@ overlays:
variables: { weight: 10}
template: [name: standard, name: networks]
TV4 Play:
variables: { weight: 10}
template: [name: standard, name: networks]
TVB Jade:
variables: { weight: 10}
template: [name: standard, name: networks]

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

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

@ -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 |
| `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. |
| `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_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` | **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_<<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_<<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 | | | |
| `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` |

@ -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:
* 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.
???+ example "Example"

@ -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`.
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
@ -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.
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.
```
python plex_meta_manager.py --run
```
First let's start the container. Oops! The container won't start?
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
```
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

@ -695,16 +695,16 @@
"minimum": 1
},
"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"],
"enum": [
"added.asc", "added.desc", "audience_rating.asc",
"added.asc", "added.desc", "alpha", "audience_rating.asc",
"audience_rating.desc", "bitrate.asc", "bitrate.desc",
"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",
"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",
"user_rating.asc", "user_rating.desc", "viewed.asc", "viewed.desc",
"year.asc", "year.desc", null
@ -944,7 +944,7 @@
"properties": {
"pmm": {
"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": {
"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"] },
"minimum": { "type": "integer"},
"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"] },
"post_nr_text": { "type": "string" },
"post_text": { "type": "string" },
"pre_nr_text": { "type": "string" },
"pre_text": { "type": "string" },
"post_nr_text": { "description": "Choose the text after the 'nr' key for the Overlay.\nValues: Any String", "type": "string" },
"post_text": { "description": "Choose the text after the key for the Overlay.\nDefault: +\nValues: Any String", "type": "string" },
"pre_nr_text": { "description": "Choose the text before the 'nr' key for the Overlay.\nValues: Any String","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"] },
"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"] },
@ -1594,7 +1595,7 @@
"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_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" },
"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?)://" },
@ -1608,6 +1609,7 @@
},
"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})$" },
"^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}$" },
"^file_.*$": { "type": "string" },
"^git_.*$": { "type": "string" },

@ -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_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_builders = ["radarr_tag_list", "sonarr_taglist"]
radarr_details = [
"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",
@ -966,7 +967,7 @@ class CollectionBuilder:
logger.debug(f"Validating Method: {method_key}")
logger.debug(f"Value: {method_data}")
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")
elif method_data is None and method_final not in none_details:
logger.warning(f"Collection Warning: {method_final} attribute is blank")

@ -918,7 +918,7 @@ class ConfigFile:
default_path = os.path.join(default_dir, f"{str(library_name)}_Metadata_Backup.yml")
if "path" not in input_dict:
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}")
else:
default_path = input_dict["path"]

@ -1123,10 +1123,14 @@ class Operations:
if "year" in mv:
special_names[f"{mv['title']} ({mv['year']})"] = mk
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):
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:
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 {}

@ -1494,27 +1494,40 @@ class Plex(Library):
imdb_id = self.get_imdb_from_map(item)
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)
attrs = {}
match_dict = {}
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:
map_key = f"{item.title} ({item.year})"
attrs["title"] = item.title
attrs["year"] = item.year
if year_titles.count(f"{item.title} ({item.year})") > 1:
match_dict["title"] = item.title
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:
map_key = int(item.index)
else:
map_key = item.title
if "title" in fields:
attrs["title"] = item.title
if isinstance(item, (Movie, Show)):
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))
if tmdb_item:
attrs["alt_title"] = tmdb_item.title
elif isinstance(item, (Season, Episode, Track)):
attrs["title"] = item.title
match_dict["title"] = [item.title, tmdb_item.title]
if match_dict:
attrs["match"] = match_dict
def check_field(plex_key, pmm_key, var_key=None):
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
check_field("titleSort", "sort_title")
check_field("editionTitle", "edition")
check_field("originalTitle", "original_artist" if self.is_music else "original_title")
check_field("originallyAvailableAt", "originally_available")
check_field("contentRating", "content_rating")

Loading…
Cancel
Save