166 lines
No EOL
4.9 KiB
Lua
166 lines
No EOL
4.9 KiB
Lua
require 'mp'
|
|
require 'mp.msg'
|
|
|
|
-- Copy:
|
|
-- Filename or URL
|
|
-- Full Filename Path
|
|
-- Current Video Time
|
|
-- Current Video Duration
|
|
-- Current Displayed Subtitle
|
|
-- Video Metadata
|
|
|
|
WINDOWS = 2
|
|
UNIX = 3
|
|
|
|
local function platform_type()
|
|
local utils = require 'mp.utils'
|
|
local workdir = utils.to_string(mp.get_property_native("working-directory"))
|
|
if string.find(workdir, "\\") then
|
|
return WINDOWS
|
|
else
|
|
return UNIX
|
|
end
|
|
end
|
|
|
|
local function command_exists(cmd)
|
|
local pipe = io.popen("type " .. cmd .. " > /dev/null 2> /dev/null; printf \"$?\"", "r")
|
|
exists = pipe:read() == "0"
|
|
pipe:close()
|
|
return exists
|
|
end
|
|
|
|
local function get_clipboard_cmd()
|
|
if command_exists("xclip") then
|
|
return "xclip -silent -in -selection clipboard"
|
|
elseif command_exists("wl-copy") then
|
|
return "wl-copy"
|
|
elseif command_exists("pbcopy") then
|
|
return "pbcopy"
|
|
else
|
|
mp.msg.error("No supported clipboard command found")
|
|
return false
|
|
end
|
|
end
|
|
|
|
local function divmod(a, b)
|
|
return a / b, a % b
|
|
end
|
|
|
|
local function set_clipboard(text)
|
|
if platform == WINDOWS then
|
|
mp.commandv("run", "powershell", "set-clipboard", table.concat({'"', text, '"'}))
|
|
return true
|
|
elseif (platform == UNIX and clipboard_cmd) then
|
|
local pipe = io.popen(clipboard_cmd, "w")
|
|
pipe:write(text)
|
|
pipe:close()
|
|
return true
|
|
else
|
|
mp.msg.error("Set_clipboard error")
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Copy Time
|
|
local function copyTime()
|
|
local time_pos = mp.get_property_number("time-pos")
|
|
local minutes, remainder = divmod(time_pos, 60)
|
|
local hours, minutes = divmod(minutes, 60)
|
|
local seconds = math.floor(remainder)
|
|
local milliseconds = math.floor((remainder - seconds) * 1000)
|
|
local time = string.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, milliseconds)
|
|
if set_clipboard(time) then
|
|
mp.osd_message(string.format("Time Copied to Clipboard: %s", time))
|
|
else
|
|
mp.osd_message("Failed to copy time to clipboard")
|
|
end
|
|
end
|
|
|
|
-- Copy Filename with Extension
|
|
local function copyFilename()
|
|
local filename = string.format("%s", mp.get_property_osd("filename"))
|
|
local extension = string.match(filename, "%.(%w+)$")
|
|
|
|
local succ_message = "Filename Copied to Clipboard"
|
|
local fail_message = "Failed to copy filename to clipboard"
|
|
|
|
-- If filename doesn't have an extension then it is a URL.
|
|
if not extension then
|
|
filename = mp.get_property_osd("path")
|
|
|
|
succ_message = "URL Copied to Clipboard"
|
|
fail_message = "Failed to copy URL to clipboard"
|
|
end
|
|
|
|
if set_clipboard(filename) then
|
|
mp.osd_message(string.format("%s: %s", succ_message, filename))
|
|
else
|
|
mp.osd_message(string.format("%s", fail_message))
|
|
end
|
|
end
|
|
|
|
-- Copy Full Filename Path
|
|
local function copyFullPath()
|
|
if platform == WINDOWS then
|
|
full_path = string.format("%s\\%s", mp.get_property_osd("working-directory"), mp.get_property_osd("path"))
|
|
else
|
|
full_path = string.format("%s/%s", mp.get_property_osd("working-directory"), mp.get_property_osd("path"))
|
|
end
|
|
|
|
if set_clipboard(full_path) then
|
|
mp.osd_message(string.format("Full Filename Path Copied to Clipboard: %s", full_path))
|
|
else
|
|
mp.osd_message("Failed to copy full filename path to clipboard")
|
|
end
|
|
end
|
|
|
|
-- Copy Current Displayed Subtitle
|
|
local function copySubtitle()
|
|
local subtitle = string.format("%s", mp.get_property_osd("sub-text"))
|
|
|
|
if subtitle == "" then
|
|
mp.osd_message("There are no displayed subtitles.")
|
|
return
|
|
end
|
|
|
|
if set_clipboard(subtitle) then
|
|
mp.osd_message(string.format("Displayed Subtitle Copied to Clipboard: %s", subtitle))
|
|
else
|
|
mp.osd_message("Failed to copy displayed subtitle to clipboard")
|
|
end
|
|
end
|
|
|
|
-- Copy Current Video Duration
|
|
local function copyDuration()
|
|
local duration = string.format("%s", mp.get_property_osd("duration"))
|
|
|
|
if set_clipboard(duration) then
|
|
mp.osd_message(string.format("Video Duration Copied to Clipboard: %s", duration))
|
|
else
|
|
mp.osd_message("Failed to copy video duration to clipboard")
|
|
end
|
|
end
|
|
|
|
-- Copy Current Video Metadata
|
|
local function copyMetadata()
|
|
local metadata = string.format("%s", mp.get_property_osd("metadata"))
|
|
|
|
if set_clipboard(metadata) then
|
|
mp.osd_message(string.format("Video Metadata Copied to Clipboard: %s", metadata))
|
|
else
|
|
mp.osd_message("Failed to copy metadata to clipboard")
|
|
end
|
|
end
|
|
|
|
platform = platform_type()
|
|
if platform == UNIX then
|
|
clipboard_cmd = get_clipboard_cmd()
|
|
end
|
|
|
|
-- Key-Bindings
|
|
mp.add_key_binding("Ctrl+t", "copyTime", copyTime)
|
|
mp.add_key_binding("Ctrl+f", "copyFilename", copyFilename)
|
|
mp.add_key_binding("Ctrl+p", "copyFullPath", copyFullPath)
|
|
mp.add_key_binding("Ctrl+s", "copySubtitle", copySubtitle)
|
|
mp.add_key_binding("Ctrl+d", "copyDuration", copyDuration)
|
|
mp.add_key_binding("Ctrl+m", "copyMetadata", copyMetadata) |