MediaServer ContentDirectoryでルートをBrowseDirectChildrenする(Net::UPnP::ControlPointを利用)

UPnP AVのMediaServerのContent DirectoryサービスのBrowseアクションを使ってルートコンテナに含まれるチャイルドノード一覧を取得する方法です。 UPnP AVは、DLNAで利用されている基礎技術なので、DLNA機器に対して以下のスクリプトを動作させることも可能だと思われます。

サンプルコード

サンプルです。

このサンプルはBrowse Actionに対するResponseに入っている結果をArgument毎に表示します。


#!/usr/bin/perl

use Net::UPnP::ControlPoint;

$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";
  $inarg{'BrowseFlag'} = "BrowseDirectChildren";
  $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";
}

exit;


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