huin/goupnp

Not a issue but an ad request

Closed this issue · 3 comments

Hi
I would like to create a simple app to display all items stored on a media server.
To discover media server, I just wrote this simple code :
`package main

import (
"flag"
"log"
"github.com/huin/goupnp"
)

var servers = flag.Bool("servers",true,"list all the dlna servers availabled.")
var list = flag.String("list","","get content from server uri")

func main() {
flag.Parse()
if *servers == true {
devices, err := goupnp.DiscoverDevices("urn:schemas-upnp-org:device:MediaServer:1")
if err != nil {
log.Printf("error %v",err.Error())
} else {
for _,d := range devices {
log.Printf("Device %v,%v",d.Root,d.Location)

		}
	}
} else {
	flag.Usage()
}

}`

Now to display the items content from a media server I call those requests :
curl -v -H 'SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"' -H 'content-type: text/xml ;charset="utf-8"' "http://10.188.2.125:8200/ctl/ContentDir" -d "@browse.xml"

and the browse.xml content is :
<?xml version="1.0" encoding="utf-8"?> <s:Envelope xmlns:ns0="urn:schemas-upnp-org:service:ContentDirectory:1" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <ns0:Browse> <ObjectID>0</ObjectID> <BrowseFlag>BrowseDirectChildren</BrowseFlag> <Filter>*</Filter> <StartingIndex>0</StartingIndex> <RequestedCount>0</RequestedCount> <SortCriteria/> </ns0:Browse> </s:Body> </s:Envelope>

My question is how can I do by code the same feature ?

Best regards

Jerome

huin commented

I'm not terribly familiar with the MediaServer semantics, but I think it would be something along the lines of:

import "github.com/huin/goupnp/dcps/av1"
//...
clients, errs, err := av1.NewContentDirectory1Clients()
if err != nil { ... }
// optionally check errs in case secondary lookups for one of the servers failed

// loop or select a client in clients, based on a field in ContentDirectory1.ServiceClient
for _, c := range clients {
  result, numReturned, totalMatches, updateID, err := c.Browse(/* args which I don't know semantics of */)
  if err != nil { ... }
  // use returned values
}

References:

Thanks for your advise.
That's I looked for. It works.
Thanks a lot.
Best regards
Jerome

huin commented

Excellent, thanks for letting me know :)