diff --git a/youtube_dl/extractor/dtube.py b/youtube_dl/extractor/dtube.py index 114d2dbe3..ecc8ee28f 100644 --- a/youtube_dl/extractor/dtube.py +++ b/youtube_dl/extractor/dtube.py @@ -1,20 +1,19 @@ # coding: utf-8 from __future__ import unicode_literals -import json import re from socket import timeout from .common import InfoExtractor from ..utils import ( int_or_none, - parse_iso8601, ) class DTubeIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?d\.tube/(?:#!/)?v/(?P[0-9a-z.-]+)/(?P[0-9a-z]{8})' - _TEST = { + _VALID_URL = r'https?://(?:www\.)?d\.tube/(?:#!/)?v/(?P[0-9a-z.-]+)/(?P[0-9a-zA-Z-_]{8,46})' + _TESTS = [{ + # old test: fail 'url': 'https://d.tube/#!/v/broncnutz/x380jtr1', 'md5': '9f29088fa08d699a7565ee983f56a06e', 'info_dict': { @@ -29,21 +28,56 @@ class DTubeIE(InfoExtractor): 'params': { 'format': '480p', }, - } + }, { + # ipfs + 'url': 'https://d.tube/v/anonyhack/QmXxj4j1prF5MUbFme4QVuGApeUw1MLq69Wf4GPBz2j2qL', + 'info_dict': { + 'id': 'QmXxj4j1prF5MUbFme4QVuGApeUw1MLq69Wf4GPBz2j2qL', + 'ext': 'mp4', + 'title': 'i wont accept it', + 'uploader_id': 'anonyhack', + }, + 'params': { + 'format': '480p', + }, + }, { + # facebook + 'url': 'https://d.tube/v/whatstrending360/538648240276191', + 'info_dict': { + 'id': '538648240276191', + 'ext': 'mp4', + 'title': 'Funny Videos 2019', + 'timestamp': 1569481574, + 'upload_date': '20190926', + 'uploader': 'Funny Videos 2019', + }, + }, { + # youtube + 'url': 'https://d.tube/#!/v/jeronimorubio/XCrCtqMeywk', + 'info_dict': { + 'id': 'XCrCtqMeywk', + 'ext': 'mp4', + 'title': 'Is it Beginning to Look a lot Like Christmas in Your City?', + 'upload_date': '20191024', + 'description': 'md5:9323433bbe8b34a55d84761e5bf652af', + 'uploader': 'Jeronimo Rubio', + 'uploader_id': 'UCbbG-SIMdWSW02RYKJucddw', + }, + }] def _real_extract(self, url): uploader_id, video_id = re.match(self._VALID_URL, url).groups() - result = self._download_json('https://api.steemit.com/', video_id, data=json.dumps({ - 'jsonrpc': '2.0', - 'method': 'get_content', - 'params': [uploader_id, video_id], - }).encode())['result'] - metadata = json.loads(result['json_metadata']) - video = metadata['video'] - content = video['content'] - info = video.get('info', {}) - title = info.get('title') or result['title'] + result = self._download_json( + 'https://avalon.d.tube/content/%s/%s' % (uploader_id, video_id), + video_id) + + metadata = result.get('json') + title = metadata.get('title') or result['title'] + + if metadata.get('providerName') != 'IPFS': + video_url = metadata.get('url') + return self.url_result(video_url) def canonical_url(h): if not h: @@ -52,7 +86,8 @@ class DTubeIE(InfoExtractor): formats = [] for q in ('240', '480', '720', '1080', ''): - video_url = canonical_url(content.get('video%shash' % q)) + video_url = canonical_url( + metadata.get('ipfs').get('video%shash' % q)) if not video_url: continue format_id = (q + 'p') if q else 'Source' @@ -73,11 +108,10 @@ class DTubeIE(InfoExtractor): return { 'id': video_id, 'title': title, - 'description': content.get('description'), - 'thumbnail': canonical_url(info.get('snaphash')), - 'tags': content.get('tags') or metadata.get('tags'), - 'duration': info.get('duration'), + 'description': metadata.get('description'), + 'thumbnail': metadata.get('thumbnailUrl'), + 'tags': result.get('tags'), + 'duration': metadata.get('duration'), 'formats': formats, - 'timestamp': parse_iso8601(result.get('created')), 'uploader_id': uploader_id, }