diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 57d4d319c..f08847c51 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -949,6 +949,7 @@ from .radiode import RadioDeIE from .radiojavan import RadioJavanIE from .radiobremen import RadioBremenIE from .radiofrance import RadioFranceIE +from .radioplay import RadioplayPodcastIE from .rai import ( RaiPlayIE, RaiPlayLiveIE, diff --git a/youtube_dl/extractor/radioplay.py b/youtube_dl/extractor/radioplay.py new file mode 100644 index 000000000..ae192e311 --- /dev/null +++ b/youtube_dl/extractor/radioplay.py @@ -0,0 +1,46 @@ +from __future__ import unicode_literals + +from .common import InfoExtractor + +from ..utils import ( + int_or_none, + js_to_json, + parse_iso8601, + unified_strdate, +) + + +class RadioplayPodcastIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?radioplay\.(?:se|no)/podcast/[^/]+/[^/]+/(?P\d+)' + + _TEST = { + 'url': 'https://radioplay.se/podcast/lilla-my/lyssna/2001126', + 'info_dict': { + 'id': '2001126', + 'ext': 'mp3', + 'title': 'Kaktus till läraren', + 'description': 'Lilla My ska köpa en "blomma" till sin lärare.', + 'timestamp': 1549898100, + 'upload_date': '20190211', + }, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + player = self._parse_json(self._search_regex( + r'window\.__PRELOADED_STATE__\s*=\s*({.+})', webpage, + 'player', default='{}'), video_id, transform_source=js_to_json) + video_info = player['player']['nowPlaying'] + + return { + 'url': video_info['PodcastExtMediaUrl'], + 'id': video_id, + 'title': video_info['PodcastTitle'], + 'description': video_info.get('PodcastDescription'), + 'thumbnail': video_info.get('PodcastImageUrl'), + 'release_date': unified_strdate(video_info.get('PodcastPublishDate')), + 'timestamp': parse_iso8601(video_info.get('PodcastPublishDate'), ' '), + 'duration': int_or_none(video_info.get('PodcastDuration')), + 'channel': player.get('podcastsApi').get('data').get('channel').get('PodcastChannelTitle'), + }