aboutsummaryrefslogtreecommitdiffstats
path: root/community/mpv/yt-dlp.patch
blob: 80b8a1bd270d85fd63b8752b774a94f677ab6d2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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