84 lines
2.5 KiB
Perl
84 lines
2.5 KiB
Perl
|
#!/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);
|
||
|
}
|