diff --git a/VERSION b/VERSION index 39893559..98b7de70 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.20.0 +1.20.0-develop1 diff --git a/docs/config/settings.md b/docs/config/settings.md index c0a721fe..73726645 100644 --- a/docs/config/settings.md +++ b/docs/config/settings.md @@ -714,6 +714,27 @@ The available setting attributes which can be set at each level are outlined bel save_report: false ``` +??? blank "`report_path` - Used to specify the location of `save_report`." + +
Specify the location where `save_report` is saved. + +
+ + **Attribute:** `report_path` + + **Levels with this Attribute:** Library + + **Accepted Values:** YAML file path location + + **Default Value:** `[Directory containing YAML config]/[Library Mapping Name]_report.yml` + + ???+ example "Example" + + ```yaml + settings: + report_path: config/TV_missing_report.yml + ``` + ??? blank "`tvdb_language` - Specify the language to query TVDb in."
Specify the language to query TVDb in. diff --git a/docs/files/filters.md b/docs/files/filters.md index cb48ad55..6511c547 100644 --- a/docs/files/filters.md +++ b/docs/files/filters.md @@ -173,23 +173,23 @@ Number filters can **NOT** take multiple values. ### Attribute -| Number Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track | -|:----------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------:|:--------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------:|:------------------------------------------:|:--------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------:|:------------------------------------------:| -| `year`**[3](#table-annotations)** | Uses the year attribute to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | -| `tmdb_year`**[2](#table-annotations)****[3](#table-annotations)** | Uses the year on TMDb to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `critic_rating` | Uses the critic rating attribute to match
`0.0` - `10.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | -| `audience_rating` | Uses the audience rating attribute to match
`0.0` - `10.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `user_rating` | Uses the user rating attribute to match
`0.0` - `10.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | -| `tmdb_vote_count`**[2](#table-annotations)** | Uses the tmdb vote count to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `tmdb_vote_average`**[2](#table-annotations)** | Uses the tmdb vote average rating to match
minimum: `0.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `plays` | Uses the plays attribute to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | -| `duration` | Uses the duration attribute to match using minutes
minimum: `0.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | -| `channels` | Uses the audio channels attribute to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `height` | Uses the height attribute to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `width` | Uses the width attribute to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `aspect` | Uses the aspect attribute to match
minimum: `0.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | -| `versions` | Uses the number of versions found to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | -| `stinger_rating`**[4](#table-annotations)** | Uses the [media stinger](http://www.mediastinger.com/) rating to match. The media stinger rating is if the after/during credits scene is worth staying for.
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| Number Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track | +|:----------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------:|:--------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------:|:------------------------------------------:|:--------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------:|:------------------------------------------:| +| `year`**[3](#table-annotations)** | Uses the year attribute to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | +| `tmdb_year`**[2](#table-annotations)****[3](#table-annotations)** | Uses the year on TMDb to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `critic_rating` | Uses the critic rating attribute to match
`0.0` - `10.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | +| `audience_rating` | Uses the audience rating attribute to match
`0.0` - `10.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `user_rating` | Uses the user rating attribute to match
`0.0` - `10.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | +| `tmdb_vote_count`**[2](#table-annotations)** | Uses the tmdb vote count to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `tmdb_vote_average`**[2](#table-annotations)** | Uses the tmdb vote average rating to match
minimum: `0.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `plays` | Uses the plays attribute to match
minimum: `1` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | +| `duration` | Uses the duration attribute to match using minutes
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-check:{ .green } | +| `channels` | Uses the audio channels attribute to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `height` | Uses the height attribute to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `width` | Uses the width attribute to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `aspect` | Uses the aspect attribute to match
minimum: `0.0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | +| `versions` | Uses the number of versions found to match
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green }**[1](#table-annotations)** | :fontawesome-solid-circle-check:{ .green } | +| `stinger_rating`**[4](#table-annotations)** | Uses the [media stinger](http://www.mediastinger.com/) rating to match. The media stinger rating is if the after/during credits scene is worth staying for.
minimum: `0` | :fontawesome-solid-circle-check:{ .green } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | :fontawesome-solid-circle-xmark:{ .red } | ## Special Filters diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 0951df12..cacbd146 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -15,6 +15,10 @@ strong { color: #00bc8c; } +table tr td code { + white-space: nowrap; +} + .md-banner { background-color: #252525; color: var(--md-footer-fg-color); diff --git a/modules/mdblist.py b/modules/mdblist.py index 10a43481..66f82a27 100644 --- a/modules/mdblist.py +++ b/modules/mdblist.py @@ -114,8 +114,8 @@ class Mdblist: response = self.config.get_json(api_url, params=params) except JSONDecodeError: raise Failed("Mdblist Error: JSON Decoding Failed") - if "response" in response and response["response"] is False: - if response["error"] == "API Limit Reached!": + if "response" in response and response["response"] is False or response["response"] == "False": + if response["error"] in ["API Limit Reached!", "API Rate Limit Reached!"]: self.limit = True raise LimitReached(f"MdbList Error: {response['error']}") raise Failed(f"MdbList Error: {response['error']}") diff --git a/modules/operations.py b/modules/operations.py index b1461d97..9aee01df 100644 --- a/modules/operations.py +++ b/modules/operations.py @@ -906,6 +906,7 @@ class Operations: all_collections = self.library.get_all_collections() for i, col in enumerate(all_collections, 1): logger.ghost(f"Reading Collection: {i}/{len(all_collections)} {col.title}") + col = self.library.reload(col, force=True) labels = [la.tag for la in self.library.item_labels(col)] if (less is not None or managed is not None or configured is not None) \ and (less is None or col.childCount < less) \ diff --git a/modules/util.py b/modules/util.py index 5c3057f3..839b99dc 100644 --- a/modules/util.py +++ b/modules/util.py @@ -534,7 +534,7 @@ def is_date_filter(value, modifier, data, final, current_time): if (modifier == ".before" and value >= filter_date) or (modifier == ".after" and value <= filter_date): return True elif modifier == ".regex": - jailbreak = True + jailbreak = False for check_data in data: if re.compile(check_data).match(value.strftime("%m/%d/%Y")): jailbreak = True diff --git a/plex_meta_manager.py b/plex_meta_manager.py index 728c30bf..be163d47 100644 --- a/plex_meta_manager.py +++ b/plex_meta_manager.py @@ -556,8 +556,15 @@ def run_libraries(config): for ad in library.asset_directory: logger.debug(f"Asset Directory: {ad}") logger.debug(f"Asset Folders: {library.asset_folders}") + logger.debug(f"Asset Depth: {library.asset_depth}") logger.debug(f"Create Asset Folders: {library.create_asset_folders}") + logger.debug(f"Prioritize Assets: {library.prioritize_assets}") + logger.debug(f"Dimensional Asset Rename: {library.dimensional_asset_rename}") logger.debug(f"Download URL Assets: {library.download_url_assets}") + logger.debug(f"Show Missing Assets: {library.show_missing_assets}") + logger.debug(f"Show Missing Season Assets: {library.show_missing_season_assets}") + logger.debug(f"Show Missing Episode Assets: {library.show_missing_episode_assets}") + logger.debug(f"Show Assets Not Needed: {library.show_asset_not_needed}") logger.debug(f"Sync Mode: {library.sync_mode}") logger.debug(f"Minimum Items: {library.minimum_items}") logger.debug(f"Delete Below Minimum: {library.delete_below_minimum}") @@ -566,11 +573,15 @@ def run_libraries(config): logger.debug(f"Missing Only Released: {library.missing_only_released}") logger.debug(f"Only Filter Missing: {library.only_filter_missing}") logger.debug(f"Show Unmanaged: {library.show_unmanaged}") + logger.debug(f"Show Unconfigured: {library.show_unconfigured}") logger.debug(f"Show Filtered: {library.show_filtered}") + logger.debug(f"Show Options: {library.show_options}") logger.debug(f"Show Missing: {library.show_missing}") - logger.debug(f"Show Missing Assets: {library.show_missing_assets}") logger.debug(f"Save Report: {library.save_report}") logger.debug(f"Report Path: {library.report_path}") + logger.debug(f"Ignore IDs: {library.ignore_ids}") + logger.debug(f"Ignore IMDb IDs: {library.ignore_imdb_ids}") + logger.debug(f"Item Refresh Delay: {library.item_refresh_delay}") logger.debug(f"Clean Bundles: {library.clean_bundles}") logger.debug(f"Empty Trash: {library.empty_trash}") logger.debug(f"Optimize: {library.optimize}") diff --git a/requirements.txt b/requirements.txt index 52175909..0d4d7ce3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ arrapi==1.4.7 GitPython==3.1.40 -lxml==5.0.0 +lxml==5.1.0 num2words==0.5.13 pathvalidate==3.2.0 pillow==10.2.0