Skip to main content

Notice

Please note that most of the software linked on this forum is likely to be safe to use. If you are unsure, feel free to ask in the relevant topics, or send a private message to an administrator or moderator. To help curb the problems of false positives, or in the event that you do find actual malware, you can contribute through the article linked here.
Topic: Lyrics Grabber Feedback & Discussion (Read 252639 times) previous topic - next topic
0 Members and 1 Guest are viewing this topic.

Lyrics Grabber Feedback & Discussion

Reply #151
I think it would be better to have a button "Force update" instead of corresponding option to rewrite lyrics tag, when it is already here.

Lyrics Grabber Feedback & Discussion

Reply #152
Quote
Maybe it's just me, or it's a bug:
Lyrics grabber seems to forget quiet tagging is enabled between foobar or computerrestarts. Have to enable it every day again.

Oops, forgot to write that during shutdown, I'll fix that later.

Quote
I think it would be better to have a button "Force update" instead of corresponding option to rewrite lyrics tag, when it is already here.

Good idea 

P.S: There'se significant changes in the next release, which supports custom meta field-value pair, I hope it will be useful for those who want to write custom providers not only grab lyrics 


Lyrics Grabber Feedback & Discussion

Reply #154
I have the next request, that IMHO can improve usability if implemented (sorry for my English, of course  ): I want lyrics grabber to be able to search lyrics with several engines at once and display results as in the picture f.ex.. It has to be possible to select not a complete row in list, but only the cell in one of the lyrics provider' columns.
This can be usefull, when comparing lyrics from different sources.




And of course, thank you once more for this plugin. I have tried all avaliable plugins for getting lyrics, but I think this one is the best!

Lyrics Grabber Feedback & Discussion

Reply #155
does it support iPod lyrics?

Lyrics Grabber Feedback & Discussion

Reply #156
Quote
Maybe it's just me, or it's a bug:
Lyrics grabber seems to forget quiet tagging is enabled between foobar or computerrestarts. Have to enable it every day again.

Oops, forgot to write that during shutdown, I'll fix that later.

Quote
I think it would be better to have a button "Force update" instead of corresponding option to rewrite lyrics tag, when it is already here.

Good idea 

P.S: There'se significant changes in the next release, which supports custom meta field-value pair, I hope it will be useful for those who want to write custom providers not only grab lyrics 
T.P.,

Thanks for this excellent plugin.

Would it be possible to have an option to inspect files for existing lyrics, and only when none are found, search for lyrics at providers?  That option would allow for locating newly-available lyrics without needless network traffic and without invalidating proofed lyrics.

-HB

Lyrics Grabber Feedback & Discussion

Reply #157
Would it be possible to have an option to inspect files for existing lyrics, and only when none are found, search for lyrics at providers?  That option would allow for locating newly-available lyrics without needless network traffic and without invalidating proofed lyrics.

Lyrics Grabber -> Configuration -> Skip tracks which contain lyrics field already

Lyrics Grabber Feedback & Discussion

Reply #158
Would it be possible to have an option to inspect files for existing lyrics, and only when none are found, search for lyrics at providers?  That option would allow for locating newly-available lyrics without needless network traffic and without invalidating proofed lyrics.

Lyrics Grabber -> Configuration -> Skip tracks which contain lyrics field already
Thank you novembre.


Update:

I just went to implement the Configuration option and noticed that it's under the SAVE part of Configuration.  I had forgotten that I had already checked it. It reads:
[indent][/indent]“Skip UPDATING files whose tag already exists.”
So this implements the "avoid invalidating proofed lyrics" request, but does not eliminate the time and needless traffic of checking for lyrics where they already exist.  I request that option.

Lyrics Grabber Feedback & Discussion

Reply #159
I just went to implement the Configuration option and noticed that it's under the SAVE part of Configuration.  I had forgotten that I had already checked it. It reads:
"Skip UPDATING files whose tag already exists."
So this implements the "avoid invalidating proofed lyrics" request, but does not eliminate the time and needless traffic of checking for lyrics where they already exist.  I request that option.

I think that option already does what you're trying to get. Try it yourself: select a few tracks with lyrics already and run lyrics grabber: nothing happens, lyrics grabber doesn't even start to search for lyrics.

Lyrics Grabber Feedback & Discussion

Reply #160
I just went to implement the Configuration option and noticed that it's under the SAVE part of Configuration.  I had forgotten that I had already checked it. It reads:
"Skip UPDATING files whose tag already exists."
So this implements the "avoid invalidating proofed lyrics" request, but does not eliminate the time and needless traffic of checking for lyrics where they already exist.  I request that option.

I think that option already does what you're trying to get. Try it yourself: select a few tracks with lyrics already and run lyrics grabber: nothing happens, lyrics grabber doesn't even start to search for lyrics.
Lyricsgrabber seems to search every selected song every time.  I have a satellite connection, so the propogation delay makes the response very slow.

 

Lyrics Grabber Feedback & Discussion

Reply #161
here are two scripts which can fetch GENRE and STYLE tags from Discogs and put them in appropriate tags on any number of files or maybe your whole library

speed isn't it strong side, but it functions like this:
from every track ARTIST and ALBUM tags are used to get the discogs release ID, which is chosen as the first from the response list, and then according to GENRE/STYLE tags they are written to files

to use them you need to copy the files to the scripts folder (usually "C:\Program Files\foobar2000\pygrabber\scripts")
then, go to context menu > lyrics grabber > configuration and change the lyric field to appropriate field i.e. GENRE or STYLE depending on which script will run

Discogs_GetGenre.py
Code: [Select]
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 Genre Tag'
   
    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%]")
           
            try:
                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

                lyric=getGenres(xml.etree.ElementTree.fromstring(unzipped_data))
                lyric=str(lyric).strip('[]').replace(',', ';').replace('\'','')
                result.append(lyric)
            except Exception, e:
                traceback.print_exc(file=sys.stdout)
                result.append('')
                continue
       
        return result

if __name__ == "__main__":
    LyricProviderInstance = Discogs_GetGenre()

Discogs_GetStyle.py
Code: [Select]
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_GetStyle(LyricProviderBase):
    def GetName(self):
        return 'Discogs Style Tag'
   
    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%]")
           
            try:
                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 getStyles(tree):
                    styles = []
                    release = tree.find('release')
                    styleList = release.find('styles')
                    if styleList:
                        for i in styleList:
                            styles.append(i.text)
                    return styles

                lyric=getStyles(xml.etree.ElementTree.fromstring(unzipped_data))
                lyric=str(lyric).strip('[]').replace(',', ';').replace('\'','')
                result.append(lyric)
            except Exception, e:
                traceback.print_exc(file=sys.stdout)
                result.append('')
                continue
       
        return result

if __name__ == "__main__":
    LyricProviderInstance = Discogs_GetStyle()

[edit] well, it is limited to 5,000 requests per 24-hour period, per IP address

Lyrics Grabber Feedback & Discussion

Reply #162
two more scripts (which are faster and easier to write then above) but results are less accurate because they came from Last.fm:

LastFm_TopTag.py - fetches the most counted tag (GENRE) through "track.gettoptags" for the particular ARTIST and TITLE:
Code: [Select]
import urllib
from xml.dom import minidom
from encodings import utf_8
from grabber import LyricProviderBase

class LastFm_TopTag(LyricProviderBase):
    def GetName(self):
        return "LastFm TopTag"

    def GetVersion(self):
        return "0.1"

    def GetURL(self):
        return "http://ws.audioscrobbler.com/"

    def Query(self, handles, status, abort):
        result = []
        api_key = 'b25b959554ed76058ac220b7b2e0a026'

        for handle in handles:
            status.Advance()

            if abort.Aborting():
                return result

            artist = handle.Format("[%artist%]")
            title = handle.Format("[%title%]")

            try:
                string=urllib.urlopen('http://ws.audioscrobbler.com/2.0/?method=track.gettoptags&artist=' + artist.lower().replace(' ','+') + '&track=' + title.lower().replace(' ','+') + '&api_key=' + api_key).read()
                doc = minidom.parseString(string)
                child = doc.getElementsByTagName("tag")[0]
                toptag = child.getElementsByTagName("name")[0]
                lyric = toptag.childNodes[0].data.encode('utf_8').capitalize()
                result.append(lyric)
            except Exception, e:
                traceback.print_exc(file=sys.stdout)
                result.append('')
            continue

        return result

if __name__ == "__main__":
    LyricProviderInstance = LastFm_TopTag()

LastFm_TrackTags.py - fetches all top tags (GENRE) through "track.getinfo" for the particular ARTIST and TITLE (obviously not very good idea):
Code: [Select]
import urllib
from xml.dom import minidom
from encodings import utf_8
from grabber import LyricProviderBase

class LastFm_TrackTags(LyricProviderBase):
    def GetName(self):
        return "LastFm TrackTags"

    def GetVersion(self):
        return "0.1"

    def GetURL(self):
        return "http://ws.audioscrobbler.com/"

    def Query(self, handles, status, abort):
        result = []
        api_key = 'b25b959554ed76058ac220b7b2e0a026'

        for handle in handles:
            status.Advance()

            if abort.Aborting():
                return result

            artist = handle.Format("[%artist%]")
            title = handle.Format("[%title%]")

            try:
                string=urllib.urlopen('http://ws.audioscrobbler.com/2.0/?method=track.getinfo&api_key=' + api_key + '&artist=' + artist.lower().replace(' ','+') + '&track=' + title.lower().replace(' ','+')).read()
                doc = minidom.parseString(string)
                child = doc.getElementsByTagName("toptags")[0]
                toptags = child.getElementsByTagName("tag")
                tags=[]
                for i in toptags:
                    tags.append(str(i.getElementsByTagName("name")[0].toxml()).replace('<name>','').replace('</name>','').capitalize( ))
                lyric=str(tags).strip('[]').replace(',', ';').replace('\'','')
                result.append(lyric)
            except Exception, e:
                traceback.print_exc(file=sys.stdout)
                result.append('')
            continue

        return result

if __name__ == "__main__":
    LyricProviderInstance = LastFm_TrackTags()

Lyrics Grabber Feedback & Discussion

Reply #163
Maybe this could interesting for fetching tags from Last.fm.
It was written for Picard Tagger, but i think it could also be usefull for this Plugin.
http://tiptoes.hobby-site.com/mbz/lastfm/

Lyrics Grabber Feedback & Discussion

Reply #164
Maybe this could interesting for fetching tags from Last.fm.
It was written for Picard Tagger, but i think it could also be usefull for this Plugin.
http://tiptoes.hobby-site.com/mbz/lastfm/


I'm just going to lie down here, that's so extensive and awesome but it'll also wants to make me to tag my entire collection AGAIN. You bastards, why does this forum always give me acces to more information and stuff to catalogue my music even better?

Too bad it doesn't auto-recognize the different tags, that would make it a match made in heaven.

Lyrics Grabber Feedback & Discussion

Reply #165
Would it be possible to make the "lyric field" field in configuration allow Foobar scripting? (Though the new Python stuffs might change things...) I want to set it up to put lyrics for m4a files in the <lyrics> tag, but lyrics for mp3's in the <unsynced lyrics> tag, since iTunes expects mp3 lyrics to be in unsynced lyrics but AAC/ALAC lyrics to be in lyrics because Apple doesn't like consistency.

Lyrics Grabber Feedback & Discussion

Reply #166
I updated my Windows, and now having problem with starting python grabber:

[font= "Lucida Console"]Failed to load DLL: foo_grabber_python.dll, reason: This component is missing a required dependency, or was made for different version of foobar2000.[/font][/size]

I downloaded again the latest release (06 Feb) and try to install it, but same error. On Vista I didn't have problem with it, so maybe I'm missing install instructions, but I followed them. Or does this component needs recompile?

Here is my list of files:

[font= "Lucida Console"]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

Microsoft Windows [Version 6.1.7127][/font]
[/size]

Lyrics Grabber Feedback & Discussion

Reply #167
Python25.dll requires MSVCR71.dll, so I may included that dependency in the next version.

Lyrics Grabber Feedback & Discussion

Reply #168
That solved the problem, thanks
I was planning to install VS later, and didn't know about this dependence

Lyrics Grabber Feedback & Discussion

Reply #169
Quote
(I am not saying this is a great problem, as this probably only applies to some DT tracks..., just thought I'd notify you of it).


I'll consider that in the next version, thanks for reporting.

Any news on this issue? Not finding lyrics doesn't bother me (other providers work fine) but the annoyance is that FB2K crashes...

Lyrics Grabber Feedback & Discussion

Reply #170
A good idea is to be able to search for a specific lyric when nothing is found, specifying the name and the artist.

Sometimes you have those songs with (Acoustic Live 2004) or (Acoustic version) or (lyrics by Jani Limateinen) that you really don't want to go, change the name, and then search and change back.

Lyrics Grabber Feedback & Discussion

Reply #171
Hi there,

I've tried Lyrics Grabber on the following album :
- Album artist : Superbus
- Album : Lova Lova

The whole album is present on Lyric Wiki ( http://lyricwiki.org/Superbus:Lova_Lova_(2009) ), but two lyrics are currently failing to download. Why are they failing ? Because in Lyric Wiki their titles are :
- "Apprends moi"
- "Keyhole"

While in my library their titles are :
- "Apprends-moi"
- "Key Hole"

Of course I could modify the titles, but if I had to do it for all the tracks in my library it would be quite impossible.
Besides, the correct title for the first track would actually be "Apprends-moi" ("Apprends moi" is gramatically incorrect in french)

That's why I would suggest that Lyrics Grabber becomes "space tolerant" and "symbol tolerant" :
1. Take %title%
2. Eliminate all spaces and symbols
3. Do the same with Lyric Wiki's title
4. Compare both

That way, my titles would become "Apprendsmoi" and "Keyhole" and could match the corresponding Lyric Wiki titles "Apprendsmoi" and "Keyhole".

What do you think T.P. ? Can this be done ?

Lyrics Grabber Feedback & Discussion

Reply #172
Another two missed lyrics :


1. From Britney Spears' "Circus" :
- My title : "MMM Papi"
- Lyric Wiki's title : "Mmm Papi"

So could Lyrics Grabber also be "caps tolerant" please ?  ("space tolerant", "symbol tolerant" and "caps tolerant")


2. From Alanis Morissette's "Underneath" CDS :
- My title : 20/20
- Lyric Wiki's title : 20/20 (yes ! the same title ! see it here : http://lyricwiki.org/Alanis_Morissette:20/20 )

I don't know where this error comes from, but I guess if Lyrics Grabber was "symbol tolerant" this wouldn't happen anymore, so...

Lyrics Grabber Feedback & Discussion

Reply #173
I have also installed the python scripts to test them. I have currently 6 available scripts : AZ Lyrics, DarkLyrics, Leo's Lyrics, LyricDB, and 2 chinese LRC scripts.

On Superbus tracks :
- "Apprends-moi" : all failed (LyricWiki, Lyric Plugin, and the Python Scripts)
- "Key Hole" : all failed except Lyric Plugin (not because it's better, but rather because the track probably figures exactly as "Key Hole" at one of Lyric Plugin's sites while at LyricWiki it's "Keyhole")

I really think Lyrics Grabber needs to become "space tolerant", "symbol tolerant" and "caps tolerant", maybe by implementing some Levenshtein distance code (thanks to 2E7AH for pointing this out  ).

T.P, are you there ? Tell us what you think please !!

Lyrics Grabber Feedback & Discussion

Reply #174
foorious,
DarkLyrics, LyrDB, Lyricist(LRC) and TTPlayer(LRC) already contain that code, but for searching after successful respond by provider. Maybe it's hard to implement it for actual search, but some string manipulation in case of failed search I think is possible