diff options
| author | Remita Amine <remitamine@gmail.com> | 2018-06-13 14:46:00 +0100 | 
|---|---|---|
| committer | Remita Amine <remitamine@gmail.com> | 2018-06-13 14:51:19 +0100 | 
| commit | f15f7a674b309eff00a66d16449f8d5abb1c6682 (patch) | |
| tree | d9a25dab4397bdf0664ff666c52968b355f5be0c /youtube_dl/extractor/dailymotion.py | |
| parent | 9aca7fe6a3551df6379079f570e5a8bdf517c670 (diff) | |
[dailymotion] add support for password protected videos(closes #9789)
Diffstat (limited to 'youtube_dl/extractor/dailymotion.py')
| -rw-r--r-- | youtube_dl/extractor/dailymotion.py | 25 | 
1 files changed, 20 insertions, 5 deletions
diff --git a/youtube_dl/extractor/dailymotion.py b/youtube_dl/extractor/dailymotion.py index de27fffd4..0afb6a158 100644 --- a/youtube_dl/extractor/dailymotion.py +++ b/youtube_dl/extractor/dailymotion.py @@ -1,9 +1,14 @@  # coding: utf-8  from __future__ import unicode_literals -import re -import json +import base64 +import hashlib  import itertools +import json +import random +import re +import string +import struct  from .common import InfoExtractor @@ -64,7 +69,6 @@ class DailymotionIE(DailymotionBaseInfoExtractor):              'uploader': 'Deadline',              'uploader_id': 'x1xm8ri',              'age_limit': 0, -            'view_count': int,          },      }, {          'url': 'https://www.dailymotion.com/video/x2iuewm_steam-machine-models-pricing-listed-on-steam-store-ign-news_videogames', @@ -167,6 +171,17 @@ class DailymotionIE(DailymotionBaseInfoExtractor):              player = self._parse_json(player_v5, video_id)              metadata = player['metadata'] +            if metadata.get('error', {}).get('type') == 'password_protected': +                password = self._downloader.params.get('videopassword') +                if password: +                    r = int(metadata['id'][1:], 36) +                    us64e = lambda x: base64.urlsafe_b64encode(x).decode().strip('=') +                    t = ''.join(random.choice(string.ascii_letters) for i in range(10)) +                    n = us64e(struct.pack('I', r)) +                    i = us64e(hashlib.md5(('%s%d%s' % (password, r, t)).encode()).digest()) +                    metadata = self._download_json( +                        'http://www.dailymotion.com/player/metadata/video/p' + i + t + n, video_id) +              self._check_error(metadata)              formats = [] @@ -302,8 +317,8 @@ class DailymotionIE(DailymotionBaseInfoExtractor):      def _check_error(self, info):          error = info.get('error') -        if info.get('error') is not None: -            title = error['title'] +        if error: +            title = error.get('title') or error['message']              # See https://developer.dailymotion.com/api#access-error              if error.get('code') == 'DM007':                  self.raise_geo_restricted(msg=title)  | 
