| Prev: 9.1. Introduction | [ home ] | Next: 9.3. Hooking into Aqualung Events |
By specifying a function named `playlist_title'
in your Lua extension file, which should accept no arguments and
should return a string, you can override the default title formatting
specified by the Title format setting. Similarly,
by specifying a function named `application_title' with
the same API, you have the application window's title set separately
from the playlist title. If you would like
the application title and playlist title to be the same, you
can have your `application_title' function
just call `playlist_title'.
Aqualung defines two functions for you to use to get data
to use in the title format, `m' and
`i'. `m' stands for metadata,
and `i' stands for file info. The
`m' function is used to get metadata from file
tags, while the `i' function is used to get
information about the file itself, such as the length,
bitrate, and number of channels. If there are multiple
metadata entries (such as multiple artists),
`m' will return them as a single string
separated with comma (`,'). If there is no
metadata entry, `m' will return the empty
string. If you ask for a metadata or file info entry that
Aqualung doesn't understand, Aqualung will log an error and
will fallback to using the standard title formatting code.
Here are some examples.
function playlist_title()
return m('artist') .. '-' .. m('title') .. ' (' .. m('album') .. ')'
end
Results:
function mi(field, format)
if field ~= "" then
field = string.format(format, field)
end
return field
end
function dirname(path)
if string.find(path, "/") then
return string.sub(path, 1, string.len(path) - string.find(string.reverse(path), "/"))
else
return ""
end
end
function album()
local a = m('album')
if a ~= "" then
a = a .. mi('date', ' (%s)')
else
a = dirname(i('filename'))
end
return a .. '-'
end
function playlist_title()
return album() .. mi('trackno', '%s-') .. m('title')
end
Results:
-- Maximum length of a line in the playlist
maxlen = 85
-- Directory name for path
function dirname(path)
if string.find(path, "/") then
return string.sub(path, 1, string.len(path) - string.find(string.reverse(path), "/"))
else
return ""
end
end
-- File name for path
function basename(path)
if string.find(path, "/") then
return string.sub(path, string.len(path) - string.find(string.reverse(path), "/") + 2)
else
return path
end
end
-- The album name from the metadata, or the directory name of the file if not present
function album_or_dir()
local album = m('album')
if album == "" then
album = basename(dirname(i("filename")))
end
return album
end
-- The title from the metadata, or the base name of the file if not present
function title_or_file()
local title = m('title')
if title == "" then
local file = basename(i("filename"))
if not string.match(file, "^%d+%-%....$") then
title = file
end
end
return title
end
-- If the field exists in the metadata, format it using the format_string
function formatif(field, format_string)
if field ~= "" then
field = string.format(format_string, field)
end
return field
end
-- A string indicating the frequency in Hz, or the empty string if the frequency is 44100
function freq()
local hz = string.format("%i", i('sample_rate'))
if hz == "44100" then
hz = ""
else
hz = formatif(hz, "[%sHz] ")
end
return hz
end
-- A string indicating the number of channels, unless the number of channels is 2 (stereo)
function chan()
local m = string.format("%i", i('channels'))
if m == "2" then
m = ""
elseif m == "1" then
m = "[MONO] "
else
m = formatif(m, "[%s channels] ")
end
return m
end
-- Pad the string to the given length, adding spaces if it is too short and truncating
-- it if it is too long
function pad(s, n)
local l = string.len(s)
if l > n then
s = string.sub(s, 1, n)
else
s = s .. string.rep(' ', n-l)
end
return s
end
-- Combine the left and right sides, with the right side having priority
function finalize(l, r)
return pad(l, maxlen - string.len(r)) .. r
end
-- Build the title in two parts, a left part (channel and frequency expections, album,
-- track number, title) and a right part (artist, genre, comment, date, and gain).
-- The right part is columnar, the left side is not.
function playlist_title()
local l = chan() .. freq() .. formatif(album_or_dir(), "%s-")
.. formatif(m('trackno'), "%s-") .. title_or_file()
local r = " " .. m('artist') .. " " .. formatif(m("genre"), "%s ")
.. pad(m('comment'), 12) .. " " .. pad(m("date"), 4) .. " "
.. pad(m('track_gain'), 5) .. " " .. pad(m('album_gain'), 5)
return finalize(l, r)
end
Results:
[ title | artist | album | date | genre | trackno | comment | disc | performer | description | organization | location | contact | license | copyright | isrc | version | subtitle | debut_album | publisher | conductor | composer | publication_right | file | ean_upc | isbn | catalog | label_code | record_date | record_location | media | index | related | abstract | language | bibliography | introplay | bpm | encoding_time | playlist_delay | original_release_time | release_time | tagging_time | encoded_by | lyricist | filetype | involved_people | content_group | initial_key | length | musician_credits | mood | original_album | original_filename | original_lyricist | original_artist | file_owner | band | remixed | set_part | produced | station_name | station_owner | album_order | performer_order | title_order | software | set_subtitle | user_text | commercial_info | legal_info | file_website | artist_website | source_website | station_website | payment | publisher_website | user_url | vendor | rg_loudness | track_gain | track_peak | album_gain | album_peak | icy_name | icy_descr | icy_genre | rva ]
[ filename | sample_rate | channels | bps | samples | voladj_db | voladj_lin | stream | mono ]
Changing the Lua extension file entry takes effect immediately, but does not affect existing titles in the playlist. In order to update existing titles in the playlist, the Reread file metadata setting should be used.
| Prev: 9.1. Introduction | [ home ] | Next: 9.3. Hooking into Aqualung Events |