From c4b76ee3eaa8dc7ff172a1b71c63c5fb665cbaf4 Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Thu, 15 Dec 2011 01:56:17 +0000 Subject: * Add support for Sony's av:mediaClass tag, so certain Sony devices can filter menu items by media type. --- upnpsoap.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/upnpsoap.c b/upnpsoap.c index 0880eb4..d4822f0 100644 --- a/upnpsoap.c +++ b/upnpsoap.c @@ -347,10 +347,11 @@ mime_to_ext(const char * mime, char * buf) #define FILTER_UPNP_ORIGINALTRACKNUMBER 0x00080000 #define FILTER_UPNP_SEARCHCLASS 0x00100000 /* Vendor-specific filter flags */ -#define FILTER_SEC_CAPTION_INFO_EX 0x10000000 -#define FILTER_SEC_DCM_INFO 0x20000000 -#define FILTER_PV_SUBTITLE_FILE_TYPE 0x40000000 -#define FILTER_PV_SUBTITLE_FILE_URI 0x80000000 +#define FILTER_SEC_CAPTION_INFO_EX 0x01000000 +#define FILTER_SEC_DCM_INFO 0x02000000 +#define FILTER_PV_SUBTITLE_FILE_TYPE 0x04000000 +#define FILTER_PV_SUBTITLE_FILE_URI 0x08000000 +#define FILTER_AV_MEDIA_CLASS 0x10000000 static u_int32_t set_filter_flags(char * filter, struct upnphttp *h) @@ -360,7 +361,7 @@ set_filter_flags(char * filter, struct upnphttp *h) if( !filter || (strlen(filter) <= 1) ) /* Not the full 32 bits. Skip vendor-specific stuff by default. */ - return 0xFFFFFFF; + return 0xFFFFFF; if( h->reqflags & FLAG_SAMSUNG ) flags |= FILTER_DLNA_NAMESPACE; item = strtok_r(filter, ",", &saveptr); @@ -491,6 +492,10 @@ set_filter_flags(char * filter, struct upnphttp *h) { flags |= FILTER_PV_SUBTITLE_FILE_URI; } + else if( strcmp(item, "av:mediaClass") == 0 ) + { + flags |= FILTER_AV_MEDIA_CLASS; + } item = strtok_r(NULL, ",", &saveptr); } @@ -1010,6 +1015,20 @@ callback(void *args, int argc, char **argv, char **azColName) ret = strcatf(str, ">http://%s:%d/AlbumArt/%s-%s.jpg</upnp:albumArtURI>", lan_addr[passed_args->iface].str, runtime_vars.port, album_art, detailID); } + if( passed_args->filter & FILTER_AV_MEDIA_CLASS ) { + char class; + if( strncmp(id, MUSIC_ID, sizeof(MUSIC_ID)) == 0 ) + class = 'M'; + else if( strncmp(id, VIDEO_ID, sizeof(VIDEO_ID)) == 0 ) + class = 'V'; + else if( strncmp(id, IMAGE_ID, sizeof(IMAGE_ID)) == 0 ) + class = 'P'; + else + class = 0; + if( class ) + ret = strcatf(str, "<av:mediaClass xmlns:av=\"urn:schemas-sony-com:av\">" + "%c</av:mediaClass>", class); + } ret = strcatf(str, "</container>"); } -- cgit v1.2.3