MediaServer CDSでBrowseした結果に含まれる全情報を表示する

ここでは、CDS::Browseを行った結果に含まれるオブジェクトが保持する全情報を表示する方法を説明したいと思います。 以下のサンプルでは、各オブジェクトとそれに含まれるノードの名前、それらの全Attribute情報を表示します。

サンプルコード

サンプルです。

このサンプルはBrowse Actionに対するResponseに入っているResultを解析しています。 各オブジェクトの名前や、そこに含まれるAttribute名と値をそれぞれ表示します。

XMLのパースにはXML::DOMを利用しています。

なお、以下のコードは説明のために冗長に書いている部分等もあるので、必要に応じて最適化して下さい。


#!/usr/bin/perl

use Net::UPnP::ControlPoint;
use XML::DOM;

$upnp = Net::UPnP::ControlPoint->new();

@devs = $upnp->search(st => 'upnp:rootdevice', mx => 3);

foreach $dev (@devs) {
  $type = $dev->getdevicetype();
  if ($type ne 'urn:schemas-upnp-org:device:MediaServer:1') {
    next;
  }

  $serv = $dev->getservicebyname(
             'urn:schemas-upnp-org:service:ContentDirectory:1');
  unless ($serv) {
    next;
  }

  print $dev->getfriendlyname();
  print "\n";

  $inarg{'ObjectID'} = "0/2/13413/13415/13978";
  $inarg{'BrowseFlag'} = "BrowseMetaData";
  $inarg{'Filter'} = "";
  $inarg{'StartingIndex'} = "0";
  $inarg{'RequestedCount'} = "0";
  $inarg{'SortCriteria'} = "";

  $resp = $serv->postaction('Browse', \%inarg);
  if ($resp->getstatuscode() != 200) {
    print "ERROR : status code ";
    print $resp->getstatuscode();
    print "\n";

    next;
  }

  $args = $resp->getargumentlist();
  print $args->{'Result'};
  print "\n";
  print $args->{'NumberReturned'};
  print "\n";
  print $args->{'TotalMatches'};
  print "\n";
  print $args->{'UpdateID'};
  print "\n";

  print "===\n";
  print "Print Result\n";
  print "===\n";

  $parser = new XML::DOM::Parser;
  $doc = $parser->parse($args->{'Result'});

  $didl = $doc->getFirstChild();

  $nodes = $didl->getChildNodes();
  for ($i=0; $i<$nodes->getLength(); $i++) {
    $node = $nodes->item($i);

    print $node->getNodeName();
    print "\n";

    $attrs = $node->getAttributes();

    for ($j=0; $j<$attrs->getLength(); $j++) {
      $a = $attrs->item($j);

      print "  + ";
      print $a->getNodeName();
      print " => " . $a->getValue();
      print "\n";
    }

    $cn = $node->getChildNodes();
    for ($k=0; $k<$cn->getLength(); $k++) {
      $childNode = $cn->item($k);
      print "  " . $childNode->getNodeName();
      print "\n";

      $attrs2 = $childNode->getAttributes();

      for ($m=0; $m<$attrs2->getLength(); $m++) {
        $a2 = $attrs2->item($m);

        print "    + ";
        print $a2->getNodeName();
        print " => " . $a2->getValue();
        print "\n";
      }

      $text = $childNode->getFirstChild();
      if ($text->getNodeType == TEXT_NODE) {
        print "    " . $text->getData();
        print "\n";
      }
    }
  }
}

exit;


IPv6基礎検定

YouTubeチャンネルやってます!