diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 3da5f8020..ae74bb4a6 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -636,6 +636,7 @@ from .linkedin import ( LinkedInLearningCourseIE, ) from .linuxacademy import LinuxAcademyIE +from .listennow import ListennowIE from .litv import LiTVIE from .livejournal import LiveJournalIE from .livestream import ( @@ -1012,6 +1013,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/listennow.py b/youtube_dl/extractor/listennow.py new file mode 100644 index 000000000..627acab07 --- /dev/null +++ b/youtube_dl/extractor/listennow.py @@ -0,0 +1,28 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .common import InfoExtractor + + +class ListennowIE(InfoExtractor): + _VALID_URL = r'https?://(?:[^\.]+\.)?listennow\.link/(?P\d+)' + + _TEST = { + 'url': 'https://radionorge.listennow.link/10279676', + 'info_dict': { + 'id': '2035659', + 'ext': 'mp3', + 'title': 'Best of Høsten 2020', + 'description': 'md5:701b09a2bcf9a75b6bfd8a27f359dcfa', + 'timestamp': 1603429200, + 'upload_date': '20201023', + }, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + url = self._search_regex( + r'desktopUrl\s*:\s*\'([^\']+)\'', webpage, + 'redirect', video_id) + return self.url_result(url) diff --git a/youtube_dl/extractor/radioplay.py b/youtube_dl/extractor/radioplay.py new file mode 100644 index 000000000..77898aafd --- /dev/null +++ b/youtube_dl/extractor/radioplay.py @@ -0,0 +1,47 @@ +# coding: utf-8 +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'), + }