The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Revision history for StreamFinder

1.00    Date/time
        First version, released on an unsuspecting world.
1.01    2018/08/10
        - Fixed issue with some Facebook videos on Youtube.
        - Removed Tunein as a valid site (can no longer extract streams).
1.02    2019/01/31
        - Make StreamFinder::Youtube the default and handle pretty much 
        anything youtube-dl handles, ie. brighteon, vimeo, etc.
1.03    2019/08/15
        - Fix StreamFinder::Reciva now failing to connect to server 
        (added wget as fallthrough as LWP::UserAgent and curl fail with 
        unsupported SSL protocol errors).
        - Fix StreamFinder.IHeartRadio now failing to grab images / icons.
        - Strip off "?autoplay=true" from StreamFinder::Youtube urls.
        - Minor doc fixes.
1.04    NOT RELEASED
        - Make debug option work for all stream types, and allow specifying 
        as either "debug", "-debug", "debug => 1", or "-debug => 1" in 
        parameter list for new()
        (ie. my $station = new StreamFinder($url, -debug => 1);
        - Better handle ".m3u8" streams returned by brighteon.com (Youtube).
1.05    2019/09/03
        - Add StreamFinder::BannedVideo (https://banned.video/) to handle 
        their video streams (which youtube-dl doesn't currently handle).
1.10    2019/09/07
        - Add user-configuration files (~/.config/StreamFinder/config, 
        ~/.config/StreamFinder/<submodule>/config (see docs).
        User can now specify / override most LWP::UserAgent options, ie. 
        "agent", "timeout", etc. in the new configuration files.
        User must create these files, if needed with a text editor.
        - Greatly reduce falling back to wget by adding default user-agent 
        and checking for wget availability.  Specify an "agent" => "your agent" 
        line in the user-configuration file to change.
        - Add "-random" and "-noplaylists" options to $station->getURL() 
        (see docs)
        - StreamFinder::BannedVideo:  Add "-keep" option to better control 
        type and order of streams returned (see docs).
        - StreamFinder::Facebook: Depreciated ~/.config/.fbdata for new 
        user-configuration files.
        - StreamFinder::IHeartRadio: Add podcast-playing capability.
        - StreamFinder::IHeartRadio: Depreciated old stream order options, 
        replacing them with new -keep and -skip arguments and configuration 
        file entries.
        - StreamFinder::RadioNet: (https://www.radio.net/) ADDED
        - StreamFinder::Tunein: RESTORED (now uses StreamFinder::Youtube for 
        stream fetching), but adds metadata loading (which youtube-dl does 
        not currently fetch for these streams.
        - StreamFinder::Youtube: Better handle "chunky" brighteon.com 
        .m3u8 video streams.  Also add "-notitle" option, streamlining 
        use by StreamFinder::Tunein (see docs).
1.11    2019/09/07
        - StreamFinder::Youtube: bugfix for brighteon.com m3u8 video URLs.
        - Docs: fix a cpl. typos, actually include the updated README file.
1.12    2019/09/10
        - StreamFinder::Tunein: Add podcast-playing capability.  
        (Will look for "playUrl" before falling back to youtube-dl for stream).
        - StreamFinder::Reciva: Fix to make LWP::Useragent fetch reciva URLs 
        using the ANCIENT TLSv1 to allow to work without falling back to wget.
        See the StreamFinder::Reciva docs for creating a one-line custom 
        config file to do this - I didn't make it the default since they could 
        FIX this at ANY time, which would break things!
        - Add URI::Escape and HTML::Entities as DEPENDENCIES - in order to 
        ensure that the returned stream titles are un-escaped.
        - Fix $station->getID('fcc') to work properly (return the station's 
        FCC call-letters for sights and stations that support it.
        - Set $station->{artist} and $station->{year} where applicable.
        - Minor doc updates.
        - Fix some sight-specific submodules to properly accept just a station 
        / video ID rather than a full URL (see docs).
        - Add "desc" option go getTitle() to fetch station's (long) description 
        (for sites that provide that field), otherwise, the title is returned.
1.13    2019/09/11
        - Fix missing (recently-added) file (RadioNet.pm) in MANIFEST file.
        - More doc. fixes, mostly to the individual submodules.
1.20    2019/09/16
        - Removed usage and all references to WWW::Youtube::Download - 
        This module no longer fetches the "author" (Youtube user) nor does 
        anything else we can't more easily do manually.
        - StreamFinder::Apple: (podcasts.apple.com) ADDED!
        - StreamFinder::Brighteon: (brighteon.com) ADDED (split off from 
        StreamFinder::Youtube).
        - StreamFinder::Vimeo: (vimeo.com) ADDED (split off from 
        StreamFinder::Youtube.
        We separated these for better support - ie. ability to get the "author" 
        fields and access some additional streams.  We also can often avoid 
        having to call youtube-dl.
        - StreamFinder::Youtube: Removed "notitle" option, added "fast" option, 
        and add "description" field fetch to youtube-dl.  Fixed url-fetching 
        order to call youtube-dl FIRST to prevent infinite stall if called 
        with an already-valid stream-url (Fauxdacious mediaplayer).
        StreamFinder::IHeartRadio - Fix sometimes-corrupted ID field.
        StreamFinder::Reciva - Fix failure to always capture ID field if 
        given wrongly-formatted full url.
        - Add $station->{'genre'} field to IHeartRadio, RadioNet, Reciva, and 
        Tunein (the sites that support it).
        - Various small code and doc. tweaks / cleanups.
        - DEBUG was accidently left set to ON, now turned OFF by default!
1.21    2019/09/18
        - Significant documentation improvements & polishing.
        - StreamFinder::BannedVideo: Fix incorrect IDs returned.
        - StreamFinder::Tunein: (new()) - Fix mishandled URL if only 
        station-ID specified (non-full URL).
        - StreamFinder::Apple: (new()) - Handle if only podcast-ID specified.
1.22    2019/10/07
        - Minor bugfixes, namely handling double-quotes in titles in 
        some submodules.
        - Minor doc. improvements.
1.23    2019/11/02
        - StreamFinder::BannedVideo: Fix to handle change in their site - 
        to execute extra step now needed for infowarsmedia.com videos and make 
        the retrieved mp4 stream the "best" stream.
1.24    2019/11/06
        - StreamFinder::Youtube: Eliminate express page scan for metadata for 
        non-Youtube sites processed to prevent ocassional infinite loop caused 
        by attempting to scan a media stream instead of a website.
        - Unescape HTML entities in the Genre string in Reciva & Tunein.
        - Minor doc. improvements.
1.25    2019/11/08
        - StreamFinder::Brighteon: Fix another site-change that caused blank 
        titles to be returned, and broaden title and description searching 
        ability.
1.26    2019/11/19
        - Correctly handle "HOME" directory in M#-Windows.
        - StreamFinder::IHeartRadio - Handle non-US site URLs.  Change default 
        "keep" priority to "secure_shoutcast, shoutcast, secure, any" for 
        easier use by Fauxdacious.
1.27    2020/04/23
        - Added StreamFinder::Spreaker for https://widget.spreaker.com 
        podcasts.
        - Minor doc. improvements.
1.28    2020/04/25
        - Fix failure to include StreamFinder::Spreaker in MANIFEST and 
        to update change log.
1.29    2020/07/02
        - Split out video's channel page (that was previously appended onto 
        the "artist" field) into a new, separate "albumartist" field.  This 
        affects the video sites:  Brighteon, Vimeo, and Youtube.
        (Old way was:  artist:="Artist - Artist's video channel URL").  These 
        are now put into separate fields.
        - Fix .pls playlists returned by some Tunein stations by stripping off 
        some garbage Tunein appends in the format:  
        "stream.pls?DIST=TuneIn&TGT=TuneIn&maxServers=..." and more accurately 
        obtain title, artist, and album fields for stations vs podcasts.
        - Fix issue causing some vimeo videos to fail to fetch stream.
        - Clean up some "dirty" Spreaker titles (convert invalid characters).
        - Marked StreamFinder::Radionomy depreciated - site appears defunct.
1.30    2020/07/05
        - Add "-nopls" option to getURL() to parse ".pls" playlists and 
        return only a single entry, like "-noplaylists", but pass others 
        (".m3u" and ".m3u8") through unchanged.  This needed because most 
        ".m3u*" are playable "HLS" streams, whereas ".pls" playlists are 
        actually playlists and many players will not play them as-is.
        - StreamFinder::RadioNet: Fix issue with no streams being fetched for 
        some stations & clean up titles a bit.
        - StreamFinder::IHeartRadio: Add year to podcasts, fix some title 
        and description issues.
        - StreamFinder::Spreaker: Fix some streams not working, fix "-debug" 
        option to work.
1.31    2020/08/10
        - Add StreamFinder::Blogger (www.blogger.com) for Blogger videos.
        - Add StreamFinder::Bitchute (www.bitchute.com) for Bitchute videos.