Lyricator v1.5.5 (2022-11-25)

Download and get help for different MediaMonkey for Windows 4 Addons.

Moderators: Peke, Gurus

thehammer
Posts: 153
Joined: Wed Dec 15, 2004 2:15 pm

Re: Lyricator v1.2.2 (2014-10-12)

Post by thehammer »

tj_junk wrote:Any idea what provider(s) are used by the built-in lyric finder (e.g., the feature that is configured via Tools > Options > Library > Metadata Lookup)?

The built-in finder has a very good success rate. However, it's not publicly extensible, and you cannot run in on a batch of files, like you can with the Lyricator tool. Plus, the built-in has no confirmation step: it's completely automatic, which is great when it works, but bad when it pulls back incorrect lyrics.

I wish the two tools were combined. I like the provider(s) and success rate of the built-in tool, but love the batch capability and confirmation of Lyricator.
Thanks for all the input and code snippets! I think I can get all of these in except the source order. The way the lookup happens iteratively makes it difficult to do what I think you are suggesting without a major rewrite. I'll have to think on that some more.

I don't know what the built in lyrics search uses but in the testing I have done I found it putting tons of incorrect lyrics in. Letras was doing the same thing before in Lyricator before a user suggested a good check that I put in before taking results. Anyway, if we find out what sites it uses I can look into it.
ImageSpoon!
thehammer
Posts: 153
Joined: Wed Dec 15, 2004 2:15 pm

Re: Lyricator v1.2.2 (2014-10-12)

Post by thehammer »

Meander wrote:
For the first issue, it sounds like the plugin was installed for all users.
Nope. I install all scripts for current user only.

Just to be clear - I'm using the context menu to access Lyricator, having pre-selected the track(s). What I get is a window which shows those selections in a (wrapped) column on the left hand side. There's no other formatting/style sheet or function beyond that, until I confirm the options.
are you saying that you cannot put a carriage return in the lyrics
Yep. As simple as that.
What version of Windows and Internet Explorer do you have?
ImageSpoon!
Meander
Posts: 67
Joined: Fri Jun 06, 2014 8:45 am

Re: Lyricator v1.2.2 (2014-10-12)

Post by Meander »

What version of Windows and Internet Explorer do you have?
Windows 8.1 pro

IE 11.0.9600.17351
tj_junk
Posts: 71
Joined: Thu Apr 13, 2006 10:10 am

Re: Lyricator v1.2.2 (2014-10-12)

Post by tj_junk »

tj_junk wrote:Suggestions:
  • Add option to ignore lyrics that are all upper case or all lower case
    ...
  • An alternative to ignoring lyrics that are all upper case or lower case:
  • Add option to format lyrics that are all upper case or all lower case

    The following code formats lyrics that are 3 or more lines, where the lyrics all upper case or lower case. It capitalizes the first word of every line, plus variations of the pronoun I (e.g., I'm, I've, I'd), Dr.|Mr.|Mrs.|Ms., USA|USSR|UK, and any word that follows a period or semicolon. (Obviously, it's impossible to format all proper names and titles, so I'm not going to even try, other than the most obvious ones listed here.) Unit tested and verified.

    Code: Select all

    
    if (formatLyricsWithoutMixedCase 
        || l.split(/<br>|\r\n|\r|\n/).length >= 3 
        || (l.replace(/<br>/gi, "") == l.replace(/<br>/gi, "").toUpperCase() 
        && l.replace(/<br>/gi, "") == l.replace(/<br>/gi, "").toLowerCase()))  {
        l = l.toLowerCase().replace(/(^\s*[a-z]|<br>\s*[a-z]|[\r\n]\s*[a-z]|\Wuk\W|\Wusa\W|\Wussr\W|\Wi\W|[;.] +[a-z]|\W[dm]r\.|\Wmrs\.|\Wms\.)/gm, function(m){ return m.toUpperCase() });
    }
    
    
Last edited by tj_junk on Fri Oct 17, 2014 8:44 pm, edited 1 time in total.
tj_junk
Posts: 71
Joined: Thu Apr 13, 2006 10:10 am

Re: Lyricator v1.2.2 (2014-10-12)

Post by tj_junk »

thehammer wrote:Thanks for all the input and code snippets! I think I can get all of these in except the source order. The way the lookup happens iteratively makes it difficult to do what I think you are suggesting without a major rewrite. I'll have to think on that some more.
It might be difficult to implement configurable provider rankings, unless the user could assign a number to rank each provider (say from 1-20) and then have the tool iterate from 1 to 20, searching the corresponding provider. Kinda cheesy, but that might work.

On the other hand, if you agree with my assessment, you can simply rearrange the function calls to "hard code the ranking" so that the providers are called in the preferred sequence. (I think I already have my copy of Lyricator resequenced. I can copy the source code here when i get home. ** done **)

** UPDATE: ** Here is the Lyricator.js function with the search calls sequenced by provider preference.

Code: Select all

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var init = function() {

// To add lyrics site add init check for when enabled
// The Lyrics providers vary in terms of success rate, turnaround speed, and text formatting.
// You can sequence the following function calls to suit your provider preferences.

   if(tryLyricsMode) {
      rLyricsMode = new Request({method:'get',onSuccess:rSuccessLyricsMode,onException:rNextLyricsMode,onFailure:rNextLyricsMode,onCancel:rNextLyricsMode});
      rLyricsMode.host = 'http://www.lyricsmode.com/lyrics/%artistfirstchar%/%artist%/%title%.html';
      rLyricsMode.sendString = '';
      rLyricsMode.timeout = '20000';
      rLyricsMode.delay = '50';
      rLyricsMode.name = 'Lyrics Mode';
      rLyricsMode.className = 'LyricsMode';

      aR.include(rLyricsMode);
   }
   if(trySongColeta) {
      rSongColeta = new Request({method:'get',onSuccess:rSuccessSongColeta,onException:rNextSongColeta,onFailure:rNextSongColeta,onCancel:rNextSongColeta});
      rSongColeta.host = 'http://www.songcoleta.com/lyrics/%title%_(%artist%)';
      rSongColeta.sendString = '';
      rSongColeta.timeout = '20000';
      rSongColeta.delay = '1000';
      rSongColeta.name = 'SongColeta';
      rSongColeta.className = 'SongColeta';

      aR.include(rSongColeta);
   }
   if(tryLyrDB) {
      rLyrDB = new Request({method:'get',onSuccess:rSuccessLyrDB,onException:rNextLyrDB,onFailure:rNextLyrDB,onCancel:rNextLyrDB});
      rLyrDB.host = 'http://webservices.lyrdb.com/lookup.php?for=match&q=%artist%|%title%&agent=MediaMonkey';
      rLyrDB.sendString = '';
      rLyrDB.timeout = '20000';
      rLyrDB.delay = '50';
      rLyrDB.name = 'Lyr DB';
      rLyrDB.className = 'LyrDB';

      aR.include(rLyrDB);
   }
   if(tryHiplyrics) {
      rHiplyrics = new Request({method:'get',onSuccess:rSuccessHiplyrics,onException:rNextHiplyrics,onFailure:rNextHiplyrics,onCancel:rNextHiplyrics});
      rHiplyrics.host = 'http://www.hiplyrics.com/lyrics/%title%-by-%artist%-lyrics.html';
      rHiplyrics.sendString = '';
      rHiplyrics.timeout = '20000';
      rHiplyrics.delay = '50';
      rHiplyrics.name = 'hiplyrics';
      rHiplyrics.className = 'hiplyrics';

      aR.include(rHiplyrics);
   }
   if(tryGenius) {
      rGenius = new Request({method:'get',onSuccess:rSuccessGenius,onException:rNextGenius,onFailure:rNextGenius,onCancel:rNextGenius});
      rGenius.host = 'http://%genre%.genius.com/%artist%-%title%-lyrics';
      rGenius.sendString = '';
      rGenius.timeout = '20000';
      rGenius.delay = '1000';
      rGenius.name = 'Genius';
      rGenius.className = 'Genius';

      aR.include(rGenius);
   }
   if(trySeekALyric) {
      rSeekALyric = new Request({method:'get',onSuccess:rSuccessSeekALyric,onException:rNextSeekALyric,onFailure:rNextSeekALyric,onCancel:rNextSeekALyric});
      rSeekALyric.host = 'http://www.seekalyric.com/song/%artist%/%title%';
      rSeekALyric.sendString = '';
      rSeekALyric.timeout = '20000';
      rSeekALyric.delay = '50';
      rSeekALyric.name = 'Seek A Lyric';
      rSeekALyric.className = 'SeekALyric';

      aR.include(rSeekALyric);
   }
   if(tryELyrics) {
      rELyrics = new Request({method:'get',onSuccess:rSuccessELyrics,onException:rNextELyrics,onFailure:rNextELyrics,onCancel:rNextELyrics});
      rELyrics.host = 'http://www.elyrics.net/read/%artistfirstchar%/%artist%-lyrics/%title%-lyrics.html';
      rELyrics.sendString = '';
      rELyrics.timeout = '20000';
      rELyrics.delay = '50';
      rELyrics.name = 'ELyrics';
      rELyrics.className = 'ELyrics';

      aR.include(rELyrics);
   }
   if(tryMetroLyrics) {
      rMetroLyrics = new Request({method:'get',onSuccess:rSuccessMetroLyrics,onException:rNextMetroLyrics,onFailure:rNextMetroLyrics,onCancel:rNextMetroLyrics});
      rMetroLyrics.host = 'http://www.metrolyrics.com/%title%-lyrics-%artist%.html';
      rMetroLyrics.sendString = '';
      rMetroLyrics.timeout = '20000';
      rMetroLyrics.delay = '50';
      rMetroLyrics.name = 'Metro Lyrics';
      rMetroLyrics.className = 'MetroLyrics';

      aR.include(rMetroLyrics);
   }
   if(tryLetras) {
      rLetras = new Request({method:'get',onSuccess:rSuccessLetras,onException:rNextLetras,onFailure:rNextLetras,onCancel:rNextLetras});
      rLetras.host = 'http://letras.mus.br/winamp.php?artista=%artist%&musica=%title%';
      rLetras.sendString = 'artista=%artist%&musica=%title%';
      rLetras.timeout = '20000';
      rLetras.delay = '50';
      rLetras.name = 'Letras';
      rLetras.className = 'Letras';

      aR.include(rLetras);
   }
   if(tryAZLyrics) {
      rAZLyrics = new Request({method:'get',onSuccess:rSuccessAZLyrics,onException:rNextAZLyrics,onFailure:rNextAZLyrics,onCancel:rNextAZLyrics});
      rAZLyrics.host = 'http://www.azlyrics.com/lyrics/%artist%/%title%.html';
      rAZLyrics.sendString = '';
      rAZLyrics.timeout = '20000';
      rAZLyrics.delay = '1000';
      rAZLyrics.name = 'AZ Lyrics';
      rAZLyrics.className = 'AZLyrics';

      aR.include(rAZLyrics);
   }
   if(tryLyricWikia) {
      rLyricWikia = new Request({method:'get',onSuccess:rSuccessLyricWikia,onException:rNextLyricWikia,onFailure:rNextLyricWikia,onCancel:rNextLyricWikia});
      rLyricWikia.host = 'http://lyrics.wikia.com/%artist%:%title%';
      rLyricWikia.sendString = '';
      rLyricWikia.timeout = '20000';
      rLyricWikia.delay = '50';
      rLyricWikia.name = 'Lyrics Wiki';
      rLyricWikia.className = 'LyricWikia';

      aR.include(rLyricWikia);
   }
   if(tryMp3Lyrics) {
      rMp3Lyrics = new Request({method:'get',onSuccess:rSuccessMp3Lyrics,onException:rNextMp3Lyrics,onFailure:rNextMp3Lyrics,onCancel:rNextMp3Lyrics});
      rMp3Lyrics.host = 'http://www.mp3lyrics.org/%artist%/%title%';
      rMp3Lyrics.sendString = '';
      rMp3Lyrics.timeout = '20000';
      rMp3Lyrics.delay = '50';
      rMp3Lyrics.name = 'Mp3Lyrics';
      rMp3Lyrics.className = 'Mp3Lyrics';

      aR.include(rMp3Lyrics);
   }
   if(tryLyricstime) {
      rLyricstime = new Request({method:'get',onSuccess:rSuccessLyricstime,onException:rNextLyricstime,onFailure:rNextLyricstime,onCancel:rNextLyricstime});
      rLyricstime.host = 'http://www.lyricstime.com/%artist%-%title%-lyrics.html';
      rLyricstime.sendString = '';
      rLyricstime.timeout = '20000';
      rLyricstime.delay = '50';
      rLyricstime.name = 'lyricstime';
      rLyricstime.className = 'lyricstime';

      aR.include(rLyricstime);
   }

   bruteForce = tryAllArtists || tryCommaArtists || tryParensA || tryBracketsA || tryBracesA || trySplitArrayA || tryParensT || tryBracketsT || tryBracesT || trySplitArrayT;

   loading = new Asset.image(loadinggif);
   status = $('Status');
   tracks = $$('div[class=track]');
   if(!tracks.length) return;
   tracks.each(
      function(e) {
         e.addEvent('click', trackClick);
         e.addEvent('mouseover', trackOver);
         e.addEvent('mouseout', trackOut);
         e.addEvent('contextmenu', trackContextMenu);
      }
   )
   $$('input[type=checkbox]').each(function(e) { e.addEvent('click', function() {if(!e.checked) e.parentNode.parentNode.addClass('unchecked'); else e.parentNode.parentNode.removeClass('unchecked'); window.event.cancelBubble = true;});});
   $('Header').innerHTML = '<button id="PauseButton" onclick="pause();">Pause</button><span id="GlobalStatus"></span><span id="GlobalStats"></span><span id="GlobalHost"></span><br><br><span id="Legend">Legend: </span>';

// To add lyrics site create status html here to show when processing
   if(tryAZLyrics) {  $('Header').innerHTML += '<span class="textAZLyrics">AZLyrics</span> ' ; }
   if(tryLyricWikia) {  $('Header').innerHTML += '<span class="textLyricWikia">LyricWikia</span> ' ; }
   if(tryLyrDB) {  $('Header').innerHTML += '<span class="textLyrDB">LyrDB</span> ' ; }
   if(tryLetras) {  $('Header').innerHTML += '<span class="textLetras">Letras</span> ' ; }
   if(tryLyricsMode) {  $('Header').innerHTML += '<span class="textLyricsMode">LyricsMode</span> ' ; }
   if(tryMp3Lyrics) {  $('Header').innerHTML += '<span class="textMp3Lyrics">Mp3Lyrics</span> ' ; }
   if(trySeekALyric) {  $('Header').innerHTML += '<span class="textSeekALyric">SeekALyric</span> ' ; }
   if(tryMetroLyrics) {  $('Header').innerHTML += '<span class="textMetroLyrics">MetroLyrics</span> ' ; }
   if(tryELyrics) {  $('Header').innerHTML += '<span class="textELyrics">ELyrics</span> ' ; }
   if(tryHiplyrics) {  $('Header').innerHTML += '<span class="textHiplyrics">hiplyrics</span> ' ; }
   if(tryLyricstime) {  $('Header').innerHTML += '<span class="textLyricstime">lyricstime</span> ' ; }
   if(trySongColeta) {  $('Header').innerHTML += '<span class="textSongColeta">SongColeta</span> ' ; }
   if(tryGenius) {  $('Header').innerHTML += '<span class="textGenius">Genius</span> ' ; }

   $('Popup').innerHTML = '<button onclick="updateLyrics();">Update Lyrics</button><button onclick="closeLyrics();">Cancel changes</button><br /><textarea id="PopupLyrics"></textarea>';

   whatNext(null, null, null, true);
}


Last edited by tj_junk on Fri Oct 17, 2014 8:33 pm, edited 1 time in total.
thehammer
Posts: 153
Joined: Wed Dec 15, 2004 2:15 pm

Re: Lyricator v1.2.2 (2014-10-12)

Post by thehammer »

tj_junk wrote:
thehammer wrote:Thanks for all the input and code snippets! I think I can get all of these in except the source order. The way the lookup happens iteratively makes it difficult to do what I think you are suggesting without a major rewrite. I'll have to think on that some more.
It might be difficult to implement configurable provider rankings, unless the user could assign a number to rank each provider (say from 1-20) and then have the tool iterate from 1 to 20, searching the corresponding provider. Kinda cheesy, but that might work.

On the other hand, if you agree with my assessment, you can simply rearrange the function calls to "hard code the ranking" so that the providers are called in the preferred sequence. (I think I already have my copy of Lyricator resequenced. I can copy the source code here when i get home.)
OK, so you are talking about rearranging the order that they get called. That is pretty straightforward. I thought you were talking about looping through all the top-ranked ones first with all the brute force options, then through the rest of them.
ImageSpoon!
gibbon
Posts: 49
Joined: Wed Nov 07, 2007 5:20 am

Lyricator v1.2.2 (2014-10-12)

Post by gibbon »

I love this script and use it regularly but lately I noticed that obviously not all lyrics are found and using the website of the lyrics-provider is sometimes more successfull.
I noticed this because I had an additional look with google in order to find missing lyrics.

Here's an example:
Lyrics-Provider: LyricWikia
Artist: Chapeau Claque
Album: Hand aufs Herz

With the lyricator I don't find any lyrics for the songs of this album using this provider .
If I make a search on their website I get offered all songs of this album.
http://lyrics.wikia.com/Chapeau_Claque: ... erz_(2007)

Why is the search with lyricator not successfull?
thehammer
Posts: 153
Joined: Wed Dec 15, 2004 2:15 pm

Re: Lyricator v1.2.2 (2014-10-12)

Post by thehammer »

gibbon wrote:I love this script and use it regularly but lately I noticed that obviously not all lyrics are found and using the website of the lyrics-provider is sometimes more successfull.
I noticed this because I had an additional look with google in order to find missing lyrics.

Here's an example:
Lyrics-Provider: LyricWikia
Artist: Chapeau Claque
Album: Hand aufs Herz

With the lyricator I don't find any lyrics for the songs of this album using this provider .
If I make a search on their website I get offered all songs of this album.
http://lyrics.wikia.com/Chapeau_Claque: ... erz_(2007)

Why is the search with lyricator not successfull?
Right off, I see that there is an apostrophe in the album name, but that shouldn't matter. I will have to look into this and make sure they haven't changed their URL.
ImageSpoon!
thehammer
Posts: 153
Joined: Wed Dec 15, 2004 2:15 pm

Re: Lyricator v1.2.2 (2014-10-12)

Post by thehammer »

thehammer wrote:
gibbon wrote:I love this script and use it regularly but lately I noticed that obviously not all lyrics are found and using the website of the lyrics-provider is sometimes more successfull.
I noticed this because I had an additional look with google in order to find missing lyrics.

Here's an example:
Lyrics-Provider: LyricWikia
Artist: Chapeau Claque
Album: Hand aufs Herz

With the lyricator I don't find any lyrics for the songs of this album using this provider .
If I make a search on their website I get offered all songs of this album.
http://lyrics.wikia.com/Chapeau_Claque: ... erz_(2007)

Why is the search with lyricator not successfull?
Right off, I see that there is an apostrophe in the album name, but that shouldn't matter. I will have to look into this and make sure they haven't changed their URL.
Fixed the issue and made it available as v1.2.3
ImageSpoon!
pocketlama
Posts: 13
Joined: Mon Oct 27, 2014 1:43 pm

Re: Lyricator v1.2.2 (2014-10-12)

Post by pocketlama »

When I select an album and click "All Configured Sites," I get a pop-up with the songs listed. But I can't click on the check boxes next to the songs.
thehammer
Posts: 153
Joined: Wed Dec 15, 2004 2:15 pm

Re: Lyricator v1.2.2 (2014-10-12)

Post by thehammer »

pocketlama wrote:When I select an album and click "All Configured Sites," I get a pop-up with the songs listed. But I can't click on the check boxes next to the songs.
If all the rows are gray, there is no spinning icon showing that lyrics are being looked up, and there are no lyrics listed in the far right column then the check boxes are not selectable because there is nothing to update on those tracks.
ImageSpoon!
gibbon
Posts: 49
Joined: Wed Nov 07, 2007 5:20 am

Feature Request: AlbumArtist

Post by gibbon »

Hi,
I suggest the following feature:

There should be an option to search for the tags of artist or albumartist alternatively.

Reason:
I tag my albums both with artist and albumartist.
This does not only refer to samplers where the albumartist would be "Various Artists".
There are also a lot of albums with 1 really albumartist and a lot of individual artists.
I also don't like to have "Feat. ..." and so on in my title-tags, because they don't belong there and are really a part of the artist.

At the moment Lyricator looks for the artist and the title. But on all servers with lyrics the lyrics are listed under the name of the albumartist.
Mostly the lyricator will find them anyway but it takes some time and a lot of different searching tries to strip brackets, feat., & ... and so on.

So for me and many others that tag in the same way it would be very nioce to have an option to tell lyricator to look for "albumartist - title".

As an example for such an album look here:
https://itunes.apple.com/de/album/tim-m ... d589284065

Albumartist: Tim McGraw
Album: Tim McGraw & Friends
Artists: Many different ones

Lyricator sends search-requests for all the different artists without success and is successfull with all tracks after stripping the artist to "Tim McGraw", which takes a lot of time and unnecessary search requests.
thehammer
Posts: 153
Joined: Wed Dec 15, 2004 2:15 pm

Re: Lyricator v1.3.1 (2014-12-20)

Post by thehammer »

Happy holidays! Thanks to tj_junk, who provided some enhancement requests and code snippets to use to start them off, I have finally got some time to add some new features and a fix to Lyricator. It is now available for update/install from HappyMonkeying.com.
  • Add: Ability to ignore lyrics returned without proper breaks
  • Add: Ability to modify character case on the fly if lyrics are all upper or lower case
  • Change: Sort lyrics sites in the popup menu
  • Change: Run lyrics site lookups with best results match and best formatted lyrics sites first
  • Fix: Hiplyrics artist and song title retrieval was returning html code
ImageSpoon!
tj_junk
Posts: 71
Joined: Thu Apr 13, 2006 10:10 am

Re: Lyricator v1.3.1 (2014-12-20)

Post by tj_junk »

Invalid Results / Reprocess feature

Lyricator always selects the first matching result (which is completely logical), but sometimes this yields invalid or incorrect lyrics.
  • The search logic sometimes selects the wrong song title, wrong artist, etc. which results in incorrect lyrics.
  • The providers sometimes return text to indicate “no match”, such as:
    * “Sorry lyrics cannot be displayed at this time...” (FROM: hiplyrics.com)
    * “Unfortunately, we don't have the lyrics for Your Song by Song Artist yet.
    Check back soon, as we are always working to find the latest lyrics and adding new songs every day.

    Or, if you want to give us a hand, you can submit them now!” (FROM: hiplyrics.com)
It is easy enough to avoid saving the invalid lyrics -- by unchecking the box in the leftmost results column. However, Lyricator does not provide a feature to reprocess tracks using a different search provider.

Currently, the only recourse is to save your results, exit Lyricator, unselect the tracks that returned valid lyrics, and then run the remaining tracks in Lyricator against individual lyric providers. (NOTE: You cannot reprocess those tracks against “All Providers”, or you will receive the same invalid results that you got the first time.) And, this is very cumbersome when trying to manage and process multiple tracks.

Ideally, the Lyricator should:
  • Maintain a black list of phrases that the providers use to indicate “no lyrics found”.
    NOTE: Some providers embed artist and song title in those phrases.
  • Allow user to save the valid lyrics in Lyricator
    a. Don’t close the dialog after saving
    (This is already possible via the option titled “Auto-Close after Save”)

    b. Re-enable the “Save” button after “Saving…” (* current bug *)

    c. Add a feature to remove tracks from list after saving lyrics (* new feature request *)
  • Allow the user to reprocess the remaining tracks, with the following logic:
    a. Skip tracks that were unable to find any results
    (No need to waste time repeating a search that will ultimately fail.)

    b. Ignore the providers that returned invalid lyrics per individual track.
    (In other words, don’t repeat the same mistake twice. Ignore the provider that returned the invalid lyric.)

    c. Enable checkboxes for tracks that returned empty lyrics.
    (Don’t check those boxes, but allow the user to edit the empty lyrics [perhaps with an external web search], and save them. Currently, you can edit the lyrics, but you cannot save them because the checkbox is disabled.)
Guest

Re: Lyricator v1.3.1 (2014-12-20)

Post by Guest »

Just to let you know, Metrolyrics appears be shooting blanks now.
Post Reply