tvl-depot/users/Profpatsch/lyric/lyric-timing-mpv-script.lua
Profpatsch 92ad57febe fix(users/Profpatsch/lyric): create new lyric file if not exists
That was the original intention, but I didn’t understand that lua
would fail with "r+" if the file does not exist (and "w+" truncates
the file, so you have to try "r+" and then fall back to "w+" which
will create the file as well.)

Change-Id: Ib238f0b73ab403ceeaf035d053a14eba718d1b48
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12562
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
2024-10-05 13:49:38 +00:00

68 lines
2.6 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- This function formats the current timestamp in the [mm:ss.ms] format
function format_timestamp(seconds)
local minutes = math.floor(seconds / 60)
local seconds = seconds % 60
return string.format("[%02d:%05.2f]", minutes, seconds)
end
-- Get the users cache directory
local cache_dir = os.getenv("XDG_CACHE_HOME") or os.getenv("HOME") .. "/.cache"
-- This function writes the timestamp to the LRC file
function write_timestamp_to_lrc()
local filename = mp.get_property("path")
if not filename then
mp.msg.warn("No file currently playing.")
return
end
-- Extract metadata for artist, title, and album
local artist = mp.get_property("metadata/by-key/ARTIST", "Unknown Artist")
local title = mp.get_property("metadata/by-key/TITLE", "Unknown Title")
local album = mp.get_property("metadata/by-key/ALBUM", "Unknown Album")
-- Construct the lrc dir
local dir = cache_dir .. "/lyric/timed"
local lrc_filename = string.format("%s/%s - %s - %s.lrc", dir, artist, album, title)
-- Get current playback time
local current_time = mp.get_property_number("time-pos", 0)
local formatted_time = format_timestamp(current_time)
-- If the file does not exist, or is empty, create it and add metadata in the following format:
-- [ar: Chubby Checker oppure Beatles, The]
-- [al: Hits Of The 60's - Vol. 2 Oldies]
-- [ti: Let's Twist Again]
-- [au: Written by Kal Mann / Dave Appell, 1961]
-- [length: 2:23]
local file = io.open(lrc_filename, "r+")
if not file then
file = io.open(lrc_filename, "w+")
end
-- read the file and check whether it only contains whitespace
local content = file:read("*all")
if content:match("^%s*$") then
file:write("[ar: " .. artist .. "]\n")
file:write("[al: " .. album .. "]\n")
file:write("[ti: " .. title .. "]\n")
local duration = mp.get_property_number("duration", 0)
local formatted_duration = string.format("%02d:%02d", math.floor(duration / 60), duration % 60)
file:write("[length: " .. formatted_duration .. "]\n")
file:write("\n")
end
file:close()
-- Append the timestamp to the LRC file
local file = io.open(lrc_filename, "a")
if file then
file:write(formatted_time .. "\n")
file:close()
mp.msg.info("Timestamp " .. formatted_time .. " added to " .. lrc_filename)
else
mp.msg.error("Failed to open " .. lrc_filename)
end
end
-- Bind Ctrl+l to the function that writes the timestamp
mp.add_key_binding("Ctrl+l", "insert_timestamp", write_timestamp_to_lrc)