We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
download from d.tube fails
### Make sure you are using the *latest* version: run `youtube-dl --version` and ensure your version is *2019.01.02*. If it's not, read [this FAQ entry](https://github.com/rg3/youtube-dl/blob/master/README.md#how-do-i-update-youtube-dl) and update. Issues with outdated version will be rejected.
- [x] I've **verified** and **I assure** that I'm running youtube-dl **2019.01.02**

### Before submitting an *issue* make sure you have:
- [x] At least skimmed through the [README](https://github.com/rg3/youtube-dl/blob/master/README.md), **most notably** the [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections
- [x] [Searched](https://github.com/rg3/youtube-dl/search?type=Issues) the bugtracker for similar issues including closed ones
- [x] Checked that provided video/audio/playlist URLs (if any) are alive and playable in a browser

### What is the purpose of your *issue*?
- [x] Bug report (encountered problems with youtube-dl)
- [x] Site support request (request for __re__adding support for an existing site)
- [ ] Feature request (request for a new functionality)
- [ ] Question
- [ ] Other

### If the purpose of this *issue* is a *bug report*, *site support request* or you are not completely sure provide the full verbose output as follows:

Add the `-v` flag to **your command line** 

```
user@mymachine:~$ youtube-dl --verbose
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['--verbose']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2019.01.02
[debug] Python version 3.5.3 (CPython) - Linux-4.9.0-4-amd64-x86_64-with-debian-9.2
[debug] exe versions: none
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.
user@ mymachine:~$ youtube-dl --verbose "https://d.tube/#!/v/dennisxxx/lgfrcata"
bash: !/v/dennisxxx/lgfrcata: event not found
```
### Description of your *issue*, suggested solution and other information

Download from d.tube failed. I am sorry to not being able to provide more information. If I can help/try anything else I will gladly do though....

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `youtube_dl/extractor/dtube.py`
Content:
```
1 # coding: utf-8
2 from __future__ import unicode_literals
3 
4 import json
5 import re
6 from socket import timeout
7 
8 from .common import InfoExtractor
9 from ..utils import (
10     int_or_none,
11     parse_iso8601,
12 )
13 
14 
15 class DTubeIE(InfoExtractor):
16     _VALID_URL = r'https?://(?:www\.)?d\.tube/(?:#!/)?v/(?P<uploader_id>[0-9a-z.-]+)/(?P<id>[0-9a-z]{8})'
17     _TEST = {
18         'url': 'https://d.tube/#!/v/benswann/zqd630em',
19         'md5': 'a03eaa186618ffa7a3145945543a251e',
20         'info_dict': {
21             'id': 'zqd630em',
22             'ext': 'mp4',
23             'title': 'Reality Check: FDA\'s Disinformation Campaign on Kratom',
24             'description': 'md5:700d164e066b87f9eac057949e4227c2',
25             'uploader_id': 'benswann',
26             'upload_date': '20180222',
27             'timestamp': 1519328958,
28         },
29         'params': {
30             'format': '480p',
31         },
32     }
33 
34     def _real_extract(self, url):
35         uploader_id, video_id = re.match(self._VALID_URL, url).groups()
36         result = self._download_json('https://api.steemit.com/', video_id, data=json.dumps({
37             'jsonrpc': '2.0',
38             'method': 'get_content',
39             'params': [uploader_id, video_id],
40         }).encode())['result']
41 
42         metadata = json.loads(result['json_metadata'])
43         video = metadata['video']
44         content = video['content']
45         info = video.get('info', {})
46         title = info.get('title') or result['title']
47 
48         def canonical_url(h):
49             if not h:
50                 return None
51             return 'https://ipfs.io/ipfs/' + h
52 
53         formats = []
54         for q in ('240', '480', '720', '1080', ''):
55             video_url = canonical_url(content.get('video%shash' % q))
56             if not video_url:
57                 continue
58             format_id = (q + 'p') if q else 'Source'
59             try:
60                 self.to_screen('%s: Checking %s video format URL' % (video_id, format_id))
61                 self._downloader._opener.open(video_url, timeout=5).close()
62             except timeout:
63                 self.to_screen(
64                     '%s: %s URL is invalid, skipping' % (video_id, format_id))
65                 continue
66             formats.append({
67                 'format_id': format_id,
68                 'url': video_url,
69                 'height': int_or_none(q),
70                 'ext': 'mp4',
71             })
72 
73         return {
74             'id': video_id,
75             'title': title,
76             'description': content.get('description'),
77             'thumbnail': canonical_url(info.get('snaphash')),
78             'tags': content.get('tags') or metadata.get('tags'),
79             'duration': info.get('duration'),
80             'formats': formats,
81             'timestamp': parse_iso8601(result.get('created')),
82             'uploader_id': uploader_id,
83         }
84
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/youtube_dl/extractor/dtube.py b/youtube_dl/extractor/dtube.py
--- a/youtube_dl/extractor/dtube.py
+++ b/youtube_dl/extractor/dtube.py
@@ -48,7 +48,7 @@
         def canonical_url(h):
             if not h:
                 return None
-            return 'https://ipfs.io/ipfs/' + h
+            return 'https://video.dtube.top/ipfs/' + h
 
         formats = []
         for q in ('240', '480', '720', '1080', ''):

{"golden_diff": "diff --git a/youtube_dl/extractor/dtube.py b/youtube_dl/extractor/dtube.py\n--- a/youtube_dl/extractor/dtube.py\n+++ b/youtube_dl/extractor/dtube.py\n@@ -48,7 +48,7 @@\n         def canonical_url(h):\n             if not h:\n                 return None\n-            return 'https://ipfs.io/ipfs/' + h\n+            return 'https://video.dtube.top/ipfs/' + h\n \n         formats = []\n         for q in ('240', '480', '720', '1080', ''):\n", "issue": "download from d.tube fails\n### Make sure you are using the *latest* version: run `youtube-dl --version` and ensure your version is *2019.01.02*. If it's not, read [this FAQ entry](https://github.com/rg3/youtube-dl/blob/master/README.md#how-do-i-update-youtube-dl) and update. Issues with outdated version will be rejected.\r\n- [x] I've **verified** and **I assure** that I'm running youtube-dl **2019.01.02**\r\n\r\n### Before submitting an *issue* make sure you have:\r\n- [x] At least skimmed through the [README](https://github.com/rg3/youtube-dl/blob/master/README.md), **most notably** the [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections\r\n- [x] [Searched](https://github.com/rg3/youtube-dl/search?type=Issues) the bugtracker for similar issues including closed ones\r\n- [x] Checked that provided video/audio/playlist URLs (if any) are alive and playable in a browser\r\n\r\n### What is the purpose of your *issue*?\r\n- [x] Bug report (encountered problems with youtube-dl)\r\n- [x] Site support request (request for __re__adding support for an existing site)\r\n- [ ] Feature request (request for a new functionality)\r\n- [ ] Question\r\n- [ ] Other\r\n\r\n### If the purpose of this *issue* is a *bug report*, *site support request* or you are not completely sure provide the full verbose output as follows:\r\n\r\nAdd the `-v` flag to **your command line** \r\n\r\n```\r\nuser@mymachine:~$ youtube-dl --verbose\r\n[debug] System config: []\r\n[debug] User config: []\r\n[debug] Custom config: []\r\n[debug] Command-line args: ['--verbose']\r\n[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8\r\n[debug] youtube-dl version 2019.01.02\r\n[debug] Python version 3.5.3 (CPython) - Linux-4.9.0-4-amd64-x86_64-with-debian-9.2\r\n[debug] exe versions: none\r\n[debug] Proxy map: {}\r\nUsage: youtube-dl [OPTIONS] URL [URL...]\r\n\r\nyoutube-dl: error: You must provide at least one URL.\r\nType youtube-dl --help to see a list of all options.\r\nuser@ mymachine:~$ youtube-dl --verbose \"https://d.tube/#!/v/dennisxxx/lgfrcata\"\r\nbash: !/v/dennisxxx/lgfrcata: event not found\r\n```\r\n### Description of your *issue*, suggested solution and other information\r\n\r\nDownload from d.tube failed. I am sorry to not being able to provide more information. If I can help/try anything else I will gladly do though....\n", "before_files": [{"content": "# coding: utf-8\nfrom __future__ import unicode_literals\n\nimport json\nimport re\nfrom socket import timeout\n\nfrom .common import InfoExtractor\nfrom ..utils import (\n    int_or_none,\n    parse_iso8601,\n)\n\n\nclass DTubeIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?d\\.tube/(?:#!/)?v/(?P<uploader_id>[0-9a-z.-]+)/(?P<id>[0-9a-z]{8})'\n    _TEST = {\n        'url': 'https://d.tube/#!/v/benswann/zqd630em',\n        'md5': 'a03eaa186618ffa7a3145945543a251e',\n        'info_dict': {\n            'id': 'zqd630em',\n            'ext': 'mp4',\n            'title': 'Reality Check: FDA\\'s Disinformation Campaign on Kratom',\n            'description': 'md5:700d164e066b87f9eac057949e4227c2',\n            'uploader_id': 'benswann',\n            'upload_date': '20180222',\n            'timestamp': 1519328958,\n        },\n        'params': {\n            'format': '480p',\n        },\n    }\n\n    def _real_extract(self, url):\n        uploader_id, video_id = re.match(self._VALID_URL, url).groups()\n        result = self._download_json('https://api.steemit.com/', video_id, data=json.dumps({\n            'jsonrpc': '2.0',\n            'method': 'get_content',\n            'params': [uploader_id, video_id],\n        }).encode())['result']\n\n        metadata = json.loads(result['json_metadata'])\n        video = metadata['video']\n        content = video['content']\n        info = video.get('info', {})\n        title = info.get('title') or result['title']\n\n        def canonical_url(h):\n            if not h:\n                return None\n            return 'https://ipfs.io/ipfs/' + h\n\n        formats = []\n        for q in ('240', '480', '720', '1080', ''):\n            video_url = canonical_url(content.get('video%shash' % q))\n            if not video_url:\n                continue\n            format_id = (q + 'p') if q else 'Source'\n            try:\n                self.to_screen('%s: Checking %s video format URL' % (video_id, format_id))\n                self._downloader._opener.open(video_url, timeout=5).close()\n            except timeout:\n                self.to_screen(\n                    '%s: %s URL is invalid, skipping' % (video_id, format_id))\n                continue\n            formats.append({\n                'format_id': format_id,\n                'url': video_url,\n                'height': int_or_none(q),\n                'ext': 'mp4',\n            })\n\n        return {\n            'id': video_id,\n            'title': title,\n            'description': content.get('description'),\n            'thumbnail': canonical_url(info.get('snaphash')),\n            'tags': content.get('tags') or metadata.get('tags'),\n            'duration': info.get('duration'),\n            'formats': formats,\n            'timestamp': parse_iso8601(result.get('created')),\n            'uploader_id': uploader_id,\n        }\n", "path": "youtube_dl/extractor/dtube.py"}], "after_files": [{"content": "# coding: utf-8\nfrom __future__ import unicode_literals\n\nimport json\nimport re\nfrom socket import timeout\n\nfrom .common import InfoExtractor\nfrom ..utils import (\n    int_or_none,\n    parse_iso8601,\n)\n\n\nclass DTubeIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?d\\.tube/(?:#!/)?v/(?P<uploader_id>[0-9a-z.-]+)/(?P<id>[0-9a-z]{8})'\n    _TEST = {\n        'url': 'https://d.tube/#!/v/benswann/zqd630em',\n        'md5': 'a03eaa186618ffa7a3145945543a251e',\n        'info_dict': {\n            'id': 'zqd630em',\n            'ext': 'mp4',\n            'title': 'Reality Check: FDA\\'s Disinformation Campaign on Kratom',\n            'description': 'md5:700d164e066b87f9eac057949e4227c2',\n            'uploader_id': 'benswann',\n            'upload_date': '20180222',\n            'timestamp': 1519328958,\n        },\n        'params': {\n            'format': '480p',\n        },\n    }\n\n    def _real_extract(self, url):\n        uploader_id, video_id = re.match(self._VALID_URL, url).groups()\n        result = self._download_json('https://api.steemit.com/', video_id, data=json.dumps({\n            'jsonrpc': '2.0',\n            'method': 'get_content',\n            'params': [uploader_id, video_id],\n        }).encode())['result']\n\n        metadata = json.loads(result['json_metadata'])\n        video = metadata['video']\n        content = video['content']\n        info = video.get('info', {})\n        title = info.get('title') or result['title']\n\n        def canonical_url(h):\n            if not h:\n                return None\n            return 'https://video.dtube.top/ipfs/' + h\n\n        formats = []\n        for q in ('240', '480', '720', '1080', ''):\n            video_url = canonical_url(content.get('video%shash' % q))\n            if not video_url:\n                continue\n            format_id = (q + 'p') if q else 'Source'\n            try:\n                self.to_screen('%s: Checking %s video format URL' % (video_id, format_id))\n                self._downloader._opener.open(video_url, timeout=5).close()\n            except timeout:\n                self.to_screen(\n                    '%s: %s URL is invalid, skipping' % (video_id, format_id))\n                continue\n            formats.append({\n                'format_id': format_id,\n                'url': video_url,\n                'height': int_or_none(q),\n                'ext': 'mp4',\n            })\n\n        return {\n            'id': video_id,\n            'title': title,\n            'description': content.get('description'),\n            'thumbnail': canonical_url(info.get('snaphash')),\n            'tags': content.get('tags') or metadata.get('tags'),\n            'duration': info.get('duration'),\n            'formats': formats,\n            'timestamp': parse_iso8601(result.get('created')),\n            'uploader_id': uploader_id,\n        }\n", "path": "youtube_dl/extractor/dtube.py"}]}