I've been working to pull dynamic data from last.fm using youpy's "lastfm" gem. Getting the data works great; however, rails doesn't seem to like the dynamic portion. Right now, I have added the code to a helper module called "HomeHelper" (generated during the creation of the rails app) found in the helper folder:
module HomeHelper
@@lastfm = Lastfm.new(key, secret)
@@wesRecent = @@lastfm.user.get_recent_tracks(:user => 'weskey5644')
def _album_art_helper
trackHash = @@wesRecent[0]
medAlbumArt = trackHash["image"][3]
if medAlbumArt["content"] == nil
html = "<img src=\"/images/noArt.png\" height=\"auto\" width=\"150\" />"
else
html = "<img src=#{medAlbumArt["content"]} height=\"auto\" width=\"150\" />"
end
html.html_safe
end
def _recent_tracks_helper
lfartist1 = @@wesRecent[0]["artist"]["content"]
lftrack1 = @@wesRecent[0]["name"]
lfartist1 = @@wesRecent[1]["artist"]["content"]
lftrack1 = @@wesRecent[1]["name"]
htmltrack = "<div class=\"lastfm_recent_tracks\">
<div class=\"lastfm_artist\"><p>#{lfartist1 = @@wesRecent[0]["artist"]["content"]}</p></div>
<div class=\"lastfm_trackname\"><p>#{lftrack1 = @@wesRecent[0]["name"]}</p></div>
<div class=\"lastfm_artist\"><p>#{lfartist2 = @@wesRecent[1]["artist"]["content"]}</p></div>
<div class=\"lastfm_trackname\"><p>#{lftrack2 = @@wesRecent[1]["name"]}</p></div>
</div>
"
htmltrack.html_safe
end
end
I created a partial for each and added them to my Index page:
<div class="album_art"><%= render "album_art" %></div>
<div id="nowplayingcontain"><%= render "recent_tracks" %></div>
Great, this gets the data I need and displays on the page like I want; however, it seems that when the song changes, according to last.fm, it doesn't on my site unless I restart the server.
I've tested this using Phusion Gassenger and also WEBrick and it seems to do it on both. I had thought this might be an issue with caching of this particular page so I tried a couple of caching hacks to expire the page an reload. This didn't help.
I then came to conclusion that sticking this code in a helper file might not be the best solution. I don't know how well helpers handle dynamic content; such as this. If anyone has any insight on this, awesome!! Thanks everyone!
Your problem isn't that you're using a helper, the problem is that you're using class variables:
module HomeHelper
@@lastfm = Lastfm.new(key, secret)
@@wesRecent = @@lastfm.user.get_recent_tracks(:user => 'weskey5644')
that are initialized when the module is first read. In particular, @@wesRecent
will be initialized once and then it will stay the same until you restart the server or happen to get a new server process. You should be able to call get_recent_tracks
when you need it:
def _album_art_helper
trackHash = @@lastfm.user.get_recent_tracks(:user => 'weskey5644').first
#...
Note that this means that your two helpers won't necessarily be using the same track list.
You might want to add a bit of "only refresh the tracks at most once very minute" logic as well.