From b122f609c7f58121d8bf8163c7ce1cb56de33ade Mon Sep 17 00:00:00 2001 From: Jan Gampe Date: Fri, 18 Jan 2019 14:26:27 +0100 Subject: [PATCH] [podlovepublisher] Add new extractor --- youtube_dl/extractor/generic.py | 2 +- youtube_dl/extractor/podlovepublisher.py | 90 ++++++++++++++++-------- 2 files changed, 62 insertions(+), 30 deletions(-) diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index 149ceb0a4..cad5685e2 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -3128,7 +3128,7 @@ class GenericIE(InfoExtractor): podlove_url = PodlovePublisherIE._extract_url(webpage) if podlove_url: return self.url_result(podlove_url) - + foxnews_urls = FoxNewsIE._extract_urls(webpage) if foxnews_urls: return self.playlist_from_matches( diff --git a/youtube_dl/extractor/podlovepublisher.py b/youtube_dl/extractor/podlovepublisher.py index 26d157936..73bef3532 100644 --- a/youtube_dl/extractor/podlovepublisher.py +++ b/youtube_dl/extractor/podlovepublisher.py @@ -6,54 +6,86 @@ import datetime import time import re + class PodlovePublisherIE(InfoExtractor): _VALID_URL = r'''(?:https?:)?//.+?/?podlove_action=pwp4_config''' - _TEST = { + _TESTS = [{ 'url': 'https://not-safe-for-work.de/nsfw099-kanzlerkind-sebastian/?podlove_action=pwp4_config', - 'md5': '73ab53f3898e752f6db89b50c3b4658c', + 'md5': 'b123c265e73b3cd814f052de5bbd21c3', 'info_dict': { 'id': 'NSFW099 Kanzlerkind Sebastian', - 'ext': 'm4a', + 'ext': 'mp3', 'title': 'NSFW099 Kanzlerkind Sebastian', 'description': 'Uuuuund da sind wir wieder, keine 10 Monate nachdem wir das letzte Mal gesendet haben. Und bedenkt, dass solche Sendezyklen im Kern gut für Euch sind. So oder so haben wir uns einiges zu erzählen, auch wenn wir zunehmend aus der alten Brachialität rauszuwachsen scheinen. Dafür mehr Blick in die Zeit und dann und wann auch ins Internet.', - 'duration': 11723 - # TODO more properties, either as: - # * A value - # * MD5 checksum; start the string with md5: - # * A regular expression; start the string with re: - # * Any Python type (for example int or float) + 'duration': 11723, + 'series': 'Not Safe For Work' } - } + }, { + 'url': 'https://cre.fm/cre218-diamanten?podlove_action=pwp4_config', + 'md5': 'a6251c173c01ee0447ce55ee7c63e8c8', + 'info_dict': { + 'id': 'CRE218 Diamanten', + 'ext': 'mp3', + 'title': 'CRE218 Diamanten', + 'description': 'Diamanten faszinieren die Menschen und seit einem Jahrhundert symbolisieren sie Luxus und Perfektion wie kein anderes Material. Nachdem Diamanten zunächst nur aus der Erde gegraben wurden können Diamanten mit technischen Verfahren in sogar besserer Form hergestellt werden und spielen in Forschung und Industrie eine wichtige Rolle. Ich spreche mit Physiker und und Podcaster Reinhard Remfort über seinen persönlichen Weg zum Thema und über die Physik, Struktur, Eigenschaften und Anwendungen, die Diamanten heute ermöglichen und in Zukunft noch ermöglichen könnten.', + 'duration': 10905, + 'series': 'CRE: Technik, Kultur, Gesellschaft' + } + }, { + 'url': 'http://einschlafen-podcast.de/podcast/ep-433-st-pauli-und-kant/?podlove_action=pwp4_config', + 'md5': '5d4b0d463a647d564abe8ff8bcecc272', + 'info_dict': { + 'id': 'EP 433 ~ St. Pauli und Kant', + 'ext': 'mp3', + 'title': 'EP 433 ~ St. Pauli und Kant', + 'description': 'Vor 200 (in Worten: zweihundert!) Episoden habe ich von einem Fussballspiel berichtet, bei dem zwei unserer langjährigen Spieler den FC St. Pauli verlassen haben. In Episode 233 ging es nämlich um das letzte Heimspiel von Marius Ebbers und Florian Bruns. Mein Hörer Berthold hatte mich auf diese Episode aufmerksam gemacht, und interessanterweise hat uns beim letzten Heimspiel wieder ein langjähriger Spieler verlassen: Bernd Nehrig. Und genau wie Bruns und Ebbers hat er in seinem letzten Spiel ein Tor gemacht! Was für eine Geschichte :)', + 'duration': 3195, + 'series': 'Einschlafen Podcast' + } + }] @staticmethod def _extract_url(webpage): - mobj = re.search(r'(?:https?:)?//.+?/?podlove_action=pwp4_config',webpage) + mobj = re.search(r'(?:https?:)?//.+?/?podlove_action=pwp4_config', webpage) if mobj: return mobj.group(0) else: - return None + return None def _real_extract(self, url): player_data = self._download_json(url, None) - - dur_ptime = time.strptime(player_data['duration'].split('.')[0],'%H:%M:%S') - duration_secs = datetime.timedelta(hours=dur_ptime.tm_hour,minutes=dur_ptime.tm_min,seconds=dur_ptime.tm_sec).total_seconds() - print(duration_secs) + duration_secs = None + if 'duration' in player_data: + dur_ptime = time.strptime(player_data.get('duration').split('.')[0], '%H:%M:%S') + duration_secs = datetime.timedelta(hours=dur_ptime.tm_hour, minutes=dur_ptime.tm_min, seconds=dur_ptime.tm_sec).total_seconds() + + formats = [] + for audioformat in player_data.get('audio'): + result_format = {} + if 'url' not in audioformat: + # url is mandatory + continue + else: + result_format['url'] = audioformat.get('url') + + if 'size' in audioformat: + result_format['filesize'] = int(audioformat['size']) + + result_format['format_id'] = audioformat.get('mimeType') + result_format['format'] = audioformat.get('title') + + formats.append(result_format) + + self._sort_formats(formats) return { - 'id': player_data['title'], - 'title': player_data['title'], - 'description': player_data['summary'], - 'filesize': int(player_data['audio'][0]['size']), - 'url': player_data['audio'][0]['url'], - 'duration': duration_secs - # TODO more properties (see youtube_dl/extractor/common.py) + 'id': player_data.get('title'), + 'title': player_data.get('title'), + 'episode': player_data.get('title'), + 'description': player_data.get('summary'), + 'formats': formats, + 'duration': duration_secs, + 'series': player_data.get('show', {}).get('title') } - - - - - -