[61] #738 Expand Summary

This commit is contained in:
meisnate12 2022-05-04 12:27:17 -04:00
parent e66793511f
commit d8d1730fc8
7 changed files with 122 additions and 89 deletions

View file

@ -1 +1 @@
1.16.5-develop60 1.16.5-develop61

View file

@ -27,8 +27,8 @@ Set the attribute to the tag you want to search for. Multiple values are support
```yaml ```yaml
collections: collections:
Radarr Movies Without Tags: Radarr Tag1 and Tag2 Movies:
radarr_taglist: action, drama radarr_taglist: tag1, tag2
``` ```
If no tag is specified then it gets every Movie without a tag. If no tag is specified then it gets every Movie without a tag.

View file

@ -27,8 +27,8 @@ Set the attribute to the tag you want to search for. Multiple values are support
```yaml ```yaml
collections: collections:
Sonarr Series Without Tags: Sonarr Tag1 and Tag2 Series:
sonarr_taglist: action, drama sonarr_taglist: tag1, tag2
``` ```
If no tag is specified then it gets every Movie without a tag. If no tag is specified then it gets every Movie without a tag.

View file

@ -2438,45 +2438,44 @@ class CollectionBuilder:
self.created = True self.created = True
def update_details(self): def update_details(self):
updated_details = []
logger.info("") logger.info("")
logger.separator(f"Updating Details of {self.name} {self.Type}", space=False, border=False) logger.separator(f"Updating Details of {self.name} {self.Type}", space=False, border=False)
logger.info("") logger.info("")
if self.smart_url and self.smart_url != self.library.smart_filter(self.obj): if self.smart_url and self.smart_url != self.library.smart_filter(self.obj):
self.library.update_smart_collection(self.obj, self.smart_url) self.library.update_smart_collection(self.obj, self.smart_url)
logger.info(f"Detail: Smart Filter updated to {self.smart_url}") logger.info(f"Detail: Smart Filter updated to {self.smart_url}")
updated_details.append("Smart Filter")
def get_summary(summary_method, summaries): if "summary" in self.summaries: summary = ("summary", self.summaries["summary"])
logger.info(f"Detail: {summary_method} will update {self.Type} Summary") elif "tmdb_description" in self.summaries: summary = ("tmdb_description", self.summaries["tmdb_description"])
return summaries[summary_method] elif "letterboxd_description" in self.summaries: summary = ("letterboxd_description", self.summaries["letterboxd_description"])
if "summary" in self.summaries: summary = get_summary("summary", self.summaries) elif "tmdb_summary" in self.summaries: summary = ("tmdb_summary", self.summaries["tmdb_summary"])
elif "tmdb_description" in self.summaries: summary = get_summary("tmdb_description", self.summaries) elif "tvdb_summary" in self.summaries: summary = ("tvdb_summary", self.summaries["tvdb_summary"])
elif "letterboxd_description" in self.summaries: summary = get_summary("letterboxd_description", self.summaries) elif "tmdb_biography" in self.summaries: summary = ("tmdb_biography", self.summaries["tmdb_biography"])
elif "tmdb_summary" in self.summaries: summary = get_summary("tmdb_summary", self.summaries) elif "tmdb_person" in self.summaries: summary = ("tmdb_person", self.summaries["tmdb_person"])
elif "tvdb_summary" in self.summaries: summary = get_summary("tvdb_summary", self.summaries) elif "tmdb_collection_details" in self.summaries: summary = ("tmdb_collection_details", self.summaries["tmdb_collection_details"])
elif "tmdb_biography" in self.summaries: summary = get_summary("tmdb_biography", self.summaries) elif "trakt_list_details" in self.summaries: summary = ("trakt_list_details", self.summaries["trakt_list_details"])
elif "tmdb_person" in self.summaries: summary = get_summary("tmdb_person", self.summaries) elif "tmdb_list_details" in self.summaries: summary = ("tmdb_list_details", self.summaries["tmdb_list_details"])
elif "tmdb_collection_details" in self.summaries: summary = get_summary("tmdb_collection_details", self.summaries) elif "letterboxd_list_details" in self.summaries: summary = ("letterboxd_list_details", self.summaries["letterboxd_list_details"])
elif "trakt_list_details" in self.summaries: summary = get_summary("trakt_list_details", self.summaries) elif "icheckmovies_list_details" in self.summaries: summary = ("icheckmovies_list_details", self.summaries["icheckmovies_list_details"])
elif "tmdb_list_details" in self.summaries: summary = get_summary("tmdb_list_details", self.summaries) elif "tmdb_actor_details" in self.summaries: summary = ("tmdb_actor_details", self.summaries["tmdb_actor_details"])
elif "letterboxd_list_details" in self.summaries: summary = get_summary("letterboxd_list_details", self.summaries) elif "tmdb_crew_details" in self.summaries: summary = ("tmdb_crew_details", self.summaries["tmdb_crew_details"])
elif "icheckmovies_list_details" in self.summaries: summary = get_summary("icheckmovies_list_details", self.summaries) elif "tmdb_director_details" in self.summaries: summary = ("tmdb_director_details", self.summaries["tmdb_director_details"])
elif "tmdb_actor_details" in self.summaries: summary = get_summary("tmdb_actor_details", self.summaries) elif "tmdb_producer_details" in self.summaries: summary = ("tmdb_producer_details", self.summaries["tmdb_producer_details"])
elif "tmdb_crew_details" in self.summaries: summary = get_summary("tmdb_crew_details", self.summaries) elif "tmdb_writer_details" in self.summaries: summary = ("tmdb_writer_details", self.summaries["tmdb_writer_details"])
elif "tmdb_director_details" in self.summaries: summary = get_summary("tmdb_director_details", self.summaries) elif "tmdb_movie_details" in self.summaries: summary = ("tmdb_movie_details", self.summaries["tmdb_movie_details"])
elif "tmdb_producer_details" in self.summaries: summary = get_summary("tmdb_producer_details", self.summaries) elif "tvdb_movie_details" in self.summaries: summary = ("tvdb_movie_details", self.summaries["tvdb_movie_details"])
elif "tmdb_writer_details" in self.summaries: summary = get_summary("tmdb_writer_details", self.summaries) elif "tvdb_show_details" in self.summaries: summary = ("tvdb_show_details", self.summaries["tvdb_show_details"])
elif "tmdb_movie_details" in self.summaries: summary = get_summary("tmdb_movie_details", self.summaries) elif "tmdb_show_details" in self.summaries: summary = ("tmdb_show_details", self.summaries["tmdb_show_details"])
elif "tvdb_movie_details" in self.summaries: summary = get_summary("tvdb_movie_details", self.summaries)
elif "tvdb_show_details" in self.summaries: summary = get_summary("tvdb_show_details", self.summaries)
elif "tmdb_show_details" in self.summaries: summary = get_summary("tmdb_show_details", self.summaries)
else: summary = None else: summary = None
if self.playlist: if self.playlist:
if summary and str(summary) != str(self.obj.summary): if summary and str(summary[1]) != str(self.obj.summary):
try: try:
self.obj.edit(summary=str(summary)) self.obj.edit(summary=str(summary[1]))
logger.info(f"Summary | {summary:<25}") logger.info(f"Summary ({summary[0]}) | {summary[1]:<25}")
logger.info("Details: have been updated") logger.info("Details: have been updated")
updated_details.append("Metadata")
except NotFound: except NotFound:
logger.error("Details: Failed to Update Please delete the collection and run again") logger.error("Details: Failed to Update Please delete the collection and run again")
logger.info("") logger.info("")
@ -2484,9 +2483,9 @@ class CollectionBuilder:
self.obj.batchEdits() self.obj.batchEdits()
batch_display = "Collection Metadata Edits" batch_display = "Collection Metadata Edits"
if summary and str(summary) != str(self.obj.summary): if summary and str(summary[1]) != str(self.obj.summary):
self.obj.editSummary(summary) self.obj.editSummary(summary[1])
batch_display += f"\nSummary | {summary:<25}" batch_display += f"\nSummary ({summary[0]}) | {summary[1]:<25}"
if "sort_title" in self.details and str(self.details["sort_title"]) != str(self.obj.titleSort): if "sort_title" in self.details and str(self.details["sort_title"]) != str(self.obj.titleSort):
self.obj.editSortTitle(self.details["sort_title"]) self.obj.editSortTitle(self.details["sort_title"])
@ -2506,21 +2505,29 @@ class CollectionBuilder:
try: try:
self.obj.saveEdits() self.obj.saveEdits()
logger.info("Details: have been updated") logger.info("Details: have been updated")
updated_details.append("Metadata")
except NotFound: except NotFound:
logger.error("Details: Failed to Update Please delete the collection and run again") logger.error("Details: Failed to Update Please delete the collection and run again")
logger.info("") logger.info("")
advance_update = False
if "collection_mode" in self.details: if "collection_mode" in self.details:
self.library.collection_mode_query(self.obj, self.details["collection_mode"]) if int(self.obj.collectionMode) not in plex.collection_mode_keys \
or plex.collection_mode_keys[int(self.obj.collectionMode)] != self.details["collection_mode"]:
self.library.collection_mode_query(self.obj, self.details["collection_mode"])
logger.info(f"Collection Mode | {self.details['collection_mode']}")
advance_update = True
if "collection_filtering" in self.details: if "collection_filtering" in self.details:
self.library.edit_query(self.obj, {"collectionFilterBasedOnUser": 0 if self.details["collection_filtering"] == "admin" else 1}, advanced=True) self.library.edit_query(self.obj, {"collectionFilterBasedOnUser": 0 if self.details["collection_filtering"] == "admin" else 1}, advanced=True)
advance_update = True
if "collection_order" in self.details: if "collection_order" in self.details:
if int(self.obj.collectionSort) not in plex.collection_order_keys\ if int(self.obj.collectionSort) not in plex.collection_order_keys \
or plex.collection_order_keys[int(self.obj.collectionSort)] != self.details["collection_order"]: or plex.collection_order_keys[int(self.obj.collectionSort)] != self.details["collection_order"]:
self.library.collection_order_query(self.obj, self.details["collection_order"]) self.library.collection_order_query(self.obj, self.details["collection_order"])
logger.info(f"Collection Order | {self.details['collection_order']}") logger.info(f"Collection Order | {self.details['collection_order']}")
advance_update = True
if "visible_library" in self.details or "visible_home" in self.details or "visible_shared" in self.details: if "visible_library" in self.details or "visible_home" in self.details or "visible_shared" in self.details:
visibility = self.library.collection_visibility(self.obj) visibility = self.library.collection_visibility(self.obj)
@ -2539,8 +2546,12 @@ class CollectionBuilder:
if visible_library is not None or visible_home is not None or visible_shared is not None: if visible_library is not None or visible_home is not None or visible_shared is not None:
self.library.collection_visibility_update(self.obj, visibility=visibility, library=visible_library, home=visible_home, shared=visible_shared) self.library.collection_visibility_update(self.obj, visibility=visibility, library=visible_library, home=visible_home, shared=visible_shared)
advance_update = True
logger.info("Collection Visibility Updated") logger.info("Collection Visibility Updated")
if advance_update and "Metadata" not in updated_details:
updated_details.append("Metadata")
poster_image = None poster_image = None
background_image = None background_image = None
asset_location = None asset_location = None
@ -2633,12 +2644,15 @@ class CollectionBuilder:
logger.info(f"No background {self.type} detail or asset folder found") logger.info(f"No background {self.type} detail or asset folder found")
if self.collection_poster or self.collection_background: if self.collection_poster or self.collection_background:
self.library.upload_images(self.obj, poster=self.collection_poster, background=self.collection_background) pu, bu = self.library.upload_images(self.obj, poster=self.collection_poster, background=self.collection_background)
if pu or bu:
updated_details.append("Image")
if self.url_theme: if self.url_theme: # TODO: cache theme path to not constantly upload
self.library.upload_theme(self.obj, url=self.url_theme) self.library.upload_theme(self.obj, url=self.url_theme)
elif self.file_theme: elif self.file_theme:
self.library.upload_theme(self.obj, filepath=self.file_theme) self.library.upload_theme(self.obj, filepath=self.file_theme)
return updated_details
def sort_collection(self): def sort_collection(self):
logger.info("") logger.info("")

View file

@ -184,6 +184,8 @@ class Library(ABC):
if background_uploaded: if background_uploaded:
self.config.Cache.update_image_map(item.ratingKey, f"{self.image_table_name}_backgrounds", item.art, background.compare) self.config.Cache.update_image_map(item.ratingKey, f"{self.image_table_name}_backgrounds", item.art, background.compare)
return poster_uploaded, background_uploaded
@abstractmethod @abstractmethod
def notify(self, text, collection=None, critical=True): def notify(self, text, collection=None, critical=True):
pass pass

View file

@ -1,5 +1,5 @@
import os, re import os, re
from modules import util from modules import plex, util
from modules.util import Failed from modules.util import Failed
from plexapi.audio import Artist from plexapi.audio import Artist
from plexapi.video import Show from plexapi.video import Show
@ -439,10 +439,13 @@ class Operations:
if self.library.mass_collection_mode: if self.library.mass_collection_mode:
logger.info("") logger.info("")
logger.separator(f"Unmanaged Mass Collection Mode for {self.library.name} Library", space=False, border=False) logger.separator(f"Unmanaged Mass Collection Mode to {self.library.mass_collection_mode} for {self.library.name} Library", space=False, border=False)
logger.info("") logger.info("")
for col in unmanaged_collections: for col in unmanaged_collections:
self.library.collection_mode_query(col, self.library.mass_collection_mode) if int(col.collectionMode) not in plex.collection_mode_keys \
or plex.collection_mode_keys[int(col.collectionMode)] != self.library.mass_collection_mode:
self.library.collection_mode_query(col, self.library.mass_collection_mode)
logger.info(f"{col.title} Collection Mode Updated")
if self.library.metadata_backup: if self.library.metadata_backup:
logger.info("") logger.info("")

View file

@ -396,11 +396,11 @@ def update_libraries(config):
logger.info("") logger.info("")
logger.separator(f"{section} Summary", space=False, border=False) logger.separator(f"{section} Summary", space=False, border=False)
logger.info("") logger.info("")
logger.info(f"{'Title':^{longest}} | + | = | - | {'Status':^13}") logger.info(f"{'Title':^{longest}} | + | = | - | Run Time | {'Status'}")
breaker = f"{logger.separating_character * longest}|{logger.separating_character * 5}|{logger.separating_character * 5}|{logger.separating_character * 5}|" breaker = f"{logger.separating_character * longest}|{logger.separating_character * 5}|{logger.separating_character * 5}|{logger.separating_character * 5}|"
logger.separator(breaker, space=False, border=False, side_space=False, left=True) logger.separator(breaker, space=False, border=False, side_space=False, left=True)
for name, data in status.items(): for name, data in status.items():
logger.info(f"{name:<{longest}} | {data['added']:^3} | {data['unchanged']:^3} | {data['removed']:^3} | {data['status']}") logger.info(f"{name:<{longest}} | {data['added']:^3} | {data['unchanged']:^3} | {data['removed']:^3} | {data['run_time']:>8} | {data['status']}")
if data["errors"]: if data["errors"]:
for error in data["errors"]: for error in data["errors"]:
logger.info(error) logger.info(error)
@ -467,7 +467,7 @@ def run_collection(config, library, metadata, requested_collections):
else: else:
collection_log_name, output_str = util.validate_filename(mapping_name) collection_log_name, output_str = util.validate_filename(mapping_name)
logger.add_collection_handler(library.mapping_name, collection_log_name) logger.add_collection_handler(library.mapping_name, collection_log_name)
library.status[mapping_name] = {"status": "", "errors": [], "created": False, "modified": False, "deleted": False, "added": 0, "unchanged": 0, "removed": 0, "radarr": 0, "sonarr": 0} library.status[mapping_name] = {"status": "Unchanged", "errors": [], "added": 0, "unchanged": 0, "removed": 0, "radarr": 0, "sonarr": 0}
try: try:
builder = CollectionBuilder(config, metadata, mapping_name, collection_attrs, library=library, extra=output_str) builder = CollectionBuilder(config, metadata, mapping_name, collection_attrs, library=library, extra=output_str)
@ -528,11 +528,14 @@ def run_collection(config, library, metadata, requested_collections):
): ):
logger.info("") logger.info("")
logger.info(f"Collection Minimum: {builder.minimum} not met for {mapping_name} Collection") logger.info(f"Collection Minimum: {builder.minimum} not met for {mapping_name} Collection")
delete_status = f"Minimum {builder.minimum} Not Met"
valid = False valid = False
if builder.details["delete_below_minimum"] and builder.obj: if builder.details["delete_below_minimum"] and builder.obj:
logger.info("") logger.info("")
logger.info(builder.delete()) logger.info(builder.delete())
builder.deleted = True library.stats["deleted"] += 1
delete_status = f"Deleted; {delete_status}"
library.status[mapping_name]["status"] = delete_status
run_item_details = True run_item_details = True
if valid and builder.build_collection and (builder.builders or builder.smart_url or builder.blank_collection): if valid and builder.build_collection and (builder.builders or builder.smart_url or builder.blank_collection):
@ -540,28 +543,29 @@ def run_collection(config, library, metadata, requested_collections):
builder.load_collection() builder.load_collection()
if builder.created: if builder.created:
library.stats["created"] += 1 library.stats["created"] += 1
library.status[mapping_name]["created"] = True library.status[mapping_name]["status"] = "Created"
elif items_added > 0 or items_removed > 0: elif items_added > 0 or items_removed > 0:
library.stats["modified"] += 1 library.stats["modified"] += 1
library.status[mapping_name]["modified"] = True library.status[mapping_name]["status"] = "Modified"
except Failed: except Failed:
logger.stacktrace() logger.stacktrace()
run_item_details = False run_item_details = False
logger.info("") logger.info("")
logger.separator("No Collection to Update", space=False, border=False) logger.separator("No Collection to Update", space=False, border=False)
else: else:
builder.update_details() details_list = builder.update_details()
if details_list:
if builder.deleted: pre = ""
library.stats["deleted"] += 1 if library.status[mapping_name]["status"] != "Unchanged":
library.status[mapping_name]["deleted"] = True pre = f"{library.status[mapping_name]['status']} and "
library.status[mapping_name]["status"] = f"{pre}Updated {', '.join(details_list)}"
if builder.server_preroll is not None: if builder.server_preroll is not None:
library.set_server_preroll(builder.server_preroll) library.set_server_preroll(builder.server_preroll)
logger.info("") logger.info("")
logger.info(f"Plex Server Movie pre-roll video updated to {builder.server_preroll}") logger.info(f"Plex Server Movie pre-roll video updated to {builder.server_preroll}")
if (builder.item_details or builder.custom_sort) and run_item_details and builder.builders: if valid and run_item_details and builder.builders and (builder.item_details or builder.custom_sort):
try: try:
builder.load_collection_items() builder.load_collection_items()
except Failed: except Failed:
@ -578,17 +582,13 @@ def run_collection(config, library, metadata, requested_collections):
if builder.run_again and (len(builder.run_again_movies) > 0 or len(builder.run_again_shows) > 0): if builder.run_again and (len(builder.run_again_movies) > 0 or len(builder.run_again_shows) > 0):
library.run_again.append(builder) library.run_again.append(builder)
if library.status[mapping_name]["created"]:
library.status[mapping_name]["status"] = "Created"
elif library.status[mapping_name]["deleted"]:
library.status[mapping_name]["status"] = "Deleted"
elif library.status[mapping_name]["modified"]:
library.status[mapping_name]["status"] = "Modified"
else:
library.status[mapping_name]["status"] = "Unchanged"
except NotScheduled as e: except NotScheduled as e:
logger.info(e) logger.info(e)
library.status[mapping_name]["status"] = "Not Scheduled" if str(e).endswith("and was deleted"):
library.stats["deleted"] += 1
library.status[mapping_name]["status"] = "Deleted Not Scheduled"
else:
library.status[mapping_name]["status"] = "Not Scheduled"
except Failed as e: except Failed as e:
library.notify(e, collection=mapping_name) library.notify(e, collection=mapping_name)
logger.stacktrace() logger.stacktrace()
@ -601,8 +601,10 @@ def run_collection(config, library, metadata, requested_collections):
logger.error(f"Unknown Error: {e}") logger.error(f"Unknown Error: {e}")
library.status[mapping_name]["status"] = "Unknown Error" library.status[mapping_name]["status"] = "Unknown Error"
library.status[mapping_name]["errors"].append(e) library.status[mapping_name]["errors"].append(e)
collection_run_time = str(datetime.now() - collection_start).split('.')[0]
library.status[mapping_name]["run_time"] = collection_run_time
logger.info("") logger.info("")
logger.separator(f"Finished {mapping_name} Collection\nCollection Run Time: {str(datetime.now() - collection_start).split('.')[0]}") logger.separator(f"Finished {mapping_name} Collection\nCollection Run Time: {collection_run_time}")
logger.remove_collection_handler(library.mapping_name, collection_log_name) logger.remove_collection_handler(library.mapping_name, collection_log_name)
def run_playlists(config): def run_playlists(config):
@ -634,7 +636,7 @@ def run_playlists(config):
else: else:
playlist_log_name, output_str = util.validate_filename(mapping_name) playlist_log_name, output_str = util.validate_filename(mapping_name)
logger.add_playlist_handler(playlist_log_name) logger.add_playlist_handler(playlist_log_name)
status[mapping_name] = {"status": "", "errors": [], "created": False, "modified": False, "deleted": False, "added": 0, "unchanged": 0, "removed": 0, "radarr": 0, "sonarr": 0} status[mapping_name] = {"status": "Unchanged", "errors": [], "added": 0, "unchanged": 0, "removed": 0, "radarr": 0, "sonarr": 0}
server_name = None server_name = None
library_names = None library_names = None
try: try:
@ -677,7 +679,7 @@ def run_playlists(config):
for filter_key, filter_value in builder.tmdb_filters: for filter_key, filter_value in builder.tmdb_filters:
logger.info(f"Playlist Filter {filter_key}: {filter_value}") logger.info(f"Playlist Filter {filter_key}: {filter_value}")
if len(builder.added_items) >= builder.minimum: if len(builder.added_items) > 0 and len(builder.added_items) + builder.beginning_count >= builder.minimum:
items_added, items_unchanged = builder.add_to_collection() items_added, items_unchanged = builder.add_to_collection()
stats["added"] += items_added stats["added"] += items_added
status[mapping_name]["added"] += items_added status[mapping_name]["added"] += items_added
@ -691,11 +693,14 @@ def run_playlists(config):
elif len(builder.added_items) < builder.minimum: elif len(builder.added_items) < builder.minimum:
logger.info("") logger.info("")
logger.info(f"Playlist Minimum: {builder.minimum} not met for {mapping_name} Playlist") logger.info(f"Playlist Minimum: {builder.minimum} not met for {mapping_name} Playlist")
delete_status = f"Minimum {builder.minimum} Not Met"
valid = False valid = False
if builder.details["delete_below_minimum"] and builder.obj: if builder.details["delete_below_minimum"] and builder.obj:
logger.info("") logger.info("")
logger.info(builder.delete()) logger.info(builder.delete())
builder.deleted = True stats["deleted"] += 1
delete_status = f"Deleted; {delete_status}"
status[mapping_name]["status"] = delete_status
if builder.do_missing and (len(builder.missing_movies) > 0 or len(builder.missing_shows) > 0): if builder.do_missing and (len(builder.missing_movies) > 0 or len(builder.missing_shows) > 0):
radarr_add, sonarr_add = builder.run_missing() radarr_add, sonarr_add = builder.run_missing()
@ -705,25 +710,27 @@ def run_playlists(config):
status[mapping_name]["sonarr"] += sonarr_add status[mapping_name]["sonarr"] += sonarr_add
run_item_details = True run_item_details = True
try: if valid and builder.builders:
builder.load_collection() try:
if builder.created: builder.load_collection()
stats["created"] += 1 if builder.created:
status[mapping_name]["created"] = True stats["created"] += 1
elif items_added > 0 or items_removed > 0: status[mapping_name]["status"] = "Created"
stats["modified"] += 1 elif items_added > 0 or items_removed > 0:
status[mapping_name]["modified"] = True stats["modified"] += 1
except Failed: status[mapping_name]["status"] = "Modified"
logger.stacktrace() except Failed:
run_item_details = False logger.stacktrace()
logger.info("") run_item_details = False
logger.separator("No Playlist to Update", space=False, border=False) logger.info("")
else: logger.separator("No Playlist to Update", space=False, border=False)
builder.update_details() else:
details_list = builder.update_details()
if builder.deleted: if details_list:
stats["deleted"] += 1 pre = ""
status[mapping_name]["deleted"] = True if status[mapping_name]["status"] != "Unchanged":
pre = f"{status[mapping_name]['status']} and "
status[mapping_name]["status"] = f"{pre}Updated {', '.join(details_list)}"
if valid and run_item_details and builder.builders and (builder.item_details or builder.custom_sort): if valid and run_item_details and builder.builders and (builder.item_details or builder.custom_sort):
try: try:
@ -744,7 +751,11 @@ def run_playlists(config):
except NotScheduled as e: except NotScheduled as e:
logger.info(e) logger.info(e)
status[mapping_name]["status"] = "Not Scheduled" if str(e).endswith("and was deleted"):
stats["deleted"] += 1
status[mapping_name]["status"] = "Deleted Not Scheduled"
else:
status[mapping_name]["status"] = "Not Scheduled"
except Failed as e: except Failed as e:
config.notify(e, server=server_name, library=library_names, playlist=mapping_name) config.notify(e, server=server_name, library=library_names, playlist=mapping_name)
logger.stacktrace() logger.stacktrace()
@ -758,7 +769,10 @@ def run_playlists(config):
status[mapping_name]["status"] = "Unknown Error" status[mapping_name]["status"] = "Unknown Error"
status[mapping_name]["errors"].append(e) status[mapping_name]["errors"].append(e)
logger.info("") logger.info("")
logger.separator(f"Finished {mapping_name} Playlist\nPlaylist Run Time: {str(datetime.now() - playlist_start).split('.')[0]}") playlist_run_time = str(datetime.now() - playlist_start).split('.')[0]
status[mapping_name]["run_time"] = playlist_run_time
logger.info("")
logger.separator(f"Finished {mapping_name} Playlist\nPlaylist Run Time: {playlist_run_time}")
logger.remove_playlist_handler(playlist_log_name) logger.remove_playlist_handler(playlist_log_name)
return status, stats return status, stats