#!/usr/bin/perl
use strict;
use warnings;

#use Net::UPnP::ControlPoint;
use LWP::Simple;
use XML::Simple;
use HTML::HeadParser;
use Device::Conf "EscapeList";

my $obj = Net::UPnP::ControlPoint->new();
my %devs = ();

my @dev_list = $obj->search(st =>'urn:schemas-upnp-org:device:nvcdevice', mx => 3);
foreach my $dev (@dev_list) {
    my ($addr,$port) = $dev->getlocation()=~m/http:\/\/([0-9a-z.]+)[:]*([0-9]*)\/.*/i;
    next unless $addr;
    next if $devs{$addr};
    $port = 80 unless $port;
    
    my $descr = $dev->getdescription();
    next unless $descr;
    my $xml = eval { XMLin($descr) };
    next if $@;
    my $presURL = $xml->{device}{presentationURL};
    my $url = $presURL=~/^http/ ? $presURL : "http://$addr:$port$presURL";
    my $tmp_page = get($url);
    my $p = HTML::HeadParser->new;
    $p->parse($tmp_page);
    my $refresh_url = $p->header('Refresh');
    if ($refresh_url && $refresh_url=~m|http://.+?:(\d+)|) {
	$devs{$addr}{HTTP_PORT} = $1;
    }
    $devs{$addr}{NAME} = $dev->getfriendlyname();
    $devs{$addr}{DEVIP} = $addr;
}

print EscapeList(%$_),"\n" foreach values %devs;
