aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorgarret1317 <garret@airmail.cc>2025-08-29 20:57:50 +0100
committergarret1317 <garret@airmail.cc>2025-08-29 20:57:50 +0100
commitbd04585fa66131530227456b9f8c2717c0d23a23 (patch)
tree1ab24624afd633ba754002a4d25fd274f52fa5b5
parentcbb46ec14339cd938f96446440ea2bd32a2ff1ba (diff)
downloadyt-dlp-rajiko-master.tar.gz
yt-dlp-rajiko-master.tar.bz2
yt-dlp-rajiko-master.zip
add support for "r_seasons" programme pagesHEADmaster
-rwxr-xr-xmisc/test_extractors.py4
-rw-r--r--yt_dlp_plugins/extractor/radiko.py42
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")),
+ )