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 - < 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 ) ) )