|
@ -1,9 +1,14 @@ |
|
|
# coding: utf-8 |
|
|
# coding: utf-8 |
|
|
from __future__ import unicode_literals |
|
|
from __future__ import unicode_literals |
|
|
|
|
|
|
|
|
import re |
|
|
|
|
|
import json |
|
|
|
|
|
|
|
|
import base64 |
|
|
|
|
|
import hashlib |
|
|
import itertools |
|
|
import itertools |
|
|
|
|
|
import json |
|
|
|
|
|
import random |
|
|
|
|
|
import re |
|
|
|
|
|
import string |
|
|
|
|
|
import struct |
|
|
|
|
|
|
|
|
from .common import InfoExtractor |
|
|
from .common import InfoExtractor |
|
|
|
|
|
|
|
@ -64,7 +69,6 @@ class DailymotionIE(DailymotionBaseInfoExtractor): |
|
|
'uploader': 'Deadline', |
|
|
'uploader': 'Deadline', |
|
|
'uploader_id': 'x1xm8ri', |
|
|
'uploader_id': 'x1xm8ri', |
|
|
'age_limit': 0, |
|
|
'age_limit': 0, |
|
|
'view_count': int, |
|
|
|
|
|
}, |
|
|
}, |
|
|
}, { |
|
|
}, { |
|
|
'url': 'https://www.dailymotion.com/video/x2iuewm_steam-machine-models-pricing-listed-on-steam-store-ign-news_videogames', |
|
|
'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) |
|
|
player = self._parse_json(player_v5, video_id) |
|
|
metadata = player['metadata'] |
|
|
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) |
|
|
self._check_error(metadata) |
|
|
|
|
|
|
|
|
formats = [] |
|
|
formats = [] |
|
@ -302,8 +317,8 @@ class DailymotionIE(DailymotionBaseInfoExtractor): |
|
|
|
|
|
|
|
|
def _check_error(self, info): |
|
|
def _check_error(self, info): |
|
|
error = info.get('error') |
|
|
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 |
|
|
# See https://developer.dailymotion.com/api#access-error |
|
|
if error.get('code') == 'DM007': |
|
|
if error.get('code') == 'DM007': |
|
|
self.raise_geo_restricted(msg=title) |
|
|
self.raise_geo_restricted(msg=title) |
|
|