Beispiel #1
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()
        page = args['page']
        page_size = args['page_size']
        lookup = args.get('lookup')

        # Handle max size limit
        if page_size > 100:
            page_size = 100

        start = page_size * (page - 1)
        stop = start + page_size

        kwargs = {
            'configured': args.get('in_config'),
            'premieres': args.get('premieres'),
            'status': args.get('status'),
            'days': args.get('days'),
            'start': start,
            'stop': stop,
            'sort_by': args.get('sort_by'),
            'descending': args.get('descending'),
            'session': session

        }
        num_of_shows = series.get_series_summary(count=True, **kwargs)

        raw_series_list = series.get_series_summary(**kwargs)
        converted_series_list = [get_series_details(show) for show in raw_series_list]

        pages = int(ceil(num_of_shows / float(page_size)))

        if page > pages and pages != 0:
            return {'error': 'page %s does not exist' % page}, 404

        number_of_shows = min(page_size, num_of_shows)

        response = {
            'shows': converted_series_list,
            'page_size': number_of_shows,
            'total_number_of_shows': num_of_shows,
            'page': page,
            'total_number_of_pages': pages
        }

        if lookup:
            api_client = ApiClient()
            for endpoint in lookup:
                base_url = '/%s/series/' % endpoint
                for show in response['shows']:
                    pos = response['shows'].index(show)
                    response['shows'][pos].setdefault('lookup', {})
                    url = base_url + show['show_name'] + '/'
                    result = api_client.get_endpoint(url)
                    response['shows'][pos]['lookup'].update({endpoint: result})
        return jsonify(response)
Beispiel #2
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()
        page = args['page']
        page_size = args['page_size']
        lookup = args.get('lookup')

        # Handle max size limit
        if page_size > 100:
            page_size = 100

        start = page_size * (page - 1)
        stop = start + page_size

        kwargs = {
            'configured': args.get('in_config'),
            'premieres': args.get('premieres'),
            'status': args.get('status'),
            'days': args.get('days'),
            'start': start,
            'stop': stop,
            'sort_by': args.get('sort_by'),
            'descending': args.get('descending'),
            'session': session

        }
        num_of_shows = series.get_series_summary(count=True, **kwargs)

        raw_series_list = series.get_series_summary(**kwargs)
        converted_series_list = [get_series_details(show) for show in raw_series_list]

        pages = int(ceil(num_of_shows / float(page_size)))

        if page > pages and pages != 0:
            return {'error': 'page %s does not exist' % page}, 404

        number_of_shows = min(page_size, num_of_shows)

        response = {
            'shows': converted_series_list,
            'page_size': number_of_shows,
            'total_number_of_shows': num_of_shows,
            'page': page,
            'total_number_of_pages': pages
        }

        if lookup:
            api_client = ApiClient()
            for endpoint in lookup:
                base_url = '/%s/series/' % endpoint
                for show in response['shows']:
                    pos = response['shows'].index(show)
                    response['shows'][pos].setdefault('lookup', {})
                    url = base_url + show['show_name'] + '/'
                    result = api_client.get_endpoint(url)
                    response['shows'][pos]['lookup'].update({endpoint: result})
        return jsonify(response)
Beispiel #3
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()
        page = args['page']
        page_size = args['page_size']

        sort_by = args['sort_by']
        order = args['order']
        # In case the default 'desc' order was received
        if order == 'desc':
            order = True
        else:
            order = False

        kwargs = {
            'configured': args.get('in_config'),
            'premieres': args.get('premieres'),
            'status': args.get('status'),
            'days': args.get('days'),
            'page_size': args.get('page_size'),
            'page': args.get('page'),
            'session': session

        }
        num_of_shows = series.get_series_summary(count=True, **kwargs)

        raw_series_list = series.get_series_summary(**kwargs)
        converted_series_list = [get_series_details(show) for show in raw_series_list]
        sorted_show_list = []
        if sort_by == 'show_name':
            sorted_show_list = sorted(converted_series_list, key=lambda show: show['show_name'], reverse=order)
        elif sort_by == 'episodes_behind_latest':
            sorted_show_list = sorted(converted_series_list,
                                      key=lambda show: show['latest_downloaded_episode']['number_of_episodes_behind'],
                                      reverse=order)
        elif sort_by == 'last_download_date':
            sorted_show_list = sorted(converted_series_list,
                                      key=lambda show: show['latest_downloaded_episode']['last_downloaded_release'][
                                          'release_first_seen'] if show['latest_downloaded_episode'][
                                          'last_downloaded_release'] else datetime.datetime(1970, 1, 1),
                                      reverse=order)

        pages = int(ceil(num_of_shows / float(page_size)))

        if page > pages and pages != 0:
            return {'error': 'page %s does not exist' % page}, 400

        number_of_shows = min(page_size, num_of_shows)

        return jsonify({
            'shows': sorted_show_list,
            'number_of_shows': number_of_shows,
            'total_number_of_shows': num_of_shows,
            'page': page,
            'total_number_of_pages': pages
        })
Beispiel #4
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()
        page = args['page']
        max_results = args['max']

        sort_by = args['sort_by']
        order = args['order']
        # In case the default 'desc' order was received
        if order == 'desc':
            order = True
        else:
            order = False

        kwargs = {
            'configured': args.get('in_config'),
            'premieres': args.get('premieres'),
            'status': args.get('status'),
            'days': args.get('days'),
            'session': session

        }

        series_list = series.get_series_summary(**kwargs)
        series_list = series_list.order_by(series.Series.name)

        num_of_shows = series_list.count()
        pages = int(ceil(num_of_shows / float(max_results)))

        shows = sorted_show_list = []
        if page > pages and pages != 0:
            return {'error': 'page %s does not exist' % page}, 400

        start = (page - 1) * max_results
        finish = start + max_results
        if finish > num_of_shows:
            finish = num_of_shows

        for show_number in range(start, finish):
            shows.append(get_series_details(series_list[show_number]))

        if sort_by == 'show_name':
            sorted_show_list = sorted(shows, key=lambda show: show['show_name'], reverse=order)
        elif sort_by == 'episodes_behind_latest':
            sorted_show_list = sorted(shows,
                                      key=lambda show: show['latest_downloaded_episode']['number_of_episodes_behind'],
                                      reverse=order)
        elif sort_by == 'last_download_date':
            sorted_show_list = sorted(shows,
                                      key=lambda show: show['latest_downloaded_episode']['last_downloaded_release'][
                                          'release_first_seen'] if show['latest_downloaded_episode'][
                                          'last_downloaded_release'] else datetime.datetime(1970, 1, 1),
                                      reverse=order)

        return jsonify({
            'shows': sorted_show_list,
            'number_of_shows': num_of_shows,
            'page': page,
            'total_number_of_pages': pages
        })
Beispiel #5
0
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')
Beispiel #6
0
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')
Beispiel #7
0
def display_summary(options):
    """
    Display series summary.
    :param options: argparse options from the CLI
    """
    porcelain = options.table_type == 'porcelain'
    configured = options.configured or os.environ.get(ENV_LIST_CONFIGURED, 'configured')
    premieres = True if (os.environ.get(ENV_LIST_PREMIERES) == 'yes' or
                         options.premieres) else False
    sort_by = options.sort_by or os.environ.get(ENV_LIST_SORTBY_FIELD, 'name')
    if options.order is not None:
        descending = True if options.order == 'desc' else False
    else:
        descending = True if os.environ.get(ENV_LIST_SORTBY_ORDER) == 'desc' else False
    with Session() as session:
        kwargs = {'configured': configured,
                  'premieres': premieres,
                  'session': session,
                  'sort_by': sort_by,
                  'descending': descending}
        if sort_by == 'name':
            kwargs['sort_by'] = 'show_name'
        else:
            kwargs['sort_by'] = 'last_download_date'

        query = get_series_summary(**kwargs)
        header = ['Name', 'Begin', 'Last Encountered', 'Age', 'Downloaded', 'Identified By']
        for index, value in enumerate(header):
            if value.lower() == options.sort_by:
                header[index] = colorize(SORT_COLUMN_COLOR, value)

        table_data = [header]
        for series in query:
            name_column = series.name

            behind = (0,)
            begin = series.begin.identifier if series.begin else '-'
            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_entities_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] > 0:
                    name_column += colorize(BEHIND_EP_COLOR, ' {} {} behind'.format(behind[0], behind[1]))

            table_data.append([name_column, begin, episode_id, age_col, latest_release, identifier_type])
    try:
        table = TerminalTable(options.table_type, table_data, wrap_columns=[3], drop_columns=[4, 3, 2])
        console(table.output)
    except TerminalTableError as e:
        console('ERROR: %s' % str(e))
        return
    if not porcelain:
        if not query.count():
            console('Use `flexget series list all` to view all known series.')
        else:
            console('Use `flexget series show NAME` to get detailed information.')
Beispiel #8
0
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)

        table_data = [header]
        for series in query:
            name_column = series.name

            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_entities_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] > 0:
                    name_column += colorize(
                        BEHIND_EP_COLOR,
                        ' {} {} behind'.format(behind[0], behind[1]))

            table_data.append([
                name_column, episode_id, age_col, latest_release,
                identifier_type
            ])
    try:
        table = TerminalTable(options.table_type,
                              table_data,
                              wrap_columns=[3],
                              drop_columns=[4, 3, 2])
        console(table.output)
    except TerminalTableError as e:
        console('ERROR: %s' % str(e))
        return
    if not porcelain:
        if not query.count():
            console('Use `flexget series list all` to view all known series.')
        else:
            console(
                'Use `flexget series show NAME` to get detailed information.')
Beispiel #9
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()
        page = args['page']
        max_results = args['number_of_shows']

        sort_by = args['sort_by']
        order = args['order']
        # In case the default 'desc' order was received
        if order == 'desc':
            order = True
        else:
            order = False

        kwargs = {
            'configured': args.get('in_config'),
            'premieres': args.get('premieres'),
            'status': args.get('status'),
            'days': args.get('days'),
            'session': session
        }

        raw_series_list = series.get_series_summary(**kwargs)
        converted_series_list = [
            get_series_details(show) for show in raw_series_list
        ]
        sorted_show_list = []
        if sort_by == 'show_name':
            sorted_show_list = sorted(converted_series_list,
                                      key=lambda show: show['show_name'],
                                      reverse=order)
        elif sort_by == 'episodes_behind_latest':
            sorted_show_list = sorted(
                converted_series_list,
                key=lambda show: show['latest_downloaded_episode'][
                    'number_of_episodes_behind'],
                reverse=order)
        elif sort_by == 'last_download_date':
            sorted_show_list = sorted(
                converted_series_list,
                key=lambda show: show['latest_downloaded_episode'][
                    'last_downloaded_release']['release_first_seen']
                if show['latest_downloaded_episode']['last_downloaded_release']
                else datetime.datetime(1970, 1, 1),
                reverse=order)

        num_of_shows = len(sorted_show_list)
        pages = int(ceil(num_of_shows / float(max_results)))

        shows = []
        if page > pages and pages != 0:
            return {'error': 'page %s does not exist' % page}, 400

        start = (page - 1) * max_results
        finish = start + max_results
        if finish > num_of_shows:
            finish = num_of_shows

        for show_number in range(start, finish):
            shows.append(sorted_show_list[show_number])

        number_of_shows = min(max_results, num_of_shows)

        return jsonify({
            'shows': shows,
            'number_of_shows': number_of_shows,
            'total_number_of_shows': num_of_shows,
            'page': page,
            'total_number_of_pages': pages
        })
Beispiel #10
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()
        page = args['page']
        page_size = args['page_size']
        lookup = args.get('lookup')

        # Handle max size limit
        if page_size > 100:
            page_size = 100

        sort_by = args['sort_by']
        order = args['order']
        # In case the default 'desc' order was received
        if order == 'desc':
            order = True
        else:
            order = False

        start = page_size * (page - 1)
        stop = start + page_size

        kwargs = {
            'configured': args.get('in_config'),
            'premieres': args.get('premieres'),
            'status': args.get('status'),
            'days': args.get('days'),
            'start': start,
            'stop': stop,
            'session': session

        }
        num_of_shows = series.get_series_summary(count=True, **kwargs)

        raw_series_list = series.get_series_summary(**kwargs)
        converted_series_list = [get_series_details(show) for show in raw_series_list]
        sorted_show_list = []
        if sort_by == 'show_name':
            sorted_show_list = sorted(converted_series_list, key=lambda show: show['show_name'], reverse=order)
        elif sort_by == 'episodes_behind_latest':
            sorted_show_list = sorted(converted_series_list,
                                      key=lambda show: show['latest_downloaded_episode']['number_of_episodes_behind'],
                                      reverse=order)
        elif sort_by == 'last_download_date':
            sorted_show_list = sorted(converted_series_list,
                                      key=lambda show: show['latest_downloaded_episode']['last_downloaded_release'][
                                          'release_first_seen'] if show['latest_downloaded_episode'][
                                          'last_downloaded_release'] else datetime.datetime(1970, 1, 1),
                                      reverse=order)

        pages = int(ceil(num_of_shows / float(page_size)))

        if page > pages and pages != 0:
            return {'error': 'page %s does not exist' % page}, 404

        number_of_shows = min(page_size, num_of_shows)

        response = {
            'shows': sorted_show_list,
            'page_size': number_of_shows,
            'total_number_of_shows': num_of_shows,
            'page': page,
            'total_number_of_pages': pages
        }

        if lookup:
            api_client = ApiClient()
            for endpoint in lookup:
                base_url = '/%s/series/' % endpoint
                for show in response['shows']:
                    pos = response['shows'].index(show)
                    response['shows'][pos].setdefault('lookup', {})
                    url = base_url + show['show_name'] + '/'
                    result = api_client.get_endpoint(url)
                    response['shows'][pos]['lookup'].update({endpoint: result})
        return jsonify(response)
Beispiel #11
0
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)
Beispiel #12
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()

        # Filter params
        configured = args['in_config']
        premieres = args['premieres']
        status = args['status']
        days = args['days']

        # Pagination and sorting params
        page = args['page']
        per_page = args['per_page']
        sort_by = args['sort_by']
        sort_order = args['order']

        # Handle max size limit
        if per_page > 100:
            per_page = 100

        descending = bool(sort_order == 'desc')

        # Data params
        lookup = args.get('lookup')
        begin = args.get('begin')
        latest = args.get('latest')

        start = per_page * (page - 1)
        stop = start + per_page

        kwargs = {
            'configured': configured,
            'premieres': premieres,
            'status': status,
            'days': days,
            'start': start,
            'stop': stop,
            'sort_by': sort_by,
            'descending': descending,
            'session': session
        }

        total_items = series.get_series_summary(count=True, **kwargs)

        if not total_items:
            return jsonify([])

        series_list = []
        for s in series.get_series_summary(**kwargs):
            series_object = series_details(s, begin, latest)
            series_list.append(series_object)

        # Total number of pages
        total_pages = int(ceil(total_items / float(per_page)))

        if total_pages < page and total_pages != 0:
            raise NotFoundError('page %s does not exist' % page)

        # Actual results in page
        actual_size = min(per_page, len(series_list))

        # Do relevant lookups
        if lookup:
            api_client = APIClient()
            for endpoint in lookup:
                base_url = '/%s/series/' % endpoint
                for show in series_list:
                    pos = series_list.index(show)
                    series_list[pos].setdefault('lookup', {})
                    url = base_url + show['name'] + '/'
                    result = api_client.get_endpoint(url)
                    series_list[pos]['lookup'].update({endpoint: result})

        # Get pagination headers
        pagination = pagination_headers(total_pages, total_items, actual_size,
                                        request)

        # Created response
        rsp = jsonify(series_list)

        # Add link header to response
        rsp.headers.extend(pagination)
        return rsp
Beispiel #13
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()

        # Filter params
        configured = args['in_config']
        premieres = args['premieres']
        status = args['status']
        days = args['days']

        # Pagination and sorting params
        page = args['page']
        per_page = args['per_page']
        sort_by = args['sort_by']
        sort_order = args['order']

        # Handle max size limit
        if per_page > 100:
            per_page = 100

        descending = sort_order == 'desc'

        # Data params
        lookup = args.get('lookup')
        begin = args.get('begin')
        latest = args.get('latest')

        start = per_page * (page - 1)
        stop = start + per_page

        kwargs = {
            'configured': configured,
            'premieres': premieres,
            'status': status,
            'days': days,
            'start': start,
            'stop': stop,
            'sort_by': sort_by,
            'descending': descending,
            'session': session
        }

        total_items = series.get_series_summary(count=True, **kwargs)

        if not total_items:
            return jsonify([])

        series_list = []
        for s in series.get_series_summary(**kwargs):
            series_object = series_details(s, begin, latest)
            series_list.append(series_object)

        # Total number of pages
        total_pages = int(ceil(total_items / float(per_page)))

        if total_pages < page and total_pages != 0:
            raise NotFoundError('page %s does not exist' % page)

        # Actual results in page
        actual_size = min(per_page, len(series_list))

        # Do relevant lookups
        if lookup:
            api_client = APIClient()
            for endpoint in lookup:
                base_url = '/%s/series/' % endpoint
                for show in series_list:
                    pos = series_list.index(show)
                    series_list[pos].setdefault('lookup', {})
                    url = base_url + show['name'] + '/'
                    result = api_client.get_endpoint(url)
                    series_list[pos]['lookup'].update({endpoint: result})

        # Get pagination headers
        pagination = pagination_headers(total_pages, total_items, actual_size, request)

        # Created response
        rsp = jsonify(series_list)

        # Add link header to response
        rsp.headers.extend(pagination)
        return rsp
Beispiel #14
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()

        # Filter params
        configured = args["in_config"]
        premieres = args["premieres"]
        status = args["status"]
        days = args["days"]

        # Pagination and sorting params
        page = args["page"]
        per_page = args["per_page"]
        sort_by = args["sort_by"]
        sort_order = args["order"]

        # Handle max size limit
        if per_page > 100:
            per_page = 100

        descending = bool(sort_order == "desc")

        # Data params
        lookup = args.get("lookup")
        begin = args.get("begin")
        latest = args.get("latest")

        start = per_page * (page - 1)
        stop = start + per_page

        kwargs = {
            "configured": configured,
            "premieres": premieres,
            "status": status,
            "days": days,
            "start": start,
            "stop": stop,
            "sort_by": sort_by,
            "descending": descending,
            "session": session,
        }

        total_items = series.get_series_summary(count=True, **kwargs)

        if not total_items:
            return jsonify([])

        series_list = []
        for s in series.get_series_summary(**kwargs):
            series_object = series_details(s, begin, latest)
            series_list.append(series_object)

        # Total number of pages
        total_pages = int(ceil(total_items / float(per_page)))

        if total_pages < page and total_pages != 0:
            raise NotFoundError("page %s does not exist" % page)

        # Actual results in page
        actual_size = min(per_page, len(series_list))

        # Do relevant lookups
        if lookup:
            api_client = APIClient()
            for endpoint in lookup:
                base_url = "/%s/series/" % endpoint
                for show in series_list:
                    pos = series_list.index(show)
                    series_list[pos].setdefault("lookup", {})
                    url = base_url + show["name"] + "/"
                    result = api_client.get_endpoint(url)
                    series_list[pos]["lookup"].update({endpoint: result})

        # Get pagination headers
        pagination = pagination_headers(total_pages, total_items, actual_size, request)

        # Created response
        rsp = jsonify(series_list)

        # Add link header to response
        rsp.headers.extend(pagination)
        return rsp
Beispiel #15
0
    def get(self, session=None):
        """ List existing shows """
        args = series_list_parser.parse_args()
        page = args['page']
        page_size = args['page_size']
        lookup = args.get('lookup')

        # Handle max size limit
        if page_size > 100:
            page_size = 100

        sort_by = args['sort_by']
        order = args['order']
        # In case the default 'desc' order was received
        if order == 'desc':
            order = True
        else:
            order = False

        start = page_size * (page - 1)
        stop = start + page_size

        kwargs = {
            'configured': args.get('in_config'),
            'premieres': args.get('premieres'),
            'status': args.get('status'),
            'days': args.get('days'),
            'start': start,
            'stop': stop,
            'session': session
        }
        num_of_shows = series.get_series_summary(count=True, **kwargs)

        raw_series_list = series.get_series_summary(**kwargs)
        converted_series_list = [
            get_series_details(show) for show in raw_series_list
        ]
        sorted_show_list = []
        if sort_by == 'show_name':
            sorted_show_list = sorted(converted_series_list,
                                      key=lambda show: show['show_name'],
                                      reverse=order)
        elif sort_by == 'episodes_behind_latest':
            sorted_show_list = sorted(
                converted_series_list,
                key=lambda show: show['latest_downloaded_episode'][
                    'number_of_episodes_behind'],
                reverse=order)
        elif sort_by == 'last_download_date':
            sorted_show_list = sorted(
                converted_series_list,
                key=lambda show: show['latest_downloaded_episode'][
                    'last_downloaded_release']['release_first_seen']
                if show['latest_downloaded_episode']['last_downloaded_release']
                else datetime.datetime(1970, 1, 1),
                reverse=order)

        pages = int(ceil(num_of_shows / float(page_size)))

        if page > pages and pages != 0:
            return {'error': 'page %s does not exist' % page}, 404

        number_of_shows = min(page_size, num_of_shows)

        response = {
            'shows': sorted_show_list,
            'page_size': number_of_shows,
            'total_number_of_shows': num_of_shows,
            'page': page,
            'total_number_of_pages': pages
        }

        if lookup:
            api_client = ApiClient()
            for endpoint in lookup:
                base_url = '/%s/series/' % endpoint
                for show in response['shows']:
                    pos = response['shows'].index(show)
                    response['shows'][pos].setdefault('lookup', {})
                    url = base_url + show['show_name'] + '/'
                    result = api_client.get_endpoint(url)
                    response['shows'][pos]['lookup'].update({endpoint: result})
        return jsonify(response)