Skip to content

Instantly share code, notes, and snippets.

@wiiaboo
Created February 25, 2017 15:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save wiiaboo/a8f355905aaa2da5f11f5202d9a0d099 to your computer and use it in GitHub Desktop.
Save wiiaboo/a8f355905aaa2da5f11f5202d9a0d099 to your computer and use it in GitHub Desktop.
-- autoloadtxt.lua
-- autoload .txt subtitles respecting --sub-auto setting
-- hacked from autoload.lua
local msg = require 'mp.msg'
local options = require 'mp.options'
local utils = require 'mp.utils'
o = { disabled = false }
options.read_options(o)
function split_ext(path)
return string.match(path, "^(.+)%.([^%.]+)$")
end
table.filter = function(t, iter)
for i = #t, 1, -1 do
if not iter(t[i]) then
table.remove(t, i)
end
end
end
function find_and_add_entries()
local path = mp.get_property("path", "")
local dir, filename = utils.split_path(path)
local name, ext = string.match(filename, "(.+)%.([^%.]+)$")
local fuzz = mp.get_property("sub-auto", "no")
if o.disabled or #dir == 0 or fuzz == "no" then
return
end
local files = utils.readdir(dir, "files")
if not files then
return
end
local logdir, logfile = utils.split_path(mp.get_property("log-file", ""))
table.filter(files, function (v, k)
local sname, sext = split_ext(v:lower())
local name = name:lower()
if fuzz=="all" and logfile and
logdir:lower()==dir:lower() and
logfile:lower()==v then
return false
end
return (sext:lower() == "txt") and
(
(fuzz=="exact" and sname==name) or
(fuzz=="fuzzy" and sname:find(name)==1) or
fuzz=="all"
)
end)
table.sort(files, function (a, b)
local len = string.len(a) - string.len(b)
if len ~= 0 then -- case for ordering filename ending with such as X.Y.Z
local _, ext = split_ext(a)
local ext = string.len(ext) + 1
return string.sub(a, 1, -ext) < string.sub(b, 1, -ext)
end
return string.lower(a) < string.lower(b)
end)
msg.verbose("candidates:", utils.to_string(files))
if dir == "." then
dir = ""
end
for i = 1,#files do
local subpath = files[i]
local subname = split_ext(subpath)
if subname:lower() == name:lower() then
mp.commandv('sub-add', utils.join_path(dir,subpath), 'select')
elseif fuzz == "all" or
(fuzz == "fuzzy" and subname:lower():find(name:lower()) == 1) then
mp.commandv('sub-add', utils.join_path(dir,subpath), 'auto')
end
end
end
mp.register_event("start-file", find_and_add_entries)
@milahu
Copy link

milahu commented Mar 28, 2024

this fails on files without file extension

error: attempt to index local 'sext' (a nil value)

fix:

-        return (sext:lower() == "txt") and
+        return sext and (sext:lower() == "txt") and

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment