From 3cfa85d5e5bea7a82062879e31c536eeb1996ab1 Mon Sep 17 00:00:00 2001 From: John Mertz Date: Tue, 1 Dec 2020 04:59:29 -0500 Subject: [PATCH] Script to look up and stream today's podcasts --- audio/stream-podcasts.pl | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100755 audio/stream-podcasts.pl diff --git a/audio/stream-podcasts.pl b/audio/stream-podcasts.pl new file mode 100755 index 0000000..1a32d90 --- /dev/null +++ b/audio/stream-podcasts.pl @@ -0,0 +1,83 @@ +#!/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); +}