#!/usr/bin/env python import urllib, re from sys import stdin from sys import argv from os import system def __splitartistsong(data): f = data.split(' - ') if len(f) > 2: #We will assume that there is no artist with " - " in the name. f = [' - '.join(f[:-1]), f[-1]] return f #f[0] = songname, f[1] = artist def song(artist, songname, newurl=None): if artist == False: data = songname page = newurl else: page = "http://www.songmeanings.net/query.php?action=title&query=" + urllib.quote_plus(songname) try: data = urllib.urlopen(page).read() except IOError: #system('dcop amarok playlist popupMessage "Network input/output error when retrieving lyrics. Try again later."') return if data.find('SongMeanings | lyrics') != -1: #ok, we've got a lyrics page artist = data[data.find('<title>SongMeanings | lyrics | ')+31:data.find('')].split(' - ') if len(artist) > 2: songname = ' - '.join(artist[1:]) artist = artist[1] else: songname, artist = artist[1], artist[0] data = data[data.find('')+5:] data = data[data.find('')+42:] data = data[:data.find('')] data = data.replace('\n', '').replace('\r', '').replace('
', '\n') while data[:1] == ' ' or data[:1] == '\n': data = data[1:] while data[-1] == ' ' or data[-1] == '\n': data = data[:-1] return "lyrics", page, artist, songname, data elif data.find('SongMeanings | search results for') != -1: # search results page matches = re.findall('<a href="query.php\?action=go&lid=(\d+)" title="(.+?)">.+?</a>', data, re.M) for i in matches: f = __splitartistsong(i[1]) if f[0].lower() == songname.lower() and f[1].lower() == artist.lower(): #ohay, we've got a match try: return song(False, urllib.urlopen("http://www.songmeanings.net/query.php?action=go&lid=" + i[0]).read(), i[0]) except IOError: #system('dcop amarok playlist popupMessage "Network input/output error when retrieving lyrics at %s. Try again later."' % i[0]) return else: continue return "matches", page, matches # return the whole list if we haven't got any exact matches elif data.find('<title>SongMeanings | error') != -1: # no results return "matches", page, () if argv[1][0]=="^": exit("no artist given") sn=1; artist=argv[1] title="" for i in argv[2:]: if (i[0]=="^"): sn=0; title=i[1:] elif (sn==0): title=title+" "+i else: artist=artist+" "+i print song(artist, title)[4].replace("\n\n","\n")