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

From: Drew DeVault <[email-masked]>
Date: Thu, 7 Oct 2021 12:51:38 +0200

---
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 <[email-masked]>
 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 <[email-masked]>
+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