summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/options.rst20
-rw-r--r--player/lua/ytdl_hook.lua34
2 files changed, 50 insertions, 4 deletions
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index cfe586f03c..6f20a4f3f5 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -531,6 +531,26 @@ Program Behavior
If the script can't do anything with an URL, it will do nothing.
+ The `exclude` script option accepts a comma-separated list of URL patterns
+ which mpv should not use with youtube-dl. The patterns are matched after
+ the ``http(s)://`` part of the URL.
+
+ ``^`` matches the beginning of the URL, ``$`` matches its end, and you
+ should use ``%`` before any of the characters ``^$()%,.[]*+-?`` to match
+ that character.
+
+ .. admonition:: Example
+
+ ``--script-opts=ytdl_hook-exclude='^youtube%.com'`` will exclude any
+ URL that starts with ``http://youtube.com`` or
+ ``https://youtube.com``.
+ ``--script-opts=ytdl_hook-exclude='%.mkv$,%.mp4$'`` will exclude any
+ URL that ends with ``.mkv`` or ``.mp4``.
+
+ See more `lua patterns here`__.
+ __ https://www.lua.org/manual/5.1/manual.html#5.4.1
+
+
``--ytdl-format=<best|worst|mp4|webm|...>``
Video format/quality that is directly passed to youtube-dl. The possible
values are specific to the website and the video, for a given url the
diff --git a/player/lua/ytdl_hook.lua b/player/lua/ytdl_hook.lua
index 11a252af00..b01bf68f30 100644
--- a/player/lua/ytdl_hook.lua
+++ b/player/lua/ytdl_hook.lua
@@ -1,9 +1,15 @@
local utils = require 'mp.utils'
local msg = require 'mp.msg'
+local options = require 'mp.options'
+
+local o = {
+ exclude = ""
+}
local ytdl = {
path = "youtube-dl",
- searched = false
+ searched = false,
+ blacklisted = {}
}
local chapter_list = {}
@@ -93,6 +99,27 @@ local function extract_chapters(data, video_length)
return ret
end
+local function is_blacklisted(url)
+ if o.blacklist == "" then return false end
+ if #ytdl.blacklisted == 0 then
+ local joined = o.blacklist
+ while joined:match(',?[^,]+') do
+ local _, e, domain = joined:find(',?([^,]+)')
+ table.insert(ytdl.blacklisted, domain)
+ joined = joined:sub(e+1)
+ end
+ end
+ if #ytdl.blacklisted > 0 then
+ url = url:match('https?://(.+)')
+ for _, exclude in ipairs(ytdl.blacklisted) do
+ if url:match(exclude) then
+ return true
+ end
+ end
+ end
+ return false
+end
+
local function edl_track_joined(fragments, protocol, is_live)
if not (type(fragments) == "table") or not fragments[1] then
msg.debug("No fragments to join into EDL")
@@ -244,9 +271,8 @@ end
mp.add_hook("on_load", 10, function ()
local url = mp.get_property("stream-open-filename")
local start_time = os.clock()
-
- if (url:find("http://") == 1) or (url:find("https://") == 1)
- or (url:find("ytdl://") == 1) then
+ if (url:find("ytdl://") == 1) or
+ ((url:find("https?://") == 1) and not is_blacklisted(url)) then
-- check for youtube-dl in mpv's config dir
if not (ytdl.searched) then