From 9d7d88f9e66bdab55c959f6d300a652fe9c05740 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 --- ...ind-and-use-system-youtube-dl-binary.patch | 130 ++++++++++++++++++ youtube_dl_gui/__init__.py | 10 +- youtube_dl_gui/downloaders.py | 11 +- youtube_dl_gui/downloadmanager.py | 8 +- youtube_dl_gui/utils.py | 6 + 5 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 0001-Find-and-use-system-youtube-dl-binary.patch diff --git a/0001-Find-and-use-system-youtube-dl-binary.patch b/0001-Find-and-use-system-youtube-dl-binary.patch new file mode 100644 index 00000000..8e5ec7f1 --- /dev/null +++ b/0001-Find-and-use-system-youtube-dl-binary.patch @@ -0,0 +1,130 @@ +From 8b8d7dd2f828b9c45192d1ce736c34020b9ca928 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 d8c0fe2..4988922 100644 +--- a/youtube_dl_gui/__init__.py ++++ b/youtube_dl_gui/__init__.py +@@ -51,7 +51,8 @@ from .utils import ( + get_config_path, + get_locale_file, + os_path_exists, +- YOUTUBEDL_BIN ++ YOUTUBEDL_BIN, ++ system_youtube_dl, + ) + + +@@ -81,7 +82,12 @@ from .mainframe import MainFrame + + 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 159ed6c..68e0363 100644 +--- a/youtube_dl_gui/downloaders.py ++++ b/youtube_dl_gui/downloaders.py +@@ -21,7 +21,10 @@ from time import sleep + 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 @@ class YoutubeDLDownloader(object): + 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 = ['python2', 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 a344829..0bfab71 100644 +--- a/youtube_dl_gui/downloadmanager.py ++++ b/youtube_dl_gui/downloadmanager.py +@@ -40,6 +40,7 @@ from .downloaders import YoutubeDLDownloader + + from .utils import ( + YOUTUBEDL_BIN, ++ system_youtube_dl, + os_path_exists, + format_bytes, + to_string, +@@ -506,7 +507,7 @@ class DownloadManager(Thread): + + 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 @@ class DownloadManager(Thread): + 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 729c007..a9a49be 100644 +--- a/youtube_dl_gui/utils.py ++++ b/youtube_dl_gui/utils.py +@@ -19,6 +19,9 @@ import math + 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 @@ YOUTUBEDL_BIN = 'youtube-dl' + 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"] + +-- +2.20.1 + 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"]