diff options
| -rw-r--r-- | youtube_dl/extractor/__init__.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/dailymotion.py | 42 | ||||
| -rw-r--r-- | youtube_dl/extractor/generic.py | 17 | 
3 files changed, 60 insertions, 0 deletions
diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index 0f4af88f0..bd3c3193f 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -106,6 +106,7 @@ from .dailymotion import (      DailymotionIE,      DailymotionPlaylistIE,      DailymotionUserIE, +    DailymotionCloudIE,  )  from .daum import DaumIE  from .dbtv import DBTVIE diff --git a/youtube_dl/extractor/dailymotion.py b/youtube_dl/extractor/dailymotion.py index 70aa4333c..96f0ed9ad 100644 --- a/youtube_dl/extractor/dailymotion.py +++ b/youtube_dl/extractor/dailymotion.py @@ -251,3 +251,45 @@ class DailymotionUserIE(DailymotionPlaylistIE):              'title': full_user,              'entries': self._extract_entries(user),          } + + +class DailymotionCloudIE(DailymotionBaseInfoExtractor): +    _VALID_URL = r'http://api\.dmcloud\.net/embed/[^/]+/(?P<id>[^/?]+)' + +    _TEST = { +        # From http://www.francetvinfo.fr/economie/entreprises/les-entreprises-familiales-le-secret-de-la-reussite_933271.html +        # Tested at FranceTvInfo_2 +        'url': 'http://api.dmcloud.net/embed/4e7343f894a6f677b10006b4/556e03339473995ee145930c?auth=1464865870-0-jyhsm84b-ead4c701fb750cf9367bf4447167a3db&autoplay=1', +        'only_matching': True, +    } + +    @classmethod +    def _extract_dmcloud_url(self, webpage): +        mobj = re.search(r'<iframe[^>]+src=[\'"](http://api\.dmcloud\.net/embed/[^/]+/[^\'"]+)[\'"]', webpage) +        if mobj: +            return mobj.group(1) + +        mobj = re.search(r'<input[^>]+id=[\'"]dmcloudUrlEmissionSelect[\'"][^>]+value=[\'"](http://api\.dmcloud\.net/embed/[^/]+/[^\'"]+)[\'"]', webpage) +        if mobj: +            return mobj.group(1) + +    def _real_extract(self, url): +        video_id = self._match_id(url) + +        request = self._build_request(url) +        webpage = self._download_webpage(request, video_id) + +        title = self._html_search_regex(r'<title>([^>]+)</title>', webpage, 'title') + +        video_info = self._parse_json(self._search_regex( +            r'var\s+info\s*=\s*([^;]+);', webpage, 'video info'), video_id) + +        # TODO: parse ios_url, which is in fact a manifest +        video_url = video_info['mp4_url'] + +        return { +            'id': video_id, +            'url': video_url, +            'title': title, +            'thumbnail': video_info.get('thumbnail_url'), +        } diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index bf689f531..07939b196 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -44,6 +44,7 @@ from .bliptv import BlipTVIE  from .svt import SVTIE  from .pornhub import PornHubIE  from .vimeo import VimeoIE +from .dailymotion import DailymotionCloudIE  class GenericIE(InfoExtractor): @@ -813,6 +814,17 @@ class GenericIE(InfoExtractor):                  'description': 'To understand why he was the Toronto Blue Jays’ top off-season priority is to appreciate his background and upbringing in Montreal, where he first developed his baseball skills. Written and narrated by Stephen Brunt.',                  'uploader': 'Rogers Sportsnet',              }, +        }, +        # Dailymotion Cloud video +        { +            'url': 'http://replay.publicsenat.fr/vod/le-debat/florent-kolandjian,dominique-cena,axel-decourtye,laurence-abeille,bruno-parmentier/175910', +            'md5': '49444254273501a64675a7e68c502681', +            'info_dict': { +                'id': '5585de919473990de4bee11b', +                'ext': 'mp4', +                'title': 'Le débat', +                'thumbnail': 're:^https?://.*\.jpe?g$', +            }          }      ] @@ -1486,6 +1498,11 @@ class GenericIE(InfoExtractor):          if senate_isvp_url:              return self.url_result(senate_isvp_url, 'SenateISVP') +        # Look for Dailymotion Cloud videos +        dmcloud_url = DailymotionCloudIE._extract_dmcloud_url(webpage) +        if dmcloud_url: +            return self.url_result(dmcloud_url, 'DailymotionCloud') +          def check_video(vurl):              if YoutubeIE.suitable(vurl):                  return True  | 
