aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/downloader
diff options
context:
space:
mode:
authorteddy171 <teddy171@qq.com>2023-02-10 04:19:27 +0800
committerdirkf <fieldhouse@gmx.net>2023-02-13 03:54:51 +0000
commit33db85c571304bbd6863e3407ad8d08764c9e53b (patch)
tree790456153d00d043364af84f5d20d31625699be5 /youtube_dl/downloader
parentf33923cba7670ea2e82f233c1f88210eb41f7c3b (diff)
downloadyoutube-dl-33db85c571304bbd6863e3407ad8d08764c9e53b.tar.xz
[feat]: Add support to external downloader aria2p (#31500)
* feat: add class Aria2pFD * feat: create call_downloader function * feat: a colorful download interface to aria2pFD * feat: change value name * Apply suggestions from code review Co-authored-by: dirkf <fieldhouse@gmx.net> * Typo in suggestion * fix: remove unused value * fix: add not function to return value(0 is normal); add total_seconds to download.eta(timedelta object); add waiting status when hook progress * fix: remove unuse method ..utils.format_bytes * fix: be up to flake8 * fix: be up to flake8 * Apply suggestions from code review * [feat] test external downloader aria2p * [feat] test external downloader aria2p * [fix] test_external_downloader.py * Apply suggestions from code review Co-authored-by: dirkf <fieldhouse@gmx.net> * Apply suggestions from code review Co-authored-by: dirkf <fieldhouse@gmx.net> * Update test/test_external_downloader.py Co-authored-by: dirkf <fieldhouse@gmx.net> * Update test/test_external_downloader.py Co-authored-by: dirkf <fieldhouse@gmx.net> * Update youtube_dl/downloader/external.py Co-authored-by: dirkf <fieldhouse@gmx.net> * refactoring code and fix bugs * Apply suggestions from code review * Rename test_external_downloader.py to test_downloader_external.py --------- Co-authored-by: dirkf <fieldhouse@gmx.net>
Diffstat (limited to 'youtube_dl/downloader')
-rw-r--r--youtube_dl/downloader/external.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/youtube_dl/downloader/external.py b/youtube_dl/downloader/external.py
index a06ab2e50..bffcd10b6 100644
--- a/youtube_dl/downloader/external.py
+++ b/youtube_dl/downloader/external.py
@@ -200,6 +200,64 @@ class Aria2cFD(ExternalFD):
return cmd
+class Aria2pFD(ExternalFD):
+ ''' Aria2pFD class
+ This class support to use aria2p as downloader.
+ (Aria2p, a command-line tool and Python library to interact with an aria2c daemon process
+ through JSON-RPC.)
+ It can help you to get download progress more easily.
+ To use aria2p as downloader, you need to install aria2c and aria2p, aria2p can download with pip.
+ Then run aria2c in the background and enable with the --enable-rpc option.
+ '''
+ try:
+ import aria2p
+ __avail = True
+ except ImportError:
+ __avail = False
+
+ @classmethod
+ def available(cls):
+ return cls.__avail
+
+ def _call_downloader(self, tmpfilename, info_dict):
+ aria2 = self.aria2p.API(
+ self.aria2p.Client(
+ host='http://localhost',
+ port=6800,
+ secret=''
+ )
+ )
+
+ options = {
+ 'min-split-size': '1M',
+ 'max-connection-per-server': 4,
+ 'auto-file-renaming': 'false',
+ }
+ options['dir'] = os.path.dirname(tmpfilename) or os.path.abspath('.')
+ options['out'] = os.path.basename(tmpfilename)
+ options['header'] = []
+ for key, val in info_dict['http_headers'].items():
+ options['header'].append('{0}: {1}'.format(key, val))
+ download = aria2.add_uris([info_dict['url']], options)
+ status = {
+ 'status': 'downloading',
+ 'tmpfilename': tmpfilename,
+ }
+ started = time.time()
+ while download.status in ['active', 'waiting']:
+ download = aria2.get_download(download.gid)
+ status.update({
+ 'downloaded_bytes': download.completed_length,
+ 'total_bytes': download.total_length,
+ 'elapsed': time.time() - started,
+ 'eta': download.eta.total_seconds(),
+ 'speed': download.download_speed,
+ })
+ self._hook_progress(status)
+ time.sleep(.5)
+ return download.status != 'complete'
+
+
class HttpieFD(ExternalFD):
@classmethod
def available(cls):