Getting Rhythmbox to play desired songs in awesome

Awesome is a pretty good tiling window manager I have recently taken some liking to. I initially started with it for the simple reason that I was working with a Matlab script which spawned tens of figures and I wanted to view them simultaneously. I am sure there are easier ways of viewing those graphs than switching window managers from Gnome (which I still think is pretty good) to Awesome, but it was a valid reason to procrastinate in my own way. :-)

Anyhow, some of the things I really missed from Gnome were:

  1. sticky notes
  2. Gnome-Do and Pidgin integration (opening IM windows by just Super + Space + Buddy name )
  3. Gnome-Do and Rhythmbox integration (playing songs by just Super + Space + Song name )

It is the last thing which I got tired of today and looked at how I can fix it. The configuration turned out to be fairly easy to, thanks to the general awesomeness of Awesome and handy Lua documentation. It happened in the following steps:

  1. Getting to know rhythmbox-client can play songs using their URI, which is just the path of the file in case of local files.
  2. Understanding how to configure awesome using  /.config/awesome/rc.lua
  3. Figuring out how to get a prompt to type in a song name, which turned out fairly simple thanks to awful.prompt
  4. Understanding functions in Lua and writing functions for Notification and running the rhythmbox client:
      myRhythmboxFunction = 
          function (c) 
                  home = os.getenv("HOME")
                  file = io.open(home .. "/.song_list")
                  if not file then
                          myNotifyFunction("~/.song_list does not exist")
                  else
                          found = false
                          myNotifyFunction("Searching for " .. c)
                          c = string.lower(c)
                          for song in file:lines() do
                                  songLower = string.lower(song)
                                  if string.find(songLower, c) then
                                          found = true
                                          awful.util.spawn
                                            ("rhythmbox-client --play-uri=\"" ..
                                                song .. 
                                                "\"")
                                          myNotifyFunction("Found, playing")
                                          break
                                  end
                          end
                          file:close()
                          if not found then myNotifyFunction("Not found") end
                  end
          end
    

    It is not difficult to guess what this function does:

    I have not described how I made myNotifyFunction , because it is embarrassingly simple to implement using naughty, but I did it in a horribly complicated way using awful.util.spawn and notify-send . But, hey! This is just supposed to be a proof of concept, right? :-)
  5. Understanding how to add global key bindings:
      awful.key({ modkey,           }, "p",
                function ()
                    awful.prompt.run({ prompt = "Play: " },
                    mypromptbox[mouse.screen].widget,
                    myRhythmboxFunction,
                    nil)
                end),
    
    Here, mypromptbox is just the usual Run prompt which I have borrowed to act as the play prompt box.

After these rudimentary changes, I did:

 find /my/music/folder | grep -v 'No directories' > ~/.song_list

To prepare the .song_list file needed in myRhythmboxFunction , and voila!

My songs are now Super + P + Song name away!

The next additions on my dashboard are the Pidgin integration and some sort of periodic mail notification without needing either Evolution or Thunderbird running in the background.

Some other holiday ...

Back to Home



musically_ut 2014-04-03