#!/usr/bin/env perl
# Ping M3U playlist items

use v5.12;

our $VERSION = "1.00";

use URI;
use MP3::M3U::Parser;

use Getopt::Std;
our %opts;
getopts( "", \%opts )
    || die("Error in command-line-arguments: $!");

sub ping_echo_host {
    my ($uri) = @_;
    my $ret;
    eval {
        my $host = $uri->host; # FIXME
        my $port = $uri->port || $uri->default_port;

        use Net::Ping;
        my $p = Net::Ping->new("tcp");
        $p->port_number($port);
        $ret = $p->ping($host);
        $p->close();
    };
    warn $uri, ": ", $@ if $@;
    return $ret;
}

sub ping_http_head {
    my ($uri) = @_;
    my $ret;
    use LWP::Simple;
    eval {
       $ret = defined( head($uri) );
    };
    warn $uri, ": ", $@ if $@;
    return $ret;
}

my %options;
our $parser = MP3::M3U::Parser->new(%options);
$parser->parse(@ARGV);

my $result = $parser->result;
my %info   = $parser->info;

my $offline;
my $online;
my $double;

my @streams;

for ( @{$result} ) {
    for ( @{ $_->{data} } ) {
        my $uri = URI->new( @$_[0] ) || next;
        @$_[1]                       || next;
        @$_[2]                       || next;

        if ( !ping_http_head($uri) ) {
            say STDERR sprintf( "Offline %s (%s)", @$_[0], @$_[1] );
            $offline++;
            next;
        }

       if ( !grep { "$uri" eq @$_[0] } @streams ) {
           say STDERR sprintf( "Online %s (%s)", @$_[0], @$_[1] );
           $online++;
           push @streams, $_;
       } else {
           say STDERR sprintf( "Double %s (%s)", @$_[0], @$_[1] );
           $double++;
       }
   }
}

if (scalar(@streams)) {
    say "#EXTM3U";
    for (@streams) {
        say "#EXTINF:", @$_[2], ",", @$_[1];
        say @$_[0];
    }
}

my $total = $online + $offline + $double;
say STDERR "Total: ",   "\t", $total;
if ($total > 0) {
    if ($online > 0) {
        say STDERR "Online:\t", $online, "\t", 100 / $total * $online, "%";
    } else {
        say STDERR "Online:\t", $online;
    }
    if ($online > 0) {
        say STDERR "Offline:\t", $offline, "\t", 100 / $total * $offline, "%";
    } else {
        say STDERR "Offline:\t", $offline;
    }
    if ($double > 0) {
        say STDERR "Double:\t", $double, "\t", 100 / $total * $double, "%";
    } else {
        say STDERR "Double:\t", $double;
    }
}

exit !scalar(@streams);

