def display_details(name): """Display detailed series information, ie. series show NAME""" with Session() as session: name = normalize_series_name(name) # Sort by length of name, so that partial matches always show shortest matching title matches = shows_by_name(name, session=session) if not matches: console('ERROR: Unknown series `%s`' % name) return # Pick the best matching series series = matches[0] console('Showing results for `%s`.' % series.name) if len(matches) > 1: console('WARNING: Multiple series match to `%s`.' % name) console('Be more specific to see the results of other matches:') for s in matches[1:]: console(' - %s' % s.name) console(' %-63s%-15s' % ('Identifier, Title', 'Quality')) console('-' * 79) episodes = show_episodes(series, session=session) for episode in episodes: if episode.identifier is None: console(' None <--- Broken!') else: console(' %s (%s) - %s' % (episode.identifier, episode.identified_by or 'N/A', episode.age)) for release in episode.releases: status = release.quality.name title = release.title if len(title) > 55: title = title[:55] + '...' if release.proper_count > 0: status += '-proper' if release.proper_count > 1: status += str(release.proper_count) if release.downloaded: console(' * %-60s%-15s' % (title, status)) else: console(' %-60s%-15s' % (title, status)) console('-' * 79) console(' * = downloaded') if not series.identified_by: console('') console(' Series plugin is still learning which episode numbering mode is ') console(' correct for this series (identified_by: auto).') console(' Few duplicate downloads can happen with different numbering schemes') console(' during this time.') else: console(' Series uses `%s` mode to identify episode numbering (identified_by).' % series.identified_by) console(' See option `identified_by` for more information.') if series.begin: console(' Begin episode for this series set to `%s`.' % series.begin.identifier)
def get(self, name, session): """ List of shows matching lookup name """ name = series.normalize_series_name(name) matches = series.shows_by_name(name, session=session) shows = [] for match in matches: shows.append(get_series_details(match)) return jsonify({'shows': shows, 'number_of_shows': len(shows)})
def get(self, name, session): """ List of shows matching lookup name """ name = series.normalize_series_name(name) matches = series.shows_by_name(name, session=session) shows = [] for match in matches: shows.append(get_series_details(match)) return jsonify({ 'shows': shows, 'number_of_shows': len(shows) })
def get(self, name, session): """ List of shows matching lookup name """ name = series.normalize_series_name(name) matches = series.shows_by_name(name, session=session) args = series_list_parser.parse_args() begin = args.get('begin') latest = args.get('latest') shows = [] for match in matches: shows.append(series_details(match, begin, latest)) return jsonify(shows)
def begin(manager, options): series_name = options.series_name ep_id = options.episode_id with Session() as session: series = shows_by_name(series_name, session)[0] if not series: console('Series not yet in database, adding `%s`' % series_name) series = Series() series.name = series_name session.add(series) try: set_series_begin(series, ep_id) except ValueError as e: console(e) else: console('Episodes for `%s` will be accepted starting with `%s`' % (series.name, ep_id)) session.commit() manager.config_changed()
def display_details(options): """Display detailed series information, ie. series show NAME""" name = options.series_name sort_by = options.sort_by or os.environ.get(ENV_SHOW_SORTBY_FIELD, 'age') if options.order is not None: reverse = True if options.order == 'desc' else False else: reverse = True if os.environ.get(ENV_SHOW_SORTBY_ORDER) == 'desc' else False with Session() as session: name = normalize_series_name(name) # Sort by length of name, so that partial matches always show shortest matching title matches = shows_by_name(name, session=session) if not matches: console(colorize(ERROR_COLOR, 'ERROR: Unknown series `%s`' % name)) return # Pick the best matching series series = matches[0] table_title = colorize('white', series.name) if len(matches) > 1: warning = (colorize('red', ' WARNING: ') + 'Multiple series match to `{}`.\n ' 'Be more specific to see the results of other matches:\n\n' ' {}'.format(name, ', '.join(s.name for s in matches[1:]))) if not options.table_type == 'porcelain': console(warning) header = ['Identifier', 'Last seen', 'Release titles', 'Release Quality', 'Proper'] table_data = [header] entities = get_all_entities(series, session=session, sort_by=sort_by, reverse=reverse) for entity in entities: if not entity.releases: continue if entity.identifier is None: identifier = colorize(ERROR_COLOR, 'MISSING') age = '' else: identifier = entity.identifier age = entity.age entity_data = [identifier, age] release_titles = [] release_qualities = [] release_propers = [] for release in entity.releases: title = release.title quality = release.quality.name if not release.downloaded: title = colorize(UNDOWNLOADED_RELEASE_COLOR, title) quality = quality else: title += ' *' title = colorize(DOWNLOADED_RELEASE_COLOR, title) quality = quality release_titles.append(title) release_qualities.append(quality) release_propers.append('Yes' if release.proper_count > 0 else '') entity_data.append('\n'.join(release_titles)) entity_data.append('\n'.join(release_qualities)) entity_data.append('\n'.join(release_propers)) table_data.append(entity_data) footer = ' %s \n' % (colorize(DOWNLOADED_RELEASE_COLOR, '* Downloaded')) if not series.identified_by: footer += ('\n Series plugin is still learning which episode numbering mode is \n' ' correct for this series (identified_by: auto).\n' ' Few duplicate downloads can happen with different numbering schemes\n' ' during this time.') else: footer += '\n `%s` uses `%s` mode to identify episode numbering.' % (series.name, series.identified_by) begin_text = 'option' if series.begin: footer += ' \n Begin for `%s` is set to `%s`.' % (series.name, series.begin.identifier) begin_text = 'and `begin` options' footer += ' \n See `identified_by` %s for more information.' % begin_text try: table = TerminalTable(options.table_type, table_data, table_title, drop_columns=[4, 3, 1]) console(table.output) except TerminalTableError as e: console('ERROR: %s' % str(e)) return if not options.table_type == 'porcelain': console(footer)
def display_details(options): """Display detailed series information, ie. series show NAME""" name = options.series_name with Session() as session: name = normalize_series_name(name) # Sort by length of name, so that partial matches always show shortest matching title matches = shows_by_name(name, session=session) if not matches: console(colorize(ERROR_COLOR, 'ERROR: Unknown series `%s`' % name)) return # Pick the best matching series series = matches[0] table_title = colorize('white', series.name) if len(matches) > 1: warning = ( colorize('red', ' WARNING: ') + 'Multiple series match to `{}`.\n ' 'Be more specific to see the results of other matches:\n\n' ' {}'.format(name, ', '.join(s.name for s in matches[1:]))) if not options.table_type == 'porcelain': console(warning) header = [ 'Entity ID', 'Latest age', 'Release titles', 'Release Quality', 'Proper' ] table_data = [header] entities = get_all_entities(series, session=session) for entity in entities: if entity.identifier is None: identifier = colorize(ERROR_COLOR, 'MISSING') age = '' else: identifier = entity.identifier age = entity.age entity_data = [identifier, age] release_titles = [] release_qualities = [] release_propers = [] for release in entity.releases: title = release.title quality = release.quality.name if not release.downloaded: title = colorize(UNDOWNLOADED_RELEASE_COLOR, title) quality = quality else: title += ' *' title = colorize(DOWNLOADED_RELEASE_COLOR, title) quality = quality release_titles.append(title) release_qualities.append(quality) release_propers.append( 'Yes' if release.proper_count > 0 else '') entity_data.append('\n'.join(release_titles)) entity_data.append('\n'.join(release_qualities)) entity_data.append('\n'.join(release_propers)) table_data.append(entity_data) footer = ' %s \n' % (colorize(DOWNLOADED_RELEASE_COLOR, '* Downloaded')) if not series.identified_by: footer += ( '\n Series plugin is still learning which episode numbering mode is \n' ' correct for this series (identified_by: auto).\n' ' Few duplicate downloads can happen with different numbering schemes\n' ' during this time.') else: footer += '\n Series uses `%s` mode to identify episode numbering (identified_by).' % series.identified_by footer += ' \n See option `identified_by` for more information.\n' if series.begin: footer += ' Begin episode for this series set to `%s`.' % series.begin.identifier try: table = TerminalTable(options.table_type, table_data, table_title, drop_columns=[4, 3, 1]) console(table.output) except TerminalTableError as e: console('ERROR: %s' % str(e)) return if not options.table_type == 'porcelain': console(footer)
def display_details(options): """Display detailed series information, ie. series show NAME""" name = options.series_name with Session() as session: name = normalize_series_name(name) # Sort by length of name, so that partial matches always show shortest matching title matches = shows_by_name(name, session=session) if not matches: console(colorize(ERROR_COLOR, 'ERROR: Unknown series `%s`' % name)) return # Pick the best matching series series = matches[0] table_title = colorize('white', series.name) if len(matches) > 1: warning = (colorize('red', ' WARNING: ') + 'Multiple series match to `{}`.\n ' 'Be more specific to see the results of other matches:\n\n' ' {}'.format(name, ', '.join(s.name for s in matches[1:]))) if not options.table_type == 'porcelain': console(warning) header = ['Episode ID', 'Latest age', 'Release titles', 'Release Quality', 'Proper'] table_data = [header] episodes = show_episodes(series, session=session) for episode in episodes: if episode.identifier is None: identifier = colorize(ERROR_COLOR, 'MISSING') age = '' else: identifier = episode.identifier age = episode.age ep_data = [identifier, age] release_titles = [] release_qualities = [] release_propers = [] for release in episode.releases: title = release.title quality = release.quality.name if not release.downloaded: title = colorize(UNDOWNLOADED_RELEASE_COLOR, title) quality = quality else: title = colorize(DOWNLOADED_RELEASE_COLOR, title) quality = quality release_titles.append(title) release_qualities.append(quality) release_propers.append('Yes' if release.proper_count > 0 else '') ep_data.append('\n'.join(release_titles)) ep_data.append('\n'.join(release_qualities)) ep_data.append('\n'.join(release_propers)) table_data.append(ep_data) footer = (' %s %s\n' % (colorize(DOWNLOADED_RELEASE_COLOR, 'Downloaded'), colorize(UNDOWNLOADED_RELEASE_COLOR, 'Un-downloaded'))) if not series.identified_by: footer += ('\n' ' Series plugin is still learning which episode numbering mode is \n' ' correct for this series (identified_by: auto).\n' ' Few duplicate downloads can happen with different numbering schemes\n' ' during this time.') else: footer += ' \n Series uses `%s` mode to identify episode numbering (identified_by).' % series.identified_by footer += ' \n See option `identified_by` for more information.\n' if series.begin: footer += ' Begin episode for this series set to `%s`.' % series.begin.identifier table = TerminalTable(options.table_type, table_data, table_title, drop_columns=[4, 3, 1]) try: console(table.output) except TerminalTableError as e: console('ERROR: %s' % str(e)) return if not options.table_type == 'porcelain': console(footer)