my-guix/.config/mpv/scripts/next-episode.lua

155 lines
4.4 KiB
Lua

local utils = require 'mp.utils'
local msg = require 'mp.msg'
local settings = {
filetypes = {
'jpg', 'jpeg', 'png', 'tif', 'tiff', 'gif', 'webp', 'svg', 'bmp',
'mp3', 'wav', 'ogm', 'flac', 'm4a', 'wma', 'ogg', 'opus',
'mkv', 'avi', 'mp4', 'ogv', 'webm', 'rmvb', 'flv', 'wmv', 'mpeg', 'mpg', 'm4v', '3gp'
},
--linux(true)/windows(false)/auto(nil)
linux_over_windows = nil,
--at end of directory jump to start and vice versa
allow_looping = true,
--order by natural (version) numbers, thus behaving case-insensitively and treating multi-digit numbers atomically
--e.x.: true will result in the following order: 09A 9A 09a 9a 10A 10a
-- while false will result in: 09a 09A 10a 10A 9a 9A
version_flag = true,
}
local filetype_lookup = {}
for _, ext in ipairs(settings.filetypes) do
filetype_lookup[ext] = true
end
--check os
if settings.linux_over_windows==nil then
local o = {}
if mp.get_property_native('options/vo-mmcss-profile', o) ~= o then
settings.linux_over_windows = false
else
settings.linux_over_windows = true
end
end
function show_osd_message(file)
mp.osd_message("Now playing: " .. file, 3) -- Adjust OSD display time as needed
end
function nexthandler()
movetofile(true)
end
function prevhandler()
movetofile(false)
end
function get_files_windows(dir)
local args = {
'powershell', '-NoProfile', '-Command', [[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
$path = "]]..dir..[["
$escapedPath = [WildcardPattern]::Escape($path)
cd $escapedPath
$list = (Get-ChildItem -File | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) }).Name
$string = ($list -join "/")
$u8list = [System.Text.Encoding]::UTF8.GetBytes($string)
[Console]::OpenStandardOutput().Write($u8list, 0, $u8list.Length)
}]]
}
local process = utils.subprocess({ args = args, cancellable = false })
return parse_files(process, '%/')
end
function get_files_linux(dir)
local flags = ('-1p' .. (settings.version_flag and 'v' or ''))
local args = { 'ls', flags, dir }
local process = utils.subprocess({ args = args, cancellable = false })
return parse_files(process, '\n')
end
function parse_files(res, delimiter)
if not res.error and res.status == 0 then
local valid_files = {}
for line in res.stdout:gmatch("[^"..delimiter.."]+") do
local ext = line:match("^.+%.(.+)$")
if ext and filetype_lookup[ext:lower()] then
table.insert(valid_files, line)
end
end
return valid_files, nil
else
return nil, res.error
end
end
function movetofile(forward)
if mp.get_property('filename'):match("^%a%a+:%/%/") then return end
local pwd = mp.get_property('working-directory')
local relpath = mp.get_property('path')
if not pwd or not relpath then return end
local path = utils.join_path(pwd, relpath)
local filename = mp.get_property("filename")
local dir = utils.split_path(path)
local files, error
if settings.linux_over_windows then
files, error = get_files_linux(dir)
else
files, error = get_files_windows(dir)
end
if not files then
msg.error("Subprocess failed: "..(error or ''))
return
end
local found = false
local memory = nil
local lastfile = true
local firstfile = nil
for _, file in ipairs(files) do
if found == true then
mp.commandv("loadfile", utils.join_path(dir, file), "replace")
lastfile = false
show_osd_message(file)
break
end
if file == filename then
found = true
if not forward then
lastfile = false
if settings.allow_looping and firstfile == nil then
found = false
else
if firstfile == nil then break end
mp.commandv("loadfile", utils.join_path(dir, memory), "replace")
show_osd_message(memory)
break
end
end
end
memory = file
if firstfile == nil then firstfile = file end
end
if lastfile and firstfile and settings.allow_looping then
mp.commandv("loadfile", utils.join_path(dir, firstfile), "replace")
show_osd_message(firstfile)
end
if not found and memory then
mp.commandv("loadfile", utils.join_path(dir, memory), "replace")
show_osd_message(memory)
end
end
mp.add_key_binding('Shift+RIGHT', 'nextfile', nexthandler)
mp.add_key_binding('Shift+LEFT', 'previousfile', prevhandler)