aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemita Amine <remitamine@gmail.com>2018-06-13 14:46:00 +0100
committerRemita Amine <remitamine@gmail.com>2018-06-13 14:51:19 +0100
commitf15f7a674b309eff00a66d16449f8d5abb1c6682 (patch)
treed9a25dab4397bdf0664ff666c52968b355f5be0c
parent9aca7fe6a3551df6379079f570e5a8bdf517c670 (diff)
[dailymotion] add support for password protected videos(closes #9789)
-rw-r--r--youtube_dl/extractor/dailymotion.py25
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)