diff options
author | garret1317 <garret@airmail.cc> | 2025-08-29 20:57:50 +0100 |
---|---|---|
committer | garret1317 <garret@airmail.cc> | 2025-08-29 20:57:50 +0100 |
commit | bd04585fa66131530227456b9f8c2717c0d23a23 (patch) | |
tree | 1ab24624afd633ba754002a4d25fd274f52fa5b5 | |
parent | cbb46ec14339cd938f96446440ea2bd32a2ff1ba (diff) | |
download | yt-dlp-rajiko-master.tar.gz yt-dlp-rajiko-master.tar.bz2 yt-dlp-rajiko-master.zip |
-rwxr-xr-x | misc/test_extractors.py | 4 | ||||
-rw-r--r-- | yt_dlp_plugins/extractor/radiko.py | 42 |
2 files changed, 45 insertions, 1 deletions
diff --git a/misc/test_extractors.py b/misc/test_extractors.py index f6ee0dd..21800c5 100755 --- a/misc/test_extractors.py +++ b/misc/test_extractors.py @@ -44,7 +44,8 @@ def get_test_timefields(airtime, release_time): from yt_dlp_plugins.extractor.radiko import ( RadikoTimeFreeIE, RadikoShareIE, - RadikoLiveIE, RadikoPersonIE, RadikoStationButtonIE + RadikoLiveIE, RadikoPersonIE, RadikoStationButtonIE, + RadikoRSeasonsIE ) from yt_dlp_plugins.extractor.radiko_podcast import ( @@ -147,6 +148,7 @@ IEs = [ RadikoTimeFreeIE, RadikoShareIE, RadikoLiveIE, RadikoPersonIE, RadikoStationButtonIE, RadikoPodcastEpisodeIE, RadikoPodcastChannelIE, + RadikoRSeasonsIE, ] import test.helper as th diff --git a/yt_dlp_plugins/extractor/radiko.py b/yt_dlp_plugins/extractor/radiko.py index 94df945..e81a1ca 100644 --- a/yt_dlp_plugins/extractor/radiko.py +++ b/yt_dlp_plugins/extractor/radiko.py @@ -746,3 +746,45 @@ class RadikoPersonIE(InfoExtractor): yield self.url_result(timefree_url, ie=RadikoTimeFreeIE, video_id=timefree_id) return self.playlist_result(entries(), playlist_id=join_nonempty("person", person_id)) + + +class RadikoRSeasonsIE(InfoExtractor): + _VALID_URL = r"https?://(?:www\.)?radiko\.jp/(?:mobile/)?r_seasons/(?P<id>\d+$)" + _TESTS = [{ + "url": "https://radiko.jp/r_seasons/10012302", + "playlist_mincount": 4, + "info_dict": { + "id": '10012302', + "title": '山下達郎の楽天カード サンデー・ソングブック', + } + }, { + "url": "https://radiko.jp/r_seasons/10002831", + "playlist_mincount": 4, + "info_dict": { + "id": "10002831", + "title": "Tokyo Moon", + } + }] + + def _real_extract(self, url): + season_id = self._match_id(url) + html = self._download_webpage(url, season_id) + pageProps = self._search_nextjs_data(html, season_id)["props"]["pageProps"] + season_id = traverse_obj(pageProps, ("rSeason", "id")) or season_id + + def entries(): + for episode in pageProps.get("pastPrograms"): + station = traverse_obj(episode, ("stationId")) + start = traverse_obj(episode, ("startAt", "seconds")) + timestring = rtime.RadikoTime.fromtimestamp(start, tz=rtime.JST).timestring() + + timefree_id = join_nonempty(station, timestring) + timefree_url = f"https://radiko.jp/#!/ts/{station}/{timestring}" + + yield self.url_result(timefree_url, ie=RadikoTimeFreeIE, video_id=timefree_id) + + return self.playlist_result( + entries(), + playlist_id=season_id, + playlist_title=traverse_obj(pageProps, ("rSeason", "rSeasonName")), + ) |