Revision history for LyricFinder

1.00    2020/12/15
        First version, released on an unsuspecting world.
        (Converted from David Precious's Lyric::Fetcher and friends)
1.01    2021/01/15
        - LyricFinder::Musixmatch - Handle non/high/wide/utf8 ascii characters 
        in artist and title fields, ie. accented characters - Musixmatch.com 
        allows these in searches and encodes them in the page URL.
        - Add URI::Escape to prerequesites.
        - Small Pod/doc. tweaks.
1.02    2021/05/11
        - LyricFinder::Musixmatch - Fix bug that cut off first few lines 
        of lyrics (due to their site separating an abreviated version of the 
        first few lines from the rest of the lyrics).  Also added a 
        "(Musixmatch status:  ok|warning|error)" line at bottom indicating 
        what Musixmatch thinks of the state of the selected song's lyrics.
1.03    2021/05/13
        - Added LyricFinder::Letras (https://www.letras.mus.br).
        - Added optional integer 4th argument to LyricFinder->fetch() to 
        allow limiting # of sites tried (Default is to try all (currently 
        5 sites installed) until lyrics are found.  Use this with the 
        'random' option to limit the time spent searching before giving up.
        If zero or >= 5 (current # of sites), all 5 sites will be tried.
        - LyricFinder::Genius: Add conversions of accented characters to 
        their unaccented equivalents to handle some non-English artist and 
        song names.
1.10    2021/05/26
        - Refactor all modules to combine all common methods into a separate 
        internal module:  LyricFinder::_Class (new) to greatly simplify and 
        eliminate redundant code.  This should make creating new site modules 
        much simpler (now most if not all functions other than new(), fetch(), 
        and the internal function _parse() should not be required in site 
        modules unless it's necessary to override)!
        This better follows proper object-oriented programming standards.
        - LyricFinder::Genius - Fix failure to fetch lyrics due to changes in 
        their site (to increase obfuscation, I presume).
        - LyricFinder::Musixmatch - Add "-nostatus" option to suppress the 
        additional "status" message appended to Musixmatch lyrics.  NOTE: this 
        option will also be used in future to suppress any additional info. 
        that may be offered by other sites as well (only actual lyrics will 
        be returned, if specified).
        - Upgrade default user-agent to Mozilla Firefox v84.
        - Fixed bug preventing caching fetched lyrics if -cache directory had 
        the ">" (write-only) option prepended.
1.11    2021/05/26
        - Doc fixes, namely "-nostatus" should be "-noextra" and the effect 
        (if specified) is to SUPPRESS the extra status message, if any!
        Docs implied the opposite.
1.20    2021/05/29
        - Added LyricFinder option "-omit" to specify submodules that you 
        have installed to NOT be used, ie. -omit => "AZLyrics,Genius".  
        This can limit which submodules will be used for "all" or "random" 
        searches.
        - Added image_url() function to return the cover-art image on some 
        lyric sites (currently Genius and Musixmatch).  For other sites and 
        songs that do not provide an image, an empty string is returned.
        - LyricFinder::Letras - Verify that lyrics page returned matches the 
        artist / title being searched for and fail (return no lyrics) if not.
        (Letras has been known to try to "guess" the song if they do not have 
        the exact one you're asking for)!
1.21    2021/12/01
        LyricFinder::Letras - Fix - Was broken due to slight change in their 
        site (wasn't returning any lyrics due to "artist mismatch".
1.22    2022/07/29
        LyricFinder::Genius - Remove spam from end of lyrics text recently 
        added by Genius. :/
1.23    2022/09/23
        LyricFinder::Genius - It's Baaaaack!  Remove more spam from end of 
        lyrics text added by Genius, so we had to rejigger our filter.
1.30    2024/01/25
        - Added LyricFinder::ChartLyrics to fetch lyrics and album-covers from 
        api.chartlyrics.com.
        - Update default user-agent to Firefox 112.0.
        - LyricFinder::_Class:  Allow http (in addition to https) - needed by 
        LyricFinder::ChartLyrics.  Also pass the artist and song title 
        parameters back to _fetch() - also needed by LyricFinder::ChartLyrics.
1.31    2024/01/26
        - LyricFinder::ChartLyrics - Polish off a cpl. rough edges.
1.32    2024/01/27
        - LyricFinder::Letras - Make work again (discovered during general 
        testing that Letras was no longer working due to aparent site changes).
        - LyricFinder::ChartLyrics - Shush an improper error msg. (sites don't 
        normally "carp" an error msg. for simple "no matching lyrics found").
        Also add a fix for titles and artist names that contain Perl regex 
        special characters.
        - LyricFinder::Genius - Add a note in the docs about potential spam 
        embedded in lyrics text returned.
1.40    2025/02/26
        - Added  LyricFinder::Lrclib (lrclib.net) - a new free open-source site 
        Audacious audio player had recently added support for this site in 
        their latest development release.
1.50    2025/03/01
        - LyricFinder::Musixmatch - Fix failure to fetch cover-art images due 
        to slight changes in their site.
        - Added "-synced" option to allow for choosing between fetching 
        timestamped (synced) lyrics or traditional plain-text ones.  Currently, 
        only the new LyricFinder::Lrclib site supports returning synced lyrics. 
        See the POD docs for details on this option.
        - Modified the argument requirements for the fetch() method to: 
        1) allow for specifying multiple site-modules in a string, in addition 
        to the previous array-ref format.  2) allow the "random" choice to be 
        included anywhere in a list of modules.  This can allow for forcing 
        certain modules to be searched in order first, then including the 
        others in random order, and even followed up by one to be searched last 
        (without repeating a call to a previously-searched module.
        - Misc. doc. touchups.
