From efefcde150bc98cda055515d235a8e25d1d6b094 Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Wed, 3 Jun 2009 20:49:31 +0000 Subject: [PATCH] * Work around Freebox's bad behavior of only using the first element for images. --- minidlnatypes.h | 1 + upnphttp.c | 10 +++++++++- upnpsoap.c | 22 +++++++++++++++------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/minidlnatypes.h b/minidlnatypes.h index d1e04d9..7d76ea5 100644 --- a/minidlnatypes.h +++ b/minidlnatypes.h @@ -32,6 +32,7 @@ enum client_types { EXbox = 1, EPS3, ESamsungTV, + EFreeBox, EStandardDLNA150 = 100 }; diff --git a/upnphttp.c b/upnphttp.c index 4d01785..c50f88f 100644 --- a/upnphttp.c +++ b/upnphttp.c @@ -242,6 +242,10 @@ intervening space) by either an integer or the keyword "infinite". */ h->req_client = EStandardDLNA150; h->reqflags |= FLAG_DLNA; } + else if(strstr(p, "fbxupnpav/")) + { + h->req_client = EFreeBox; + } } else if(strncasecmp(line, "X-AV-Client-Info", 16)==0) { @@ -1076,6 +1080,7 @@ SendResp_albumArt(struct upnphttp * h, char * object) char **result; int rows = 0; char *path; + char *dash; char date[30]; time_t curtime = time(NULL); off_t offset = 0, size; @@ -1090,8 +1095,11 @@ SendResp_albumArt(struct upnphttp * h, char * object) return; } - strip_ext(object); + dash = strchr(object, '-'); + if( dash ) + *dash = '\0'; sprintf(sql_buf, "SELECT PATH from ALBUM_ART where ID = %s", object); +printf("sql: %s\n", sql_buf); sql_get_table(db, sql_buf, &result, &rows, NULL); if( !rows ) { diff --git a/upnpsoap.c b/upnpsoap.c index d3b50b4..3447a97 100644 --- a/upnpsoap.c +++ b/upnpsoap.c @@ -606,9 +606,9 @@ callback(void *args, int argc, char **argv, char **azColName) /* Video and audio album art is handled differently */ if( *mime == 'v' && (passed_args->filter & FILTER_RES) ) { ret = sprintf(str_buf, "<res protocolInfo=\"http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN\">" - "http://%s:%d/AlbumArt/%s.jpg" + "http://%s:%d/AlbumArt/%s-%s.jpg" "</res>", - lan_addr[0].str, runtime_vars.port, album_art); + lan_addr[0].str, runtime_vars.port, album_art, detailID); memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; } @@ -621,15 +621,15 @@ callback(void *args, int argc, char **argv, char **azColName) memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; } - ret = sprintf(str_buf, ">http://%s:%d/AlbumArt/%s.jpg</upnp:albumArtURI>", - lan_addr[0].str, runtime_vars.port, album_art); + ret = sprintf(str_buf, ">http://%s:%d/AlbumArt/%s-%s.jpg</upnp:albumArtURI>", + lan_addr[0].str, runtime_vars.port, album_art, detailID); memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; } } if( passed_args->filter & FILTER_RES ) { mime_to_ext(mime, ext); - if( tn && atoi(tn) && dlna_pn ) { + if( tn && atoi(tn) && (passed_args->client == EFreeBox) && dlna_pn ) { ret = sprintf(str_buf, "<res protocolInfo=\"http-get:*:%s:%s\">" "http://%s:%d/Thumbnails/%s.jpg" "</res>", @@ -690,6 +690,14 @@ callback(void *args, int argc, char **argv, char **azColName) #endif memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; + if( tn && atoi(tn) && (passed_args->client != EFreeBox) && dlna_pn ) { + ret = sprintf(str_buf, "<res protocolInfo=\"http-get:*:%s:%s\">" + "http://%s:%d/Thumbnails/%s.jpg" + "</res>", + mime, "DLNA.ORG_PN=JPEG_TN", lan_addr[0].str, runtime_vars.port, detailID); + memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); + passed_args->size += ret; + } } ret = sprintf(str_buf, "</item>"); } @@ -756,8 +764,8 @@ callback(void *args, int argc, char **argv, char **azColName) memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; } - ret = sprintf(str_buf, ">http://%s:%d/AlbumArt/%s.jpg</upnp:albumArtURI>", - lan_addr[0].str, runtime_vars.port, album_art); + ret = sprintf(str_buf, ">http://%s:%d/AlbumArt/%s-%s.jpg</upnp:albumArtURI>", + lan_addr[0].str, runtime_vars.port, album_art, detailID); memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; }