summaryrefslogtreecommitdiff
path: root/mac/.config/mpv/scripts/delete_current_file.lua
diff options
context:
space:
mode:
Diffstat (limited to 'mac/.config/mpv/scripts/delete_current_file.lua')
-rw-r--r--mac/.config/mpv/scripts/delete_current_file.lua168
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)