[81] add convert and overlay summary

pull/1800/head
meisnate12 12 months ago
parent 31ff1c78e9
commit a7ffd51c76

@ -1,24 +1,51 @@
# Requirements Update (requirements will need to be reinstalled)
Updated arrapi requirement to 1.4.7
Updated GitPython requirement to 3.1.40
Updated lxml requirement to 5.0.0
Updated num2words requirement to 0.5.13
Updated pillow requirement to 10.1.0
Updated PlexAPI requirement to 4.15.6
Updated pillow requirement to 10.2.0
Updated PlexAPI requirement to 4.15.7
Updated psutil requirement to 5.9.7
Updated ruamel.yaml requirement to 0.18.5
Updated schedule requirement to 1.2.1
Updated tmdbapis requirement to 1.2.2
Updated tmdbapis requirement to 1.2.6
Added setuptools requirement at 69.0.3
# New Features
Introduced batchMultiEdits - this is a major feature introduction that we hope will increase performance for all users. This is a behind-the-scenes change that the user does not need to do anything to take advantage of.
Redesigned Wiki with new landing page and new layout using mkdocs.
Introduced (Run Order)[https://metamanager.wiki/en/latest/config/settings/#run-order] attribute which allows the user to amend the way that each library is executed.
Introduced [IMDb Search Builder](https://metamanager.wiki/en/latest/files/builders/imdb/#imdb-search) following IMDb UI rework.
- `imdb_list` can no longer be used for Title or Keyword Searches, these must be transferred to `imdb_search` builders.
Introduced [IMDb Award Builder](https://metamanager.wiki/en/latest/files/builders/imdb/#imdb-award).
Added IMDb Awards to [Dynamic Collection Types](https://metamanager.wiki/en/latest/files/dynamic_types/#imdb-awards)
Reintroduced [Flixpatrol Builder](https://metamanager.wiki/en/latest/builders/flixpatrol/) following introduction of paywalled API.
Added a JSON Schema file which will assist users in validating their configuration file when using a code-aware text editor such as VSCode and VSCodium. This is a work in progress and will help identify basic errors such as specifying "yes" when the available options are "true" and "false"
- If you run into any validation issues which you don't understand, ask in our Discord Server
# Updates
Redesigned Wiki with new landing page and new layout using mkdocs.
Introduced batchMultiEdits - this is a major feature introduction that we hope will increase performance for all users. This is a behind-the-scenes change that the user does not need to do anything to take advantage of.
Updated `overlay_path` to `overlay_files` and split `metadata_path` into `collection_files` and `metadata_files`.
Moved `remove_overalys`, `reapply_overlays`, and `reset_overlays` to the [library level](https://metamanager.wiki/en/latest/config/libraries/#remove-overlays) instead of under `overlay_path`.
Removed `schedule` from under `overlay_path` and replaced it with the library level attribute [`schedule_overlays`](https://metamanager.wiki/en/nightly/config/libraries/#schedule-overlays).
Removed library-level and collection-level logging, all logging is handled in the meta.log
Added the `score` attribute to the [`anilist_userlist`](https://metamanager.wiki/en/latest/files/builders/anilist/#anilist-userlist) builder.
Added the `episode_actor` attribute to the [`plex_search`](https://metamanager.wiki/en/latest/files/builders/plex/#plex-search) builder.
# Defaults
[PMM Default Award Files](https://metamanager.wiki/en/latest/defaults/files/#award-collections) have been reworked to use the `imdb_award` builder and `imdb_awards` dynamic collection type.
Reintroduced [Flixpatrol Chart Defaults Collections](https://metamanager.wiki/en/latest/defaults/chart/flixpatrol/).
Added Trakt Anticipated to [Trakt Chart Defaults Collections](https://metamanager.wiki/en/latest/defaults/chart/trakt/).
Added information on Python 3.12 support in the [Local Install Guides](https://metamanager.wiki/en/nightly/pmm/install/guides/local/#if-you-are-running-python-312)
Removed library- and collection-level logging, all logging is handled in the meta.log
Added DE Content Rating as a PMM Default [Collection](https://metamanager.wiki/en/latest/defaults/both/content_rating_de/) and [Overlay](https://metamanager.wiki/en/latest/defaults/overlays/content_rating_de/)
Added `schedule` and `schedule_<<key>>` template variables to most defaults.
# Bug Fixes
Fixed `(404) not_found` error that presented itself in PMS 1.32.7, as outlined [here](https://discord.com/channels/822460010649878528/1099773891733377065/1174751954367422585)
Fixed issue that would prevent `file_poster` from overriding `url_poster` in the PMM Defaults.
Removed `--cache-libraries` Environment Variable due to inconsistent behaviour that could cause issues.
Fixed issue with `mass_poster_update` incorrectly updating episode posters when it shouldn't.
Fixed issue with `delete_collection_named` running in a collection even if the collection wasn't scheduled to run.
Fixed issue with `delete_collection_named` running in a collection even if the collection wasn't scheduled to run.
Various other Minor Fixes
GitHub issues closed: #1438, #1542, #1563, #1568, #1571, #1585, #1609, #1618, #1621, #1623, #1632, #1636, #1642, #1662, #1666, #1670, #1674, #1688, #1705, #1712, #1749, #1781, #1772, #1786,

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2023 meisnate12
Copyright (c) 2024 meisnate12
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

@ -1 +1 @@
1.19.1-develop80
1.19.1-develop81

@ -649,8 +649,8 @@ This example is an advanced version of the library mappings which highlights som
- file: config/TV Shows.yml
- pmm: tmdb
- pmm: network
remove_overlays: false
overlay_files:
- remove_overlays: false
- file: config/Overlays.yml
TV Shows On Second Plex:
library_name: TV Shows

@ -104,195 +104,25 @@ Note that the `template_variables:` section only needs to be used if you do want
If you want to customize these values, use the methods described above.
**Default `include`:
**Default `include`:**
```yaml
include:
- ab # Abkhazian
- aa # Afar
- af # Afrikaans
- ak # Akan
- sq # Albanian
- am # Amharic
- ar # Arabic
- an # Aragonese
- hy # Armenian
- as # Assamese
- av # Avaric
- ae # Avestan
- ay # Aymara
- az # Azerbaijani
- bm # Bambara
- ba # Bashkir
- eu # Basque
- be # Belarusian
- bn # Bengali
- bi # Bislama
- bs # Bosnian
- br # Breton
- bg # Bulgarian
- my # Burmese
- ca # Catalan, Valencian
- km # Central Khmer
- ch # Chamorro
- ce # Chechen
- ny # Chichewa, Chewa, Nyanja
- zh # Chinese
- cu # Church Slavic, Old Slavonic, Church Slavonic, Old Bulgarian, Old Church Slavonic
- cv # Chuvash
- kw # Cornish
- co # Corsican
- cr # Cree
- hr # Croatian
- cs # Czech
- da # Danish
- dv # Divehi, Dhivehi, Maldivian
- nl # Dutch, Flemish
- dz # Dzongkha
- en # English
- eo # Esperanto
- et # Estonian
- ee # Ewe
- fo # Faroese
- fj # Fijian
- fil # Filipino
- fi # Finnish
- fr # French
- ff # Fulah
- gd # Gaelic, Scottish Gaelic
- gl # Galician
- lg # Ganda
- ka # Georgian
- de # German
- el # Greek, Modern (1453)
- gn # Guarani
- gu # Gujarati
- ht # Haitian, Haitian Creole
- ha # Hausa
- he # Hebrew
- hz # Herero
- hi # Hindi
- ho # Hiri Motu
- hu # Hungarian
- is # Icelandic
- io # Ido
- ig # Igbo
- id # Indonesian
- ia # Interlingua (International Auxiliary Language Association)
- ie # Interlingue, Occidental
- iu # Inuktitut
- ik # Inupiaq
- ga # Irish
- it # Italian
- ja # Japanese
- jv # Javanese
- kl # Kalaallisut, Greenlandic
- kn # Kannada
- kr # Kanuri
- ks # Kashmiri
- kk # Kazakh
- ki # Kikuyu, Gikuyu
- rw # Kinyarwanda
- ky # Kirghiz, Kyrgyz
- kv # Komi
- kg # Kongo
- ko # Korean
- kj # Kuanyama, Kwanyama
- ku # Kurdish
- lo # Lao
- la # Latin
- lv # Latvian
- li # Limburgan, Limburger, Limburgish
- ln # Lingala
- lt # Lithuanian
- lu # Luba-Katanga
- lb # Luxembourgish, Letzeburgesch
- mk # Macedonian
- mg # Malagasy
- ms # Malay
- ml # Malayalam
- mt # Maltese
- gv # Manx
- mi # Maori
- mr # Marathi
- mh # Marshallese
- myn # Mayan
- mn # Mongolian
- na # Nauru
- nv # Navajo, Navaho
- ng # Ndonga
- ne # Nepali
- nd # North Ndebele
- se # Northern Sami
- no # Norwegian
- nb # Norwegian Bokmål
- nn # Norwegian Nynorsk
- oc # Occitan
- oj # Ojibwa
- or # Oriya
- om # Oromo
- os # Ossetian, Ossetic
- pi # Pali
- ps # Pashto, Pushto
- fa # Persian
- pl # Polish
- pt # Portuguese
- pa # Punjabi, Panjabi
- qu # Quechua
- ro # Romanian, Moldavian, Moldovan
- rm # Romansh
- rom # Romany
- rn # Rundi
- ru # Russian
- sm # Samoan
- sg # Sango
- sa # Sanskrit
- sc # Sardinian
- sr # Serbian
- sn # Shona
- ii # Sichuan Yi, Nuosu
- sd # Sindhi
- si # Sinhala, Sinhalese
- sk # Slovak
- sl # Slovenian
- so # Somali
- nr # South Ndebele
- st # Southern Sotho
- es # Spanish, Castilian
- su # Sundanese
- sw # Swahili
- ss # Swati
- sv # Swedish
- tl # Tagalog
- ty # Tahitian
- tai # Tai
- tg # Tajik
- ta # Tamil
- tt # Tatar
- te # Telugu
- th # Thai
- bo # Tibetan
- ti # Tigrinya
- to # Tonga (Tonga Islands)
- ts # Tsonga
- tn # Tswana
- tr # Turkish
- tk # Turkmen
- tw # Twi
- ug # Uighur, Uyghur
- uk # Ukrainian
- ur # Urdu
- uz # Uzbek
- ve # Venda
- vi # Vietnamese
- vo # Volapük
- wa # Walloon
- cy # Welsh
- fy # Western Frisian
- wo # Wolof
- xh # Xhosa
- yi # Yiddish
- yo # Yoruba
- za # Zhuang, Chuang
- zu # Zulu
include: {%
include-markdown "../../../defaults/both/audio_language.yml"
comments=false
preserve-includer-indent=false
start="include:"
end="key_name_override:"
%}
```
**Default `key_name_override`:**
```yaml
key_name_override: {%
include-markdown "../../../defaults/both/audio_language.yml"
comments=false
preserve-includer-indent=false
start="key_name_override:"
%}
```

@ -11,52 +11,54 @@
collection_mode: hide # hide the collections within the "library" tab in Plex.
placeholder_imdb_id: tt8579674 # 1917 (2019) placeholder id for the separators, avoids a plex bug.
collection_files:
- pmm: separator_award # An "index card"
- pmm: bafta # BAFTA Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: golden # Golden Globes Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: oscars # The Oscars
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: separator_chart # An "index card"
- pmm: basic # Some basic chart collections
- pmm: tmdb # TMDb Charts (Popular, Trending, etc.)
- pmm: audio_language # English, French, Arabic, German, etc. audio language
- pmm: resolution # 4K HDR, 1080P FHD, etc. with the standards style
template_variables:
style: standards
- pmm: studio # DreamWorks Studios, Lucasfilm Ltd, etc.
- pmm: seasonal # Christmas, Halloween, etc.
template_variables: # Disable any US-specific seasonal collections
schedule_independence: never
schedule_thanksgiving: never
schedule_memorial: never
schedule_labor: never
- pmm: streaming # Streaming on Disney+, Netflix, etc.
template_variables:
originals_only: true # Only create collections for Original Content (i.e. Netflix Originals)
- pmm: universe # Marvel Cinematic Universe, Wizarding World, etc.
- pmm: separator_award # An "index card"
- pmm: bafta # BAFTA Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: golden # Golden Globes Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: oscars # The Oscars
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: separator_chart # An "index card"
- pmm: basic # Some basic chart collections
- pmm: tmdb # TMDb Charts (Popular, Trending, etc.)
- pmm: audio_language # English, French, Arabic, German, etc. audio language
- pmm: resolution # 4K HDR, 1080P FHD, etc. with the standards style
template_variables:
style: standards
- pmm: studio # DreamWorks Studios, Lucasfilm Ltd, etc.
- pmm: seasonal # Christmas, Halloween, etc.
template_variables: # Disable any US-specific seasonal collections
schedule_independence: never
schedule_thanksgiving: never
schedule_memorial: never
schedule_labor: never
- pmm: streaming # Streaming on Disney+, Netflix, etc.
template_variables:
originals_only: true # Only create collections for Original Content (i.e. Netflix Originals)
- pmm: universe # Marvel Cinematic Universe, Wizarding World, etc.
remove_overlays: false # Set to true if you want to remove overlays
reapply_overlays: false # If you are doing a lot of testing and changes like me, keep this to true to always reapply overlays - can cause image bloat
#reset_overlays: tmdb # if you want to reset the poster to default poster from tmdb - can cause image bloat
overlay_files:
- remove_overlays: false # Set to true if you want to remove overlays
# - reapply_overlays: false # If you are doing a lot of testing and changes like me, keep this to true to always reapply overlays - can cause image bloat
# - reset_overlays: tmdb # if you want to reset the poster to default poster from tmdb - can cause image bloat
- pmm: audio_codec # FLAC, DTS-X, TrueHD, etc. style: standard/compact. compact is default
- pmm: resolution # 4K HDR, 1080P FHD, etc.
- pmm: ribbon # Used for ribbon in bottom right
- pmm: streaming # Streaming on Disney+, Netflix, etc.
- pmm: video_format # Remux, DVD, Blu-Ray, etc. in bottom left
- pmm: audio_codec # FLAC, DTS-X, TrueHD, etc. style: standard/compact. compact is default
- pmm: resolution # 4K HDR, 1080P FHD, etc.
- pmm: ribbon # Used for ribbon in bottom right
- pmm: streaming # Streaming on Disney+, Netflix, etc.
- pmm: video_format # Remux, DVD, Blu-Ray, etc. in bottom left
settings:
asset_directory:
- config/assets
- config/assets
operations:
split_duplicates: false
@ -69,70 +71,70 @@
collection_mode: hide # hide the collections within the "library" tab in Plex.
placeholder_imdb_id: tt1190634 # The Boys (2019) placeholder id for the separators, avoids a plex bug.
collection_files:
- pmm: separator_award # An "index card"
- pmm: bafta # BAFTA Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: golden # Golden Globes Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: oscars # The Oscars
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: separator_chart # An "index card"
- pmm: basic # Some basic chart collections
- pmm: tmdb # TMDb Charts (Popular, Trending, etc.)
- pmm: audio_language # English, French, Arabic, German, etc. audio language
- pmm: resolution # 4K HDR, 1080P FHD, etc. with the standards style
template_variables:
style: standards
- pmm: network # ABC, CBC, NBC, FOX, etc.
- pmm: streaming # Streaming on Disney+, Netflix, etc.
template_variables:
originals_only: true # Only create collections for Original Content (i.e. Netflix Originals)
- pmm: separator_award # An "index card"
- pmm: bafta # BAFTA Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: golden # Golden Globes Awards
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: oscars # The Oscars
template_variables: # Show collections from current_year-10 onwards.
data:
starting: current_year-10
ending: current_year
- pmm: separator_chart # An "index card"
- pmm: basic # Some basic chart collections
- pmm: tmdb # TMDb Charts (Popular, Trending, etc.)
- pmm: audio_language # English, French, Arabic, German, etc. audio language
- pmm: resolution # 4K HDR, 1080P FHD, etc. with the standards style
template_variables:
style: standards
- pmm: network # ABC, CBC, NBC, FOX, etc.
- pmm: streaming # Streaming on Disney+, Netflix, etc.
template_variables:
originals_only: true # Only create collections for Original Content (i.e. Netflix Originals)
remove_overlays: false # Set to true if you want to remove overlays
reapply_overlays: false # If you are doing a lot of testing and changes like me, keep this to true to always reapply overlays - can cause image bloat
#reset_overlays: tmdb # if you want to reset the poster to default poster from tmdb - can cause image bloat
overlay_files:
- remove_overlays: false # Set to true if you want to remove overlays
# - reapply_overlays: false # If you are doing a lot of testing and changes like me, keep this to true to always reapply overlays - can cause image bloat
# - reset_overlays: tmdb # if you want to reset the poster to default poster from tmdb - can cause image bloat
- pmm: audio_codec # FLAC, DTS-X, TrueHD, etc. on show and episode
- pmm: audio_codec
template_variables:
builder_level: episode
- pmm: episode_info # S##E## information in bottom right on episode
template_variables:
builder_level: episode
- pmm: resolution # 4K HDR, 1080P FHD, etc. on show, episode, and season
- pmm: resolution
template_variables:
builder_level: episode
- pmm: resolution
template_variables:
builder_level: season
- pmm: ribbon # Used for ribbon in bottom right on show
- pmm: status # Airing, Returning, Ended, Canceled on show
- pmm: versions # Will show duplicates for that media item on show and episode
- pmm: versions
template_variables:
builder_level: episode
- pmm: video_format # Remux, DVD, Blu-Ray, etc. in bottom left on show, episode, and season
- pmm: video_format
template_variables:
builder_level: episode
- pmm: audio_codec # FLAC, DTS-X, TrueHD, etc. on show and episode
- pmm: audio_codec
template_variables:
builder_level: episode
- pmm: episode_info # S##E## information in bottom right on episode
template_variables:
builder_level: episode
- pmm: resolution # 4K HDR, 1080P FHD, etc. on show, episode, and season
- pmm: resolution
template_variables:
builder_level: episode
- pmm: resolution
template_variables:
builder_level: season
- pmm: ribbon # Used for ribbon in bottom right on show
- pmm: status # Airing, Returning, Ended, Canceled on show
- pmm: versions # Will show duplicates for that media item on show and episode
- pmm: versions
template_variables:
builder_level: episode
- pmm: video_format # Remux, DVD, Blu-Ray, etc. in bottom left on show, episode, and season
- pmm: video_format
template_variables:
builder_level: episode
settings:
asset_directory:
- config/assets
- config/assets
operations:
split_duplicates: false
assets_for_all: false
playlist_files:
- pmm: playlist
template_variables:
libraries: Movies, TV Shows # Must match the names of your libraries in Plex.
- pmm: playlist
template_variables:
libraries: Movies, TV Shows # Must match the names of your libraries in Plex.
```

@ -33,8 +33,8 @@ libraries:
```yaml
libraries:
Movies:
remove_overlays: false
overlay_files:
- remove_overlays: false
- pmm: resolution # 1, 4
- pmm: audio_codec # 2
- pmm: mediastinger # 3
@ -78,8 +78,8 @@ libraries:
```yaml
libraries:
TV Shows:
remove_overlays: false
overlay_files:
- remove_overlays: false
- pmm: resolution # 1
- pmm: audio_codec # 2
- pmm: mediastinger # 3
@ -120,8 +120,8 @@ libraries:
```yaml
libraries:
TV Shows:
remove_overlays: false
overlay_files:
- remove_overlays: false
- pmm: resolution # 1
template_variables:
builder_level: season
@ -145,8 +145,8 @@ libraries:
```yaml
libraries:
TV Shows:
remove_overlays: false
overlay_files:
- remove_overlays: false
- pmm: resolution # 1
template_variables:
builder_level: episode

@ -138,6 +138,12 @@ Finds every item in an [IMDb Event](https://www.imdb.com/event/).
| `category_filter` | Filter by the Category heading. Can only accept multiple values as a list.<br>**Options:** Any Gold/Yellow Category heading on an Event Page. |
| `winning` | Filter by if the Item Won the award.<br>**Options:** `true`/`false`<br>**Default:** `false` |
??? example "Example Award and Category Filter"
In the below example, "Grand Jury Prize" is the award_filter, and "Documentary" is the `category_filter`. You can use both of these filters together.
![imdbfilter.png](../images/imdbfilter.png)
1. When using multiple years the only available Event IDs are:
```yaml

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

@ -50,8 +50,8 @@ I then call "MyOverlays.yml" in my [Configuration File](../config/overview.md) w
```yaml
libraries:
Movies: #(1)!
remove_overlays: false
overlay_files:
- remove_overlays: false
- file: config/MyOverlays.yml #(2)!
```
@ -112,7 +112,7 @@ There is an attribute called `reapply_overlays` which, when set to true, will fo
* Ensure `reapply_overlays` is set to `false` if you see it in your Configuration File. If it has previously been set to true we recommend using [Plex Image Cleanup](../pmm/scripts/image-cleanup.md) to get rid of the bloat.
To remove all overlays from your library, add `remove_overlays: true` to the `overlay_files` [Libraries Attribute](../config/libraries.md).**
To remove all overlays from your library, add the [`remove_overlays` library attribute](../config/libraries.md#remove-overlays) set to `true`.**
* See the above note on Plex Meta Manager not removing the overlaid images, this is still true here.

@ -33,8 +33,8 @@ libraries:
- file: config/TV Shows.yml
- pmm: tmdb
- pmm: network
remove_overlays: false
overlay_files:
- remove_overlays: false
- file: config/Overlays.yml
playlist_files:
- file: config/playlists.yml

@ -2,7 +2,7 @@
search:
boost: 4
---
# Frequently Asked Questions
# FAQ & Knowledgebase
This page aims to provide knowledge based on combined user experience, and to answer the frequent questions that we are asked in our
@ -12,7 +12,7 @@ If you have a question that is not answered here, try entering some keywords int
This sections aims to answer the most commonly asked questions that users have.
#### PMM Versions & Updating
### PMM Versions & Updating
The commands here should work in any terminal on the respective platforms, but that can't be guaranteed. If you know shortcuts for some of these things, go ahead and use them. For example, in many terminals, `cd ~/Plex-Meta-Manager` is the same as `cd /Users/YOUR_USERNAME/Plex-Meta-Manager`.
@ -300,7 +300,7 @@ Your PMM installation may not be located at the paths referenced below. These a
If you are using Docker on a NAS like Synology or UNRaid, they will provide some means of doing those two things.
#### Performance & Scheduling
### Performance & Scheduling
??? question "Any tips on increasing PMM performance?"
@ -347,7 +347,7 @@ Your PMM installation may not be located at the paths referenced below. These a
- pmm: resolution
```
#### Errors & Issues
### Errors & Issues
??? question "Why doesn't PMM let me enter my authentication information for Trakt/MAL?"
@ -378,4 +378,115 @@ Your PMM installation may not be located at the paths referenced below. These a
:two: Check the plex logs (container or other) for the "Busy DB Sleeping for 200ms)
There is nothing that PMM or our support staff can really do to resolve a 500 error.
There is nothing that PMM or our support staff can really do to resolve a 500 error.
## Knowledgebase
This section aims to provide some insight as to articles/information that we feel is important to document as they may pop up infrequently but often enough to require entry here.
### PMM 1.20 Release Changes
With the release of PMM 1.20, several changes have taken place that we would like to make you aware of, please read the below document thoroughly!
??? blank "`metadata_path` and `overlay_path` are now legacy attributes (click to expand).<a class="headerlink" href="#metadata-overlay-path" title="Permanent link"></a>"
<div id="metadata-overlay-path" />
The attributes `metadata_path` and `overlay_path` are now legacy, and will likely produce an error `metadata attribute is required` when running PMM.
We have new attributes: `collection_files`, `overlay_files` and `metadata_files` which you can read more about on the [Libraries Attributes page](../config/libraries.md#attributes)
Whilst this error can be ignored, we strongly advise you to move over to the new attributes, which can be done following this guidance:
:fontawesome-solid-1: If your YAML file contains `collections:` or is a PMM Defaults Collection File then it belongs under `collection_files`.
:fontawesome-solid-2: If your YAML file contains `overlays:` or is a PMM Defaults Overlay File then it belongs under `overlay_files`
:fontawesome-solid-3: If your YAML file contains `metadata:` then it belongs under `metadata_files`
If your file contains both `collections:` and `metadata:` then it should go in both `collection_files` and `metadata_files`
If you are unsure on the above, the majority of `metadata_path` items will now fall under `collection_files`, but you can ask on the Discord.
Below is an example of the new attributes in use:
```yaml
libraries:
Movies:
collection_files: #(1)!
- file: config/Movies.yml #(2)!
- pmm: imdb #(2)!
metadata_files: #(3)!
- file: config/MetadataEdits.yml #(4)!
overlay_files: #(5)!
- file: config/Overlays.yml #(6)!
- pmm: audio_codec #(6)!
```
1. This attribute used to be `metadata_path` and defines files that will relate to Collections
2. These files are placed within `collection_files` because they define how Collections are built/maintained.
3. This attribute used to be `metadata_path` and defines files that will relate to Metadata Edits
4. These files are placed within `metadata_files` because they define Metadata Edits rather than collections.
5. This attribute used to be `overlay_path` and defines files that will relate to Overlays
6. These files are placed within `overlay_files` because they define how Overlays are built/maintained.
??? blank "`remove_` `reset_` `reapply_` and `schedule_` attributes for `overlays` are now Library Attributes (click to expand).<a class="headerlink" href="#overlay-library-attributes" title="Permanent link"></a>"
<div id="overlay-library-attributes" />
The attributes `remove_overlays`, `reset_overlays`, `reapply_overlays` and `schedule_overlays` are now Library Attributes and are called at the library level rather than within `overlay_path.
This change has been made to make these attributes consistent with other attributes of a similar nature.
Whilst the previous method still works, we strongly advise you to move over to the new attributes, which can be done by looking at the following sample YAML:
```yaml
libraries:
Movies:
remove_overlays: false
reapply_overlays: false #(1)!
reset_overlays: false
schedule_overlays: daily
overlay_files:
- pmm: audio_codec
```
1. We strongly advise never setting this to `true` as it can cause [Image Bloat](scripts/image-cleanup.md)
??? blank "`imdb_list` no longer works for Title or Keyword search URLs (click to expand).<a class="headerlink" href="#imdb-search" title="Permanent link"></a>"
<div id="imdb-search" />
As a result of IMDb changing their back-end code, `imdb_list` can no longer be used for URLs which start with `https://www.imdb.com/search/title/` or `https://www.imdb.com/search/keyword/`
All URLs used with `imdb_list` **must** start with `https://www.imdb.com/list/`
We have introduced the [IMDb Search Builder](../files/builders/imdb.md#imdb-search) which replaces the functionality that `search/title/` and `search/keyword/` used to provide.
As an example, the `imdb_search` builder for `https://www.imdb.com/search/keyword/?keywords=christmas-movie` would be:
```yaml
collections:
Christmas Movies:
imdb_search:
keyword: christmas movie
```
And the `imdb_search` builder for `https://www.imdb.com/search/title/?title_type=feature,tv_movie,tv_special,video&num_votes=100,&keywords=spy,espionage` would be:
```yaml
collections:
Spy Movies:
imdb_search:
type: movie, tv_movie, tv_special, video
votes.gte: 100
keyword.any: spy, espionage
```
??? blank "FlixPatrol Default File and Builder have been reworked (click to expand).<a class="headerlink" href="#flixpatrol" title="Permanent link"></a>"
<div id="flixpatrol" />
Due to FlixPatrol moving a lot of their data behind a paywall, the existing setup no longer works.
We have reintroduced FlixPatrol as a [Builder](../files/builders/flixpatrol.md) and [PMM Defaults File](../defaults/chart/flixpatrol.md), we recommdend reading the documentation and updating your config/YAML files to suit.

@ -39,8 +39,8 @@ Now let's add rating overlays to the poster. We're going to use the minimal conf
```yaml
libraries:
One Movie:
reapply_overlays: true
overlay_files:
- reapply_overlays: true
- pmm: ratings
template_variables:
rating1: critic
@ -89,8 +89,8 @@ You and I both know that the IMDb rating isn't 6.0, but Plex Meta Manager is jus
```yaml
libraries:
One Movie:
reapply_overlays: true
overlay_files:
- reapply_overlays: true
- pmm: ratings
template_variables:
rating1: critic
@ -122,8 +122,8 @@ Now let's actually update the ratings and push some numbers into those boxes usi
```yaml
libraries:
One Movie:
reapply_overlays: true
overlay_files:
- reapply_overlays: true
- pmm: ratings
template_variables:
rating1: critic
@ -160,8 +160,8 @@ Now let's update the critic and audience ratings to some different ratings:
```yaml
libraries:
One Movie:
reapply_overlays: true
overlay_files:
- reapply_overlays: true
- pmm: ratings
template_variables:
rating1: critic
@ -209,8 +209,8 @@ Let's change the Trakt rating to that trakt public rating of `85%` instead, whic
```yaml
libraries:
One Movie:
reapply_overlays: true
overlay_files:
- reapply_overlays: true
- pmm: ratings
template_variables:
rating1: critic
@ -244,8 +244,8 @@ Now, finally, let's make the poster rating images match the numbers we put in th
```yaml
libraries:
One Movie:
reapply_overlays: true
overlay_files:
- reapply_overlays: true
- pmm: ratings
template_variables:
rating1: critic

@ -355,17 +355,6 @@ An advantage of doing this in a virtual environment is that in the event somethi
.\pmm-venv\Scripts\activate
```
### If you are running Python 3.12
with the virtual environment activated, type this into your terminal:
```
pip install setuptools
```
This will update a piece of the Python infrastructure and prevent an error later.
### Installing requirements
Plex-Meta-Manager, like every other Python script, depends on support libraries that manage things like connections to Plex, or getting things from the internet, or writing files and so on.

@ -128,8 +128,8 @@ services:
environment:
- PMM_RUN=true
- PMM_CONFIG=/config/special-config.yml
- PMM_OVERLAYS=true
- PMM_LIBRARIES=Movies
- PMM_OVERLAYS_ONLY=true
- PMM_RUN_LIBRARIES=Movies
volumes:
- /path/to/config:/config
```
@ -138,8 +138,8 @@ services:
`- PMM_CONFIG=/config/special-config.yml` points PMM at a particular config file,
`- PMM_OVERLAYS=true` tells PMM to run overlays only, and
`- PMM_OVERLAYS_ONLY=true` tells PMM to run overlays only, and
`- PMM_LIBRARIES=Movies` tells PMM to process only a library called "Movies"
`- PMM_RUN_LIBRARIES=Movies` tells PMM to process only a library called "Movies"
Again, a list of the available environment variables can be found [here](../environmental.md).

@ -28,8 +28,8 @@ libraries: # This is called out once within the config.yml
- pmm: basic # This is a file within the defaults folder in the Repository
- pmm: imdb # This is a file within the defaults folder in the Repository
# see the wiki for how to use local files, folders, URLs, or files from git
remove_overlays: false # Set this to true to remove all overlays
overlay_files:
- remove_overlays: false # Set this to true to remove all overlays
- pmm: ribbon # This is a file within the defaults folder in the Repository
# see the wiki for how to use local files, folders, URLs, or files from git
TV Shows:
@ -37,8 +37,8 @@ libraries: # This is called out once within the config.yml
- pmm: basic # This is a file within the defaults folder in the Repository
- pmm: imdb # This is a file within the defaults folder in the Repository
# see the wiki for how to use local files, folders, URLs, or files from git
remove_overlays: false # Set this to true to remove all overlays
overlay_files:
- remove_overlays: false # Set this to true to remove all overlays
- pmm: ribbon # This is a file within the defaults folder in the Repository
# see the wiki for how to use local files, folders, URLs, or files from git
Anime:

@ -24,22 +24,6 @@ Ive removed some of the lines for space, but have left the important bits:
You can see there that PMM found its config file, was able to connect to TMDb, was able to connect to Plex, and then failed trying to read the “Movies-NOSUCHLIBRARY" library, which of course doesnt exist.
<details>
<summary>I got a ModuleError instead</summary>
If you see this error instead:
```
ModuleNotFoundError: No module named 'pkg_resources'
```
Chances are you're using Python 3.12 and skipped the bit above about Python 3.12.
Type this into your terminal
```
pip install setuptools
```
Then try the run command from above again.
</details>
Open the config file again and change "Movies-NOSUCHLIBRARY" to reflect *your own* Movie library in Plex.
Say my Movies library is called “All The Movies", so mine looks like this:

@ -12,7 +12,7 @@ libraries:
- pmm: imdb # This is a file within the defaults folder in the Repository
# see the wiki for how to use local files, folders, URLs, or files from git
- file: config/Movies.yml
remove_overlays: false ## <<< ADD THIS LINE
overlay_files: ## <<< ADD THIS LINE
- remove_overlays: false ## <<< ADD THIS LINE
- pmm: resolution ## <<< ADD THIS LINE
```

@ -3,8 +3,8 @@
If you want to remove those overlays, open the config file, change the value of `remove_overlays` to `true`, and rerun PMM.
```
remove_overlays: true
overlay_files:
- remove_overlays: true
- pmm: resolution
```
@ -18,8 +18,8 @@ libraries:
# - pmm: imdb # This is a file within the defaults folder in the Repository
# see the wiki for how to use local files, folders, URLs, or files from git
# - file: config/Movies.yml
remove_overlays: false
overlay_files:
- remove_overlays: false
- pmm: resolution
```

@ -83,7 +83,7 @@ extra:
class: md-social__link
link: 'https://github.com/meisnate12/Plex-Meta-Manager'
name: GitHub
copyright: Copyright &copy; 2023 meisnate12
copyright: Copyright &copy; 2024 meisnate12
markdown_extensions:
- pymdownx.tasklist:
custom_checkbox: true

@ -68,9 +68,9 @@ class Convert:
elif anidb_id in self._anidb_to_tvdb:
ids.append((self._anidb_to_tvdb[anidb_id], "tvdb"))
elif str(anidb_id) in self._anidb_ids:
logger.warning(f"Convert Error: No TVDb ID or IMDb ID found for AniDB ID: {anidb_id}")
logger.warning(f"Convert Warning: No TVDb ID or IMDb ID found for AniDB ID: {anidb_id}")
else:
logger.warning(f"Convert Error: AniDB ID: {anidb_id} not found")
logger.error(f"AniDB Error: No Anime found for AniDB ID: {anidb_id}")
return ids
def anilist_to_ids(self, anilist_ids, library):
@ -79,7 +79,7 @@ class Convert:
if anilist_id in self._anilist_to_anidb:
anidb_ids.append(self._anilist_to_anidb[anilist_id])
else:
logger.warning(f"Convert Error: AniDB ID not found for AniList ID: {anilist_id}")
logger.warning(f"Convert Warning: No AniDB ID Found for AniList ID: {anilist_id}")
return self.anidb_to_ids(anidb_ids, library)
def myanimelist_to_ids(self, mal_ids, library):
@ -90,7 +90,7 @@ class Convert:
elif int(mal_id) in self._mal_to_anidb:
ids.extend(self.anidb_to_ids(self._mal_to_anidb[int(mal_id)], library))
else:
logger.warning(f"Convert Error: AniDB ID not found for MyAnimeList ID: {mal_id}")
logger.warning(f"Convert Warning: No AniDB ID Found for MyAnimeList ID: {mal_id}")
return ids
def tmdb_to_imdb(self, tmdb_id, is_movie=True, fail=False):
@ -109,7 +109,7 @@ class Convert:
except Failed:
pass
if fail:
raise Failed(f"Convert Error: No IMDb ID Found for TMDb ID: {tmdb_id}")
raise Failed(f"Convert Warning: No IMDb ID Found for TMDb ID: {tmdb_id}")
else:
return None
@ -128,7 +128,7 @@ class Convert:
except Failed:
pass
if fail:
raise Failed(f"Convert Error: No TMDb ID Found for IMDb ID: {imdb_id}")
raise Failed(f"Convert Warning: No TMDb ID Found for IMDb ID: {imdb_id}")
else:
return None, None
@ -147,7 +147,7 @@ class Convert:
except Failed:
pass
if fail:
raise Failed(f"Convert Error: No TVDb ID Found for TMDb ID: {tmdb_id}")
raise Failed(f"Convert Warning: No TVDb ID Found for TMDb ID: {tmdb_id}")
else:
return None
@ -166,7 +166,7 @@ class Convert:
except Failed:
pass
if fail:
raise Failed(f"Convert Error: No TMDb ID Found for TVDb ID: {tvdb_id}")
raise Failed(f"Convert Warning: No TMDb ID Found for TVDb ID: {tvdb_id}")
else:
return None
@ -185,7 +185,7 @@ class Convert:
except Failed:
pass
if fail:
raise Failed(f"Convert Error: No IMDb ID Found for TVDb ID: {tvdb_id}")
raise Failed(f"Convert Warning: No IMDb ID Found for TVDb ID: {tvdb_id}")
else:
return None
@ -206,7 +206,7 @@ class Convert:
except Failed:
pass
if fail:
raise Failed(f"Convert Error: No TVDb ID Found for IMDb ID: {imdb_id}")
raise Failed(f"Convert Warning: No TVDb ID Found for IMDb ID: {imdb_id}")
else:
return None

@ -370,7 +370,7 @@ class Overlays:
logger.info(e)
logger.info(type(e))
logger.stacktrace()
logger.error("")
logger.info("")
logger.error(f"Overlays Attempted on {item_title}: {', '.join(over_names)}")
logger.exorcise()
for _, over in properties.items():

@ -132,10 +132,10 @@ class TMDbMovie(TMDBObj):
try:
return self._tmdb.TMDb.movie(self.tmdb_id, partial="external_ids,keywords")
except NotFound:
raise Failed(f"TMDb Error: No Movie found for TMDb ID {self.tmdb_id}")
raise Failed(f"TMDb Error: No Movie found for TMDb ID: {self.tmdb_id}")
except TMDbException as e:
logger.stacktrace()
raise TMDbException(f"TMDb Error: Unexpected Error with TMDb ID {self.tmdb_id}: {e}")
raise TMDbException(f"TMDb Error: Unexpected Error with TMDb ID: {self.tmdb_id}: {e}")
class TMDbShow(TMDBObj):
@ -169,10 +169,10 @@ class TMDbShow(TMDBObj):
try:
return self._tmdb.TMDb.tv_show(self.tmdb_id, partial="external_ids,keywords")
except NotFound:
raise Failed(f"TMDb Error: No Show found for TMDb ID {self.tmdb_id}")
raise Failed(f"TMDb Error: No Show found for TMDb ID: {self.tmdb_id}")
except TMDbException as e:
logger.stacktrace()
raise TMDbException(f"TMDb Error: Unexpected Error with TMDb ID {self.tmdb_id}: {e}")
raise TMDbException(f"TMDb Error: Unexpected Error with TMDb ID: {self.tmdb_id}: {e}")
class TMDb:
def __init__(self, config, params):

@ -1,5 +1,6 @@
import requests, time
from datetime import datetime
from lxml import html
from lxml.etree import ParserError
from modules import util
from modules.util import Failed
@ -50,7 +51,11 @@ class TVDbObj:
if self._tvdb.config.Cache and not ignore_cache:
data, expired = self._tvdb.config.Cache.query_tvdb(tvdb_id, is_movie, self._tvdb.expiration)
if expired or not data:
data = self._tvdb.get_request(f"{urls['movie_id' if is_movie else 'series_id']}{tvdb_id}")
item_url = f"{urls['movie_id' if is_movie else 'series_id']}{tvdb_id}"
try:
data = self._tvdb.get_request(item_url)
except Failed:
raise Failed(f"TVDb Error: {'Movie' if is_movie else 'Series'} not found at {item_url}")
def parse_page(xpath, is_list=False):
parse_results = data.xpath(xpath)
@ -108,7 +113,10 @@ class TVDb:
@retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_failed)
def get_request(self, tvdb_url):
return self.config.get_html(tvdb_url, headers=util.header(self.language))
response = self.config.get(tvdb_url, headers=util.header(self.language))
if response.status_code >= 400:
raise Failed(f"({response.status_code}) {response.reason}")
return html.fromstring(response.content)
def get_id_from_url(self, tvdb_url, is_movie=False, ignore_cache=False):
try:
@ -133,8 +141,8 @@ class TVDb:
logger.trace(f"URL: {tvdb_url}")
try:
response = self.get_request(tvdb_url)
except ParserError:
raise Failed(f"TVDb Error: Could not parse {tvdb_url}")
except (ParserError, Failed):
raise Failed(f"TVDb Error: Failed not parse {tvdb_url}")
results = response.xpath(f"//*[text()='TheTVDB.com {media_type} ID']/parent::node()/span/text()")
if len(results) > 0:
tvdb_id = int(results[0])

@ -1,4 +1,4 @@
import argparse, os, platform, sys, time, uuid
import argparse, os, platform, re, sys, time, uuid
from collections import Counter
from concurrent.futures import ProcessPoolExecutor
from datetime import datetime
@ -135,9 +135,9 @@ for env_name, env_data in os.environ.items():
secret_args[str(env_name).lower()[4:].replace("_", "-")] = env_data
run_arg = " ".join([f'"{s}"' if " " in s else s for s in sys.argv[:]])
for _, v in secret_args.items():
if v in run_arg:
run_arg = run_arg.replace(v, "(redacted)")
for _, sv in secret_args.items():
if sv in run_arg:
run_arg = run_arg.replace(sv, "(redacted)")
try:
from git import Repo, InvalidGitRepositoryError # noqa
@ -241,7 +241,7 @@ def start(attrs):
if not is_docker and not is_linuxserver:
try:
with open("requirements.txt", "r") as file:
required_version = next(l.strip()[9:] for l in file.readlines() if l.strip().startswith("PlexAPI=="))
required_version = next(ln.strip()[9:] for ln in file.readlines() if ln.strip().startswith("PlexAPI=="))
except FileNotFoundError:
logger.error(" File Error: requirements.txt not found")
logger.info(f" PlexAPI Version: {plexapi.VERSION}")
@ -313,14 +313,63 @@ def start(attrs):
version_line = f"{version_line} Newest Version: {new_version}"
try:
log_data = {}
no_overlays = []
no_overlays_count = 0
convert_errors = {}
other_log_groups = [
("No Items found for", r"No Items found for .* \(\d+\) (.*)"),
("Convert Warning: No TVDb ID or IMDb ID found for AniDB ID:", r"Convert Warning: No TVDb ID or IMDb ID found for AniDB ID: (.*)"),
("Convert Warning: No AniDB ID Found for AniList ID:", r"Convert Warning: No AniDB ID Found for AniList ID: (.*)"),
("Convert Warning: No AniDB ID Found for MyAnimeList ID:", r"Convert Warning: No AniDB ID Found for MyAnimeList ID: (.*)"),
("Convert Warning: No IMDb ID Found for TMDb ID:", r"Convert Warning: No IMDb ID Found for TMDb ID: (.*)"),
("Convert Warning: No TMDb ID Found for IMDb ID:", r"Convert Warning: No TMDb ID Found for IMDb ID: (.*)"),
("Convert Warning: No TVDb ID Found for TMDb ID:", r"Convert Warning: No TVDb ID Found for TMDb ID: (.*)"),
("Convert Warning: No TMDb ID Found for TVDb ID:", r"Convert Warning: No TMDb ID Found for TVDb ID: (.*)"),
("Convert Warning: No IMDb ID Found for TVDb ID:", r"Convert Warning: No IMDb ID Found for TVDb ID: (.*)"),
("Convert Warning: No TVDb ID Found for IMDb ID:", r"Convert Warning: No TVDb ID Found for IMDb ID: (.*)"),
("Convert Warning: No AniDB ID to Convert to MyAnimeList ID for Guid:", r"Convert Warning: No AniDB ID to Convert to MyAnimeList ID for Guid: (.*)"),
("Convert Warning: No MyAnimeList Found for AniDB ID:", r"Convert Warning: No MyAnimeList Found for AniDB ID: (.*) of Guid: .*"),
]
other_message = {}
with open(logger.main_log, encoding="utf-8") as f:
for log_line in f:
for err_type in ["WARNING", "ERROR", "CRITICAL"]:
if f"[{err_type}]" in log_line:
log_line = log_line.split("|")[1].strip()
if err_type not in log_data:
log_data[err_type] = []
log_data[err_type].append(log_line)
other = False
for key, reg in other_log_groups:
if log_line.startswith(key):
other = True
_name = re.match(reg, log_line).group(1)
if key not in other_message:
other_message[key] = {"list": [], "count": 0}
other_message[key]["count"] += 1
if _name not in other_message[key]:
other_message[key]["list"].append(_name)
if other is False:
if err_type not in log_data:
log_data[err_type] = []
log_data[err_type].append(log_line)
if "No Items found for" in other_message:
logger.separator(f"Overlay Errors Summary", space=False, border=False)
logger.info("")
logger.info(f"No Items found for {other_message['No Items found for']['count']} Overlays: {other_message['No Items found for']['list']}")
logger.info("")
convert_title = False
for key, _ in other_log_groups:
if key.startswith("Convert Warning") and key in other_message:
if convert_title is False:
logger.separator("Convert Summary", space=False, border=False)
logger.info("")
convert_title = True
logger.info(f"{key[17:]}")
logger.info(", ".join(other_message[key]["list"]))
if convert_title:
logger.info("")
for err_type in ["WARNING", "ERROR", "CRITICAL"]:
if err_type not in log_data:
@ -554,7 +603,7 @@ def run_libraries(config):
for library_type in library_types:
for item in library.get_all(builder_level=library_type):
try:
sync = ["Overlay"] if "Overlay" in [i.tag for i in item.labels] else []
sync = ["Overlay"] if "Overlay" in [lbl.tag for lbl in item.labels] else []
library.edit_tags("label", item, sync_tags=sync)
except NotFound:
logger.error(f"{item.title[:25]:<25} | Labels Failed to be Removed")

Loading…
Cancel
Save