mirror of
https://github.com/yt-dlp/yt-dlp
synced 2024-12-27 21:59:17 +01:00
bcec568ea7
Add ffmpeg progress tracking to FFmpegPostProcessor Apply changes from the code review Fix a bug where the subprocess didn't capture any output thus an empty stdout and stderr were sent back Add missing hooks Revert "Add missing hooks" This reverts commit a359c5ea10bb35b965e80801e736f43cdbcf3294. Add support of -ss=132 timestamp format Infer filename from ffmpeg args instead of info_dic Remove redundant parenthesis and switch from to_stodout to to_screen Add info kwarg with multiple files and ffmpeg to track progress Moved format progress function to util Moved format progress function to util Add progress tracking to postprocessing operations Fix typing error Handle self._downloader is None at __init__ Move format progress functions to utils Move format progress functions to utils Handle case where ydl passed is None Handle case where ydl passed is None Handle case where _multiline isn't initialized Handle case where _multiline isn't initialized Fix streams incorrectly returned Fix case where ydl is nested in the downloader Add progress_hook attribute Fix bug after merge Fix import bugs after merge Catch up with upstream Fix merge errors #1 Adapt tests and implementatation for ffmpeg progress tracking args
142 lines
4.9 KiB
Python
142 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
|
|
# Allow direct execution
|
|
import os
|
|
import sys
|
|
import unittest
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
import http.cookiejar
|
|
|
|
from test.helper import FakeYDL
|
|
from yt_dlp.downloader.external import (
|
|
Aria2cFD,
|
|
AxelFD,
|
|
CurlFD,
|
|
FFmpegFD,
|
|
HttpieFD,
|
|
WgetFD,
|
|
)
|
|
|
|
TEST_COOKIE = {
|
|
'version': 0,
|
|
'name': 'test',
|
|
'value': 'ytdlp',
|
|
'port': None,
|
|
'port_specified': False,
|
|
'domain': '.example.com',
|
|
'domain_specified': True,
|
|
'domain_initial_dot': False,
|
|
'path': '/',
|
|
'path_specified': True,
|
|
'secure': False,
|
|
'expires': None,
|
|
'discard': False,
|
|
'comment': None,
|
|
'comment_url': None,
|
|
'rest': {},
|
|
}
|
|
|
|
TEST_INFO = {'url': 'http://www.example.com/'}
|
|
|
|
|
|
class TestHttpieFD(unittest.TestCase):
|
|
def test_make_cmd(self):
|
|
with FakeYDL() as ydl:
|
|
downloader = HttpieFD(ydl, {})
|
|
self.assertEqual(
|
|
downloader._make_cmd('test', TEST_INFO),
|
|
['http', '--download', '--output', 'test', 'http://www.example.com/'])
|
|
|
|
# Test cookie header is added
|
|
ydl.cookiejar.set_cookie(http.cookiejar.Cookie(**TEST_COOKIE))
|
|
self.assertEqual(
|
|
downloader._make_cmd('test', TEST_INFO),
|
|
['http', '--download', '--output', 'test', 'http://www.example.com/', 'Cookie:test=ytdlp'])
|
|
|
|
|
|
class TestAxelFD(unittest.TestCase):
|
|
def test_make_cmd(self):
|
|
with FakeYDL() as ydl:
|
|
downloader = AxelFD(ydl, {})
|
|
self.assertEqual(
|
|
downloader._make_cmd('test', TEST_INFO),
|
|
['axel', '-o', 'test', '--', 'http://www.example.com/'])
|
|
|
|
# Test cookie header is added
|
|
ydl.cookiejar.set_cookie(http.cookiejar.Cookie(**TEST_COOKIE))
|
|
self.assertEqual(
|
|
downloader._make_cmd('test', TEST_INFO),
|
|
['axel', '-o', 'test', '-H', 'Cookie: test=ytdlp', '--max-redirect=0', '--', 'http://www.example.com/'])
|
|
|
|
|
|
class TestWgetFD(unittest.TestCase):
|
|
def test_make_cmd(self):
|
|
with FakeYDL() as ydl:
|
|
downloader = WgetFD(ydl, {})
|
|
self.assertNotIn('--load-cookies', downloader._make_cmd('test', TEST_INFO))
|
|
# Test cookiejar tempfile arg is added
|
|
ydl.cookiejar.set_cookie(http.cookiejar.Cookie(**TEST_COOKIE))
|
|
self.assertIn('--load-cookies', downloader._make_cmd('test', TEST_INFO))
|
|
|
|
|
|
class TestCurlFD(unittest.TestCase):
|
|
def test_make_cmd(self):
|
|
with FakeYDL() as ydl:
|
|
downloader = CurlFD(ydl, {})
|
|
self.assertNotIn('--cookie', downloader._make_cmd('test', TEST_INFO))
|
|
# Test cookie header is added
|
|
ydl.cookiejar.set_cookie(http.cookiejar.Cookie(**TEST_COOKIE))
|
|
self.assertIn('--cookie', downloader._make_cmd('test', TEST_INFO))
|
|
self.assertIn('test=ytdlp', downloader._make_cmd('test', TEST_INFO))
|
|
|
|
|
|
class TestAria2cFD(unittest.TestCase):
|
|
def test_make_cmd(self):
|
|
with FakeYDL() as ydl:
|
|
downloader = Aria2cFD(ydl, {})
|
|
downloader._make_cmd('test', TEST_INFO)
|
|
self.assertFalse(hasattr(downloader, '_cookies_tempfile'))
|
|
|
|
# Test cookiejar tempfile arg is added
|
|
ydl.cookiejar.set_cookie(http.cookiejar.Cookie(**TEST_COOKIE))
|
|
cmd = downloader._make_cmd('test', TEST_INFO)
|
|
self.assertIn(f'--load-cookies={downloader._cookies_tempfile}', cmd)
|
|
|
|
|
|
@unittest.skipUnless(FFmpegFD.available(), 'ffmpeg not found')
|
|
class TestFFmpegFD(unittest.TestCase):
|
|
_args = []
|
|
|
|
def _test_cmd(self, args):
|
|
self._args = args
|
|
|
|
def test_make_cmd(self):
|
|
with FakeYDL() as ydl:
|
|
downloader = FFmpegFD(ydl, {})
|
|
downloader._debug_cmd = self._test_cmd
|
|
|
|
downloader._call_downloader('test', {**TEST_INFO, 'ext': 'mp4'})
|
|
self.assertEqual(self._args, [
|
|
'ffmpeg', '-y', '-hide_banner', '-i', 'http://www.example.com/',
|
|
'-c', 'copy', '-f', 'mp4', 'file:test', '-progress', 'pipe:1'])
|
|
|
|
# Test cookies arg is added
|
|
ydl.cookiejar.set_cookie(http.cookiejar.Cookie(**TEST_COOKIE))
|
|
downloader._call_downloader('test', {**TEST_INFO, 'ext': 'mp4'})
|
|
self.assertEqual(self._args, [
|
|
'ffmpeg', '-y', '-hide_banner', '-cookies',
|
|
'test=ytdlp; path=/; domain=.example.com;\r\n', '-i',
|
|
'http://www.example.com/', '-c', 'copy', '-f', 'mp4',
|
|
'file:test', '-progress', 'pipe:1'])
|
|
|
|
# Test with non-url input (ffmpeg reads from stdin '-' for websockets)
|
|
downloader._call_downloader('test', {'url': 'x', 'ext': 'mp4'})
|
|
self.assertEqual(self._args, [
|
|
'ffmpeg', '-y', '-hide_banner', '-i', 'x', '-c', 'copy', '-f',
|
|
'mp4', 'file:test', '-progress', 'pipe:1'])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|