From 267d04d2bd2a7681c8bbcfbb655612101440b765 Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Fri, 6 Sep 2019 19:24:26 -0500 Subject: Lua add metadata and settings reading helper module Adds example scripts for reading track metadata + dumping albumart and rockbox settings settings are now stored as a table of strings rather than a table of tables as it saves ~15 kb of ram without adding much complexity Change-Id: I611c312b2a60ab96e595e4710b17aedbd6c0689b --- apps/plugins/lua_scripts/dump_rbsettings.lua | 49 +++++++++++++++ apps/plugins/lua_scripts/track_metadata.lua | 90 ++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 apps/plugins/lua_scripts/dump_rbsettings.lua create mode 100644 apps/plugins/lua_scripts/track_metadata.lua (limited to 'apps/plugins/lua_scripts') diff --git a/apps/plugins/lua_scripts/dump_rbsettings.lua b/apps/plugins/lua_scripts/dump_rbsettings.lua new file mode 100644 index 0000000000..2811d27487 --- /dev/null +++ b/apps/plugins/lua_scripts/dump_rbsettings.lua @@ -0,0 +1,49 @@ +require("rbsettings") +require("settings") +rb.metadata = nil -- remove track metadata settings +------------------------------------------------------------------------------- + +local function print_setting_table(t_tbl, s_sep) + s_sep = s_sep or "" + local str = "" + local function pfunct(t, sep, s, n) -- recursive print function + local vtype + for k, v in pairs(t) do + vtype = type(v) + if vtype == "table" then + local f = string.format("%s[%s]", n, k) + s = pfunct(v, sep, s, f) + elseif vtype == "boolean" then + v = v and "true" or "false" + s = string.format("%s%s[%s] = %s%s", s, n, k, v, sep) + elseif v then + s = string.format("%s%s[%s] = %s%s", s, n, k, v, sep) + end + end + return s + end + return pfunct(t_tbl, s_sep, str, "") +end + +local filename = "/settings.txt" +local file = io.open(filename, "w+") -- overwrite +local t_settings + +if not file then + rb.splash(rb.HZ, "Error writing " .. filename) + return +end + +t_settings = rb.settings.dump('global_settings', "system") +file:write("global_settings:\n") +file:write(print_setting_table(t_settings, "\n")) +file:write("\n\n") + +t_settings = rb.settings.dump('global_status', "system") +file:write("global_status:\n") +file:write(print_setting_table(t_settings, "\n")) +file:write("\n\n") + +file:close() + +rb.splash(100, "rb settings dumped: " .. filename) diff --git a/apps/plugins/lua_scripts/track_metadata.lua b/apps/plugins/lua_scripts/track_metadata.lua new file mode 100644 index 0000000000..08c1c865f3 --- /dev/null +++ b/apps/plugins/lua_scripts/track_metadata.lua @@ -0,0 +1,90 @@ +require("rbsettings") +require("settings") --settings.lua +rb.system = nil -- remove system settings +------------------------------------------------------------------------------- +local track_data = rb.metadata.mp3_entry +local cur_trk = "audio_current_track" +------------------------------------------------------------------------------- +local trackname = rb.settings.read(cur_trk, track_data.title) or + rb.settings.read(cur_trk, track_data.path) +if not trackname or trackname == "" then + os.exit(1, "No track loaded") +else + rb.splash(100, trackname) +end +------------------------------------------------------------------------------- +local function dump_albumart(fileout) + local t_albumart = rb.settings.read(cur_trk, track_data.albumart, "metadata") + local t_aaext = {".bmp",".png", ".jpg"} + local path = rb.settings.read(cur_trk, track_data.path) + if t_albumart.pos > 0 and t_albumart.size > 0 and t_albumart.type > 0 then + + if t_aaext[t_albumart.type] then + local filename = "/" .. fileout .. t_aaext[t_albumart.type] + local aa = io.open(filename, "w+") -- overwrite + if not aa then + rb.splash(rb.HZ, "Error writing " .. filename) + return + end + + local track = io.open(path, "r") + if not track then + rb.splash(rb.HZ, "Error opening " .. path) + return + end + track:seek("set", t_albumart.pos ) + for i = 0, t_albumart.size, 32 do + aa:write(track:read(32)) + end + rb.splash(rb.HZ, "Saved: " .. filename) + track:close() + aa:close() + else + + end + end +end + +local function print_setting_table(t_tbl, s_sep) + s_sep = s_sep or "" + local str = "" + local function pfunct(t, sep, s, n) -- recursive print function + local vtype + for k, v in pairs(t) do + vtype = type(v) + if vtype == "table" then + local f = string.format("%s[%s]", n, k) + s = pfunct(v, sep, s, f) + elseif vtype == "boolean" then + v = v and "true" or "false" + s = string.format("%s%s[%s] = %s%s", s, n, k, v, sep) + elseif v then + s = string.format("%s%s[%s] = %s%s", s, n, k, v, sep) + end + end + return s + end + return pfunct(t_tbl, s_sep, str, "") +end + +local filename = "/metadata.txt" +local file = io.open(filename, "w+") -- overwrite +local t_settings + +if not file then + rb.splash(rb.HZ, "Error writing " .. filename) + return +end + +---[[ +t_settings = rb.settings.dump(cur_trk, "metadata", "mp3_entry") +file:write(trackname .. ":\n") +file:write(print_setting_table(t_settings, "\n")) +file:write("\n\n") +file:close() + +rb.splash(100, "metadata dumped: " .. filename) + +if rb.settings.read(cur_trk, track_data.has_embedded_albumart) then + dump_albumart("/albumart") +end -- cgit v1.2.3