~alpine/aports

community/mpv: add yt-dlp patch v1 APPLIED

Drew DeVault: 1
 community/mpv: add yt-dlp patch

 2 files changed, 142 insertions(+), 1 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.alpinelinux.org/~alpine/aports/patches/3709/mbox | git am -3
Learn more about email & git

[PATCH] community/mpv: add yt-dlp patch Export this patch

---
youtube-dl is unmaintained and rapidly becoming less useful given that
the websites it extracts from are a moving target. This pulls a patch
from mpv's upcoming release which adds yt-dlp support, which is already
packaged in aports.

 community/mpv/APKBUILD     |   4 +-
 community/mpv/yt-dlp.patch | 139 +++++++++++++++++++++++++++++++++++++
 2 files changed, 142 insertions(+), 1 deletion(-)
 create mode 100644 community/mpv/yt-dlp.patch

diff --git a/community/mpv/APKBUILD b/community/mpv/APKBUILD
index f043bba03f..82cc6f2e58 100644
--- a/community/mpv/APKBUILD
+++ b/community/mpv/APKBUILD
@@ -5,7 +5,7 @@
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=mpv
pkgver=0.33.1
pkgrel=5
pkgrel=6
pkgdesc="Video player based on MPlayer/mplayer2"
url="https://mpv.io/"
arch="all"
@@ -63,6 +63,7 @@ subpackages="
	"
source="mpv-$pkgver.tar.gz::https://github.com/mpv-player/mpv/archive/v$pkgver.tar.gz
	placebo_upstream_api_changes.patch
	yt-dlp.patch
	"

# secfixes:
@@ -132,4 +133,5 @@ zshcomp() {
sha512sums="
99d6c40d18c5cf83814b44ec6d8eade229800c5b51a734c9bbe831c3aeb95f8931124c94f6ae2360ffff62053c163bc3c55b254df021e005b350ebc3df7e952b  mpv-0.33.1.tar.gz
92833a516fe995289a4de40703bdf57925d86d644404a4c37b6455d952605a83872898575ae0b44432a1eeb178476079ac53ccb5487cbb9b2704fbcd460fa4ad  placebo_upstream_api_changes.patch
400f3f2aca612b76ca49214a5dd2e5c540df9691cfc663c48d0b104fb547931925232bc5f4c5a5c9aa87747b0122dc22f188122a98f41df6da250b787e323e1d  yt-dlp.patch
"
diff --git a/community/mpv/yt-dlp.patch b/community/mpv/yt-dlp.patch
new file mode 100644
index 0000000000..80b8a1bd27
--- /dev/null
+++ b/community/mpv/yt-dlp.patch
@@ -0,0 +1,139 @@
From d1c92bfd79ef81ac804fcc20aee2ed24e8d587aa Mon Sep 17 00:00:00 2001
From: Guido Cella <guido@guidocella.xyz>
Date: Fri, 17 Sep 2021 09:37:09 +0200
Subject: [PATCH] ytdl_hook.lua: search for yt-dlp by default

Because youtube-dl is inactive and the yt-dlp fork is becoming more
popular, make mpv use yt-dlp without any extra configuration.

yt-dlp is ordered before youtube-dl because it's more obscure, so users
who have yt-dlp installed are more likely to want to use it rather than
youtube-dl.

Fixes #9208.
---
 DOCS/man/options.rst     |  8 +++--
 player/lua/ytdl_hook.lua | 66 +++++++++++++++++++++++++++++-----------
 2 files changed, 53 insertions(+), 21 deletions(-)

diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index c216f88edef..34d29db083a 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -995,9 +995,11 @@ Program Behavior
         no). It's disabled ("no") by default for performance reasons.
 
     ``ytdl_path=youtube-dl``
-        Configure path to youtube-dl executable or a compatible fork's.
-        The default "youtube-dl" looks for the executable in PATH. In a Windows
-        environment the suffix extension ".exe" is always appended.
+        Configure paths to youtube-dl's executable or a compatible fork's. The
+        paths should be separated by : on Unix and ; on Windows. mpv looks in
+        order for the configured paths in PATH and in mpv's config directory.
+        The defaults are "yt-dlp", "yt-dlp_x86" and "youtube-dl". On Windows
+        the suffix extension ".exe" is always appended.
 
     .. admonition:: Why do the option names mix ``_`` and ``-``?
 
diff --git a/player/lua/ytdl_hook.lua b/player/lua/ytdl_hook.lua
index b9cb04645e4..27d39afb753 100644
--- a/player/lua/ytdl_hook.lua
+++ b/player/lua/ytdl_hook.lua
@@ -8,11 +8,12 @@ local o = {
     use_manifests = false,
     all_formats = false,
     force_all_formats = true,
-    ytdl_path = "youtube-dl",
+    ytdl_path = "",
 }
 
 local ytdl = {
-    path = nil,
+    path = "",
+    paths_to_search = {"yt-dlp", "yt-dlp_x86", "youtube-dl"},
     searched = false,
     blacklisted = {}
 }
@@ -88,7 +89,13 @@ local function map_codec_to_mpv(codec)
     return nil
 end
 
+local function platform_is_windows()
+    return package.config:sub(1,1) == "\\"
+end
+
 local function exec(args)
+    msg.debug("Running: " .. table.concat(args, " "))
+
     local ret = mp.command_native({name = "subprocess",
                                    args = args,
                                    capture_stdout = true,
@@ -718,20 +725,6 @@ end
 function run_ytdl_hook(url)
     local start_time = os.clock()
 
-    -- check for youtube-dl in mpv's config dir
-    if not (ytdl.searched) then
-        local exesuf = (package.config:sub(1,1) == '\\') and '.exe' or ''
-        local ytdl_mcd = mp.find_config_file(o.ytdl_path .. exesuf)
-        if ytdl_mcd == nil then
-            msg.verbose("No youtube-dl found with path "..o.ytdl_path..exesuf.." in config directories")
-            ytdl.path = o.ytdl_path
-        else
-            msg.verbose("found youtube-dl at: " .. ytdl_mcd)
-            ytdl.path = ytdl_mcd
-        end
-        ytdl.searched = true
-    end
-
     -- strip ytdl://
     if (url:find("ytdl://") == 1) then
         url = url:sub(8)
@@ -786,8 +779,45 @@ function run_ytdl_hook(url)
     end
     table.insert(command, "--")
     table.insert(command, url)
-    msg.debug("Running: " .. table.concat(command,' '))
-    local es, json, result, aborted = exec(command)
+
+    local es, json, result, aborted
+    if ytdl.searched then
+        es, json, result, aborted = exec(command)
+    else
+        local separator = platform_is_windows() and ";" or ":"
+        if o.ytdl_path:match("[^" .. separator .. "]") then
+            ytdl.paths_to_search = {}
+            for path in o.ytdl_path:gmatch("[^" .. separator .. "]+") do
+                table.insert(ytdl.paths_to_search, path)
+            end
+        end
+
+        for _, path in pairs(ytdl.paths_to_search) do
+            -- search for youtube-dl in mpv's config dir
+            local exesuf = platform_is_windows() and ".exe" or ""
+            local ytdl_cmd = mp.find_config_file(path .. exesuf)
+            if ytdl_cmd then
+                msg.verbose("Found youtube-dl at: " .. ytdl_cmd)
+                ytdl.path = ytdl_cmd
+                command[1] = ytdl.path
+                es, json, result, aborted = exec(command)
+                break
+            else
+                msg.verbose("No youtube-dl found with path " .. path .. exesuf .. " in config directories")
+                command[1] = path
+                es, json, result, aborted = exec(command)
+                if result.error_string == "init" then
+                    msg.verbose("youtube-dl with path " .. path .. exesuf .. " not found in PATH or not enough permissions")
+                else
+                    msg.verbose("Found youtube-dl with path " .. path .. exesuf .. " in PATH")
+                    ytdl.path = path
+                    break
+                end
+            end
+        end
+
+        ytdl.searched = true
+    end
 
     if aborted then
         return
-- 
2.33.0