dotfiles/awesome/music.lua

108 lines
2.7 KiB
Lua

local naughty = require("naughty")
local wibox = require("wibox")
local awful = require("awful")
local ret = {}
ret.widget = wibox.widget.textbox()
ret.widget:set_align("right")
ret.widget.font = "Ubuntu Mono"
local total_text = ""
local position = 1
local width = 30
local dots = 3
local last_notification = nil
local function string_starts_with(String,Start)
return string.sub(String,1,string.len(Start))==Start
end
local function string_split(str, delimiter)
if str == nil then
return {}
end
local ret = {''}
count = 1
for i = 1, string.len(str) do
local c = str:sub(i,i)
if c == delimiter then
count = count + 1
ret[count] = ''
else
ret[count] = ret[count] .. c
end
end
return ret
end
local function pad(str, len, char)
if char == nil then char = ' ' end
return str .. string.rep(char, len - #str)
end
local function set_text(text)
total_text = text[1]
if last_notification ~= nil then
naughty.destroy(last_notification)
end
if text[2] == nil then
return
end
elts = string_split(text[1], '-')
artist = string.sub(elts[1], 1, -1)
album = string.sub(elts[2], 2, -1)
song = string.sub(elts[3], 2)
notification_text = '\n' .. album .. '\n' .. song .. '\n'
if string.len(total_text) >= width then
position = math.floor((width - string.len(total_text)) / 2)
end
update_widget()
end
ret.execute_command = function(command)
local fd = io.popen('music-client ' .. command)
local text = string_split(fd:read('*all'), '\n')
local rc = {fd:close()}
if rc[3] == 0 then
if string_starts_with(command, 'file') or string_starts_with(command, 'next') or string_starts_with(command, 'previous') then
set_text(text)
elseif string_starts_with(command, 'noop') then
total_text = text[1]
position = math.floor((width - string.len(total_text)) / 2)
end
else
set_text({'music-server not running'})
end
end
function update_widget()
if string.len(total_text) < width then
ret.widget:set_text(pad(total_text, width, ' '))
else
local pos = math.min(position, string.len(total_text) - width)
pos = math.max(1, pos)
ret.widget:set_text(string.sub(total_text, pos, pos + width))
position = position + 1
if position > string.len(total_text) then
position = math.floor((width - string.len(total_text)) / 2)
end
end
end
ret.execute_command('noop')
ret.widget.timer = timer({timeout=0.2})
ret.widget.timer:connect_signal("timeout", update_widget)
ret.widget.timer:start()
ret.widget = ret.widget
return ret