3 Scraper for http://newlyrics.gomtv.com/
15 from optparse
import OptionParser
16 from common
import utilities
17 from common
import audiofile
19 __author__ =
"Paul Harrison and edge'"
20 __title__ =
"GomAudio"
21 __description__ =
"Search http://newlyrics.gomtv.com for lyrics"
24 __syncronized__ =
True
28 socket.setdefaulttimeout(10)
30 GOM_URL =
"http://newlyrics.gomtv.com/cgi-bin/lyrics.cgi?cmd=find_get_lyrics&file_key=%s&title=%s&artist=%s&from=gomaudio_local"
33 nfkd_data = unicodedata.normalize(
'NFKD', data)
34 return u"".join([c
for c
in nfkd_data
if not unicodedata.combining(c)])
39 privide Gom specific function, such as key from mp3
43 musf = audiofile.AudioFile()
45 buf = musf.ReadAudioStream(100*1024)
48 m = hashlib.md5(); m.update(buf);
53 s,ms = divmod(msec/10,100)
62 utilities.log(debug,
"%s: searching lyrics for %s - %s - %s" % (__title__, lyrics.artist, lyrics.album, lyrics.title))
65 ext = os.path.splitext(lyrics.filename.decode(
"utf-8"))[1].lower()
66 sup_ext = [
'.mp3',
'.ogg',
'.wma',
'.flac',
'.ape',
'.wav']
68 key = gomClient.GetKeyFromFile(lyrics.filename)
71 url = GOM_URL %(key, urllib.quote(
remove_accents(lyrics.title.decode(
'utf-8')).encode(
'euc-kr')), (
remove_accents(lyrics.artist.decode(
'utf-8')).encode(
'euc-kr')))
72 response = urllib.urlopen(url)
73 Page = response.read()
75 utilities.log(
True,
"%s: %s::%s (%d) [%s]" % (
76 __title__, self.__class__.__name__,
77 sys.exc_info()[ 2 ].tb_frame.f_code.co_name,
78 sys.exc_info()[ 2 ].tb_lineno,
83 if Page[:Page.find(
'>')+1] !=
'<lyrics_reply result="0">':
85 syncs = re.compile(
'<sync start="(\d+)">([^<]*)</sync>').findall(Page)
87 lyrline.append(
"[ti:%s]" %lyrics.title )
88 lyrline.append(
"[ar:%s]" %lyrics.artist )
91 t =
"%02d:%02d.%02d" % gomClient.mSecConv( int(sync[0]) )
94 s =
unicode(sync[1],
"euc-kr").encode(
"utf-8").replace(
"'",
"'").replace(
""",
'"')
95 lyrline.append(
"[%s]%s" %(t,s) )
98 lyrics.lyrics =
'\n'.join( lyrline )
103 lyrics = utilities.Lyrics()
104 lyrics.source = __title__
105 lyrics.syncronized = __syncronized__
106 lyrics.artist =
'Robb Benson'
107 lyrics.album =
'Demo Tracks'
108 lyrics.title =
'Lone Rock'
109 lyrics.filename = os.path.dirname(os.path.abspath(__file__)) +
'/examples/taglyrics.mp3'
112 found = fetcher.get_lyrics(lyrics)
115 utilities.log(
True,
"Everything appears in order.")
118 utilities.log(
True,
"The lyrics for the test search failed!")
122 from lxml
import etree
123 xml = etree.XML(
u'<lyrics></lyrics>')
124 etree.SubElement(xml,
"artist").text = lyrics.artist
125 etree.SubElement(xml,
"album").text = lyrics.album
126 etree.SubElement(xml,
"title").text = lyrics.title
127 etree.SubElement(xml,
"syncronized").text =
'True' if __syncronized__
else 'False'
128 etree.SubElement(xml,
"grabber").text = lyrics.source
130 lines = lyrics.lyrics.splitlines()
132 etree.SubElement(xml,
"lyric").text = line
134 utilities.log(
True, etree.tostring(xml, encoding=
'UTF-8', pretty_print=
True,
135 xml_declaration=
True))
139 from lxml
import etree
140 version = etree.XML(
u'<grabber></grabber>')
141 etree.SubElement(version,
"name").text = __title__
142 etree.SubElement(version,
"author").text = __author__
143 etree.SubElement(version,
"command").text =
'gomaudio.py'
144 etree.SubElement(version,
"type").text =
'lyrics'
145 etree.SubElement(version,
"description").text = __description__
146 etree.SubElement(version,
"version").text = __version__
147 etree.SubElement(version,
"priority").text = __priority__
148 etree.SubElement(version,
"syncronized").text =
'True' if __syncronized__
else 'False'
150 utilities.log(
True, etree.tostring(version, encoding=
'UTF-8', pretty_print=
True,
151 xml_declaration=
True))
157 parser = OptionParser()
159 parser.add_option(
'-v',
"--version", action=
"store_true", default=
False,
160 dest=
"version", help=
"Display version and author")
161 parser.add_option(
'-t',
"--test", action=
"store_true", default=
False,
162 dest=
"test", help=
"Test grabber with a know good search")
163 parser.add_option(
'-s',
"--search", action=
"store_true", default=
False,
164 dest=
"search", help=
"Search for lyrics.")
165 parser.add_option(
'-a',
"--artist", metavar=
"ARTIST", default=
None,
166 dest=
"artist", help=
"Artist of track.")
167 parser.add_option(
'-b',
"--album", metavar=
"ALBUM", default=
None,
168 dest=
"album", help=
"Album of track.")
169 parser.add_option(
'-n',
"--title", metavar=
"TITLE", default=
None,
170 dest=
"title", help=
"Title of track.")
171 parser.add_option(
'-f',
"--filename", metavar=
"FILENAME", default=
None,
172 dest=
"filename", help=
"Filename of track.")
173 parser.add_option(
'-d',
'--debug', action=
"store_true", default=
False,
174 dest=
"debug", help=(
"Show debug messages"))
176 opts, args = parser.parse_args()
178 lyrics = utilities.Lyrics()
179 lyrics.source = __title__
180 lyrics.syncronized = __syncronized__
192 lyrics.artist = opts.artist
194 lyrics.album = opts.album
196 lyrics.title = opts.title
198 lyrics.filename = opts.filename
201 if fetcher.get_lyrics(lyrics):
205 utilities.log(
True,
"No lyrics found for this track")
209 if __name__ ==
'__main__':