mirror of
https://github.com/meisnate12/Plex-Meta-Manager
synced 2024-11-21 20:13:05 +00:00
[81] add convert and overlay summary
This commit is contained in:
parent
31ff1c78e9
commit
a7ffd51c76
25 changed files with 390 additions and 384 deletions
41
CHANGELOG
41
CHANGELOG
|
@ -1,20 +1,42 @@
|
||||||
# Requirements Update (requirements will need to be reinstalled)
|
# Requirements Update (requirements will need to be reinstalled)
|
||||||
|
Updated arrapi requirement to 1.4.7
|
||||||
Updated GitPython requirement to 3.1.40
|
Updated GitPython requirement to 3.1.40
|
||||||
|
Updated lxml requirement to 5.0.0
|
||||||
Updated num2words requirement to 0.5.13
|
Updated num2words requirement to 0.5.13
|
||||||
Updated pillow requirement to 10.1.0
|
Updated pillow requirement to 10.2.0
|
||||||
Updated PlexAPI requirement to 4.15.6
|
Updated PlexAPI requirement to 4.15.7
|
||||||
|
Updated psutil requirement to 5.9.7
|
||||||
Updated ruamel.yaml requirement to 0.18.5
|
Updated ruamel.yaml requirement to 0.18.5
|
||||||
Updated schedule requirement to 1.2.1
|
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
|
# 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.
|
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.
|
||||||
Redesigned Wiki with new landing page and new layout using mkdocs.
|
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.
|
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/).
|
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 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)
|
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/)
|
||||||
Removed library- and collection-level logging, all logging is handled in the meta.log
|
Added `schedule` and `schedule_<<key>>` template variables to most defaults.
|
||||||
|
|
||||||
# Bug Fixes
|
# 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 `(404) not_found` error that presented itself in PMS 1.32.7, as outlined [here](https://discord.com/channels/822460010649878528/1099773891733377065/1174751954367422585)
|
||||||
|
@ -22,3 +44,8 @@ Fixed issue that would prevent `file_poster` from overriding `url_poster` in the
|
||||||
Removed `--cache-libraries` Environment Variable due to inconsistent behaviour that could cause issues.
|
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 `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,
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2023 meisnate12
|
Copyright (c) 2024 meisnate12
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -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
|
- file: config/TV Shows.yml
|
||||||
- pmm: tmdb
|
- pmm: tmdb
|
||||||
- pmm: network
|
- pmm: network
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- file: config/Overlays.yml
|
- file: config/Overlays.yml
|
||||||
TV Shows On Second Plex:
|
TV Shows On Second Plex:
|
||||||
library_name: TV Shows
|
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.
|
If you want to customize these values, use the methods described above.
|
||||||
|
|
||||||
**Default `include`:
|
**Default `include`:**
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
include:
|
include: {%
|
||||||
- ab # Abkhazian
|
include-markdown "../../../defaults/both/audio_language.yml"
|
||||||
- aa # Afar
|
comments=false
|
||||||
- af # Afrikaans
|
preserve-includer-indent=false
|
||||||
- ak # Akan
|
start="include:"
|
||||||
- sq # Albanian
|
end="key_name_override:"
|
||||||
- am # Amharic
|
%}
|
||||||
- ar # Arabic
|
```
|
||||||
- an # Aragonese
|
|
||||||
- hy # Armenian
|
**Default `key_name_override`:**
|
||||||
- as # Assamese
|
|
||||||
- av # Avaric
|
```yaml
|
||||||
- ae # Avestan
|
key_name_override: {%
|
||||||
- ay # Aymara
|
include-markdown "../../../defaults/both/audio_language.yml"
|
||||||
- az # Azerbaijani
|
comments=false
|
||||||
- bm # Bambara
|
preserve-includer-indent=false
|
||||||
- ba # Bashkir
|
start="key_name_override:"
|
||||||
- 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
|
|
||||||
```
|
```
|
|
@ -45,10 +45,12 @@
|
||||||
template_variables:
|
template_variables:
|
||||||
originals_only: true # Only create collections for Original Content (i.e. Netflix Originals)
|
originals_only: true # Only create collections for Original Content (i.e. Netflix Originals)
|
||||||
- pmm: universe # Marvel Cinematic Universe, Wizarding World, etc.
|
- 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:
|
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: audio_codec # FLAC, DTS-X, TrueHD, etc. style: standard/compact. compact is default
|
||||||
- pmm: resolution # 4K HDR, 1080P FHD, etc.
|
- pmm: resolution # 4K HDR, 1080P FHD, etc.
|
||||||
- pmm: ribbon # Used for ribbon in bottom right
|
- pmm: ribbon # Used for ribbon in bottom right
|
||||||
|
@ -96,10 +98,10 @@
|
||||||
- pmm: streaming # Streaming on Disney+, Netflix, etc.
|
- pmm: streaming # Streaming on Disney+, Netflix, etc.
|
||||||
template_variables:
|
template_variables:
|
||||||
originals_only: true # Only create collections for Original Content (i.e. Netflix Originals)
|
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:
|
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 # FLAC, DTS-X, TrueHD, etc. on show and episode
|
||||||
- pmm: audio_codec
|
- pmm: audio_codec
|
||||||
template_variables:
|
template_variables:
|
||||||
|
|
|
@ -33,8 +33,8 @@ libraries:
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
Movies:
|
Movies:
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- pmm: resolution # 1, 4
|
- pmm: resolution # 1, 4
|
||||||
- pmm: audio_codec # 2
|
- pmm: audio_codec # 2
|
||||||
- pmm: mediastinger # 3
|
- pmm: mediastinger # 3
|
||||||
|
@ -78,8 +78,8 @@ libraries:
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
TV Shows:
|
TV Shows:
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- pmm: resolution # 1
|
- pmm: resolution # 1
|
||||||
- pmm: audio_codec # 2
|
- pmm: audio_codec # 2
|
||||||
- pmm: mediastinger # 3
|
- pmm: mediastinger # 3
|
||||||
|
@ -120,8 +120,8 @@ libraries:
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
TV Shows:
|
TV Shows:
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- pmm: resolution # 1
|
- pmm: resolution # 1
|
||||||
template_variables:
|
template_variables:
|
||||||
builder_level: season
|
builder_level: season
|
||||||
|
@ -145,8 +145,8 @@ libraries:
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
TV Shows:
|
TV Shows:
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- pmm: resolution # 1
|
- pmm: resolution # 1
|
||||||
template_variables:
|
template_variables:
|
||||||
builder_level: episode
|
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. |
|
| `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` |
|
| `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:
|
1. When using multiple years the only available Event IDs are:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
|
BIN
docs/files/images/imdbfilter.png
Normal file
BIN
docs/files/images/imdbfilter.png
Normal file
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
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
Movies: #(1)!
|
Movies: #(1)!
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- file: config/MyOverlays.yml #(2)!
|
- 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.
|
* 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.
|
* 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
|
- file: config/TV Shows.yml
|
||||||
- pmm: tmdb
|
- pmm: tmdb
|
||||||
- pmm: network
|
- pmm: network
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- file: config/Overlays.yml
|
- file: config/Overlays.yml
|
||||||
playlist_files:
|
playlist_files:
|
||||||
- file: config/playlists.yml
|
- file: config/playlists.yml
|
||||||
|
|
119
docs/pmm/faqs.md
119
docs/pmm/faqs.md
|
@ -2,7 +2,7 @@
|
||||||
search:
|
search:
|
||||||
boost: 4
|
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
|
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.
|
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`.
|
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.
|
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?"
|
??? 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
|
- pmm: resolution
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Errors & Issues
|
### Errors & Issues
|
||||||
|
|
||||||
??? question "Why doesn't PMM let me enter my authentication information for Trakt/MAL?"
|
??? question "Why doesn't PMM let me enter my authentication information for Trakt/MAL?"
|
||||||
|
|
||||||
|
@ -379,3 +379,114 @@ 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)
|
: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
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
One Movie:
|
One Movie:
|
||||||
|
reapply_overlays: true
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- reapply_overlays: true
|
|
||||||
- pmm: ratings
|
- pmm: ratings
|
||||||
template_variables:
|
template_variables:
|
||||||
rating1: critic
|
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
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
One Movie:
|
One Movie:
|
||||||
|
reapply_overlays: true
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- reapply_overlays: true
|
|
||||||
- pmm: ratings
|
- pmm: ratings
|
||||||
template_variables:
|
template_variables:
|
||||||
rating1: critic
|
rating1: critic
|
||||||
|
@ -122,8 +122,8 @@ Now let's actually update the ratings and push some numbers into those boxes usi
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
One Movie:
|
One Movie:
|
||||||
|
reapply_overlays: true
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- reapply_overlays: true
|
|
||||||
- pmm: ratings
|
- pmm: ratings
|
||||||
template_variables:
|
template_variables:
|
||||||
rating1: critic
|
rating1: critic
|
||||||
|
@ -160,8 +160,8 @@ Now let's update the critic and audience ratings to some different ratings:
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
One Movie:
|
One Movie:
|
||||||
|
reapply_overlays: true
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- reapply_overlays: true
|
|
||||||
- pmm: ratings
|
- pmm: ratings
|
||||||
template_variables:
|
template_variables:
|
||||||
rating1: critic
|
rating1: critic
|
||||||
|
@ -209,8 +209,8 @@ Let's change the Trakt rating to that trakt public rating of `85%` instead, whic
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
One Movie:
|
One Movie:
|
||||||
|
reapply_overlays: true
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- reapply_overlays: true
|
|
||||||
- pmm: ratings
|
- pmm: ratings
|
||||||
template_variables:
|
template_variables:
|
||||||
rating1: critic
|
rating1: critic
|
||||||
|
@ -244,8 +244,8 @@ Now, finally, let's make the poster rating images match the numbers we put in th
|
||||||
```yaml
|
```yaml
|
||||||
libraries:
|
libraries:
|
||||||
One Movie:
|
One Movie:
|
||||||
|
reapply_overlays: true
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- reapply_overlays: true
|
|
||||||
- pmm: ratings
|
- pmm: ratings
|
||||||
template_variables:
|
template_variables:
|
||||||
rating1: critic
|
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
|
.\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
|
### 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.
|
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:
|
environment:
|
||||||
- PMM_RUN=true
|
- PMM_RUN=true
|
||||||
- PMM_CONFIG=/config/special-config.yml
|
- PMM_CONFIG=/config/special-config.yml
|
||||||
- PMM_OVERLAYS=true
|
- PMM_OVERLAYS_ONLY=true
|
||||||
- PMM_LIBRARIES=Movies
|
- PMM_RUN_LIBRARIES=Movies
|
||||||
volumes:
|
volumes:
|
||||||
- /path/to/config:/config
|
- /path/to/config:/config
|
||||||
```
|
```
|
||||||
|
@ -138,8 +138,8 @@ services:
|
||||||
|
|
||||||
`- PMM_CONFIG=/config/special-config.yml` points PMM at a particular config file,
|
`- 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).
|
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: 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
|
- 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
|
# 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:
|
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
|
- 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
|
# see the wiki for how to use local files, folders, URLs, or files from git
|
||||||
TV Shows:
|
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: 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
|
- 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
|
# 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:
|
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
|
- 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
|
# see the wiki for how to use local files, folders, URLs, or files from git
|
||||||
Anime:
|
Anime:
|
||||||
|
|
|
@ -24,22 +24,6 @@ I’ve 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 doesn’t exist.
|
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 doesn’t 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.
|
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:
|
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
|
- 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
|
# see the wiki for how to use local files, folders, URLs, or files from git
|
||||||
- file: config/Movies.yml
|
- file: config/Movies.yml
|
||||||
|
remove_overlays: false ## <<< ADD THIS LINE
|
||||||
overlay_files: ## <<< ADD THIS LINE
|
overlay_files: ## <<< ADD THIS LINE
|
||||||
- remove_overlays: false ## <<< ADD THIS LINE
|
|
||||||
- pmm: resolution ## <<< 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.
|
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:
|
overlay_files:
|
||||||
- remove_overlays: true
|
|
||||||
- pmm: resolution
|
- pmm: resolution
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@ libraries:
|
||||||
# - pmm: imdb # 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
|
# see the wiki for how to use local files, folders, URLs, or files from git
|
||||||
# - file: config/Movies.yml
|
# - file: config/Movies.yml
|
||||||
|
remove_overlays: false
|
||||||
overlay_files:
|
overlay_files:
|
||||||
- remove_overlays: false
|
|
||||||
- pmm: resolution
|
- pmm: resolution
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ extra:
|
||||||
class: md-social__link
|
class: md-social__link
|
||||||
link: 'https://github.com/meisnate12/Plex-Meta-Manager'
|
link: 'https://github.com/meisnate12/Plex-Meta-Manager'
|
||||||
name: GitHub
|
name: GitHub
|
||||||
copyright: Copyright © 2023 meisnate12
|
copyright: Copyright © 2024 meisnate12
|
||||||
markdown_extensions:
|
markdown_extensions:
|
||||||
- pymdownx.tasklist:
|
- pymdownx.tasklist:
|
||||||
custom_checkbox: true
|
custom_checkbox: true
|
||||||
|
|
|
@ -68,9 +68,9 @@ class Convert:
|
||||||
elif anidb_id in self._anidb_to_tvdb:
|
elif anidb_id in self._anidb_to_tvdb:
|
||||||
ids.append((self._anidb_to_tvdb[anidb_id], "tvdb"))
|
ids.append((self._anidb_to_tvdb[anidb_id], "tvdb"))
|
||||||
elif str(anidb_id) in self._anidb_ids:
|
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:
|
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
|
return ids
|
||||||
|
|
||||||
def anilist_to_ids(self, anilist_ids, library):
|
def anilist_to_ids(self, anilist_ids, library):
|
||||||
|
@ -79,7 +79,7 @@ class Convert:
|
||||||
if anilist_id in self._anilist_to_anidb:
|
if anilist_id in self._anilist_to_anidb:
|
||||||
anidb_ids.append(self._anilist_to_anidb[anilist_id])
|
anidb_ids.append(self._anilist_to_anidb[anilist_id])
|
||||||
else:
|
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)
|
return self.anidb_to_ids(anidb_ids, library)
|
||||||
|
|
||||||
def myanimelist_to_ids(self, mal_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:
|
elif int(mal_id) in self._mal_to_anidb:
|
||||||
ids.extend(self.anidb_to_ids(self._mal_to_anidb[int(mal_id)], library))
|
ids.extend(self.anidb_to_ids(self._mal_to_anidb[int(mal_id)], library))
|
||||||
else:
|
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
|
return ids
|
||||||
|
|
||||||
def tmdb_to_imdb(self, tmdb_id, is_movie=True, fail=False):
|
def tmdb_to_imdb(self, tmdb_id, is_movie=True, fail=False):
|
||||||
|
@ -109,7 +109,7 @@ class Convert:
|
||||||
except Failed:
|
except Failed:
|
||||||
pass
|
pass
|
||||||
if fail:
|
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:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ class Convert:
|
||||||
except Failed:
|
except Failed:
|
||||||
pass
|
pass
|
||||||
if fail:
|
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:
|
else:
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ class Convert:
|
||||||
except Failed:
|
except Failed:
|
||||||
pass
|
pass
|
||||||
if fail:
|
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:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ class Convert:
|
||||||
except Failed:
|
except Failed:
|
||||||
pass
|
pass
|
||||||
if fail:
|
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:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ class Convert:
|
||||||
except Failed:
|
except Failed:
|
||||||
pass
|
pass
|
||||||
if fail:
|
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:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ class Convert:
|
||||||
except Failed:
|
except Failed:
|
||||||
pass
|
pass
|
||||||
if fail:
|
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:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
@ -370,7 +370,7 @@ class Overlays:
|
||||||
logger.info(e)
|
logger.info(e)
|
||||||
logger.info(type(e))
|
logger.info(type(e))
|
||||||
logger.stacktrace()
|
logger.stacktrace()
|
||||||
logger.error("")
|
logger.info("")
|
||||||
logger.error(f"Overlays Attempted on {item_title}: {', '.join(over_names)}")
|
logger.error(f"Overlays Attempted on {item_title}: {', '.join(over_names)}")
|
||||||
logger.exorcise()
|
logger.exorcise()
|
||||||
for _, over in properties.items():
|
for _, over in properties.items():
|
||||||
|
|
|
@ -132,10 +132,10 @@ class TMDbMovie(TMDBObj):
|
||||||
try:
|
try:
|
||||||
return self._tmdb.TMDb.movie(self.tmdb_id, partial="external_ids,keywords")
|
return self._tmdb.TMDb.movie(self.tmdb_id, partial="external_ids,keywords")
|
||||||
except NotFound:
|
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:
|
except TMDbException as e:
|
||||||
logger.stacktrace()
|
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):
|
class TMDbShow(TMDBObj):
|
||||||
|
@ -169,10 +169,10 @@ class TMDbShow(TMDBObj):
|
||||||
try:
|
try:
|
||||||
return self._tmdb.TMDb.tv_show(self.tmdb_id, partial="external_ids,keywords")
|
return self._tmdb.TMDb.tv_show(self.tmdb_id, partial="external_ids,keywords")
|
||||||
except NotFound:
|
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:
|
except TMDbException as e:
|
||||||
logger.stacktrace()
|
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:
|
class TMDb:
|
||||||
def __init__(self, config, params):
|
def __init__(self, config, params):
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import requests, time
|
import requests, time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from lxml import html
|
||||||
from lxml.etree import ParserError
|
from lxml.etree import ParserError
|
||||||
from modules import util
|
from modules import util
|
||||||
from modules.util import Failed
|
from modules.util import Failed
|
||||||
|
@ -50,7 +51,11 @@ class TVDbObj:
|
||||||
if self._tvdb.config.Cache and not ignore_cache:
|
if self._tvdb.config.Cache and not ignore_cache:
|
||||||
data, expired = self._tvdb.config.Cache.query_tvdb(tvdb_id, is_movie, self._tvdb.expiration)
|
data, expired = self._tvdb.config.Cache.query_tvdb(tvdb_id, is_movie, self._tvdb.expiration)
|
||||||
if expired or not data:
|
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):
|
def parse_page(xpath, is_list=False):
|
||||||
parse_results = data.xpath(xpath)
|
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)
|
@retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_failed)
|
||||||
def get_request(self, tvdb_url):
|
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):
|
def get_id_from_url(self, tvdb_url, is_movie=False, ignore_cache=False):
|
||||||
try:
|
try:
|
||||||
|
@ -133,8 +141,8 @@ class TVDb:
|
||||||
logger.trace(f"URL: {tvdb_url}")
|
logger.trace(f"URL: {tvdb_url}")
|
||||||
try:
|
try:
|
||||||
response = self.get_request(tvdb_url)
|
response = self.get_request(tvdb_url)
|
||||||
except ParserError:
|
except (ParserError, Failed):
|
||||||
raise Failed(f"TVDb Error: Could not parse {tvdb_url}")
|
raise Failed(f"TVDb Error: Failed not parse {tvdb_url}")
|
||||||
results = response.xpath(f"//*[text()='TheTVDB.com {media_type} ID']/parent::node()/span/text()")
|
results = response.xpath(f"//*[text()='TheTVDB.com {media_type} ID']/parent::node()/span/text()")
|
||||||
if len(results) > 0:
|
if len(results) > 0:
|
||||||
tvdb_id = int(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 collections import Counter
|
||||||
from concurrent.futures import ProcessPoolExecutor
|
from concurrent.futures import ProcessPoolExecutor
|
||||||
from datetime import datetime
|
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
|
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[:]])
|
run_arg = " ".join([f'"{s}"' if " " in s else s for s in sys.argv[:]])
|
||||||
for _, v in secret_args.items():
|
for _, sv in secret_args.items():
|
||||||
if v in run_arg:
|
if sv in run_arg:
|
||||||
run_arg = run_arg.replace(v, "(redacted)")
|
run_arg = run_arg.replace(sv, "(redacted)")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from git import Repo, InvalidGitRepositoryError # noqa
|
from git import Repo, InvalidGitRepositoryError # noqa
|
||||||
|
@ -241,7 +241,7 @@ def start(attrs):
|
||||||
if not is_docker and not is_linuxserver:
|
if not is_docker and not is_linuxserver:
|
||||||
try:
|
try:
|
||||||
with open("requirements.txt", "r") as file:
|
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:
|
except FileNotFoundError:
|
||||||
logger.error(" File Error: requirements.txt not found")
|
logger.error(" File Error: requirements.txt not found")
|
||||||
logger.info(f" PlexAPI Version: {plexapi.VERSION}")
|
logger.info(f" PlexAPI Version: {plexapi.VERSION}")
|
||||||
|
@ -313,15 +313,64 @@ def start(attrs):
|
||||||
version_line = f"{version_line} Newest Version: {new_version}"
|
version_line = f"{version_line} Newest Version: {new_version}"
|
||||||
try:
|
try:
|
||||||
log_data = {}
|
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:
|
with open(logger.main_log, encoding="utf-8") as f:
|
||||||
for log_line in f:
|
for log_line in f:
|
||||||
for err_type in ["WARNING", "ERROR", "CRITICAL"]:
|
for err_type in ["WARNING", "ERROR", "CRITICAL"]:
|
||||||
if f"[{err_type}]" in log_line:
|
if f"[{err_type}]" in log_line:
|
||||||
log_line = log_line.split("|")[1].strip()
|
log_line = log_line.split("|")[1].strip()
|
||||||
|
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:
|
if err_type not in log_data:
|
||||||
log_data[err_type] = []
|
log_data[err_type] = []
|
||||||
log_data[err_type].append(log_line)
|
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"]:
|
for err_type in ["WARNING", "ERROR", "CRITICAL"]:
|
||||||
if err_type not in log_data:
|
if err_type not in log_data:
|
||||||
continue
|
continue
|
||||||
|
@ -554,7 +603,7 @@ def run_libraries(config):
|
||||||
for library_type in library_types:
|
for library_type in library_types:
|
||||||
for item in library.get_all(builder_level=library_type):
|
for item in library.get_all(builder_level=library_type):
|
||||||
try:
|
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)
|
library.edit_tags("label", item, sync_tags=sync)
|
||||||
except NotFound:
|
except NotFound:
|
||||||
logger.error(f"{item.title[:25]:<25} | Labels Failed to be Removed")
|
logger.error(f"{item.title[:25]:<25} | Labels Failed to be Removed")
|
||||||
|
|
Loading…
Reference in a new issue