From 4d3e895708fc6c152696f1b16eaa5cf77a2a5b45 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Sun, 1 Nov 2020 12:39:48 +0100 Subject: [PATCH 1/4] [radioplay] new extractor Signed-off-by: Moritz Barsnick --- youtube_dl/extractor/extractors.py | 1 + youtube_dl/extractor/radioplay.py | 46 ++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 youtube_dl/extractor/radioplay.py 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'), + } From cfc78f02a457f7d7030f129ba732fed4b71d2ad8 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Sun, 1 Nov 2020 12:43:25 +0100 Subject: [PATCH 2/4] [listennow] new extractor Mainly a redirect for radioplay sites. Signed-off-by: Moritz Barsnick --- youtube_dl/extractor/extractors.py | 1 + youtube_dl/extractor/listennow.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 youtube_dl/extractor/listennow.py diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index f08847c51..ab9b58a24 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -592,6 +592,7 @@ from .linkedin import ( LinkedInLearningCourseIE, ) from .linuxacademy import LinuxAcademyIE +from .listennow import ListennowIE from .litv import LiTVIE from .livejournal import LiveJournalIE from .liveleak import ( diff --git a/youtube_dl/extractor/listennow.py b/youtube_dl/extractor/listennow.py new file mode 100644 index 000000000..872a9fda3 --- /dev/null +++ b/youtube_dl/extractor/listennow.py @@ -0,0 +1,27 @@ +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) From 6128cae3425c2ee8d7193b6afd864fd33d3327cf Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Fri, 15 Jan 2021 13:49:59 +0100 Subject: [PATCH 3/4] [listennow] fix flake8 CI said: Failure: SyntaxError (Non-ASCII character '\xc3' in file [...]/youtube_dl/extractor/listennow.py on line 14, but no encoding declared Signed-off-by: Moritz Barsnick --- youtube_dl/extractor/listennow.py | 1 + 1 file changed, 1 insertion(+) diff --git a/youtube_dl/extractor/listennow.py b/youtube_dl/extractor/listennow.py index 872a9fda3..627acab07 100644 --- a/youtube_dl/extractor/listennow.py +++ b/youtube_dl/extractor/listennow.py @@ -1,3 +1,4 @@ +# coding: utf-8 from __future__ import unicode_literals from .common import InfoExtractor From c3f756cd79ffe0779d289856dfe0535cf4e99201 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Fri, 15 Jan 2021 13:53:46 +0100 Subject: [PATCH 4/4] [radioplay] fix flake Signed-off-by: Moritz Barsnick --- youtube_dl/extractor/radioplay.py | 1 + 1 file changed, 1 insertion(+) diff --git a/youtube_dl/extractor/radioplay.py b/youtube_dl/extractor/radioplay.py index ae192e311..77898aafd 100644 --- a/youtube_dl/extractor/radioplay.py +++ b/youtube_dl/extractor/radioplay.py @@ -1,3 +1,4 @@ +# coding: utf-8 from __future__ import unicode_literals from .common import InfoExtractor