aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yt_dlp/extractor/abematv.py50
1 files changed, 32 insertions, 18 deletions
diff --git a/yt_dlp/extractor/abematv.py b/yt_dlp/extractor/abematv.py
index b1343eed3..8c7131b10 100644
--- a/yt_dlp/extractor/abematv.py
+++ b/yt_dlp/extractor/abematv.py
@@ -421,14 +421,15 @@ class AbemaTVIE(AbemaTVBaseIE):
class AbemaTVTitleIE(AbemaTVBaseIE):
- _VALID_URL = r'https?://abema\.tv/video/title/(?P<id>[^?/]+)'
+ _VALID_URL = r'https?://abema\.tv/video/title/(?P<id>[^?/#]+)/?(?:\?(?:[^#]+&)?s=(?P<season>[^&#]+))?'
_PAGE_SIZE = 25
_TESTS = [{
- 'url': 'https://abema.tv/video/title/90-1597',
+ 'url': 'https://abema.tv/video/title/90-1887',
'info_dict': {
- 'id': '90-1597',
+ 'id': '90-1887',
'title': 'シャッフルアイランド',
+ 'description': 'md5:61b2425308f41a5282a926edda66f178',
},
'playlist_mincount': 2,
}, {
@@ -436,41 +437,54 @@ class AbemaTVTitleIE(AbemaTVBaseIE):
'info_dict': {
'id': '193-132',
'title': '真心が届く~僕とスターのオフィス・ラブ!?~',
+ 'description': 'md5:9b59493d1f3a792bafbc7319258e7af8',
},
'playlist_mincount': 16,
}, {
- 'url': 'https://abema.tv/video/title/25-102',
+ 'url': 'https://abema.tv/video/title/25-1nzan-whrxe',
'info_dict': {
- 'id': '25-102',
- 'title': 'ソードアート・オンライン アリシゼーション',
+ 'id': '25-1nzan-whrxe',
+ 'title': 'ソードアート・オンライン',
+ 'description': 'md5:c094904052322e6978495532bdbf06e6',
},
- 'playlist_mincount': 24,
+ '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, page):
+ 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={
- 'seriesVersion': series_version,
- 'offset': str(page * self._PAGE_SIZE),
- 'order': 'seq',
- 'limit': str(self._PAGE_SIZE),
- })
+ 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):
+ def _entries(self, playlist_id, series_version, season_id):
return OnDemandPagedList(
- functools.partial(self._fetch_page, playlist_id, series_version),
+ 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)
+ 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']), playlist_id=playlist_id,
+ 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'))