diff options
Diffstat (limited to 'mac/.config/mpv/scripts/delete_current_file.lua')
| -rw-r--r-- | mac/.config/mpv/scripts/delete_current_file.lua | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/mac/.config/mpv/scripts/delete_current_file.lua b/mac/.config/mpv/scripts/delete_current_file.lua new file mode 100644 index 0000000..972f681 --- /dev/null +++ b/mac/.config/mpv/scripts/delete_current_file.lua @@ -0,0 +1,168 @@ +--[[ + + https://github.com/stax76/mpv-scripts + + This script instantly deletes the file that is currently playing + via keyboard shortcut, the file is moved to the recycle bin and + removed from the playlist. + + On Linux the app trash-cli must be installed first. + + Usage: + Add bindings to input.conf: + + # delete directly + KP0 script-message-to delete_current_file delete-file + + # delete with confirmation + KP0 script-message-to delete_current_file delete-file KP1 "Press 1 to delete file" + + Press KP0 to initiate the delete operation, + the script will ask to confirm by pressing KP1. + You may customize the the init and confirm key and the confirm message. + Confirm key and confirm message are optional. + + Similar scripts: + https://github.com/zenyd/mpv-scripts#delete-file + +]] +-- + +key_bindings = {} + +function file_exists(name) + if not name or name == "" then + return false + end + + local f = io.open(name, "r") + + if f ~= nil then + io.close(f) + return true + else + return false + end +end + +function is_protocol(path) + return type(path) == "string" and (path:match("^%a[%a%d_-]+://")) +end + +function delete_file(path) + local is_windows = package.config:sub(1, 1) == "\\" + + if is_protocol(path) or not file_exists(path) then + return + end + + if is_windows then + local ps_code = [[ + Add-Type -AssemblyName Microsoft.VisualBasic + [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile('__path__', 'OnlyErrorDialogs', 'SendToRecycleBin') + ]] + + local escaped_path = string.gsub(path, "'", "''") + escaped_path = string.gsub(escaped_path, "’", "’’") + escaped_path = string.gsub(escaped_path, "%%", "%%%%") + ps_code = string.gsub(ps_code, "__path__", escaped_path) + + mp.command_native({ + name = "subprocess", + playback_only = false, + detach = true, + args = { "powershell", "-NoProfile", "-Command", ps_code }, + }) + else + mp.command_native({ + name = "subprocess", + playback_only = false, + args = { "trash-put", path }, + }) + end +end + +function remove_current_file() + local count = mp.get_property_number("playlist-count") + local pos = mp.get_property_number("playlist-pos") + local new_pos = 0 + + if pos == count - 1 then + new_pos = pos - 1 + else + new_pos = pos + 1 + end + + mp.set_property_number("playlist-pos", new_pos) + + if pos > -1 then + mp.command("playlist-remove " .. pos) + end +end + +function handle_confirm_key() + local path = mp.get_property("path") + + if file_to_delete == path then + mp.commandv("show-text", "") + delete_file(file_to_delete) + remove_current_file() + remove_bindings() + file_to_delete = "" + end +end + +function cleanup() + remove_bindings() + file_to_delete = "" + mp.commandv("show-text", "") +end + +function get_bindings() + return { + { confirm_key, handle_confirm_key }, + } +end + +function add_bindings() + if #key_bindings > 0 then + return + end + + local script_name = mp.get_script_name() + + for _, bind in ipairs(get_bindings()) do + local name = script_name .. "_key_" .. (#key_bindings + 1) + key_bindings[#key_bindings + 1] = name + mp.add_forced_key_binding(bind[1], name, bind[2]) + end +end + +function remove_bindings() + if #key_bindings == 0 then + return + end + + for _, name in ipairs(key_bindings) do + mp.remove_key_binding(name) + end + + key_bindings = {} +end + +function client_message(event) + local path = mp.get_property("path") + + if event.args[1] == "delete-file" and #event.args == 1 then + delete_file(path) + remove_current_file() + elseif event.args[1] == "delete-file" and #event.args == 3 and #key_bindings == 0 then + confirm_key = event.args[2] + mp.add_timeout(10, cleanup) + add_bindings() + file_to_delete = path + mp.commandv("show-text", event.args[3], "10000") + end +end + +mp.register_event("client-message", client_message) |
