Skip to content

Commit

Permalink
ytdl_hook.lua: search for yt-dlp by default
Browse files Browse the repository at this point in the history
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.

exists_in_path is based on
https://github.com/TheAMM/mpv_script_libs/blob/master/helpers.lua

Fixes #9208.
  • Loading branch information
guidocella committed Sep 14, 2021
1 parent 62b2c5d commit 872b41c
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 21 deletions.
8 changes: 5 additions & 3 deletions DOCS/man/options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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 ``-``?

Expand Down
65 changes: 47 additions & 18 deletions player/lua/ytdl_hook.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}
}
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -786,8 +779,44 @@ 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
if o.ytdl_path:match("[^" .. (platform_is_windows() and ";" or ":") .. "]") then
ytdl.paths_to_search = {}
for path in o.ytdl_path:gmatch("[^" .. (platform_is_windows() and ";" or ":") .. "]+") 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 = o.ytdl_path
break
end
end
end

ytdl.searched = true
end

if aborted then
return
Expand Down

0 comments on commit 872b41c

Please sign in to comment.