#!/usr/bin/perl use strict; use warnings; # Dependencies use LWP::UserAgent; # Usually pre-installed, available on CPAN use XML::Hash::XS; # CPAN or libxml-hash-xs-perl on Debian # Feeds that should be used if no arguments are provided my @default_feeds = ( # CBC FrontBurner "https://www.cbc.ca/podcasting/includes/frontburner.xml", # Majority Report AM Quickie "https://feeds.fans.fm/5883fe04-e11e-4578-a018-3b93ddfb5723.xml" ); # Player command (must accept stream as STDIN) #my $player = "| mpv -"; # OMXPlayer is the only one capable of playing without stutter on the pi # It requires FIFO to stream. For a player that does support STDIN, uncomment # above and delete the following 4 lines unless (-e "/tmp/fifo.mp3") { system("mkfifo /tmp/fifo.mp3"); } my $player = "> /tmp/fifo.mp3 & omxplayer /tmp/fifo.mp3"; # Multiple feeds can be given as CLI arguments instead my @feeds; if (scalar @ARGV) { foreach (@ARGV) { push @feeds, $_; } } # Only use default feeds if no CLI feeds were given unless (scalar @feeds) { @feeds = @default_feeds; } # Local function to get date pattern provided as 'pubDate' my $today = get_date(); # Setup Webpage agent and XML parser my $ua = LWP::UserAgent->new(); my $xml = XML::Hash::XS->new(utf8 => 0, encoding => 'utf-8'); my @playlist; # Go through each feed foreach my $url (@feeds) { # Ensure that it's actual an XML link next unless $url =~ m#^https?://.*\.xml$#; # Ensure it is fetched okay my $raw = $ua->get("$url")->content() || next; # Ensure it is parsed okay my $xml_hash = $xml->xml2hash($raw) || next; # Collect all episodes published today foreach my $item (@{$xml_hash->{'channel'}->{'item'}}) { if ($item->{'pubDate'} =~ m/$today/) { # Add any found to playlist push @playlist, $item->{'enclosure'}->{'url'}; } } } # Fetch each item and pass it to player via STDIN foreach (@playlist) { # Uncomment the following to print the media URL print $_ . "\n"; system("curl -NL $_ $player"); } unlink("/tmp/fifo.mp3"); sub get_date { my ($second, $minute, $hour, $day, $month, $year) = localtime(time); my @months = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ); return $day . ' ' . $months[$month] . ' ' . ($year+1900); }