dotfiles/awes2/widget/music/spotify-music-updater.lua

324 lines
7.1 KiB
Lua

local gears = require('gears')
local awful = require('awful')
local naughty = require('naughty')
local config_dir = gears.filesystem.get_configuration_dir()
local widget_icon_dir = config_dir .. 'widget/music/icons/'
local ui_content = require('widget.music.content')
local album_cover = ui_content.album_cover
local prog_bar = ui_content.progress_bar
local track_time = ui_content.track_time
local song_info = ui_content.song_info
local vol_slider = ui_content.volume_slider
local media_buttons = ui_content.media_buttons
-- We can't set/get the data for these
-- So let's hide them
prog_bar.visible = false
track_time.time_status.visible = false
track_time.time_duration.visible = false
media_buttons.repeat_button.visible = false
media_buttons.random_button.visible = false
local update_cover = function()
local get_art_url = [[
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get \
string:'org.mpris.MediaPlayer2.Player' string:'Metadata' |
egrep -A 1 "artUrl"| egrep -v "artUrl" | awk -F '"' '{print $2}' |
sed -e 's/open.spotify.com/i.scdn.co/g'
]]
awful.spawn.easy_async_with_shell(
get_art_url,
function(link)
local download_art = [[
tmp_dir="/tmp/awesomewm/${USER}/"
tmp_cover_path=${tmp_dir}"cover.jpg"
if [ ! -d $tmp_dir ]; then
mkdir -p $tmp_dir;
fi
if [ -f $tmp_cover_path]; then
rm $tmp_cover_path
fi
wget -O $tmp_cover_path ]] ..link .. [[
echo $tmp_cover_path
]]
awful.spawn.easy_async_with_shell(
download_art,
function(stdout)
local album_icon = stdout:gsub('%\n', '')
album_cover.cover:set_image(gears.surface.load_uncached(album_icon))
album_cover:emit_signal("widget::redraw_needed")
album_cover:emit_signal("widget::layout_changed")
collectgarbage('collect')
end
)
end
)
end
local update_title = function()
awful.spawn.easy_async_with_shell(
[[
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' |
egrep -A 1 "title" | egrep -v "title" | awk -F '"' '{print $2}'
]],
function(stdout)
local title = stdout:gsub('%\n', '')
local title_widget = song_info.music_title
local title_text = song_info.music_title:get_children_by_id('title')[1]
title_text:set_text(title)
title_widget:emit_signal("widget::redraw_needed")
title_widget:emit_signal("widget::layout_changed")
collectgarbage('collect')
end
)
end
local update_artist = function()
awful.spawn.easy_async_with_shell(
[[
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'|
egrep -A 2 "artist" | egrep -v "artist" | egrep -v "array" | awk -F '"' '{print $2}'
]],
function(stdout)
-- Remove new lines
local artist = stdout:gsub('%\n', '')
if (stdout == nil or stdout == '') then
artist = 'Advertisement'
end
local artist_widget = song_info.music_artist
local artist_text = artist_widget:get_children_by_id('artist')[1]
artist_text:set_text(artist)
artist_widget:emit_signal("widget::redraw_needed")
artist_widget:emit_signal("widget::layout_changed")
collectgarbage('collect')
end
)
end
local update_volume_slider = function()
-- Stop. Don't indent.
-- It's python. Nuff said
local get_volume = [[
python - <<END
import subprocess
import os
x=0
y=0
env = os.environ
env['LANG'] = 'en_US'
app = '"Spotify"'
pactl = subprocess.check_output(['pactl', 'list', 'sink-inputs'], env=env).decode().strip().split()
if app in pactl:
for e in pactl:
x += 1
if e == app:
break
for i in pactl[0 : x -1 ]:
y += 1
if i == 'Sink' and pactl[y] == 'Input' and '#' in pactl[y + 1]:
sink_id = pactl[y+1]
if i == 'Volume:' and '%' in pactl[y + 3]:
volume = pactl[y + 3]
sink_id = sink_id[1: ]
volume = volume[ : -1 ]
print(volume)
END
]]
awful.spawn.easy_async_with_shell(
get_volume,
function(stdout)
-- naughty.notification({message=stdout})
local volume_slider = vol_slider.vol_slider
volume_slider:set_value(tonumber(stdout:match('%d+')))
end
)
end
local check_if_playing = function()
awful.spawn.easy_async_with_shell(
[[
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'PlaybackStatus' |
grep -A 1 "string" | awk -F '"' '{print $2}'
]],
function(stdout)
local play_button_img = media_buttons.play_button_image.play
if stdout:match("Playing") then
play_button_img:set_image(widget_icon_dir .. 'pause.svg')
update_volume_slider()
else
play_button_img:set_image(widget_icon_dir .. 'play.svg')
end
end
)
end
local set_spotify_volume = function(value)
local set_volume = [[
python - <<END
import subprocess
import os
import sys
x=0
y=0
env = os.environ
env['LANG'] = 'en_US'
app = '"Spotify"'
pactl = subprocess.check_output(['pactl', 'list', 'sink-inputs'], env=env).decode().strip().split()
if app in pactl:
for e in pactl:
x += 1
if e == app:
break
for i in pactl[0 : x -1 ]:
y += 1
if i == 'Sink' and pactl[y] == 'Input' and '#' in pactl[y + 1]:
sink_id = pactl[y+1]
sink_id = sink_id[1: ]
arg = int(]] .. value .. [[)
if arg < 0:
arg = 0
if arg > 100:
arg = 100
subprocess.run(['pactl', 'set-sink-input-volume', sink_id, str(arg) + '%'])
END
]]
awful.spawn.easy_async_with_shell(
set_volume,
function(stdout) end
)
end
vol_slider.vol_slider:connect_signal(
'property::value',
function()
local volume_slider = vol_slider.vol_slider
set_spotify_volume(tostring(volume_slider:get_value()))
end
)
local update_all_content = function()
-- Add a delay
gears.timer.start_new(2, function()
update_title()
update_artist()
update_cover()
check_if_playing()
update_volume_slider()
end)
end
update_all_content()
media_buttons.play_button:buttons(
gears.table.join(
awful.button(
{},
1,
nil,
function()
awful.spawn.easy_async_with_shell(
[[
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
]],
function()
check_if_playing()
end
)
end
)
)
)
media_buttons.next_button:buttons(
gears.table.join(
awful.button(
{},
1,
nil,
function()
awful.spawn.easy_async_with_shell(
[[
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next
]],
function()
update_all_content()
end
)
end
)
)
)
media_buttons.prev_button:buttons(
gears.table.join(
awful.button(
{},
1,
nil,
function()
awful.spawn.easy_async_with_shell(
[[
dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous
]],
function()
update_all_content()
end
)
end
)
)
)