mirror of
https://github.com/l1ving/youtube-dl
synced 2024-12-28 02:22:51 +08:00
3bc2ddccc8
A suitable downloader can be found using the 'get_suitable_downloader' function. Each subclass implements 'real_download', for downloading an info dict you call the 'download' method, which first checks if the video has already been downloaded
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import os
|
|
import subprocess
|
|
|
|
from .common import FileDownloader
|
|
from ..utils import (
|
|
encodeFilename,
|
|
)
|
|
|
|
|
|
class HlsFD(FileDownloader):
|
|
def real_download(self, filename, info_dict):
|
|
url = info_dict['url']
|
|
self.report_destination(filename)
|
|
tmpfilename = self.temp_name(filename)
|
|
|
|
args = ['-y', '-i', url, '-f', 'mp4', '-c', 'copy',
|
|
'-bsf:a', 'aac_adtstoasc', tmpfilename]
|
|
|
|
for program in ['avconv', 'ffmpeg']:
|
|
try:
|
|
subprocess.call([program, '-version'], stdout=(open(os.path.devnull, 'w')), stderr=subprocess.STDOUT)
|
|
break
|
|
except (OSError, IOError):
|
|
pass
|
|
else:
|
|
self.report_error(u'm3u8 download detected but ffmpeg or avconv could not be found')
|
|
cmd = [program] + args
|
|
|
|
retval = subprocess.call(cmd)
|
|
if retval == 0:
|
|
fsize = os.path.getsize(encodeFilename(tmpfilename))
|
|
self.to_screen(u'\r[%s] %s bytes' % (args[0], fsize))
|
|
self.try_rename(tmpfilename, filename)
|
|
self._hook_progress({
|
|
'downloaded_bytes': fsize,
|
|
'total_bytes': fsize,
|
|
'filename': filename,
|
|
'status': 'finished',
|
|
})
|
|
return True
|
|
else:
|
|
self.to_stderr(u"\n")
|
|
self.report_error(u'ffmpeg exited with code %d' % retval)
|
|
return False
|