mirror of https://github.com/mpv-player/mpv
TOOLS/lua/autoload: allow multiple ignore_patterns
This commit is contained in:
parent
96b34148f1
commit
3ca71b0c0e
|
@ -10,7 +10,11 @@
|
|||
To configure this script use file autoload.conf in directory script-opts (the "script-opts"
|
||||
directory must be in the mpv configuration directory, typically ~/.config/mpv/).
|
||||
|
||||
See details of ignore_pattern format at lua.org/pil/20.2.html.
|
||||
Option `ignore_patterns` is a comma-separated list of patterns (see lua.org/pil/20.2.html).
|
||||
Additionally to the standard lua patterns, you can also escape commas with `%`,
|
||||
for example, the option `bak%,x%,,another` will be resolved as patterns `bak,x,` and `another`.
|
||||
But it does not mean you need to escape all lua patterns twice,
|
||||
so the option `bak%%,%.mp4,` will be resolved as two patterns `bak%%` and `%.mp4`.
|
||||
|
||||
Example configuration would be:
|
||||
|
||||
|
@ -24,13 +28,12 @@ additional_audio_exts=list,of,ext
|
|||
ignore_hidden=yes
|
||||
same_type=yes
|
||||
directory_mode=recursive
|
||||
ignore_pattern=%.bak%.mp4$
|
||||
ignore_patterns=^~,^bak-,%.bak%.mp4$
|
||||
|
||||
--]]
|
||||
|
||||
MAXENTRIES = 5000
|
||||
MAXDIRSTACK = 20
|
||||
NEVERMATCHPATTERN = "$^"
|
||||
|
||||
local msg = require 'mp.msg'
|
||||
local options = require 'mp.options'
|
||||
|
@ -47,7 +50,7 @@ o = {
|
|||
ignore_hidden = true,
|
||||
same_type = false,
|
||||
directory_mode = "auto",
|
||||
ignore_pattern = NEVERMATCHPATTERN
|
||||
ignore_patterns = ""
|
||||
}
|
||||
options.read_options(o, nil, function(list)
|
||||
split_option_exts(list.additional_video_exts, list.additional_audio_exts, list.additional_image_exts)
|
||||
|
@ -72,9 +75,45 @@ function SetUnion (a,b)
|
|||
return a
|
||||
end
|
||||
|
||||
function Split (s)
|
||||
-- Returns first and last positions in string or past-to-end indices
|
||||
function FindOrPastTheEnd (string, pattern, start_at)
|
||||
local pos1, pos2 = string.find(string, pattern, start_at)
|
||||
return pos1 or #string + 1,
|
||||
pos2 or #string + 1
|
||||
end
|
||||
|
||||
function Split (list)
|
||||
local set = {}
|
||||
for v in string.gmatch(s, '([^,]+)') do set[v] = true end
|
||||
|
||||
local item_pos = 1
|
||||
local item = ""
|
||||
|
||||
while item_pos <= #list do
|
||||
local pos1, pos2 = FindOrPastTheEnd(list, "%%*,", item_pos)
|
||||
|
||||
local pattern_length = pos2 - pos1
|
||||
local is_comma_escaped = pattern_length % 2
|
||||
|
||||
local pos_before_escape = pos1 - 1
|
||||
local item_escape_count = pattern_length - is_comma_escaped
|
||||
|
||||
item = item .. string.sub(list, item_pos, pos_before_escape + item_escape_count)
|
||||
|
||||
if is_comma_escaped == 1 then
|
||||
item = item .. ","
|
||||
else
|
||||
set[item] = true
|
||||
item = ""
|
||||
end
|
||||
|
||||
item_pos = pos2 + 1
|
||||
end
|
||||
|
||||
set[item] = true
|
||||
|
||||
-- exclude empty items
|
||||
set[""] = nil
|
||||
|
||||
return set
|
||||
end
|
||||
|
||||
|
@ -100,6 +139,11 @@ function split_option_exts(video, audio, image)
|
|||
end
|
||||
split_option_exts(true, true, true)
|
||||
|
||||
function split_patterns()
|
||||
o.ignore_patterns = Split(o.ignore_patterns)
|
||||
end
|
||||
split_patterns()
|
||||
|
||||
function create_extensions()
|
||||
EXTENSIONS = {}
|
||||
EXTENSIONS_VIDEO = {}
|
||||
|
@ -144,6 +188,16 @@ function get_extension(path)
|
|||
end
|
||||
end
|
||||
|
||||
function is_ignored(file)
|
||||
for pattern, _ in pairs(o.ignore_patterns) do
|
||||
if string.match(file, pattern) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
table.filter = function(t, iter)
|
||||
for i = #t, 1, -1 do
|
||||
if not iter(t[i]) then
|
||||
|
@ -195,11 +249,11 @@ function scan_dir(path, current_file, dir_mode, separator, dir_depth, total_file
|
|||
-- The current file could be a hidden file, ignoring it doesn't load other
|
||||
-- files from the current directory.
|
||||
local current = prefix .. v == current_file
|
||||
if (o.ignore_hidden and not current and string.match(v, "^%.")) then
|
||||
if o.ignore_hidden and not current and string.match(v, "^%.") then
|
||||
return false
|
||||
end
|
||||
if (not current and string.match(v, o.ignore_pattern)) then
|
||||
return false;
|
||||
if not current and is_ignored(v) then
|
||||
return false
|
||||
end
|
||||
|
||||
local ext = get_extension(v)
|
||||
|
|
Loading…
Reference in New Issue