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

pull/1866/head
bullmoose20 10 months ago
commit 4dca95a4c2

@ -1,6 +1,8 @@
# Requirements Update (requirements will need to be reinstalled) # Requirements Update (requirements will need to be reinstalled)
Updated lxml requirement to 5.1.0
Updated gitpython requirement to 3.1.41 Updated gitpython requirement to 3.1.41
Updated lxml requirement to 5.1.0
Updated psutil requirement to 5.9.8
Updated python-dotenv requirement to 1.0.1
# New Features # New Features
Added `monitor_existing` to sonarr and radarr. To update the monitored status of items existing in plex to match the `monitor` declared. Added `monitor_existing` to sonarr and radarr. To update the monitored status of items existing in plex to match the `monitor` declared.
@ -10,6 +12,7 @@ Added `monitor_existing` to sonarr and radarr. To update the monitored status of
Added new [BoxOfficeMojo Builder](https://metamanager.wiki/en/latest/files/builders/mojo/) - credit to @nwithan8 for the suggestion and initial code submission Added new [BoxOfficeMojo Builder](https://metamanager.wiki/en/latest/files/builders/mojo/) - credit to @nwithan8 for the suggestion and initial code submission
Added new [`trakt_chart` attributes](https://metamanager.wiki/en/latest/files/builders/trakt/#trakt-chart) `network_ids`, `studio_ids`, `votes`, `tmdb_ratings`, `tmdb_votes`, `imdb_ratings`, `imdb_votes`, `rt_meters`, `rt_user_meters`, `metascores` and removed the deprecated `network` attribute Added new [`trakt_chart` attributes](https://metamanager.wiki/en/latest/files/builders/trakt/#trakt-chart) `network_ids`, `studio_ids`, `votes`, `tmdb_ratings`, `tmdb_votes`, `imdb_ratings`, `imdb_votes`, `rt_meters`, `rt_user_meters`, `metascores` and removed the deprecated `network` attribute
Added [Trakt and MyAnimeList Authentication Page](https://metamanager.wiki/en/latest/config/auth/) allowing users to authenticate against those services directly from the wiki. credit to @chazlarson for developing the script Added [Trakt and MyAnimeList Authentication Page](https://metamanager.wiki/en/latest/config/auth/) allowing users to authenticate against those services directly from the wiki. credit to @chazlarson for developing the script
Trakt Builder `trakt_userlist` value `recommendations` removed and `favorites` added.
# Defaults # Defaults

@ -1 +1 @@
1.20.0-develop16 1.20.0-develop19

@ -2,21 +2,21 @@
libraries: # This is called out once within the config.yml file libraries: # This is called out once within the config.yml file
Movies: # These are names of libraries in your Plex Movies: # These are names of libraries in your Plex
remove_overlays: false # Set this to true to remove all overlays
collection_files: collection_files:
- pmm: basic # This is a file within PMM's defaults folder - pmm: basic # This is a file within PMM's defaults folder
- pmm: imdb # This is a file within PMM's defaults folder - pmm: imdb # This is a file within PMM's defaults folder
# 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
overlay_files: overlay_files:
- remove_overlays: false # Set this to true to remove all overlays
- pmm: ribbon # This is a file within PMM's defaults folder - pmm: ribbon # This is a file within PMM's defaults folder
# 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:
remove_overlays: false # Set this to true to remove all overlays
collection_files: collection_files:
- pmm: basic # This is a file within PMM's defaults folder - pmm: basic # This is a file within PMM's defaults folder
- pmm: imdb # This is a file within PMM's defaults folder - pmm: imdb # This is a file within PMM's defaults folder
# 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
overlay_files: overlay_files:
- remove_overlays: false # Set this to true to remove all overlays
- pmm: ribbon # This is a file within PMM's defaults folder - pmm: ribbon # This is a file within PMM's defaults folder
# 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:
@ -69,7 +69,7 @@ settings:
ignore_ids: ignore_ids:
ignore_imdb_ids: ignore_imdb_ids:
item_refresh_delay: 0 item_refresh_delay: 0
playlist_sync_to_user: all playlist_sync_to_users: all
playlist_exclude_users: playlist_exclude_users:
playlist_report: false playlist_report: false
verify_ssl: true verify_ssl: true
@ -115,7 +115,7 @@ radarr: # Can be individually specified per library as
add_existing: false add_existing: false
upgrade_existing: false upgrade_existing: false
monitor_existing: false monitor_existing: false
root_folder_path: S:/Movies root_folder_path: "S:/Movies"
monitor: true monitor: true
availability: announced availability: announced
quality_profile: HD-1080p quality_profile: HD-1080p

@ -397,7 +397,6 @@ overlays:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]
Facebook Watch: Facebook Watch:
variables: { weight: 10} variables: { weight: 10}
template: [name: standard, name: networks] template: [name: standard, name: networks]

@ -68,11 +68,13 @@ dynamic_collections:
- BBC Four - BBC Four
- BBC iPlayer - BBC iPlayer
- BBC One - BBC One
- BBC Scotland
- BBC Three - BBC Three
- BBC Two - BBC Two
- BET - BET
- BET+ - BET+
- bilibili - bilibili
- Binge
- BluTV - BluTV
- Boomerang - Boomerang
- Bravo - Bravo
@ -96,6 +98,7 @@ dynamic_collections:
- Comedy Central - Comedy Central
- Cooking Channel - Cooking Channel
- Crackle - Crackle
- Crave
- Criterion Channel - Criterion Channel
- Crunchyroll - Crunchyroll
- CTV - CTV
@ -111,11 +114,14 @@ dynamic_collections:
- Disney XD - Disney XD
- Disney+ - Disney+
- DR1 - DR1
- Dropout
- Eden - Eden
- Elisa Viihde - Elisa Viihde
- Elisa Viihde Viaplay - Elisa Viihde Viaplay
- ENA
- Epix - Epix
- ESPN - ESPN
- EXXEN
- E! - E!
- Facebook Watch - Facebook Watch
- Family Channel - Family Channel
@ -156,7 +162,9 @@ dynamic_collections:
- ITV4 - ITV4
- ITVBe - ITVBe
- ITVX - ITVX
- JioCinema
- joyn - joyn
- JTBC
- Kan 11 - Kan 11
- KBS2 - KBS2
- Kids WB - Kids WB
@ -166,9 +174,11 @@ dynamic_collections:
- Lifetime - Lifetime
- Lionsgate+ - Lionsgate+
- Logo - Logo
- Magnolia Network
- MasterClass - MasterClass
- Max - Max
- MBC - MBC
- MBN
- MGM+ - MGM+
- mitele - mitele
- Movistar Plus+ - Movistar Plus+
@ -255,6 +265,7 @@ dynamic_collections:
- tving - tving
- tvN - tvN
- TVNZ 1 - TVNZ 1
- TVNZ 2
- TVP1 - TVP1
- UKTV - UKTV
- UniMás - UniMás
@ -263,6 +274,7 @@ dynamic_collections:
- Univision - Univision
- UPN - UPN
- USA Network - USA Network
- U+ Mobile TV
- VH1 - VH1
- Viaplay - Viaplay
- Vice - Vice
@ -270,6 +282,7 @@ dynamic_collections:
- ViuTV - ViuTV
- ViX+ - ViX+
- VRT 1 - VRT 1
- VRT Max
- VTM - VTM
- W - W
- WE tv - WE tv
@ -429,6 +442,7 @@ dynamic_collections:
Sky: Sky:
- Sky One - Sky One
- Sky Atlantic - Sky Atlantic
- Sky Atlantic (IT)
- Sky Arts - Sky Arts
- Sky History - Sky History
- Sky Living - Sky Living

@ -410,7 +410,7 @@ The available setting attributes which can be set at each level are outlined bel
```yaml ```yaml
settings: settings:
sync_mode: sync default_collection_order: release
``` ```
??? blank "`minimum_items` - Used to control minimum items requires to build a collection/playlist.<a class="headerlink" href="#minimum-items" title="Permanent link"></a>" ??? blank "`minimum_items` - Used to control minimum items requires to build a collection/playlist.<a class="headerlink" href="#minimum-items" title="Permanent link"></a>"

@ -2,102 +2,264 @@
Builders use third-party services to source items to be added to the collection. Multiple builders can be used in the same collection from a variety of sources listed below. Builders use third-party services to source items to be added to the collection. Multiple builders can be used in the same collection from a variety of sources listed below.
::cards:: cols=5 image-bg !!! builder
- title: Plex (Smart) ![Smart Plex logo](../../../assets/icons/plex.png){ align=right }
content: |
Creates Smart Collections based on the metadata inside your Plex Server. Results are dynamic and will update as your library updates without the need to re-run PMM (Collections Only) **[Plex (Smart)](../smart)** builders create Smart Collections based on the metadata inside your Plex Server. Results are dynamic and will update as your library updates without the need to re-run PMM.
image: ../../../assets/icons/plex.png
url: "../smart" [:octicons-home-16: View Builder](../smart){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Cannot be used for Overlays unless utilizing Smart Labels" }
- title: Plex (Dumb)
content: Grabs items based on the metadata inside your Plex Server. Results are static and require PMM to re-run to update. ??? quicklink "Popular Builders"
image: ../../../assets/icons/plex_dumb.png
url: "../plex" - [:simple-plex: Smart Label](../smart/#smart-label) - Create a Smart Collection based on a specific label. The label can be generated by PMM based on criteria.
- [:simple-plex: Smart Filter](../smart/#smart-filter) - Create a Smart Collection based on the filter parameters provided.
- title: TMDb
content: Grabs items based on metadata and lists on TheMovieDb.org !!! builder
image: ../../../assets/icons/tmdb.png
url: "../tmdb" ![Dumb Plex logo](../../../assets/icons/plex_dumb.png){ align=right }
- title: TVDb **[Plex (Dumb)](../smart)** builders grab items based on the metadata inside your Plex Server. Results are static and require PMM to re-run to update.
content: Grabs items based on metadata and lists on TheTVDb.com
image: ../../../assets/icons/tvdb.png [:octicons-home-16: View Builder](../plex){ .md-button .md-button--primary }
url: "../tvdb"
??? quicklink "Popular Builders"
- title: IMDb
content: Grabs items based on metadata and lists on IMDb.com - [:simple-plex: Plex All](../plex/#plex-all) - Gets every movie/show in your library.
image: ../../../assets/icons/imdb.png - [:simple-plex: Plex Search](../plex/#plex-search) - Gets every movie/show based on the search parameters provided.
url: "../imdb" - [:simple-plex: Plex Collectionless](../plex/#plex-collectionless) - Gets every movie/show that is not in a collection.
- title: Box Office Mojo !!! builder
content: Grabs items based on metadata and lists on Boxofficemojo.com
image: ../../../assets/icons/boxofficemojo.png ![TMDb logo](../../../assets/icons/tmdb.png){ align=right }
url: "../boxofficemojo"
**[TMDb](../tmdb)** builders grab items based on metadata and lists on TheMovieDb.org
- title: Trakt
content: Grabs items based on metadata and lists on Trakt.tv [:octicons-home-16: View Builder](../tmdb){ .md-button .md-button--primary }
image: ../../../assets/icons/trakt.png
url: "../trakt" ??? quicklink "Popular Builders"
- title: Tautulli - [:simple-themoviedatabase: TMDb Collection](../tmdb/#tmdb-collection) - Gets every movie/show in your library.
content: Grabs items based on metadata and lists in your Tautulli - [:simple-themoviedatabase: TMDb List](../tmdb/#tmdb-list) - Gets every movie/show in your Watchlist.
image: ../../../assets/icons/tautulli.png - [:simple-themoviedatabase: TMDb Company](../tmdb/#tmdb-company) - Gets the first episode of every show in your library.
url: "../tautulli" - [:simple-themoviedatabase: TMDb Network](../tmdb/#tmdb-network) - Gets the first episode of every show in your library.
- title: Radarr !!! builder
content: Grabs items based on metadata and lists in your Radarr
image: ../../../assets/icons/radarr.png ![Trakt logo](../../../assets/icons/trakt.png){ align=right }
url: "../radarr"
**[Trakt](../trakt)** builders grab items based on metadata and lists on Trakt.tv
- title: Sonarr
content: Grabs items based on metadata and lists in your Sonarr [:octicons-home-16: View Builder](../trakt){ .md-button .md-button--primary }
image: ../../../assets/icons/sonarr.png
url: "../sonarr" ??? quicklink "Popular Builders"
- title: MdbList - [:simple-trakt: Trakt List](../trakt/#trakt-list) - Gets every movie/show in the Trakt List
content: Grabs items based on metadata and lists on MdbList.com - [:simple-trakt: Trakt Chart](../trakt/#trakt-chart) - Gets every movie/show in the Trakt Chart
image: ../../../assets/icons/mdblist.png - [:simple-trakt: Trakt Recommendations](../trakt/#trakt-recommendations) - Gets every movie/show in Trakt's Personal Recommendations for your User
url: "../mdblist"
!!! builder
- title: Letterboxd
content: Grabs items based on metadata and lists on Letterboxd.com ![MdbList logo](../../../assets/icons/mdblist.png){ align=right }
image: ../../../assets/icons/letterboxd.png
url: "../letterboxd" **[MdbList](../mdblist)** builders grab items based on lists on MdbList.com
- title: ICheckMovies [:octicons-home-16: View Builder](../mdblist){ .md-button .md-button--primary }
content: Grabs items based on metadata and lists on ICheckMovies.com
image: ../../../assets/icons/icheckmovies.png ??? quicklink "Popular Builders"
url: "../icheckmovies"
- [:octicons-list-ordered-16: MdbList List](../mdblist/#mdblist-list) - Gets every movie/show in a MDbList List.
- title: FlixPatrol
content: Grabs items based on metadata and lists on FlixPatrol.com !!! builder
image: ../../../assets/icons/flixpatrol.png
url: "../flixpatrol" ![IMDb logo](../../../assets/icons/imdb.png){ align=right }
- title: AniDB **[IMDb](../imdb)** builders grab items based on metadata and lists on IMDb.com
content: Grabs items based on metadata and lists on AniDB.net
image: ../../../assets/icons/anidb.png [:octicons-home-16: View Builder](../imdb){ .md-button .md-button--primary }
url: "../anidb"
??? quicklink "Popular Builders"
- title: AniList
content: Grabs items based on metadata and lists on AniList.co - [:simple-imdb: IMDb Chart](../imdb/#imdb-chart) - Gets every movie/show in an IMDb Chart like IMDb Top 250 Movies.
image: ../../../assets/icons/anilist.png - [:simple-imdb: IMDb List](../imdb/#imdb-list) - Gets every movie/show in an IMDb List.
url: "../anilist" - [:simple-imdb: IMDb Award](../imdb/#imdb-award) - Gets every movie/show in an IMDb Event.
- [:simple-imdb: IMDb Search](../imdb/#imdb-award) - Gets every movie/show in an IMDb Search. Can also be used for Keyword searches.
- title: MyAnimeList
content: Grabs items based on metadata and lists on MyAnimeList.net !!! builder
image: ../../../assets/icons/myanimelist.png
url: "../myanimelist" ![TVDb logo](../../../assets/icons/tvdb.png){ align=right }
- title: Reciperr **[TVDb](../tvdb)** builders grab items based on metadata and lists on TheTVDb.com
content: Grabs items based on metadata and lists on reciperr.com
image: ../../../assets/icons/reciperr.png [:octicons-home-16: View Builder](../tvdb){ .md-button .md-button--primary }
url: "../reciperr"
??? quicklink "Popular Builders"
- title: StevenLu
content: Grabs items based on metadata and lists on StevenLu.com - [:material-television-guide: TVDb Show](../tvdb/#tvdb-show) - Grabs the specified series.
image: ../../../assets/icons/stevenlu.png - [:material-television-guide: TVDb Movie](../tvdb/#tvdb-movie) - Gets the specified movies.
url: "../stevenlu" - [:material-television-guide: TVDb List](../tvdb/#tvdb-list) - Gets every item in a TVDb List or TVDb Userlist.
::/cards:: !!! builder
![BoxOfficeMojo logo](../../../assets/icons/boxofficemojo.png){ align=right }
**[BoxOfficeMojo](../mojo)** builders grab items based on metadata and lists on Boxofficemojo.com
[:octicons-home-16: View Builder](../mojo){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Only works with Movie libraries" }
??? quicklink "Popular Builders"
- [:material-ticket: Mojo World](../mojo/#mojo-world) - Grabs items in the Worldwide Box Office chart.
- [:material-ticket: Mojo Domestic](../mojo/#mojo-movie) - Grabs items in the Domestic Box Office chart.
- [:material-ticket: Mojo Record](../mojo/#mojo-record) - Grabs items in miscellaneous lists such as Weekend Records and Daily Records.
!!! builder
![Tautulli logo](../../../assets/icons/tautulli.png){ align=right }
**[Tautulli](../tautulli)** builders grab items based on lists on Tautulli
[:octicons-home-16: View Builder](../tautulli){ .md-button .md-button--primary }
??? quicklink "Popular Builders"
- [:material-movie-search: Tautulli Popular](../tautulli/#tautulli-popular) - Gets every movie/show in the Tautulli Most Popular List
- [:material-movie-search: Tautulli Watched](../tautulli/#tautulli-watched) - Gets every movie/show in the Tautulli Most Watched List
!!! builder
![Radarr logo](../../../assets/icons/radarr.png){ align=right }
**[Radarr](../radarr)** builders grab items based on tags in Radarr
[:octicons-home-16: View Builder](../radarr){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Only works with Movie libraries" }
??? quicklink "Popular Builders"
- [:octicons-tag-16: Radarr All](../radarr/#radarr-all) - Gets every movie in Radarr
- [:octicons-tag-16: Radarr Taglist](../radarr/#radarr-taglist) - Gets every movie with the specified tags
!!! builder
![Sonarr logo](../../../assets/icons/sonarr.png){ align=right }
**[Sonarr](../sonarr)** builders grab items based on tags in Sonarr
[:octicons-home-16: View Builder](../sonarr){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Only works with Show libraries" }
??? quicklink "Popular Builders"
- [:octicons-tag-16: Sonarr All](../sonarr/#sonarr-all) - Gets every show in Sonarr
- [:octicons-tag-16: Sonarr Taglist](../sonarr/#sonarr-taglist) - Gets every show with the specified tags
!!! builder
![Letterboxd logo](../../../assets/icons/letterboxd.png){ align=right }
**[Letterboxd](../letterboxd)** builders grab items based on lists on Letterboxd.com
[:octicons-home-16: View Builder](../letterboxd){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Only works with Movie libraries" }
??? quicklink "Popular Builders"
- [:simple-letterboxd: Letterboxd List](../letterboxd/#letterboxd-list) - Gets every movie in the Letterboxd list
!!! builder
![ICheckMovies logo](../../../assets/icons/icheckmovies.png){ align=right }
**[ICheckMovies](../icheckmovies)** builders grab items based on lists on ICheckMovies.com
[:octicons-home-16: View Builder](../icheckmovies){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Only works with Movie libraries" }
??? quicklink "Popular Builders"
- [:material-check: ICheckMovies List](../icheckmovies/#icheckmovies-list) - Gets every show in the ICheckMovies list
!!! builder
![FlixPatrol logo](../../../assets/icons/flixpatrol.png){ align=right }
**[FlixPatrol](../flixpatrol)** builders grab items based on metadata on FlixPatrol.com
[:octicons-home-16: View Builder](../flixpatrol){ .md-button .md-button--primary }
??? quicklink "Popular Builders"
- [:material-police-badge: FlixPatrol Top](../flixpatrol/#flixpatrol-top) - Gets every item from FlixPatrol's Top Platform Lists based on the attributes provided.
!!! builder
![AniDB logo](../../../assets/icons/anidb.png){ align=right }
**[AniDB](../anidb)** builders grab items based on metadata and lists on AniDB.com
[:octicons-home-16: View Builder](../anidb){ .md-button .md-button--primary }
??? quicklink "Popular Builders"
- [:octicons-database-16: AniDB ID](../anidb/#anidb-id) - Finds the anime specified by the AniDB ID
- [:octicons-database-16: AniDB Popular](../anidb/#anidb-popular) - Finds every anime in AniDB's Popular Anime list
- [:octicons-database-16: AniDB Tags](../anidb/#anidb-tags) - Finds every anime with the specified AniDB Tag
!!! builder
![AniList logo](../../../assets/icons/anilist.png){ align=right }
**[AniList](../anilist)** builders grab items based on metadata and lists on AniList.com
[:octicons-home-16: View Builder](../anilist){ .md-button .md-button--primary }
??? quicklink "Popular Builders"
- [:simple-anilist: AniList Top Rated](../anilist/#anilist-top-rated) - Gets every anime in AniList's Top Rated Anime list
- [:simple-anilist: AniList Popular](../anilist/#anilist-popular) - Gets every anime in AniList's Popular Anime list
- [:simple-anilist: AniList Trending](../anilist/#anilist-trending) - Gets every anime in AniList's Trending Anime list
- [:simple-anilist: AniList Search](../anilist/#anilist-search) - Gets every anime specified by the AniList search parameters provided
!!! builder
![MyAnimeList logo](../../../assets/icons/myanimelist.png){ align=right }
**[MyAnimeList](../myanimelist)** builders grab items based on metadata and lists on MyAnimeList.com
[:octicons-home-16: View Builder](../myanimelist){ .md-button .md-button--primary }
??? quicklink "Popular Builders"
- [:simple-myanimelist: MyAnimeList Popular](../myanimelist/#myanimelist-most-popular) - Gets every anime in MyAnimeList's Most Popular Anime list
- [:simple-myanimelist: MyAnimeList Top All](../myanimelist/#myanimelist-top-all) - Gets every anime in MyAnimeList's Top All Anime list
- [:simple-myanimelist: MyAnimeList Top Airing](../myanimelist/#myanimelist-top-airing) - Gets every anime in MyAnimeList's Top Airing Anime list
- [:simple-myanimelist: MyAnimeList Suggested](../myanimelist/#myanimelist-suggested) - Gets every suggested anime in by MyAnimeList for the authorized user
!!! builder
![Reciperr logo](../../../assets/icons/reciperr.png){ align=right }
**[Reciperr](../reciperr)** builders grab items based on lists on Reciperr.com
[:octicons-home-16: View Builder](../reciperr){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Only works with Movie libraries" }
??? quicklink "Popular Builders"
- [:material-chef-hat: Reciperr List](../reciperr/#reciperr-list) - Gets every movie returned by the Reciperr JSON data URL.
!!! builder
![StevenLu logo](../../../assets/icons/stevenlu.png){ align=right }
**[StevenLu](../stevenlu)** builders grab items based on lists on StevenLu.com
[:octicons-home-16: View Builder](../stevenlu){ .md-button .md-button--primary }
[:octicons-alert-24:](""){ .card-link title="Only works with Movie libraries" }
??? quicklink "Popular Builders"
- [:material-pirate: StevenLu Popular](../stevenlu/#stevenlus-popular-movie-list) - Gets every movie on StevenLu's Popular Movies List.

@ -129,8 +129,8 @@ Finds every movie/show in the Trakt Userlist.
The `sync_mode: sync` and `collection_order: custom` Setting are recommended since the lists are continuously updated and in a specific order. The `sync_mode: sync` and `collection_order: custom` Setting are recommended since the lists are continuously updated and in a specific order.
| Attribute | Description & Values | | Attribute | Description & Values |
|:-----------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |:-----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `userlist` | **Description:** Which Trakt userlist to query<br>**Values:**<table class="clearTable"><tr><td>`watchlist`</td><td>Trakt User's Watchlist</td></tr><tr><td>`recommendations`</td><td>Trakt User's Personal Recommendations list</td></tr><tr><td>`watched`</td><td>Trakt User's Personal Watched list</td></tr><tr><td>`collected`</td><td>Trakt User's Personal Collected list</td></tr></table> | | `userlist` | **Description:** Which Trakt userlist to query<br>**Values:**<table class="clearTable"><tr><td>`watchlist`</td><td>Trakt User's Watchlist</td></tr><tr><td>`favorites`</td><td>Trakt User's Personal Favorite list</td></tr><tr><td>`watched`</td><td>Trakt User's Personal Watched list</td></tr><tr><td>`collection`</td><td>Trakt User's Personal Collection list</td></tr></table> |
| `user` | **Description:** The User who's user lists you want to query.<br>**Default:** `me`<br>**Values:** Username of User or `me` for the authenticated user. | | `user` | **Description:** The User who's user lists you want to query.<br>**Default:** `me`<br>**Values:** Username of User or `me` for the authenticated user. |
| `sort_by` | **Description:** How to sort the results<br>**Default:** `rank`<br>**Values:** `rank`, `added`, `released`, `title` | | `sort_by` | **Description:** How to sort the results<br>**Default:** `rank`<br>**Values:** `rank`, `added`, `released`, `title` |
@ -153,7 +153,7 @@ collections:
trakt_userlist: trakt_userlist:
- userlist: watched - userlist: watched
user: me user: me
- userlist: collected - userlist: collection
user: me user: me
collection_order: custom collection_order: custom
sync_mode: sync sync_mode: sync

@ -95,10 +95,10 @@ This table details examples of the most commonly-seen `[WARNING]` events and wha
| Type | Short Info | Description | Recommendation | | Type | Short Info | Description | Recommendation |
|:----------|:-----------------------------------------------------------------|:-----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |:----------|:-----------------------------------------------------------------|:-----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `WARNING` | `Convert Error: No TVDb ID Found for TMDb ID: 15733` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites.</br>For example, at the time of that error, the TMDb record for "The Two Mrs. Grenvilles" [ID 15733] didn't contain a TVDb ID.</br>This could be because the record just hasn't been updated, or because "The Two Mrs. Grenvilles" is not listed on TVDB.</br>The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. | | `WARNING` | `Convert Warning: No TVDb ID Found for TMDb ID: 15733` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites.</br>For example, at the time of that error, the TMDb record for "The Two Mrs. Grenvilles" [ID 15733] didn't contain a TVDb ID.</br>This could be because the record just hasn't been updated, or because "The Two Mrs. Grenvilles" is not listed on TVDB.</br>The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. |
| `WARNING` | `Convert Error: AniDB ID not found for AniList ID: 21400` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites. The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. | | `WARNING` | `Convert Warning: AniDB ID not found for AniList ID: 21400` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites. The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. |
| `WARNING` | `Convert Error: No TVDb ID or IMDb ID found for AniDB ID: 14719` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites. The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. | | `WARNING` | `Convert Warning: No TVDb ID or IMDb ID found for AniDB ID: 14719` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites. The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. |
| `WARNING` | `Convert Error: AniDB ID not found for MyAnimeList ID: 36838` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites. The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. | | `WARNING` | `Convert Warning: AniDB ID not found for MyAnimeList ID: 36838` | Online sources are missing information | These sorts of errors indicate that the thing can't be cross-referenced between sites. The fix is for someone [like you, perhaps] to go to the relevant site and fill in the missing data. |
#### INFO #### INFO

@ -3,6 +3,8 @@
--md-primary-fg-color--light: #00bc8c; --md-primary-fg-color--light: #00bc8c;
--md-primary-fg-color--dark: #00bc8c; --md-primary-fg-color--dark: #00bc8c;
--md-primary-bg-color--light: rgba(0,0,0,.54); --md-primary-bg-color--light: rgba(0,0,0,.54);
--pg-light-border: rgb(47, 47, 47);
} }
:root, [data-md-color-scheme="slate"] { :root, [data-md-color-scheme="slate"] {
--md-primary-fg-color: #00bc8c; --md-primary-fg-color: #00bc8c;
@ -10,6 +12,7 @@
--md-primary-fg-color--dark: #00bc8c; --md-primary-fg-color--dark: #00bc8c;
--md-default-bg-color: #252525; --md-default-bg-color: #252525;
--md-footer-bg-color--dark: var(--md-default-bg-color); --md-footer-bg-color--dark: var(--md-default-bg-color);
--pg-light-border: rgb(47, 47, 47);
} }
strong { strong {
color: #00bc8c; color: #00bc8c;
@ -240,3 +243,127 @@ table.dualTable td, table.dualTable th {
-webkit-mask-image: var(--md-admonition-icon--separator); -webkit-mask-image: var(--md-admonition-icon--separator);
mask-image: var(--md-admonition-icon--separator); mask-image: var(--md-admonition-icon--separator);
} }
.md-typeset .grid.cards > :is(ul, ol) > li, .md-typeset .grid > .card { /* Firefox */
color: var(--md-typeset-color);
background: #1b1b1b;
border: 1px solid var(--pg-light-border);
border-radius: 6px;
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 3px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px -1px;
transition: none;
position: relative;
}
.md-typeset .grid.cards>:-webkit-any(ul,ol)>li, .md-typeset .grid>.card { /* Webkit */
color: var(--md-typeset-color);
background: #1b1b1b;
border: 1px solid var(--pg-light-border);
border-radius: 6px;
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 3px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px -1px;
transition: none;
position: relative;
}
.md-typeset .grid.cards > :is(ul, ol) > li:is(:focus-within, :hover), .md-typeset .grid > .card:is(:focus-within, :hover) { /* Firefox */
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 3px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px -1px;
border-color: var(--md-accent-fg-color);
}
.md-typeset .grid.cards>:-webkit-any(ul,ol)>li:-webkit-any(:focus-within,:hover) { /* Webkit */
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 3px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px -1px;
border-color: var(--md-accent-fg-color);
}
.md-typeset .grid.cards > :is(ul, ol) > li > a::after, .md-typeset .grid>.card a::after { /* Firefox */
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.md-typeset .grid.cards>:-webkit-any(ul, ol)>li > a::after, .md-typeset .grid>.card a::after { /* Webkit */
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.md-typeset :is(.admonition, details) {
background-color: #1b1b1b;
}
/* Custom tooltips */
.md-tooltip {
background-color: var(--md-primary-fg-color);
border-radius: 6px;
}
.md-typeset .admonition.builder,
.md-typeset details.builder {
border: 1px solid var(--pg-light-border);
font-size: inherit;
}
.md-typeset .builder > .admonition-title,
.md-typeset .builder > summary {
background-color: rgba(43, 155, 70, 0.0);
border: none;
padding-left: 0.6rem;
}
.md-typeset .builder > .admonition-title::before,
.md-typeset .builder > .admonition-title,
.md-typeset .builder > summary::before {
display: none;
}
img[align="right"], svg[align="right"] {
width: 150px;
}
.md-typeset .admonition.quicklink,
.md-typeset details.quicklink {
border: none;
box-shadow: none;
}
.md-typeset .quicklink > .admonition-title,
.md-typeset .quicklink > summary {
background-color: rgba(43, 155, 70, 0.0);
}
.md-typeset .quicklink > .admonition-title::before,
.md-typeset .quicklink > .admonition-title,
.md-typeset .quicklink > summary::before {
background-color: var(--md-typeset-a-color);
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath d='M287.9 0c9.2 0 17.6 5.2 21.6 13.5l68.6 141.3 153.2 22.6c9 1.3 16.5 7.6 19.3 16.3s.5 18.1-5.9 24.5L433.6 328.4l26.2 155.6c1.5 9-2.2 18.1-9.7 23.5s-17.3 6-25.3 1.7l-137-73.2L151 509.1c-8.1 4.3-17.9 3.7-25.3-1.7s-11.2-14.5-9.7-23.5l26.2-155.6L31.1 218.2c-6.5-6.4-8.7-15.9-5.9-24.5s10.3-14.9 19.3-16.3l153.2-22.6L266.3 13.5C270.4 5.2 278.7 0 287.9 0zm0 79L235.4 187.2c-3.5 7.1-10.2 12.1-18.1 13.3L99 217.9 184.9 303c5.5 5.5 8.1 13.3 6.8 21L171.4 443.7l105.2-56.2c7.1-3.8 15.6-3.8 22.6 0l105.2 56.2L384.2 324.1c-1.3-7.7 1.2-15.5 6.8-21l85.9-85.1L358.6 200.5c-7.8-1.2-14.6-6.1-18.1-13.3L287.9 79z'/%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath d='M287.9 0c9.2 0 17.6 5.2 21.6 13.5l68.6 141.3 153.2 22.6c9 1.3 16.5 7.6 19.3 16.3s.5 18.1-5.9 24.5L433.6 328.4l26.2 155.6c1.5 9-2.2 18.1-9.7 23.5s-17.3 6-25.3 1.7l-137-73.2L151 509.1c-8.1 4.3-17.9 3.7-25.3-1.7s-11.2-14.5-9.7-23.5l26.2-155.6L31.1 218.2c-6.5-6.4-8.7-15.9-5.9-24.5s10.3-14.9 19.3-16.3l153.2-22.6L266.3 13.5C270.4 5.2 278.7 0 287.9 0zm0 79L235.4 187.2c-3.5 7.1-10.2 12.1-18.1 13.3L99 217.9 184.9 303c5.5 5.5 8.1 13.3 6.8 21L171.4 443.7l105.2-56.2c7.1-3.8 15.6-3.8 22.6 0l105.2 56.2L384.2 324.1c-1.3-7.7 1.2-15.5 6.8-21l85.9-85.1L358.6 200.5c-7.8-1.2-14.6-6.1-18.1-13.3L287.9 79z'/%3E%3C/svg%3E");
}
.md-typeset .quicklink > summary::after {
right:auto;
}
.quicklink > ul > li {
padding: 0.5em 0 !important;
}
.quicklink > ul .twemoji {
width: .9rem
}
details[class="quicklink annotate"] > p .md-annotation span span::before {
vertical-align: 0;
}
.quicklink > ul {
display: grid!important;
grid-template-columns: repeat(1, 1fr);
list-style-type: none;
}
.md-typeset .card-link {
color: var(--md-default-fg-color--light);
}

@ -50,7 +50,7 @@
], ],
"definitions": { "definitions": {
"plex-server": { "plex-server": {
"description": "Describes the primary Plex server to which PMM can connect. This attribute is REQUIRED. It can be overridden at the library level.", "description": "Describes the primary Plex server to which PMM can connect.\nThis attribute is REQUIRED. It can be overridden at the library level.",
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
@ -375,6 +375,10 @@
"type": "string", "type": "string",
"enum": ["all","future","missing","existing","pilot","first","latest","none"] "enum": ["all","future","missing","existing","pilot","first","latest","none"]
}, },
"monitor_existing": {
"description": "Ensures all existing shows in collections match your monitor setting.\nUse the sonarr_monitor_existing Sonarr Setting in the collection definition to match the monitor setting per collection.",
"type": "boolean"
},
"quality_profile": { "quality_profile": {
"type": "string" "type": "string"
}, },
@ -446,6 +450,10 @@
"type": "string", "type": "string",
"enum": ["all","future","missing","existing","pilot","first","latest","none"] "enum": ["all","future","missing","existing","pilot","first","latest","none"]
}, },
"monitor_existing": {
"description": "Ensures all existing shows in collections match your monitor setting.\nUse the sonarr_monitor_existing Sonarr Setting in the collection definition to match the monitor setting per collection.",
"type": "boolean"
},
"quality_profile": { "quality_profile": {
"type": "string" "type": "string"
}, },
@ -505,6 +513,9 @@
"monitor": { "monitor": {
"type": "boolean" "type": "boolean"
}, },
"monitor_existing": {
"type": "boolean"
},
"quality_profile": { "quality_profile": {
"type": "string" "type": "string"
}, },
@ -566,6 +577,9 @@
"monitor": { "monitor": {
"type": "boolean" "type": "boolean"
}, },
"monitor_existing": {
"type": "boolean"
},
"quality_profile": { "quality_profile": {
"type": "string" "type": "string"
}, },
@ -595,72 +609,72 @@
"properties": { "properties": {
"cache": { "cache": {
"type": "boolean", "type": "boolean",
"description": "Used to control PMM's cache database. Allow Plex Meta Manager to create and maintain a local cache database for faster subsequent processing. The cache file is created in the same directory as the configuration file." "description": "Used to control PMM's cache database.\nAllow Plex Meta Manager to create and maintain a local cache database for faster subsequent processing. The cache file is created in the same directory as the configuration file."
}, },
"cache_expiration": { "cache_expiration": {
"type": "integer", "type": "integer",
"minimum": 1, "minimum": 1,
"description": "Used to control how long data is cached for. Set the number of days before each cache mapping expires and has to be re-cached. An integer greater than 0 in days" "description": "Used to control how long data is cached for.\nSet the number of days before each cache mapping expires and has to be re-cached. An integer greater than 0 in days"
}, },
"run_order": { "run_order": {
"description": "Used to specify the run order of the library components. Specify the run order of the library components [Library Operations, Collection Files and Overlay Files]", "description": "Used to specify the run order of the library components.\nSpecify the run order of the library components [Library Operations, Collection Files and Overlay Files]",
"type": "array", "uniqueItems": true, "items": {"enum": ["operations", "metadata", "collections", "overlays"]} "type": "array", "uniqueItems": true, "items": {"enum": ["operations", "metadata", "collections", "overlays"]}
}, },
"asset_directory": { "asset_directory": {
"description": "Used to define where local assets are located. Specify the directories where assets (posters, backgrounds, etc) are located.", "description": "Used to define where local assets are located.\nSpecify the directories where assets (posters, backgrounds, etc) are located.",
"oneOf": [ "oneOf": [
{ "type": "string"}, { "type": "string"},
{ "type": "array", "uniqueItems": true, "items": {"type": "string" }} { "type": "array", "uniqueItems": true, "items": {"type": "string" }}
] ]
}, },
"asset_folders": { "asset_folders": {
"description": "Used to control the asset directory folder structure. While true, PMM will search the asset_directory for a dedicated folder per item vs while false will look for an image.", "description": "Used to control the asset directory folder structure.\nWhile true, PMM will search the asset_directory for a dedicated folder per item vs while false will look for an image.",
"type": "boolean" "type": "boolean"
}, },
"asset_depth": { "asset_depth": {
"description": "Used to control the depth of search in the asset directory. At each asset level, PMM will look for either medianame.ext [such as Star Wars.png] or a dedicated folder containing poster.ext. i.e. <path_to_assets>/Star Wars/poster.png and <path_to_assets>/Star Wars.png are both asset depth 0, whilst <path_to_assets>/Movies/Star Wars/poster.png and <path_to_assets>/Movies/Star Wars.png are both asset level 1.", "description": "Used to control the depth of search in the asset directory.\nAt each asset level, PMM will look for either medianame.ext [such as Star Wars.png] or a dedicated folder containing poster.ext. i.e. <path_to_assets>/Star Wars/poster.png and <path_to_assets>/Star Wars.png are both asset depth 0, whilst <path_to_assets>/Movies/Star Wars/poster.png and <path_to_assets>/Movies/Star Wars.png are both asset level 1.",
"type": "integer", "type": "integer",
"minimum": 0 "minimum": 0
}, },
"create_asset_folders": { "create_asset_folders": {
"description": "Used to automatically create asset folders when none exist. Whilst searching for assets, if an asset folder cannot be found within the asset_directory one will be created. Asset Searches can happen in a number of ways.", "description": "Used to automatically create asset folders when none exist.\nWhilst searching for assets, if an asset folder cannot be found within the asset_directory one will be created. Asset Searches can happen in a number of ways.",
"type": "boolean" "type": "boolean"
}, },
"prioritize_assets": { "prioritize_assets": {
"description": "Used to prioritize asset_directory images over all other images types. When determining which image to use on an item prioritize the asset_directory over all other images types.", "description": "Used to prioritize asset_directory images over all other images types.\nWhen determining which image to use on an item prioritize the asset_directory over all other images types.",
"type": "boolean" "type": "boolean"
}, },
"dimensional_asset_rename": { "dimensional_asset_rename": {
"description": "Used to automatically rename asset files based on their dimensions. Whilst searching for assets, scan the folders within the asset_directory and if an asset poster (i.e. /ASSET_NAME/poster.ext) was not found, rename the first image found that has a height greater than or equal to its width to poster.ext. If an asset background (i.e. /ASSET_NAME/background.ext), rename the first image found that has a width greater than its height to background.ext.", "description": "Used to automatically rename asset files based on their dimensions.\nWhilst searching for assets, scan the folders within the asset_directory and if an asset poster (i.e. /ASSET_NAME/poster.ext) was not found, rename the first image found that has a height greater than or equal to its width to poster.ext. If an asset background (i.e. /ASSET_NAME/background.ext), rename the first image found that has a width greater than its height to background.ext.",
"type": "boolean" "type": "boolean"
}, },
"download_url_assets": { "download_url_assets": {
"description": "Used to download url images into the asset directory. Whilst searching for assets, download images set within Collection/Metadata/Playlist files( i.e. images set by url_poster or url_background) into the asset folder if none are already present.", "description": "Used to download url images into the asset directory.\nWhilst searching for assets, download images set within Collection/Metadata/Playlist files( i.e. images set by url_poster or url_background) into the asset folder if none are already present.",
"type": "boolean" "type": "boolean"
}, },
"show_missing_season_assets": { "show_missing_season_assets": {
"description": " Used to show any missing season assets. Whilst searching for assets, when scanning for assets for a TV Show, if Season posters are found (i.e. /ASSET_NAME/Season##.ext), notify the user of any seasons which do not have an asset image.", "description": " Used to show any missing season assets.\nWhilst searching for assets, when scanning for assets for a TV Show, if Season posters are found (i.e. /ASSET_NAME/Season##.ext), notify the user of any seasons which do not have an asset image.",
"type": "boolean" "type": "boolean"
}, },
"show_missing_episode_assets": { "show_missing_episode_assets": {
"description": "Used to show any missing episode assets. Whilst searching for assets, when scanning for assets for a TV Show, if an Episode Title Card is found (i.e. /ASSET_NAME/S##E##.ext), notify the user of any episodes which do not have an asset image.", "description": "Used to show any missing episode assets.\nWhilst searching for assets, when scanning for assets for a TV Show, if an Episode Title Card is found (i.e. /ASSET_NAME/S##E##.ext), notify the user of any episodes which do not have an asset image.",
"type": "boolean" "type": "boolean"
}, },
"show_asset_not_needed": { "show_asset_not_needed": {
"description": "Used to show/hide the update not needed messages. Whilst searching for assets, show or hide the update not needed messages.", "description": "Used to show/hide the update not needed messages.\nWhilst searching for assets, show or hide the update not needed messages.",
"type": "boolean" "type": "boolean"
}, },
"sync_mode": { "sync_mode": {
"description": "Used to set the sync_mode for collections and playlists. Sets the sync_mode for collections and playlists. Setting the sync_mode directly in a collection or playlist definition will override the sync_mode for that definition.", "description": "Used to set the sync_mode for collections and playlists.\nSets the sync_mode for collections and playlists. Setting the sync_mode directly in a collection or playlist definition will override the sync_mode for that definition.",
"enum": ["sync", "append"] "enum": ["sync", "append"]
}, },
"minimum_items": { "minimum_items": {
"description": "Used to control minimum items requires to build a collection/playlist. Set the minimum number of items that must be found in order to build or update a collection/playlist.", "description": "Used to control minimum items requires to build a collection/playlist.\nSet the minimum number of items that must be found in order to build or update a collection/playlist.",
"type": "integer", "type": "integer",
"minimum": 1 "minimum": 1
}, },
"default_collection_order": { "default_collection_order": {
"description": "Used to set the collection_order for every collection run. Set the collection_order for every collection run by PMM unless the collection has a specific collection_order", "description": "Used to set the collection_order for every collection run.\nSet the collection_order for every collection run by PMM unless the collection has a specific collection_order",
"type": ["string", "null"], "type": ["string", "null"],
"enum": [ "enum": [
"added.asc", "added.desc", "audience_rating.asc", "added.asc", "added.desc", "audience_rating.asc",
@ -676,52 +690,52 @@
] ]
}, },
"delete_below_minimum": { "delete_below_minimum": {
"description": "Used to delete collections below minimum_items. When a collection is run, delete the collection if it is below the minimum number specified by minimum_items.", "description": "Used to delete collections below minimum_items.\nWhen a collection is run, delete the collection if it is below the minimum number specified by minimum_items.",
"type": "boolean" "type": "boolean"
}, },
"delete_not_scheduled": { "delete_not_scheduled": {
"description": "Used to delete collections not scheduled. If a collection is skipped due to it not being scheduled, delete the collection.", "description": "Used to delete collections not scheduled.\nIf a collection is skipped due to it not being scheduled, delete the collection.",
"type": "boolean" "type": "boolean"
}, },
"run_again_delay": { "run_again_delay": {
"description": "Used to control the number of minutes to delay running run_again collections. Set the number of minutes to delay running run_again collections after daily run is finished. For example, if a collection adds items to Sonarr/Radarr, the library can automatically re-run 'X' amount of time later so that any downloaded items are processed.", "description": "Used to control the number of minutes to delay running run_again collections.\nSet the number of minutes to delay running run_again collections after daily run is finished. For example, if a collection adds items to Sonarr/Radarr, the library can automatically re-run 'X' amount of time later so that any downloaded items are processed.",
"type": "integer", "type": "integer",
"minimum": 0 "minimum": 0
}, },
"missing_only_released": { "missing_only_released": {
"description": "Used to filter unreleased items from missing lists. Whilst running a collection or playlist, when PMM handles missing items to either report it to the user, report it to a file, or send it to Radarr/Sonarr all unreleased items will be filtered out.", "description": "Used to filter unreleased items from missing lists.\nWhilst running a collection or playlist, when PMM handles missing items to either report it to the user, report it to a file, or send it to Radarr/Sonarr all unreleased items will be filtered out.",
"type": "boolean" "type": "boolean"
}, },
"only_filter_missing": { "only_filter_missing": {
"description": "Used to have the filter only apply to missing items. Only items missing from a collection will be filtered. Only specific filters can filter missing. See Filters for more information.", "description": "Used to have the filter only apply to missing items.\nOnly items missing from a collection will be filtered. Only specific filters can filter missing. See Filters for more information.",
"type": "boolean" "type": "boolean"
}, },
"show_unmanaged": { "show_unmanaged": {
"description": "Used to show collections not managed by PMM. List all collections not managed by Plex Meta Manager at the end of each run.", "description": "Used to show collections not managed by PMM.\nList all collections not managed by Plex Meta Manager at the end of each run.",
"type": "boolean" "type": "boolean"
}, },
"show_unconfigured": { "show_unconfigured": {
"description": "Used to show collections not in the current run. List all collections not configured in the current Plex Meta Manager run at the end of each run.", "description": "Used to show collections not in the current run.\nList all collections not configured in the current Plex Meta Manager run at the end of each run.",
"type": "boolean" "type": "boolean"
}, },
"show_filtered": { "show_filtered": {
"description": "Used to show filtered items. List all items which have been filtered out of a collection or playlist (i.e. if it doesn't meet the filter criteria)", "description": "Used to show filtered items.\nList all items which have been filtered out of a collection or playlist (i.e. if it doesn't meet the filter criteria)",
"type": "boolean" "type": "boolean"
}, },
"show_options": { "show_options": {
"description": "Used to show attribute options from plex. While show_options is true the available options for an attribute when using plex_search, smart_filter or filters will be shown. i.e. a smart_filter on the genre attribute will return all of the attributes within the specified library.", "description": "Used to show attribute options from plex.\nWhile show_options is true the available options for an attribute when using plex_search, smart_filter or filters will be shown. i.e. a smart_filter on the genre attribute will return all of the attributes within the specified library.",
"type": "boolean" "type": "boolean"
}, },
"show_missing": { "show_missing": {
"description": "Used to show missing items from collections or playlists. While show_missing is true items missing from collections or playlists will be displayed.", "description": "Used to show missing items from collections or playlists.\nWhile show_missing is true items missing from collections or playlists will be displayed.",
"type": "boolean" "type": "boolean"
}, },
"show_missing_assets": { "show_missing_assets": {
"description": "Used to print a message when assets are missing. Display missing asset warnings for items, collections, and playlists.", "description": "Used to print a message when assets are missing.\nDisplay missing asset warnings for items, collections, and playlists.",
"type": "boolean" "type": "boolean"
}, },
"save_report": { "save_report": {
"description": "Used to save a report YAML file. Save a report of the items added, removed, filtered, or missing from collections to a YAML file in the same directory as the file run.", "description": "Used to save a report YAML file.\nSave a report of the items added, removed, filtered, or missing from collections to a YAML file in the same directory as the file run.",
"type": "boolean" "type": "boolean"
}, },
"tvdb_language": { "tvdb_language": {
@ -747,10 +761,10 @@
"uig", "ukr", "urd", "uzb", "ven", "vie", "vol", "wln", "wol", "xho", "uig", "ukr", "urd", "uzb", "ven", "vie", "vol", "wln", "wol", "xho",
"yid", "yor", "zha", "zho", "zul" "yid", "yor", "zha", "zho", "zul"
], ],
"description": "Specify the language to query TVDb in. This field can be either null or a valid ISO 639-2 language code." "description": "Specify the language to query TVDb in.\nThis field can be either null or a valid ISO 639-2 language code."
}, },
"ignore_ids": { "ignore_ids": {
"description": "List of TMDb/TVDb IDs to ignore. Set a null, a single TMDb/TVDb ID, or a comma-separated string of TMDb/TVDb IDs to ignore in all collections.", "description": "List of TMDb/TVDb IDs to ignore.\nSet a null, a single TMDb/TVDb ID, or a comma-separated string of TMDb/TVDb IDs to ignore in all collections.",
"anyOf": [ "anyOf": [
{ {
"type": "null" "type": "null"
@ -772,7 +786,7 @@
] ]
}, },
"ignore_imdb_ids": { "ignore_imdb_ids": {
"description": "List of IMDb IDs to ignore. Set a null, a single IMDb ID, or a comma-separated string of IMDb IDs to ignore in all collections.", "description": "List of IMDb IDs to ignore.\nSet a null, a single IMDb ID, or a comma-separated string of IMDb IDs to ignore in all collections.",
"anyOf": [ "anyOf": [
{ {
"type": "null" "type": "null"
@ -792,12 +806,12 @@
] ]
}, },
"item_refresh_delay": { "item_refresh_delay": {
"description": "Time to wait between each item_refresh. Specify the amount of time to wait between each item_refresh of every movie/show in a collection/playlist.", "description": "Time to wait between each item_refresh.\nSpecify the amount of time to wait between each item_refresh of every movie/show in a collection/playlist.",
"type": "integer", "type": "integer",
"minimum": 0 "minimum": 0
}, },
"playlist_sync_to_users": { "playlist_sync_to_users": {
"description": "Set the default playlist sync_to_users. To Sync a playlist to only yourself, leave playlist_sync_to_users blank/null. Therefore, leaving it blank, 'all', a list of users, or a comma-separated string of users is accepted", "description": "Set the default playlist sync_to_users.\nTo Sync a playlist to only yourself, leave playlist_sync_to_users blank/null. Therefore, leaving it blank, 'all', a list of users, or a comma-separated string of users is accepted",
"anyOf": [ "anyOf": [
{ {
"type": "string", "type": "string",
@ -820,7 +834,7 @@
] ]
}, },
"playlist_exclude_users": { "playlist_exclude_users": {
"description": "Set the default playlist exclude_users. Provide a null value, a list of users, or a comma-separated string of users to be excluded in the playlist.", "description": "Set the default playlist exclude_users.\nProvide a null value, a list of users, or a comma-separated string of users to be excluded in the playlist.",
"oneOf": [ "oneOf": [
{ {
"type": "null" "type": "null"
@ -839,7 +853,7 @@
] ]
}, },
"playlist_report": { "playlist_report": {
"description": "Used to print out a playlist report. Set playlist_report to true to print out a playlist report at the end of the log.", "description": "Used to print out a playlist report.\nSet playlist_report to true to print out a playlist report at the end of the log.",
"type": "boolean" "type": "boolean"
}, },
"verify_ssl": { "verify_ssl": {
@ -847,7 +861,7 @@
"type": "boolean" "type": "boolean"
}, },
"custom_repo": { "custom_repo": {
"description": "Used to set up the custom repo file block type. Specify where the repo attribute's base is when defining collection_files, metadata_files, playlist_file, and overlay_files.", "description": "Used to set up the custom repo file block type.\nSpecify where the repo attribute's base is when defining collection_files, metadata_files, playlist_file, and overlay_files.",
"oneOf": [ "oneOf": [
{ {
"type": "null" "type": "null"
@ -1106,27 +1120,35 @@
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"metadata_files": { "metadata_files": {
"description": "The metadata_files attribute is used to define Metadata Files by specifying the path of the files that will be executed against the parent library.",
"$ref": "#/definitions/metadata-files" "$ref": "#/definitions/metadata-files"
}, },
"collection_files": { "collection_files": {
"description": "The collection_files attribute is used to define Collection Files by specifying the path type and path of the files that will be executed against the parent library.",
"$ref": "#/definitions/collection-files" "$ref": "#/definitions/collection-files"
}, },
"overlay_files": { "overlay_files": {
"description": "The overlay_files attribute is used to define Overlay Files by specifying the path type and path of the files that will be executed against the parent library.",
"$ref": "#/definitions/overlay-files" "$ref": "#/definitions/overlay-files"
}, },
"metadata_path": { "metadata_path": {
"description": "DEPRECATED! Use: metadata_files.\nThe metadata_path attribute is used to define Metadata Files by specifying the path of the files that will be executed against the parent library.",
"$ref": "#/definitions/metadata-path" "$ref": "#/definitions/metadata-path"
}, },
"overlay_path": { "overlay_path": {
"description": "DEPRECATED! Use: overlay_files.\nThe overlay_path attribute is used to define Overlay Files by specifying the path type and path of the files that will be executed against the parent library.",
"$ref": "#/definitions/overlay-path" "$ref": "#/definitions/overlay-path"
}, },
"operations": { "operations": {
"description": "Used to specify Library Operations to run.",
"$ref": "#/definitions/operations" "$ref": "#/definitions/operations"
}, },
"library_name": { "library_name": {
"description": "Used to specify the Library's name.\nRequired only when trying to use multiple servers with the same name. Each library that the user wants Plex Meta Manager to interact with must be documented with a library attribute. A library attribute is represented by the mapping name (i.e. Movies or TV Shows), this must have a unique name that correlates with a library of the same name within the Plex Media Server. In the situation that two servers are being connected to which both have libraries of the same name, the library_name attribute can be utilized to specify the real Library Name, whilst the library attribute's mapping name can be made into a placeholder.",
"type": "string" "type": "string"
}, },
"report_path": { "report_path": {
"description": "Location to save the YAML Report file for a library.\nThe report_path attribute is used to define where to save the YAML Report file. This file is used to store information about what media is added, removed, filtered, and missing from the Plex library compared to what is expected from the Collection, Metadata, Overlay or Playlist file. If your Collection file creates a collection with Movie 1, Movie 2 and Movie 3 but your Plex library only has Movie 1 and Movie 3, then the missing YAML file will be updated to inform the user that Movie 2 was missing from the library.",
"type": "string" "type": "string"
}, },
"settings": { "settings": {
@ -1148,15 +1170,19 @@
"$ref": "#/definitions/template-variables-library" "$ref": "#/definitions/template-variables-library"
}, },
"schedule": { "schedule": {
"description": "Used to schedule when a library is run using the schedule options.",
"type": "string" "type": "string"
}, },
"remove_overlays": { "remove_overlays": {
"description": "Used to remove overlays from this library only. \nWhen set to true, this will remove all overlays from your library every run, but will not delete the overlaid images from your system, resulting in image bloat.",
"type": "boolean" "type": "boolean"
}, },
"reapply_overlays": { "reapply_overlays": {
"description": "Used to reapply overlays from this library only. This will reapply overlays to every item in your library.\nWhen set to true, this will reapply all overlays on each run even if there is no need to do so, which will result in image bloat.",
"type": "boolean" "type": "boolean"
}, },
"reset_overlays": { "reset_overlays": {
"description": "Used to reset overlays from this library only. This will reset overlays to every item in your library to your source choice. This will use the reset image when overlaying items in your library.\nThis will reset all posters to the desired source on each run and will reapply all overlays on each run, which will result in image bloat.",
"type": "string", "type": "string",
"enum": ["tmdb","plex"] "enum": ["tmdb","plex"]
}, },
@ -1433,18 +1459,22 @@
"type": "object", "type": "object",
"properties": { "properties": {
"sep_style": { "sep_style": {
"description": "Multiple styles are available for Separators, to match Plex's 'categories' feature.",
"type": "string", "type": "string",
"enum": ["amethyst", "aqua", "blue", "forest", "fuchsia", "gold", "gray", "green", "navy", "ocean", "olive", "orchid", "orig", "pink", "plum", "purple", "red", "rust", "salmon", "sand", "stb", "tan"] "enum": ["amethyst", "aqua", "blue", "forest", "fuchsia", "gold", "gray", "green", "navy", "ocean", "olive", "orchid", "orig", "pink", "plum", "purple", "red", "rust", "salmon", "sand", "stb", "tan"]
}, },
"collection_mode": { "collection_mode": {
"description": "Controls the collection mode of all collections in a Defaults file.",
"type": "string", "type": "string",
"enum": ["default", "hide", "hide_items", "show_items"] "enum": ["default", "hide", "hide_items", "show_items"]
}, },
"language": { "language": {
"description": "Set the language of Collection Names and Summaries that PMM has been translated to with weblate",
"type": "string", "type": "string",
"enum": ["en", "fr", "ar", "da", "nl", "de", "it", "pt-br", "nb-no", "es", "sv"] "enum": ["en", "fr", "ar", "da", "nl", "de", "it", "pt-br", "nb-no", "es", "sv"]
}, },
"placeholder_imdb_id": { "placeholder_imdb_id": {
"description": "Add a placeholder Movie/Show to the Separator to ensure Plex sees a collection with 1 item because 0 item collections can be problematic for Plex.\nValid for Movie or Show libraries assuming the ID points to an item of the correct type and that its in your library.",
"type": "string", "type": "string",
"pattern": "^tt\\d{7}$" "pattern": "^tt\\d{7}$"
} }
@ -1461,13 +1491,13 @@
"starting": { "starting": {
"oneOf": [ "oneOf": [
{ "type": "integer", "minimum": 0 }, { "type": "integer", "minimum": 0 },
{ "type": "string", "pattern": "^current_year(-\\d+)?$" } { "type": "string", "pattern": "^(current_year(\\s*-\\s*\\d+)?)$|^(first(\\s*\\+\\s*\\d+)?)$|^(latest(\\s*-\\s*\\d+)?)$" }
] ]
}, },
"ending": { "ending": {
"oneOf": [ "oneOf": [
{ "type": "integer", "minimum": 1 }, { "type": "integer", "minimum": 1 },
{ "type": "string", "pattern": "^current_year(-\\d+)?$" } { "type": "string", "pattern": "^(current_year(\\s*-\\s*\\d+)?)$|^(first(\\s*\\+\\s*\\d+)?)$|^(latest(\\s*-\\s*\\d+)?)$" }
] ]
}, },
"increment": { "type": "integer", "minimum": 0 }, "increment": { "type": "integer", "minimum": 0 },

@ -2109,7 +2109,7 @@ class CollectionBuilder:
elif method_name in ["trakt_watchlist", "trakt_collection"]: elif method_name in ["trakt_watchlist", "trakt_collection"]:
trakt_dicts = [] trakt_dicts = []
for trakt_user in util.get_list(method_data, split=False): for trakt_user in util.get_list(method_data, split=False):
trakt_dicts.append({"userlist": "watchlist" if "trakt_watchlist" else "collected", "user": trakt_user}) trakt_dicts.append({"userlist": method_name[6:], "user": trakt_user})
final_method = "trakt_userlist" final_method = "trakt_userlist"
else: else:
terms = method_name.split("_") terms = method_name.split("_")

@ -169,7 +169,7 @@ class ConfigFile:
with open(self.config_path, encoding="utf-8") as fp: with open(self.config_path, encoding="utf-8") as fp:
logger.separator("Redacted Config", space=False, border=False, debug=True) logger.separator("Redacted Config", space=False, border=False, debug=True)
for line in fp.readlines(): for line in fp.readlines():
logger.debug(re.sub(r"(token|client.*|url|api_*key|secret|error|run_start|run_end|version|changes|username|password): .+", r"\1: (redacted)", line.strip("\r\n"))) logger.debug(re.sub(r"(token|client.*|url|api_*key|secret|error|delete|run_start|run_end|version|changes|username|password): .+", r"\1: (redacted)", line.strip("\r\n")))
logger.debug("") logger.debug("")
self.data = YAML(self.config_path).data self.data = YAML(self.config_path).data

@ -23,6 +23,7 @@ status_translation = {
"returning": "returning series", "production": "in production", "returning": "returning series", "production": "in production",
"planned": "planned", "canceled": "canceled", "ended": "ended" "planned": "planned", "canceled": "canceled", "ended": "ended"
} }
userlist_options = ["favorites", "watched", "collection", "watchlist"]
periods = ["daily", "weekly", "monthly", "yearly", "all"] periods = ["daily", "weekly", "monthly", "yearly", "all"]
id_translation = {"movie": "movie", "show": "show", "season": "show", "episode": "show", "person": "person", "list": "list"} id_translation = {"movie": "movie", "show": "show", "season": "show", "episode": "show", "person": "person", "list": "list"}
id_types = { id_types = {
@ -493,17 +494,28 @@ class Trakt:
final_dict["status"] = util.parse(err_type, "status", trakt_dict, methods=dict_methods, parent=method_name, datatype="commalist", options=status) final_dict["status"] = util.parse(err_type, "status", trakt_dict, methods=dict_methods, parent=method_name, datatype="commalist", options=status)
valid_dicts.append(final_dict) valid_dicts.append(final_dict)
else: else:
userlist = util.parse(err_type, "userlist", trakt_dict, methods=dict_methods, parent=method_name, options=["recommendations", "watched", "collected", "watchlist"]) if "userlist" not in dict_methods:
raise Failed(f"{err_type} Error: {method_name} userlist attribute not found")
og_list = trakt_dict[dict_methods["year"]]
if not og_list:
raise Failed(f"{err_type} Error: {method_name} userlist attribute is blank")
if og_list == "collected":
logger.warning(f"{err_type} Warning: userlist value collected has been deprecated using collection")
userlist = "collection"
elif og_list == "recommendations":
raise Failed(f"{err_type} Error: {method_name} userlist value recommendations has been deprecated")
else:
userlist = util.parse(err_type, "userlist", trakt_dict, methods=dict_methods, parent=method_name, options=userlist_options)
user = util.parse(err_type, "user", trakt_dict, methods=dict_methods, parent=method_name, default="me") user = util.parse(err_type, "user", trakt_dict, methods=dict_methods, parent=method_name, default="me")
sort_by = None sort_by = None
if userlist in ["recommendations", "watchlist"] and "sort_by" in dict_methods: if userlist in ["favorites", "watchlist"] and "sort_by" in dict_methods:
sort_by = util.parse(err_type, "sort_by", trakt_dict, methods=dict_methods, parent=method_name, default="rank", options=["rank", "added", "released", "title"]) sort_by = util.parse(err_type, "sort_by", trakt_dict, methods=dict_methods, parent=method_name, default="rank", options=["rank", "added", "released", "title"])
self._userlist("collection" if userlist == "collected" else userlist, user, is_movie, sort_by=sort_by) self._userlist(userlist, user, is_movie, sort_by=sort_by)
valid_dicts.append({"userlist": userlist, "user": user, "sort_by": sort_by}) valid_dicts.append({"userlist": userlist, "user": user, "sort_by": sort_by})
except Failed as e: except Failed as e:
logger.error(e) logger.error(e)
if len(valid_dicts) == 0: if len(valid_dicts) == 0:
raise Failed(f"Trakt Error: No valid Trakt {method_name[6:].capitalize()}") raise Failed(f"{err_type} Error: No valid Trakt {method_name[6:].capitalize()}")
return valid_dicts return valid_dicts
def get_trakt_ids(self, method, data, is_movie): def get_trakt_ids(self, method, data, is_movie):

@ -5,8 +5,8 @@ num2words==0.5.13
pathvalidate==3.2.0 pathvalidate==3.2.0
pillow==10.2.0 pillow==10.2.0
PlexAPI==4.15.7 PlexAPI==4.15.7
psutil==5.9.7 psutil==5.9.8
python-dotenv==1.0.0 python-dotenv==1.0.1
python-dateutil==2.8.2 python-dateutil==2.8.2
requests==2.31.0 requests==2.31.0
retrying==1.3.4 retrying==1.3.4

Loading…
Cancel
Save