sanitize_path,
std_headers,
subtitles_filename,
- takewhile_inclusive,
UnavailableVideoError,
url_basename,
version_tuple,
(or video) as a single JSON line.
simulate: Do not download the video files.
format: Video format code. See options.py for more information.
- format_limit: Highest quality format to try.
outtmpl: Template for output names.
restrictfilenames: Do not allow "&" and spaces in file names
ignoreerrors: Do not stop on download errors.
return None
if format_spec == 'best' or format_spec is None:
- return available_formats[-1]
+ audiovideo_formats = [
+ f for f in available_formats
+ if f.get('vcodec') != 'none' and f.get('acodec') != 'none']
+ if audiovideo_formats:
+ return audiovideo_formats[-1]
+ # for audio only urls, 'best' selects the best audio format
+ elif all(f.get('acodec') != 'none' for f in available_formats):
+ return available_formats[-1]
elif format_spec == 'worst':
audiovideo_formats = [
f for f in available_formats
full_format_info.update(format)
format['http_headers'] = self._calc_headers(full_format_info)
- format_limit = self.params.get('format_limit', None)
- if format_limit:
- formats = list(takewhile_inclusive(
- lambda f: f['format_id'] != format_limit, formats
- ))
-
# TODO Central sorting goes here
if formats[0] is not info_dict:
req_format = self.params.get('format')
if req_format is None:
req_format_list = []
- if info_dict['extractor'] == 'youtube' and FFmpegMergerPP(self).available:
+ if info_dict['extractor'] in ['youtube', 'ted'] and FFmpegMergerPP(self).available:
req_format_list.append('bestvideo+bestaudio')
req_format_list.append('best')
req_format = '/'.join(req_format_list)
video_ext, audio_ext = audio.get('ext'), video.get('ext')
if video_ext and audio_ext:
COMPATIBLE_EXTS = (
- ('mp4', 'm4a', 'm4p', 'm4b', 'm4r', 'm4v'),
+ ('mp3', 'mp4', 'm4a', 'm4p', 'm4b', 'm4r', 'm4v'),
('webm')
)
for exts in COMPATIBLE_EXTS:
return False
requested_formats = info_dict['requested_formats']
- # Merge incompatible formats into mkv
- if not compatible_formats(requested_formats):
+ if self.params.get('merge_output_format') is None and not compatible_formats(requested_formats):
filename = os.path.splitext(filename)[0] + '.mkv'
- self.report_warning('You have requested formats uncompatible for merge. '
+ self.report_warning('You have requested formats incompatible for merge. '
'The formats will be merged into mkv')
if os.path.exists(encodeFilename(filename)):
self.to_screen(
pps_chain.extend(ie_info['__postprocessors'])
pps_chain.extend(self._pps)
for pp in pps_chain:
- old_filename = info['filepath']
try:
files_to_delete, info = pp.run(info)
except PostProcessingError as e: