[42] plex_search sorts can now be a list

This commit is contained in:
meisnate12 2022-09-21 23:20:21 -04:00
parent 5cb384c6d0
commit e56d2e959b
4 changed files with 44 additions and 23 deletions

View file

@ -1 +1 @@
1.17.3-develop41 1.17.3-develop42

View file

@ -109,12 +109,12 @@ There are a couple other attributes you can have at the top level only along wit
## Special Attributes ## Special Attributes
| Attribute | Description & Values | | Attribute | Description & Values |
|:-----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |:-----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `limit` | **Description:** The max number of item for the search.<br>**Default:** `all`<br>**Values:** `all` or a number greater than 0 | | `limit` | **Description:** The max number of item for the search.<br>**Default:** `all`<br>**Values:** `all` or a number greater than 0 |
| `sort_by` | **Description:** This will control how the filter is sorted in your library.<br>**Default:** `random`<br>**Values:** Any sort options for your search type in the [Sorts Options Table](#sort-options) | | `sort_by` | **Description:** This will control how the filter is sorted in your library. You can do a multi-level sort using a list.<br>**Default:** `random`<br>**Values:** Any sort options for your search type in the [Sorts Options Table](#sort-options) |
| `type` | **PLAYLIST SEARCHES ONLY** **Description:** Allows different types of media to be searched for.<br>**Default:** `movie`, `show`, or `artist` depending on library type<br>**Values:** `movie`, `show`, `season`, `episode`, `artist`, `album` or `track` | `type` | **PLAYLIST SEARCHES ONLY** **Description:** Allows different types of media to be searched for.<br>**Default:** `movie`, `show`, or `artist` depending on library type<br>**Values:** `movie`, `show`, `season`, `episode`, `artist`, `album` or `track` |
| `validate` | **Description:** Determines if a collection/playlist will fail on a validation error<br>**Default:** `true`<br>**Values**: `true` or `false` | | `validate` | **Description:** Determines if a collection/playlist will fail on a validation error<br>**Default:** `true`<br>**Values**: `true` or `false` |
## Sort Options ## Sort Options

View file

@ -52,11 +52,11 @@ There are a couple other attributes you can have at the top level only along wit
## Special Attributes ## Special Attributes
| Attribute | Description & Values | | Attribute | Description & Values |
|:-----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |:-----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `limit` | **Description:** The max number of item for the filter.<br>**Default:** `all`<br>**Values:** `all` or a number greater than 0 | | `limit` | **Description:** The max number of item for the filter.<br>**Default:** `all`<br>**Values:** `all` or a number greater than 0 |
| `sort_by` | **Description:** This will control how the filter is sorted in your library.<br>**Default:** `random`<br>**Values:** Any sort options for your filter type in the [Sorts Options Table](#sort-options) | | `sort_by` | **Description:** This will control how the filter is sorted in your library. You can do a multi-level sort using a list.<br>**Default:** `random`<br>**Values:** Any sort options for your filter type in the [Sorts Options Table](#sort-options) |
| `validate` | **Description:** Determines if a collection will fail on a validation error<br>**Default:** `true`<br>**Values**: `true` or `false` | | `validate` | **Description:** Determines if a collection will fail on a validation error<br>**Default:** `true`<br>**Values**: `true` or `false` |
## Sort Options ## Sort Options

View file

@ -620,13 +620,28 @@ class CollectionBuilder:
logger.debug("") logger.debug("")
logger.debug("Validating Method: collection_order") logger.debug("Validating Method: collection_order")
logger.debug(f"Value: {test_sort}") logger.debug(f"Value: {test_sort}")
if test_sort.lower() in plex.collection_order_options: if test_sort in plex.collection_order_options:
self.details["collection_order"] = test_sort.lower() self.details["collection_order"] = test_sort
if test_sort.lower() == "custom" and self.build_collection: if test_sort == "custom" and self.build_collection:
self.custom_sort = True self.custom_sort = True
elif (self.library.is_movie and test_sort.lower() in plex.movie_sorts) or (self.library.is_show and test_sort.lower() in plex.show_sorts):
self.custom_sort = test_sort.lower()
else: else:
sort_type = self.builder_level
if sort_type == "item":
if self.library.is_show:
sort_type = "show"
elif self.library.is_music:
sort_type = "artist"
else:
sort_type = "movie"
_, _, sorts = plex.sort_types[sort_type]
if not isinstance(test_sort, list):
test_sort = [test_sort]
self.custom_sort = []
for ts in test_sort:
if ts not in sorts:
raise Failed(f"{self.Type} Error: collection_order: {ts} is invalid. Options: {', '.join(sorts)}")
self.custom_sort.append(ts)
if isinstance(self.custom_sort, list) and not self.custom_sort:
raise Failed(f"{self.Type} Error: {test_sort} collection_order invalid\n\trelease (Order Collection by release dates)\n\talpha (Order Collection Alphabetically)\n\tcustom (Custom Order Collection)\n\tOther sorting options can be found at https://github.com/meisnate12/Plex-Meta-Manager/wiki/Smart-Builders#sort-options") raise Failed(f"{self.Type} Error: {test_sort} collection_order invalid\n\trelease (Order Collection by release dates)\n\talpha (Order Collection Alphabetically)\n\tcustom (Custom Order Collection)\n\tOther sorting options can be found at https://github.com/meisnate12/Plex-Meta-Manager/wiki/Smart-Builders#sort-options")
if self.smart_url or self.smart_label_collection: if self.smart_url or self.smart_label_collection:
@ -1779,13 +1794,19 @@ class CollectionBuilder:
filter_details = f"{ms[0].capitalize()} {sort_type.capitalize()} {ms[1].capitalize()}\n" filter_details = f"{ms[0].capitalize()} {sort_type.capitalize()} {ms[1].capitalize()}\n"
type_default_sort, type_key, sorts = plex.sort_types[sort_type] type_default_sort, type_key, sorts = plex.sort_types[sort_type]
sort = default_sort if default_sort else type_default_sort sort = []
if "sort_by" in filter_alias: if "sort_by" in filter_alias:
if plex_filter[filter_alias["sort_by"]] is None: test_sorts = plex_filter[filter_alias["sort_by"]]
if test_sorts is None:
raise Failed(f"{self.Type} Error: sort_by attribute is blank") raise Failed(f"{self.Type} Error: sort_by attribute is blank")
if plex_filter[filter_alias["sort_by"]] not in sorts: if not isinstance(test_sorts, list):
raise Failed(f"{self.Type} Error: sort_by: {plex_filter[filter_alias['sort_by']]} is invalid. Options: {', '.join(sorts)}") test_sorts = [test_sorts]
sort = plex_filter[filter_alias["sort_by"]] for test_sort in test_sorts:
if test_sort not in sorts:
raise Failed(f"{self.Type} Error: sort_by: {test_sort} is invalid. Options: {', '.join(sorts)}")
sort.append(test_sort)
if not sort:
sort.append(default_sort if default_sort else type_default_sort)
filter_details += f"Sort By: {sort}\n" filter_details += f"Sort By: {sort}\n"
limit = None limit = None
@ -1929,7 +1950,7 @@ class CollectionBuilder:
filter_details = f"{filter_details}Filter:{filter_text}" filter_details = f"{filter_details}Filter:{filter_text}"
if len(built_filter) > 0: if len(built_filter) > 0:
final_filter = built_filter[:-1] if base_all else f"push=1&{built_filter}pop=1" final_filter = built_filter[:-1] if base_all else f"push=1&{built_filter}pop=1"
filter_url = f"?type={type_key}&{f'limit={limit}&' if limit else ''}sort={sorts[sort]}&{final_filter}" filter_url = f"?type={type_key}&{f'limit={limit}&' if limit else ''}sort={'%2C'.join([sorts[s] for s in sort])}&{final_filter}"
else: else:
raise Failed(f"{self.Type} Error: No Filter Created") raise Failed(f"{self.Type} Error: No Filter Created")