Repository: yt-dlp/yt-dlp
File: yt_dlp/extractor/abematv.py (Python)

Code before:
    def _fetch_page(self, playlist_id, series_version, season_id, page):
        query = {
            'seriesVersion': series_version,
            'offset': str(page * self._PAGE_SIZE),
            'order': 'seq',
            'limit': str(self._PAGE_SIZE),
        }
        if season_id:
            query['seasonId'] = season_id
        programs = self._call_api(
            f'v1/video/series/{playlist_id}/programs', playlist_id,
            note=f'Downloading page {page + 1}',
            query=query,
        )
        yield from (
            self.url_result(f'https://abema.tv/video/episode/{x}')
            for x in traverse_obj(programs, ('programs', ..., 'id')))

    def _entries(self, playlist_id, series_version, season_id):
        return OnDemandPagedList(
            functools.partial(self._fetch_page, playlist_id, series_version, season_id),
            self._PAGE_SIZE)

    def _real_extract(self, url):
        playlist_id = self._match_id(url)
        season_id = self._match_valid_url(url).group('season')
        series_info = self._call_api(f'v1/video/series/{playlist_id}', playlist_id)

        return self.playlist_result(
            self._entries(playlist_id, series_info['version'], season_id), playlist_id=playlist_id,
            playlist_title=series_info.get('title'),
            playlist_description=series_info.get('content'))


Review comment (suggestion):
```suggestion
        playlist_id, season_id = self._match_valid_url(url).group('id', 'season')
```

Code after:
        'playlist_mincount': 25,
    }, {
        'url': 'https://abema.tv/video/title/26-2mzbynr-cph?s=26-2mzbynr-cph_s40',
        'info_dict': {
            'title': '〈物語〉シリーズ',
            'id': '26-2mzbynr-cph',
            'description': 'md5:e67873de1c88f360af1f0a4b84847a52',
        },
        'playlist_count': 59,
    }]

    def _fetch_page(self, playlist_id, series_version, season_id, page):
        query = {
            'seriesVersion': series_version,
            'offset': str(page * self._PAGE_SIZE),
            'order': 'seq',
            'limit': str(self._PAGE_SIZE),
        }
        if season_id:
            query['seasonId'] = season_id
        programs = self._call_api(
            f'v1/video/series/{playlist_id}/programs', playlist_id,
            note=f'Downloading page {page + 1}',
            query=query)
        yield from (
            self.url_result(f'https://abema.tv/video/episode/{x}')
            for x in traverse_obj(programs, ('programs', ..., 'id')))

    def _entries(self, playlist_id, series_version, season_id):
        return OnDemandPagedList(
            functools.partial(self._fetch_page, playlist_id, series_version, season_id),
            self._PAGE_SIZE)

    def _real_extract(self, url):
        playlist_id, season_id = self._match_valid_url(url).group('id', 'season')
        series_info = self._call_api(f'v1/video/series/{playlist_id}', playlist_id)

        return self.playlist_result(
            self._entries(playlist_id, series_info['version'], season_id), playlist_id=playlist_id,
            playlist_title=series_info.get('title'),
            playlist_description=series_info.get('content'))