From 6a7d3a0a0981d05903e70bcb31fc3f9438eedf22 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Sat, 30 Jul 2022 23:47:14 +0530 Subject: [PATCH] [ffmpeg] Set `ffmpeg_location` in a contextvar Fixes #2191 for the CLI, but not when used through the API --- yt_dlp/__init__.py | 6 ++++++ yt_dlp/postprocessor/ffmpeg.py | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index 5b9b3541c..24f6153e0 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -19,6 +19,7 @@ from .extractor.adobepass import MSO_INFO from .extractor.common import InfoExtractor from .options import parseOpts from .postprocessor import ( + FFmpegPostProcessor, FFmpegExtractAudioPP, FFmpegSubtitlesConvertorPP, FFmpegThumbnailsConvertorPP, @@ -899,6 +900,11 @@ def _real_main(argv=None): if print_extractor_information(opts, all_urls): return + # We may need ffmpeg_location without having access to the YoutubeDL instance + # See https://github.com/yt-dlp/yt-dlp/issues/2191 + if opts.ffmpeg_location: + FFmpegPostProcessor._ffmpeg_location.set(opts.ffmpeg_location) + with YoutubeDL(ydl_opts) as ydl: pre_process = opts.update_self or opts.rm_cachedir actual_use = all_urls or opts.load_info_filename diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index c3b9ac7fa..f77ca427e 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -1,4 +1,5 @@ import collections +import contextvars import itertools import json import os @@ -81,6 +82,8 @@ class FFmpegPostProcessorError(PostProcessingError): class FFmpegPostProcessor(PostProcessor): + _ffmpeg_location = contextvars.ContextVar('ffmpeg_location', default=None) + def __init__(self, downloader=None): PostProcessor.__init__(self, downloader) self._prefer_ffmpeg = self.get_param('prefer_ffmpeg', True) @@ -100,7 +103,7 @@ class FFmpegPostProcessor(PostProcessor): def _determine_executables(self): programs = [*self._ffmpeg_to_avconv.keys(), *self._ffmpeg_to_avconv.values()] - location = self.get_param('ffmpeg_location') + location = self.get_param('ffmpeg_location', self._ffmpeg_location.get()) if location is None: return {p: p for p in programs}