From 0d1a59487dc14ec7a66c51c3d655df28b888158b Mon Sep 17 00:00:00 2001 From: Mikhail Novosyolov Date: Fri, 12 Jul 2019 14:51:05 +0300 Subject: [PATCH] Find and use system youtube-dl binary Fallback to downloading it from the internet if a system one is not available --- youtube_dl_gui/__init__.py | 10 ++++++++-- youtube_dl_gui/downloaders.py | 11 +++++++++-- youtube_dl_gui/downloadmanager.py | 8 ++++++-- youtube_dl_gui/utils.py | 6 ++++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/youtube_dl_gui/__init__.py b/youtube_dl_gui/__init__.py index d8c0fe2b..4988922f 100644 --- a/youtube_dl_gui/__init__.py +++ b/youtube_dl_gui/__init__.py @@ -51,7 +51,8 @@ get_config_path, get_locale_file, os_path_exists, - YOUTUBEDL_BIN + YOUTUBEDL_BIN, + system_youtube_dl, ) @@ -81,7 +82,12 @@ def main(): """The real main. Creates and calls the main app windows. """ - youtubedl_path = os.path.join(opt_manager.options["youtubedl_path"], YOUTUBEDL_BIN) + + if system_youtube_dl is not None: + youtubedl_path = system_youtube_dl + print("Found and using system youtube-dl") + else: + youtubedl_path = os.path.join(opt_manager.options["youtubedl_path"], YOUTUBEDL_BIN) app = wx.App() frame = MainFrame(opt_manager, log_manager) diff --git a/youtube_dl_gui/downloaders.py b/youtube_dl_gui/downloaders.py index 159ed6c0..3ef0584e 100644 --- a/youtube_dl_gui/downloaders.py +++ b/youtube_dl_gui/downloaders.py @@ -21,7 +21,10 @@ from Queue import Queue from threading import Thread -from .utils import convert_item +from .utils import ( + convert_item, + system_youtube_dl, +) class PipeReader(Thread): @@ -314,7 +317,11 @@ def _get_cmd(self, url, options): if os.name == 'nt': cmd = [self.youtubedl_path] + options + [url] else: - cmd = ['python', self.youtubedl_path] + options + [url] + if (system_youtube_dl is None): + cmd = ['python', self.youtubedl_path] + options + [url] + else: + cmd = [system_youtube_dl] + options + [url] + #print("Executing cmd: ", cmd) return cmd diff --git a/youtube_dl_gui/downloadmanager.py b/youtube_dl_gui/downloadmanager.py index a344829f..0bfab712 100644 --- a/youtube_dl_gui/downloadmanager.py +++ b/youtube_dl_gui/downloadmanager.py @@ -40,6 +40,7 @@ from .utils import ( YOUTUBEDL_BIN, + system_youtube_dl, os_path_exists, format_bytes, to_string, @@ -506,7 +507,7 @@ def _talk_to_gui(self, data): def _check_youtubedl(self): """Check if youtube-dl binary exists. If not try to download it. """ - if not os_path_exists(self._youtubedl_path()) and self.parent.update_thread is None: + if (system_youtube_dl is None) and not os_path_exists(self._youtubedl_path()) and self.parent.update_thread is None: self.parent.update_thread = UpdateThread(self.opt_manager.options['youtubedl_path'], True) self.parent.update_thread.join() self.parent.update_thread = None @@ -529,7 +530,10 @@ def _jobs_done(self): def _youtubedl_path(self): """Returns the path to youtube-dl binary. """ path = self.opt_manager.options['youtubedl_path'] - path = os.path.join(path, YOUTUBEDL_BIN) + if system_youtube_dl is not None: + path = system_youtube_dl + else: + path = os.path.join(self.opt_manager.options["youtubedl_path"], YOUTUBEDL_BIN) return path diff --git a/youtube_dl_gui/utils.py b/youtube_dl_gui/utils.py index 729c0079..a9a49be5 100644 --- a/youtube_dl_gui/utils.py +++ b/youtube_dl_gui/utils.py @@ -19,6 +19,9 @@ import locale import subprocess +import distutils +from distutils.spawn import find_executable + try: from twodict import TwoWayOrderedDict except ImportError as error: @@ -36,6 +39,9 @@ if os.name == 'nt': YOUTUBEDL_BIN += '.exe' +# Prefer system youtube-dl; if it does not exist, fallback to downloading +# it in downloadmanager.py/_check_youtubedl +system_youtube_dl = find_executable(YOUTUBEDL_BIN) FILESIZE_METRICS = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]