def display_summary(options): """ Display series summary. :param options: argparse options from the CLI """ formatting = ' %-30s %-10s %-10s %-20s' console(formatting % ('Name', 'Latest', 'Age', 'Downloaded')) console('-' * 79) session = Session() try: query = (session.query(Series).outerjoin(Series.episodes).outerjoin(Episode.releases). outerjoin(Series.in_tasks).group_by(Series.id)) if options.configured == 'configured': query = query.having(func.count(SeriesTask.id) >= 1) elif options.configured == 'unconfigured': query = query.having(func.count(SeriesTask.id) < 1) if options.premieres: query = (query.having(func.max(Episode.season) <= 1).having(func.max(Episode.number) <= 2). having(func.count(SeriesTask.id) < 1)).filter(Release.downloaded == True) if options.new: query = query.having(func.max(Episode.first_seen) > datetime.now() - timedelta(days=options.new)) if options.stale: query = query.having(func.max(Episode.first_seen) < datetime.now() - timedelta(days=options.stale)) for series in query.order_by(Series.name).yield_per(10): series_name = series.name if len(series_name) > 30: series_name = series_name[:27] + '...' new_ep = ' ' behind = 0 status = 'N/A' age = 'N/A' episode_id = 'N/A' latest = get_latest_release(series) if latest: if latest.first_seen > datetime.now() - timedelta(days=2): new_ep = '>' behind = new_eps_after(latest) status = get_latest_status(latest) age = latest.age episode_id = latest.identifier if behind: episode_id += ' +%s' % behind console(new_ep + formatting[1:] % (series_name, episode_id, age, status)) if behind >= 3: console(' ! Latest download is %d episodes behind, this may require ' 'manual intervention' % behind) console('-' * 79) console(' > = new episode ') console(' Use `flexget series show NAME` to get detailed information') finally: session.close()
def get_series_details(show): latest_ep = series.get_latest_release(show) begin_ep = show.begin if begin_ep: begin_ep_id = begin_ep.id begin_ep_identifier = begin_ep.identifier else: begin_ep_id = begin_ep_identifier = None begin = { 'episode_id': begin_ep_id, 'episode_identifier': begin_ep_identifier } if latest_ep: latest_ep_id = latest_ep.id latest_ep_identifier = latest_ep.identifier latest_ep_age = latest_ep.age new_eps_after_latest_ep = series.new_eps_after(latest_ep) release = get_release_details( sorted(latest_ep.downloaded_releases, key=lambda release: release.first_seen if release.downloaded else None, reverse=True)[0]) else: latest_ep_id = latest_ep_identifier = latest_ep_age = new_eps_after_latest_ep = release = None latest = { 'episode_id': latest_ep_id, 'episode_identifier': latest_ep_identifier, 'episode_age': latest_ep_age, 'number_of_episodes_behind': new_eps_after_latest_ep, 'last_downloaded_release': release } show_item = { 'show_id': show.id, 'show_name': show.name, 'alternate_names': [n.alt_name for n in show.alternate_names], 'begin_episode': begin, 'latest_downloaded_episode': latest, 'in_tasks': [_show.name for _show in show.in_tasks] } return show_item
def display_summary(options): """ Display series summary. :param options: argparse options from the CLI """ with Session() as session: kwargs = {'configured': options.configured, 'premieres': options.premieres, 'session': session} if options.new: kwargs['status'] = 'new' kwargs['days'] = options.new elif options.stale: kwargs['status'] = 'stale' kwargs['days'] = options.stale query = get_series_summary(**kwargs) if options.porcelain: formatting = '%-30s %s %-10s %s %-10s %s %-20s' console(formatting % ('Name', '|', 'Latest', '|', 'Age', '|', 'Downloaded')) else: formatting = ' %-30s %-10s %-10s %-20s' console('-' * 79) console(formatting % ('Name', 'Latest', 'Age', 'Downloaded')) console('-' * 79) for series in query.order_by(Series.name).yield_per(10): series_name = series.name if len(series_name) > 30: series_name = series_name[:27] + '...' new_ep = ' ' behind = 0 status = 'N/A' age = 'N/A' episode_id = 'N/A' latest = get_latest_release(series) if latest: if latest.first_seen > datetime.now() - timedelta(days=2): if options.porcelain: pass else: new_ep = '>' behind = new_eps_after(latest) status = get_latest_status(latest) age = latest.age episode_id = latest.identifier if behind: episode_id += ' +%s' % behind if options.porcelain: console(formatting % (series_name, '|', episode_id, '|', age, '|', status)) else: console(new_ep + formatting[1:] % (series_name, episode_id, age, status)) if behind >= 3: console(' ! Latest download is %d episodes behind, this may require ' 'manual intervention' % behind) if options.porcelain: pass else: console('-' * 79) console(' > = new episode ') console(' Use `flexget series show NAME` to get detailed information')
def display_summary(options): """ Display series summary. :param options: argparse options from the CLI """ with Session() as session: kwargs = { 'configured': options.configured, 'premieres': options.premieres, 'session': session } if options.new: kwargs['status'] = 'new' kwargs['days'] = options.new elif options.stale: kwargs['status'] = 'stale' kwargs['days'] = options.stale query = get_series_summary(**kwargs) if options.porcelain: formatting = '%-30s %s %-10s %s %-10s %s %-20s' console(formatting % ('Name', '|', 'Latest', '|', 'Age', '|', 'Downloaded')) else: formatting = ' %-30s %-10s %-10s %-20s' console('-' * 79) console(formatting % ('Name', 'Latest', 'Age', 'Downloaded')) console('-' * 79) for series in query.order_by(Series.name).yield_per(10): series_name = series.name if len(series_name) > 30: series_name = series_name[:27] + '...' new_ep = ' ' behind = 0 status = 'N/A' age = 'N/A' episode_id = 'N/A' latest = get_latest_release(series) if latest: if latest.first_seen > datetime.now() - timedelta(days=2): if options.porcelain: pass else: new_ep = '>' behind = new_eps_after(latest) status = get_latest_status(latest) age = latest.age episode_id = latest.identifier if behind: episode_id += ' +%s' % behind if options.porcelain: console(formatting % (series_name, '|', episode_id, '|', age, '|', status)) else: console(new_ep + formatting[1:] % (series_name, episode_id, age, status)) if behind >= 3: console( ' ! Latest download is %d episodes behind, this may require ' 'manual intervention' % behind) if options.porcelain: pass else: console('-' * 79) console(' > = new episode ') console( ' Use `flexget series show NAME` to get detailed information')
def display_summary(options): """ Display series summary. :param options: argparse options from the CLI """ porcelain = options.table_type == 'porcelain' with Session() as session: kwargs = { 'configured': options.configured, 'premieres': options.premieres, 'session': session, 'sort_by': options.sort_by, 'descending': options.order } if options.new: kwargs['status'] = 'new' kwargs['days'] = options.new elif options.stale: kwargs['status'] = 'stale' kwargs['days'] = options.stale if options.sort_by == 'name': kwargs['sort_by'] = 'show_name' else: kwargs['sort_by'] = 'last_download_date' query = get_series_summary(**kwargs) header = ['Name', 'Latest', 'Age', 'Downloaded', 'Identified By'] for index, value in enumerate(header): if value.lower() == options.sort_by: header[index] = colorize(SORT_COLUMN_COLOR, value) footer = 'Use `flexget series show NAME` to get detailed information' table_data = [header] for series in query: name_column = series.name new_ep = False behind = 0 latest_release = '-' age_col = '-' episode_id = '-' latest = get_latest_release(series) identifier_type = series.identified_by if identifier_type == 'auto': identifier_type = colorize('yellow', 'auto') if latest: behind = new_eps_after(latest) latest_release = get_latest_status(latest) # colorize age age_col = latest.age if latest.age_timedelta is not None: if latest.age_timedelta < timedelta(days=1): age_col = colorize(NEW_EP_COLOR, latest.age) elif latest.age_timedelta < timedelta(days=3): age_col = colorize(FRESH_EP_COLOR, latest.age) elif latest.age_timedelta > timedelta(days=400): age_col = colorize(OLD_EP_COLOR, latest.age) episode_id = latest.identifier if not porcelain: if behind > 0: name_column += colorize(BEHIND_EP_COLOR, ' {} behind'.format(behind)) table_data.append([ name_column, episode_id, age_col, latest_release, identifier_type ]) table = TerminalTable(options.table_type, table_data, wrap_columns=[3], drop_columns=[4, 3, 2]) try: console(table.output) except TerminalTableError as e: console('ERROR: %s' % str(e)) return if not porcelain: console(footer)
def display_summary(options): """ Display series summary. :param options: argparse options from the CLI """ formatting = ' %-30s %-10s %-10s %-20s' console(formatting % ('Name', 'Latest', 'Age', 'Downloaded')) console('-' * 79) session = Session() try: query = (session.query(Series).outerjoin(Series.episodes).outerjoin( Episode.releases).outerjoin(Series.in_tasks).group_by(Series.id)) if options.configured == 'configured': query = query.having(func.count(SeriesTask.id) >= 1) elif options.configured == 'unconfigured': query = query.having(func.count(SeriesTask.id) < 1) if options.premieres: query = (query.having(func.max(Episode.season) <= 1).having( func.max(Episode.number) <= 2).having( func.count(SeriesTask.id) < 1)).filter( Release.downloaded == True) if options.new: query = query.having( func.max(Episode.first_seen) > datetime.now() - timedelta(days=options.new)) if options.stale: query = query.having( func.max(Episode.first_seen) < datetime.now() - timedelta(days=options.stale)) for series in query.order_by(Series.name).yield_per(10): series_name = series.name if len(series_name) > 30: series_name = series_name[:27] + '...' new_ep = ' ' behind = 0 status = 'N/A' age = 'N/A' episode_id = 'N/A' latest = get_latest_release(series) if latest: if latest.first_seen > datetime.now() - timedelta(days=2): new_ep = '>' behind = new_eps_after(latest) status = get_latest_status(latest) age = latest.age episode_id = latest.identifier if behind: episode_id += ' +%s' % behind console(new_ep + formatting[1:] % (series_name, episode_id, age, status)) if behind >= 3: console( ' ! Latest download is %d episodes behind, this may require ' 'manual intervention' % behind) console('-' * 79) console(' > = new episode ') console(' Use `flexget series show NAME` to get detailed information') finally: session.close()
def display_summary(options): """ Display series summary. :param options: argparse options from the CLI """ porcelain = options.table_type == 'porcelain' with Session() as session: kwargs = {'configured': options.configured, 'premieres': options.premieres, 'session': session, 'sort_by': options.sort_by, 'descending': options.order} if options.new: kwargs['status'] = 'new' kwargs['days'] = options.new elif options.stale: kwargs['status'] = 'stale' kwargs['days'] = options.stale if options.sort_by == 'name': kwargs['sort_by'] = 'show_name' else: kwargs['sort_by'] = 'last_download_date' query = get_series_summary(**kwargs) header = ['Name', 'Latest', 'Age', 'Downloaded', 'Identified By'] for index, value in enumerate(header): if value.lower() == options.sort_by: header[index] = colorize(SORT_COLUMN_COLOR, value) footer = 'Use `flexget series show NAME` to get detailed information' table_data = [header] for series in query: name_column = series.name new_ep = False behind = 0 latest_release = '-' age_col = '-' episode_id = '-' latest = get_latest_release(series) identifier_type = series.identified_by if identifier_type == 'auto': identifier_type = colorize('yellow', 'auto') if latest: behind = new_eps_after(latest) latest_release = get_latest_status(latest) # colorize age age_col = latest.age if latest.age_timedelta is not None: if latest.age_timedelta < timedelta(days=1): age_col = colorize(NEW_EP_COLOR, latest.age) elif latest.age_timedelta < timedelta(days=3): age_col = colorize(FRESH_EP_COLOR, latest.age) elif latest.age_timedelta > timedelta(days=400): age_col = colorize(OLD_EP_COLOR, latest.age) episode_id = latest.identifier if not porcelain: if behind > 0: name_column += colorize(BEHIND_EP_COLOR, ' {} behind'.format(behind)) table_data.append([name_column, episode_id, age_col, latest_release, identifier_type]) table = TerminalTable(options.table_type, table_data, wrap_columns=[3], drop_columns=[4, 3, 2]) try: console(table.output) except TerminalTableError as e: console('ERROR: %s' % str(e)) return if not porcelain: console(footer)