diff options
| -rw-r--r-- | youtube_dl/extractor/extractors.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/generic.py | 8 | ||||
| -rw-r--r-- | youtube_dl/extractor/megaphone.py | 55 | 
3 files changed, 64 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 2513f2587..668248648 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -558,6 +558,7 @@ from .matchtv import MatchTVIE  from .mdr import MDRIE  from .mediaset import MediasetIE  from .medici import MediciIE +from .megaphone import MegaphoneIE  from .meipai import MeipaiIE  from .melonvod import MelonVODIE  from .meta import METAIE diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index 36c81eda9..9678c32c4 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -97,6 +97,7 @@ from .washingtonpost import WashingtonPostIE  from .wistia import WistiaIE  from .mediaset import MediasetIE  from .joj import JojIE +from .megaphone import MegaphoneIE  class GenericIE(InfoExtractor): @@ -2790,6 +2791,13 @@ class GenericIE(InfoExtractor):              return self.playlist_from_matches(                  joj_urls, video_id, video_title, ie=JojIE.ie_key()) +        # Look for megaphone.fm embeds +        mpfn_urls = MegaphoneIE._extract_urls(webpage) +        if mpfn_urls: +            return self.playlist_from_matches( +                mpfn_urls, video_id, video_title, ie=MegaphoneIE.ie_key()) + +          def merge_dicts(dict1, dict2):              merged = {}              for k, v in dict1.items(): diff --git a/youtube_dl/extractor/megaphone.py b/youtube_dl/extractor/megaphone.py new file mode 100644 index 000000000..60e3caf0d --- /dev/null +++ b/youtube_dl/extractor/megaphone.py @@ -0,0 +1,55 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import js_to_json + + +class MegaphoneIE(InfoExtractor): +    IE_NAME = 'megaphone.fm' +    IE_DESC = 'megaphone.fm embedded players' +    _VALID_URL = r'https://player\.megaphone\.fm/(?P<id>[A-Z0-9]+)' +    _TEST = { +        'url': 'https://player.megaphone.fm/GLT9749789991?"', +        'md5': '4816a0de523eb3e972dc0dda2c191f96', +        'info_dict': { +            'id': 'GLT9749789991', +            'ext': 'mp3', +            'title': '#97 What Kind Of Idiot Gets Phished?', +            'thumbnail': 're:^https://.*\.png.*$', +            'duration': 1776.26375, +            'author': 'Reply All', +        }, +    } + +    def _real_extract(self, url): +        video_id = self._match_id(url) +        webpage = self._download_webpage(url, video_id) + +        title = self._og_search_property('audio:title', webpage) +        author = self._og_search_property('audio:artist', webpage) +        thumbnail = self._og_search_thumbnail(webpage) + +        episode_json = self._search_regex(r'(?s)var\s+episode\s*=\s*(\{.+?\});', webpage, 'episode JSON') +        episode_data = self._parse_json(episode_json, video_id, js_to_json) +        video_url = self._proto_relative_url(episode_data['mediaUrl'], 'https:') + +        formats = [{ +            'url': video_url, +        }] + +        return { +            'id': video_id, +            'thumbnail': thumbnail, +            'title': title, +            'author': author, +            'duration': episode_data['duration'], +            'formats': formats, +        } + +    @classmethod +    def _extract_urls(cls, webpage): +        return [m[0] for m in re.findall( +            r'<iframe[^>]*?\ssrc=["\'](%s)' % cls._VALID_URL, webpage)] | 
