Quote:
Originally Posted by noise
tore, are you willing to share that script? it sounds incredibly useful!
at one point i tried using various plugins to grab genre/style info from AllMusic, but never got very good results...
i'm not sure how much i would like using someone else's categorizations, but i can always back up tags and restore them if things don't work out 
|
Certainly

It's a bit of a workaround - it's actually based on a plugin which allows custom python scripts to fetch lyrics .. But since they are custom scripts, it's not hard to rewrite them so that they fetch other things. My own script is a merge of two other scripts, one to fetch discogs genres and one to fetch styles .. First, I just put those two together. Then there was a problem with queries, you're only allowed to access discogs 5000 times per 24 hours that way, so you could only tag 5000 files. I came up with a workaround for that problem by using text files as temporary storage for information. Basically, when the script starts working on a file, it writes that song's album title into a text file and fetches discogs info. When it moves on to the next file, it compares the album title to the information written to the text file by the previous song. If it's the same, it just tags it with the same info. If the album is different, it fetches new info and rewrites the text files. It also uses a text file for temporary storage of the information that goes into the genre and style tags, but that's the jist of it. Instead of tagging 5000 songs, you can tag 5000 albums ..
It doesn't work for all files, but at least for more than 3/4ths of my own collection. Aside from artists and albums having wrong titles, a possible problem is when there are more bands with the same name. Discogs register them as Band (1), Band (2) and so on (f.ex Arsenal (1), Arsenal (2) etc.) and since we don't normally have numbers in parantheses after band names, those may not get tagged.
Anyways, to make it work, there are a few things you're gonna need:
And these two, both found at the same location :
The latter of those two contains some files and folders (ex. python25.dll) that all need to be located in your base foobar folder. The files and folders should look something like this :
Code:
C:\Program Files\foobar2000>dir p*.dll /s/b & dir *grab* /s/b & dir pygrabber\* /s/b & ver
C:\Program Files\foobar2000\python25.dll
C:\Program Files\foobar2000\lyrics_grabber_provider.cfg
C:\Program Files\foobar2000\pygrabber
C:\Program Files\foobar2000\components\foo_grabber_python.dll
C:\Program Files\foobar2000\components\foo_lyricsgrabber.dll
C:\Program Files\foobar2000\pygrabber\libs
C:\Program Files\foobar2000\pygrabber\newscripts
C:\Program Files\foobar2000\pygrabber\scripts
C:\Program Files\foobar2000\pygrabber\system
C:\Program Files\foobar2000\pygrabber\newscripts\newscripts.rar
C:\Program Files\foobar2000\pygrabber\scripts\AZLyrics.py
C:\Program Files\foobar2000\pygrabber\scripts\DarkLyrics.py
C:\Program Files\foobar2000\pygrabber\scripts\Discogs_GetGenre.py
C:\Program Files\foobar2000\pygrabber\scripts\Discogs_GetStyle.py
C:\Program Files\foobar2000\pygrabber\scripts\LastFm_Bio.py
C:\Program Files\foobar2000\pygrabber\scripts\LastFm_TopTag.py
C:\Program Files\foobar2000\pygrabber\scripts\LastFm_TrackTags.py
C:\Program Files\foobar2000\pygrabber\scripts\LeosLyrics.py
C:\Program Files\foobar2000\pygrabber\scripts\LyrDB.py
C:\Program Files\foobar2000\pygrabber\scripts\Lyricist(LRC).py
C:\Program Files\foobar2000\pygrabber\scripts\TTPlayer(LRC).py
C:\Program Files\foobar2000\pygrabber\system\autoexec.py
C:\Program Files\foobar2000\pygrabber\system\BeautifulSoup.py
C:\Program Files\foobar2000\pygrabber\system\BeautifulSoup.pyc
C:\Program Files\foobar2000\pygrabber\system\Html2Text.py
C:\Program Files\foobar2000\pygrabber\system\Html2Text.pyc
C:\Program Files\foobar2000\pygrabber\system\LevenshteinDistance.py
C:\Program Files\foobar2000\pygrabber\system\LevenshteinDistance.pyc
C:\Program Files\foobar2000\pygrabber\system\Lucky.py
C:\Program Files\foobar2000\pygrabber\system\Lucky.pyc
C:\Program Files\foobar2000\pygrabber\system\pyexpat.pyd
C:\Program Files\foobar2000\pygrabber\system\Python25.zip
C:\Program Files\foobar2000\pygrabber\system\unicodedata.pyd
C:\Program Files\foobar2000\pygrabber\system\_socket.pyd
Sorry if I'm making it look tricky. If you have foo_utils, then all you really should have to do is unpack those two archives to your foobar folder, but I managed to misplace these files on my first try, so I figured I'd just make it clear.
Your foobar folder will now contain a folder called "/pygrabber/scripts". This is where you should put the script I've written. The simplest way to do it I guess is just paste the script here for you to copy and paste. Then I can show you the changes you should make.
So, copy the following script and save it in a text file in the scripts folder. Rename it to something like "tores_discogs_script.py" and then you may want to edit it and have a closer look at the
red parts :
Code:
import urllib, urllib2, gzip, cStringIO
import xml.etree.ElementTree
from xml.dom import minidom
from encodings import utf_8
from grabber import LyricProviderBase
class Discogs_GetGenre(LyricProviderBase):
def GetName(self):
return 'Discogs GenStyles'
def GetVersion(self):
return '0.1'
def GetURL(self):
return 'http://www.discogs.com'
def Query(self, handles, status, abort):
result = []
api_key = '783001745d'
for handle in handles:
status.Advance()
if abort.Aborting():
return result
artist = handle.Format("[%artist%]")
album = handle.Format("[%album%]")
album_file = open("C:\Python26\!album.txt", "r")
test = album_file.read()
album_file.close()
try:
if album == test:
text_file = open("C:\Python26\!tag3.txt", "r")
writeout = text_file.read()
text_file.close()
result.append(writeout)
else:
URL_s = 'http://www.discogs.com/search?type=all&q=' + artist.lower().replace(' ','+') + '+' + album.lower().replace(' ','+') + '&f=xml&api_key=' + api_key
request = urllib2.Request(URL_s)
request.add_header('Accept-Encoding', 'gzip')
response = urllib2.urlopen(request)
data = response.read()
unzipped_data = gzip.GzipFile(fileobj = cStringIO.StringIO(data)).read()
res = minidom.parseString(unzipped_data)
uri_1 = res.getElementsByTagName("uri")[0]
rel_id = uri_1.childNodes[0].data.encode('utf-8').rpartition('/')[2]
URL_r = 'http://www.discogs.com/release/' + rel_id + '?f=xml&api_key=' + api_key
request = urllib2.Request(URL_r)
request.add_header('Accept-Encoding', 'gzip')
response = urllib2.urlopen(request)
data = response.read()
unzipped_data = gzip.GzipFile(fileobj = cStringIO.StringIO(data)).read()
xml.etree.ElementTree.fromstring(unzipped_data)
def getGenres(tree):
genres = []
release = tree.find('release')
genreList = release.find('genres')
if genreList:
for i in genreList:
genres.append(i.text)
return genres
def getStyles(tree):
styles = []
release = tree.find('release')
styleList = release.find('styles')
if styleList:
for i in styleList:
styles.append(i.text)
return styles
lyric=getGenres(xml.etree.ElementTree.fromstring(unzipped_data))
lyric.append('//')
lyric.append(getStyles(xml.etree.ElementTree.fromstring(unzipped_data)))
lyric=str(lyric).strip('[').strip(']').replace(',', ';').replace('\'','').replace('[','').replace('Folk; World; & Country','Folk, World, & Country')
result.append(lyric)
album_file = open("C:\Python26\!album.txt", "w")
album_file.write(album)
album_file.close()
text_file = open("C:\Python26\!tag3.txt", "w")
text_file.write(lyric)
text_file.close()
except Exception, e:
traceback.print_exc(file=sys.stdout)
result.append('')
album_file = open("C:\Python26\!album.txt", "w")
album_file.write(album)
album_file.close()
text_file = open("C:\Python26\!tag3.txt", "w")
text_file.write('')
text_file.close()
continue
return result
if __name__ == "__main__":
LyricProviderInstance = Discogs_GetGenre()
Continued ->