updated print spacing

pull/282/head
meisnate12 4 years ago
parent d782ff2beb
commit 398b07742b

@ -1369,7 +1369,6 @@ class CollectionBuilder:
name, collection_items = self.library.get_collection_name_and_items(self.obj if self.obj else self.name, self.smart_label_collection) name, collection_items = self.library.get_collection_name_and_items(self.obj if self.obj else self.name, self.smart_label_collection)
total = len(self.rating_keys) total = len(self.rating_keys)
max_length = len(str(total)) max_length = len(str(total))
length = 0
for i, item in enumerate(self.rating_keys, 1): for i, item in enumerate(self.rating_keys, 1):
try: try:
current = self.library.fetchItem(item.ratingKey if isinstance(item, (Movie, Show)) else int(item)) current = self.library.fetchItem(item.ratingKey if isinstance(item, (Movie, Show)) else int(item))
@ -1380,7 +1379,7 @@ class CollectionBuilder:
continue continue
match = True match = True
if self.filters: if self.filters:
length = util.print_return(length, f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}") util.print_return(f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}")
for filter_method, filter_data in self.filters: for filter_method, filter_data in self.filters:
modifier = filter_method[-4:] modifier = filter_method[-4:]
method = filter_method[:-4] if modifier in [".not", ".lte", ".gte"] else filter_method method = filter_method[:-4] if modifier in [".not", ".lte", ".gte"] else filter_method
@ -1474,9 +1473,9 @@ class CollectionBuilder:
or (list(set(filter_data) & set(attrs)) and modifier == ".not"): or (list(set(filter_data) & set(attrs)) and modifier == ".not"):
match = False match = False
break break
length = util.print_return(length, f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}") util.print_return(f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}")
if match: if match:
logger.info(util.adjust_space(length, f"{name} Collection | {'=' if current in collection_items else '+'} | {current.title}")) logger.info(util.adjust_space(f"{name} Collection | {'=' if current in collection_items else '+'} | {current.title}"))
if current in collection_items: if current in collection_items:
self.plex_map[current.ratingKey] = None self.plex_map[current.ratingKey] = None
elif self.smart_label_collection: elif self.smart_label_collection:
@ -1486,7 +1485,7 @@ class CollectionBuilder:
elif self.details["show_filtered"] is True: elif self.details["show_filtered"] is True:
logger.info(f"{name} Collection | X | {current.title}") logger.info(f"{name} Collection | X | {current.title}")
media_type = f"{'Movie' if self.library.is_movie else 'Show'}{'s' if total > 1 else ''}" media_type = f"{'Movie' if self.library.is_movie else 'Show'}{'s' if total > 1 else ''}"
util.print_end(length) util.print_end()
logger.info("") logger.info("")
logger.info(f"{total} {media_type} Processed") logger.info(f"{total} {media_type} Processed")

@ -248,7 +248,7 @@ class Convert:
self.config.Cache.update_imdb_to_tvdb_map(expired, imdb_id, tvdb_id) self.config.Cache.update_imdb_to_tvdb_map(expired, imdb_id, tvdb_id)
return tvdb_id return tvdb_id
def get_id(self, item, library, length): def get_id(self, item, library):
expired = None expired = None
if self.config.Cache: if self.config.Cache:
cache_id, media_type, expired = self.config.Cache.query_guid_map(item.guid) cache_id, media_type, expired = self.config.Cache.query_guid_map(item.guid)
@ -344,7 +344,7 @@ class Convert:
def update_cache(cache_ids, id_type, guid_type): def update_cache(cache_ids, id_type, guid_type):
if self.config.Cache: if self.config.Cache:
cache_ids = util.compile_list(cache_ids) cache_ids = util.compile_list(cache_ids)
logger.info(util.adjust_space(length, f" Cache | {'^' if expired else '+'} | {item.guid:<46} | {id_type} ID: {cache_ids:<6} | {item.title}")) logger.info(util.adjust_space(f" Cache | {'^' if expired else '+'} | {item.guid:<46} | {id_type} ID: {cache_ids:<6} | {item.title}"))
self.config.Cache.update_guid_map(guid_type, item.guid, cache_ids, expired) self.config.Cache.update_guid_map(guid_type, item.guid, cache_ids, expired)
if tmdb_id and library.is_movie: if tmdb_id and library.is_movie:
@ -359,8 +359,8 @@ class Convert:
else: else:
raise Failed(f"No ID to convert") raise Failed(f"No ID to convert")
except Failed as e: except Failed as e:
logger.info(util.adjust_space(length, f"Mapping Error | {item.guid:<46} | {e} for {item.title}")) logger.info(util.adjust_space(f"Mapping Error | {item.guid:<46} | {e} for {item.title}"))
except BadRequest: except BadRequest:
util.print_stacktrace() util.print_stacktrace()
logger.info(util.adjust_space(length, f"Mapping Error | {item.guid:<46} | Bad Request for {item.title}")) logger.info(util.adjust_space(f"Mapping Error | {item.guid:<46} | Bad Request for {item.title}"))
return None, None return None, None

@ -62,7 +62,6 @@ class IMDbAPI:
current_url = self._fix_url(imdb_url) current_url = self._fix_url(imdb_url)
total, item_count = self._total(current_url, language) total, item_count = self._total(current_url, language)
header = {"Accept-Language": language} header = {"Accept-Language": language}
length = 0
imdb_ids = [] imdb_ids = []
if "&start=" in current_url: current_url = re.sub("&start=\\d+", "", current_url) if "&start=" in current_url: current_url = re.sub("&start=\\d+", "", current_url)
if "&count=" in current_url: current_url = re.sub("&count=\\d+", "", current_url) if "&count=" in current_url: current_url = re.sub("&count=\\d+", "", current_url)
@ -74,7 +73,7 @@ class IMDbAPI:
num_of_pages = math.ceil(int(limit) / item_count) num_of_pages = math.ceil(int(limit) / item_count)
for i in range(1, num_of_pages + 1): for i in range(1, num_of_pages + 1):
start_num = (i - 1) * item_count + 1 start_num = (i - 1) * item_count + 1
length = util.print_return(length, f"Parsing Page {i}/{num_of_pages} {start_num}-{limit if i == num_of_pages else i * item_count}") util.print_return(f"Parsing Page {i}/{num_of_pages} {start_num}-{limit if i == num_of_pages else i * item_count}")
if imdb_url.startswith(self.urls["keyword"]): if imdb_url.startswith(self.urls["keyword"]):
response = self._request(f"{current_url}&page={i}", header) response = self._request(f"{current_url}&page={i}", header)
else: else:
@ -83,7 +82,7 @@ class IMDbAPI:
imdb_ids.extend(response.xpath("//div[contains(@class, 'lister-item-image')]//a/img//@data-tconst")[:remainder]) imdb_ids.extend(response.xpath("//div[contains(@class, 'lister-item-image')]//a/img//@data-tconst")[:remainder])
else: else:
imdb_ids.extend(response.xpath("//div[contains(@class, 'lister-item-image')]//a/img//@data-tconst")) imdb_ids.extend(response.xpath("//div[contains(@class, 'lister-item-image')]//a/img//@data-tconst"))
util.print_end(length) util.print_end()
if imdb_ids: return imdb_ids if imdb_ids: return imdb_ids
else: raise Failed(f"IMDb Error: No IMDb IDs Found at {imdb_url}") else: raise Failed(f"IMDb Error: No IMDb IDs Found at {imdb_url}")
@ -111,11 +110,10 @@ class IMDbAPI:
logger.info(f"Processing {pretty}: {status}{data['url']}") logger.info(f"Processing {pretty}: {status}{data['url']}")
imdb_ids = self._ids_from_url(data["url"], language, data["limit"]) imdb_ids = self._ids_from_url(data["url"], language, data["limit"])
total_ids = len(imdb_ids) total_ids = len(imdb_ids)
length = 0
for i, imdb in enumerate(imdb_ids, 1): for i, imdb in enumerate(imdb_ids, 1):
length = util.print_return(length, f"Converting IMDb ID {i}/{total_ids}") util.print_return(f"Converting IMDb ID {i}/{total_ids}")
run_convert(imdb) run_convert(imdb)
logger.info(util.adjust_space(length, f"Processed {total_ids} IMDb IDs")) logger.info(util.adjust_space(f"Processed {total_ids} IMDb IDs"))
else: else:
raise Failed(f"IMDb Error: Method {method} not supported") raise Failed(f"IMDb Error: Method {method} not supported")
logger.debug("") logger.debug("")

@ -49,10 +49,9 @@ class LetterboxdAPI:
items = self._parse_list(data, language) items = self._parse_list(data, language)
total_items = len(items) total_items = len(items)
if total_items > 0: if total_items > 0:
length = 0
for i, item in enumerate(items, 1): for i, item in enumerate(items, 1):
letterboxd_id, slug = item letterboxd_id, slug = item
length = util.print_return(length, f"Finding TMDb ID {i}/{total_items}") util.print_return(f"Finding TMDb ID {i}/{total_items}")
tmdb_id = None tmdb_id = None
expired = None expired = None
if self.config.Cache: if self.config.Cache:
@ -66,7 +65,7 @@ class LetterboxdAPI:
if self.config.Cache: if self.config.Cache:
self.config.Cache.update_letterboxd_map(expired, letterboxd_id, tmdb_id) self.config.Cache.update_letterboxd_map(expired, letterboxd_id, tmdb_id)
movie_ids.append(tmdb_id) movie_ids.append(tmdb_id)
logger.info(util.adjust_space(length, f"Processed {total_items} TMDb IDs")) logger.info(util.adjust_space(f"Processed {total_items} TMDb IDs"))
else: else:
logger.error(f"Letterboxd Error: No List Items found in {data}") logger.error(f"Letterboxd Error: No List Items found in {data}")
logger.debug("") logger.debug("")

@ -612,9 +612,8 @@ class PlexAPI:
logger.info(col.title) logger.info(col.title)
collection_indexes = [c.index for c in good_collections] collection_indexes = [c.index for c in good_collections]
all_items = self.get_all() all_items = self.get_all()
length = 0
for i, item in enumerate(all_items, 1): for i, item in enumerate(all_items, 1):
length = util.print_return(length, f"Processing: {i}/{len(all_items)} {item.title}") util.print_return(f"Processing: {i}/{len(all_items)} {item.title}")
add_item = True add_item = True
self.query(item.reload) self.query(item.reload)
for collection in item.collections: for collection in item.collections:
@ -623,7 +622,7 @@ class PlexAPI:
break break
if add_item: if add_item:
items.append(item) items.append(item)
logger.info(util.adjust_space(length, f"Processed {len(all_items)} {'Movies' if self.is_movie else 'Shows'}")) logger.info(util.adjust_space(f"Processed {len(all_items)} {'Movies' if self.is_movie else 'Shows'}"))
else: else:
raise Failed(f"Plex Error: Method {method} not supported") raise Failed(f"Plex Error: Method {method} not supported")
if len(items) > 0: if len(items) > 0:

@ -26,6 +26,7 @@ def retry_if_not_plex(exception):
separating_character = "=" separating_character = "="
screen_width = 100 screen_width = 100
spacing = 0
days_alias = { days_alias = {
"monday": 0, "mon": 0, "m": 0, "monday": 0, "mon": 0, "m": 0,
@ -155,13 +156,6 @@ pretty_ids = {
def tab_new_lines(data): def tab_new_lines(data):
return str(data).replace("\n", "\n|\t ") if "\n" in str(data) else str(data) return str(data).replace("\n", "\n|\t ") if "\n" in str(data) else str(data)
def adjust_space(old_length, display_title):
display_title = str(display_title)
space_length = old_length - len(display_title)
if space_length > 0:
display_title += " " * space_length
return display_title
def make_ordinal(n): def make_ordinal(n):
n = int(n) n = int(n)
suffix = ["th", "st", "nd", "rd", "th"][min(n % 10, 4)] suffix = ["th", "st", "nd", "rd", "th"][min(n % 10, 4)]
@ -391,12 +385,22 @@ def apply_formatter(handler, border=True):
text = f"[%(asctime)s] %(filename)-27s %(levelname)-10s {text}" text = f"[%(asctime)s] %(filename)-27s %(levelname)-10s {text}"
handler.setFormatter(logging.Formatter(text)) handler.setFormatter(logging.Formatter(text))
def print_return(length, text): def adjust_space(display_title):
print(adjust_space(length, f"| {text}"), end="\r") display_title = str(display_title)
return len(text) + 2 space_length = spacing - len(display_title)
if space_length > 0:
display_title += " " * space_length
return display_title
def print_return(text):
print(adjust_space(f"| {text}"), end="\r")
global spacing
spacing = len(text) + 2
def print_end(length): def print_end():
print(adjust_space(length, " "), end="\r") print(adjust_space(" "), end="\r")
global spacing
spacing = 0
def validate_filename(filename): def validate_filename(filename):
if is_valid_filename(filename): if is_valid_filename(filename):

@ -205,12 +205,11 @@ def update_libraries(config):
logger.info("") logger.info("")
util.separator("Run Again") util.separator("Run Again")
logger.info("") logger.info("")
length = 0
for x in range(1, config.general["run_again_delay"] + 1): for x in range(1, config.general["run_again_delay"] + 1):
length = util.print_return(length, f"Waiting to run again in {config.general['run_again_delay'] - x + 1} minutes") util.print_return(f"Waiting to run again in {config.general['run_again_delay'] - x + 1} minutes")
for y in range(60): for y in range(60):
time.sleep(1) time.sleep(1)
util.print_end(length) util.print_end()
for library in config.libraries: for library in config.libraries:
if library.run_again: if library.run_again:
col_file_logger = os.path.join(default_dir, "logs", library.mapping_name, f"library.log") col_file_logger = os.path.join(default_dir, "logs", library.mapping_name, f"library.log")
@ -248,15 +247,14 @@ def update_libraries(config):
def map_guids(config, library): def map_guids(config, library):
movie_map = {} movie_map = {}
show_map = {} show_map = {}
length = 0
logger.info(f"Loading {'Movie' if library.is_movie else 'Show'} Library: {library.name}") logger.info(f"Loading {'Movie' if library.is_movie else 'Show'} Library: {library.name}")
logger.info("") logger.info("")
items = library.Plex.all() items = library.Plex.all()
logger.info(f"Mapping {'Movie' if library.is_movie else 'Show'} Library: {library.name}") logger.info(f"Mapping {'Movie' if library.is_movie else 'Show'} Library: {library.name}")
logger.info("") logger.info("")
for i, item in enumerate(items, 1): for i, item in enumerate(items, 1):
length = util.print_return(length, f"Processing: {i}/{len(items)} {item.title}") util.print_return(f"Processing: {i}/{len(items)} {item.title}")
id_type, main_id = config.Convert.get_id(item, library, length) id_type, main_id = config.Convert.get_id(item, library)
if main_id: if main_id:
if not isinstance(main_id, list): if not isinstance(main_id, list):
main_id = [main_id] main_id = [main_id]
@ -269,11 +267,10 @@ def map_guids(config, library):
if m in show_map: show_map[m].append(item.ratingKey) if m in show_map: show_map[m].append(item.ratingKey)
else: show_map[m] = [item.ratingKey] else: show_map[m] = [item.ratingKey]
logger.info("") logger.info("")
logger.info(util.adjust_space(length, f"Processed {len(items)} {'Movies' if library.is_movie else 'Shows'}")) logger.info(util.adjust_space(f"Processed {len(items)} {'Movies' if library.is_movie else 'Shows'}"))
return movie_map, show_map return movie_map, show_map
def mass_metadata(config, library, movie_map, show_map): def mass_metadata(config, library, movie_map, show_map):
length = 0
logger.info("") logger.info("")
util.separator(f"Mass Editing {'Movie' if library.is_movie else 'Show'} Library: {library.name}") util.separator(f"Mass Editing {'Movie' if library.is_movie else 'Show'} Library: {library.name}")
logger.info("") logger.info("")
@ -281,7 +278,7 @@ def mass_metadata(config, library, movie_map, show_map):
sonarr_adds = [] sonarr_adds = []
items = library.Plex.all() items = library.Plex.all()
for i, item in enumerate(items, 1): for i, item in enumerate(items, 1):
length = util.print_return(length, f"Processing: {i}/{len(items)} {item.title}") util.print_return(f"Processing: {i}/{len(items)} {item.title}")
tmdb_id = None tmdb_id = None
tvdb_id = None tvdb_id = None
imdb_id = None imdb_id = None
@ -316,9 +313,9 @@ def mass_metadata(config, library, movie_map, show_map):
try: try:
tmdb_item = config.TMDb.get_movie(tmdb_id) if library.is_movie else config.TMDb.get_show(tmdb_id) tmdb_item = config.TMDb.get_movie(tmdb_id) if library.is_movie else config.TMDb.get_show(tmdb_id)
except Failed as e: except Failed as e:
logger.info(util.adjust_space(length, str(e))) logger.info(util.adjust_space(str(e)))
else: else:
logger.info(util.adjust_space(length, f"{item.title[:25]:<25} | No TMDb ID for Guid: {item.guid}")) logger.info(util.adjust_space(f"{item.title[:25]:<25} | No TMDb ID for Guid: {item.guid}"))
omdb_item = None omdb_item = None
if library.mass_genre_update in ["omdb", "imdb"] or library.mass_audience_rating_update in ["omdb", "imdb"] or library.mass_critic_rating_update in ["omdb", "imdb"]: if library.mass_genre_update in ["omdb", "imdb"] or library.mass_audience_rating_update in ["omdb", "imdb"] or library.mass_critic_rating_update in ["omdb", "imdb"]:
@ -331,9 +328,9 @@ def mass_metadata(config, library, movie_map, show_map):
try: try:
omdb_item = config.OMDb.get_omdb(imdb_id) omdb_item = config.OMDb.get_omdb(imdb_id)
except Failed as e: except Failed as e:
logger.info(util.adjust_space(length, str(e))) logger.info(util.adjust_space(str(e)))
else: else:
logger.info(util.adjust_space(length, f"{item.title[:25]:<25} | No IMDb ID for Guid: {item.guid}")) logger.info(util.adjust_space(f"{item.title[:25]:<25} | No IMDb ID for Guid: {item.guid}"))
if not tmdb_item and not omdb_item: if not tmdb_item and not omdb_item:
continue continue
@ -355,7 +352,7 @@ def mass_metadata(config, library, movie_map, show_map):
library.query_data(item.addGenre, genre) library.query_data(item.addGenre, genre)
display_str += f"{', ' if len(display_str) > 0 else ''}+{genre}" display_str += f"{', ' if len(display_str) > 0 else ''}+{genre}"
if len(display_str) > 0: if len(display_str) > 0:
logger.info(util.adjust_space(length, f"{item.title[:25]:<25} | Genres | {display_str}")) logger.info(util.adjust_space(f"{item.title[:25]:<25} | Genres | {display_str}"))
except Failed: except Failed:
pass pass
if library.mass_audience_rating_update or library.mass_critic_rating_update: if library.mass_audience_rating_update or library.mass_critic_rating_update:
@ -367,14 +364,14 @@ def mass_metadata(config, library, movie_map, show_map):
else: else:
raise Failed raise Failed
if new_rating is None: if new_rating is None:
logger.info(util.adjust_space(length, f"{item.title[:25]:<25} | No Rating Found")) logger.info(util.adjust_space(f"{item.title[:25]:<25} | No Rating Found"))
else: else:
if library.mass_audience_rating_update and str(item.audienceRating) != str(new_rating): if library.mass_audience_rating_update and str(item.audienceRating) != str(new_rating):
library.edit_query(item, {"audienceRating.value": new_rating, "audienceRating.locked": 1}) library.edit_query(item, {"audienceRating.value": new_rating, "audienceRating.locked": 1})
logger.info(util.adjust_space(length, f"{item.title[:25]:<25} | Audience Rating | {new_rating}")) logger.info(util.adjust_space(f"{item.title[:25]:<25} | Audience Rating | {new_rating}"))
if library.mass_critic_rating_update and str(item.rating) != str(new_rating): if library.mass_critic_rating_update and str(item.rating) != str(new_rating):
library.edit_query(item, {"rating.value": new_rating, "rating.locked": 1}) library.edit_query(item, {"rating.value": new_rating, "rating.locked": 1})
logger.info(util.adjust_space(length, f"{item.title[:25]:<25} | Critic Rating | {new_rating}")) logger.info(util.adjust_space(f"{item.title[:25]:<25} | Critic Rating | {new_rating}"))
except Failed: except Failed:
pass pass
@ -497,7 +494,6 @@ try:
if run or test or collections or libraries or resume: if run or test or collections or libraries or resume:
start(config_file, is_test=test, requested_collections=collections, requested_libraries=libraries, resume_from=resume) start(config_file, is_test=test, requested_collections=collections, requested_libraries=libraries, resume_from=resume)
else: else:
time_length = 0
for time_to_run in times_to_run: for time_to_run in times_to_run:
schedule.every().day.at(time_to_run).do(start, config_file, time_scheduled=time_to_run) schedule.every().day.at(time_to_run).do(start, config_file, time_scheduled=time_to_run)
while True: while True:
@ -517,7 +513,7 @@ try:
minutes = int((seconds % 3600) // 60) minutes = int((seconds % 3600) // 60)
time_str = f"{hours} Hour{'s' if hours > 1 else ''} and " if hours > 0 else "" time_str = f"{hours} Hour{'s' if hours > 1 else ''} and " if hours > 0 else ""
time_str += f"{minutes} Minute{'s' if minutes > 1 else ''}" time_str += f"{minutes} Minute{'s' if minutes > 1 else ''}"
time_length = util.print_return(time_length, f"Current Time: {current} | {time_str} until the next run at {og_time_str} {times_to_run}") util.print_return(f"Current Time: {current} | {time_str} until the next run at {og_time_str} {times_to_run}")
time.sleep(60) time.sleep(60)
except KeyboardInterrupt: except KeyboardInterrupt:
util.separator("Exiting Plex Meta Manager") util.separator("Exiting Plex Meta Manager")

Loading…
Cancel
Save