From c011c4a0871e13392e66ccfc04fa6d60badb1a95 Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Wed, 27 May 2009 23:11:18 +0000 Subject: [PATCH] * Add initial support for video cover art. * Try to handle id3 tags that use non-utf8 and iso8859 charsets. --- metadata.c | 23 ++++++++++++++---- tagutils/tagutils-misc.c | 11 +++++---- upnpsoap.c | 50 +++++++++++++++++++++++++--------------- 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/metadata.c b/metadata.c index 064e762..8cf68f6 100644 --- a/metadata.c +++ b/metadata.c @@ -142,6 +142,7 @@ sqlite_int64 GetAudioMetadata(const char * path, char * name) { char duration[16], mime[16], type[4]; + static char lang[6] = { '\0' }; struct stat file; sqlite_int64 ret; char *sql; @@ -189,7 +190,16 @@ GetAudioMetadata(const char * path, char * name) return 0; } - if( readtags((char *)path, &song, &file, NULL, type) != 0 ) + if( !(*lang) ) + { + if( !getenv("LANG") ) + strcpy(lang, "en_US"); + else + strncpy(lang, getenv("LANG"), 5); + lang[5] = '\0'; + } + + if( readtags((char *)path, &song, &file, lang, type) != 0 ) { DPRINTF(E_WARN, L_GENERAL, "Cannot extract tags from %s!\n", path); freetags(&song); @@ -484,6 +494,8 @@ GetVideoMetadata(const char * path, char * name) ts_timestamp_t ts_timestamp = NONE; int duration, hours, min, sec, ms; aac_object_type_t aac_type = AAC_INVALID; + sqlite_int64 album_art = 0; + char art_dlna_pn[9]; metadata_t m; memset(&m, '\0', sizeof(m)); date[0] = '\0'; @@ -868,15 +880,18 @@ GetVideoMetadata(const char * path, char * name) asprintf(&m.mime, "video/x-tivo-mpeg"); } #endif + album_art = find_album_art(path, art_dlna_pn, NULL, 0); + sql = sqlite3_mprintf( "INSERT into DETAILS" " (PATH, SIZE, DURATION, DATE, CHANNELS, BITRATE, SAMPLERATE, RESOLUTION," - " CREATOR, TITLE, DLNA_PN, MIME) " + " CREATOR, TITLE, DLNA_PN, MIME, ALBUM_ART, ART_DLNA_PN) " "VALUES" - " (%Q, %lld, %Q, %Q, %Q, %Q, %Q, %Q, %Q, '%q', %Q, '%q');", + " (%Q, %lld, %Q, %Q, %Q, %Q, %Q, %Q, %Q, '%q', %Q, '%q', %lld, %Q);", path, size, m.duration, strlen(date) ? date : NULL, m.channels, m.bitrate, m.frequency, m.resolution, - m.artist, name, m.dlna_pn, m.mime); + m.artist, name, m.dlna_pn, m.mime, + album_art, album_art?art_dlna_pn:NULL ); //DEBUG DPRINTF(E_DEBUG, L_METADATA, "SQL: %s\n", sql); if( sql_exec(db, sql) != SQLITE_OK ) { diff --git a/tagutils/tagutils-misc.c b/tagutils/tagutils-misc.c index 0598e2b..b772d63 100644 --- a/tagutils/tagutils-misc.c +++ b/tagutils/tagutils-misc.c @@ -72,10 +72,11 @@ struct { char *lang; char *cpnames[N_LANG_ALT]; } iconv_map[] = { - { "JA", { "ISO-8859-1", "CP932", "ISO8859-1", "CP950", "CP936", 0 } }, - { "ZH_CN", { "ISO-8859-1", "CP936", "CP950", "CP932", 0 } }, - { "ZH_TW", { "ISO-8859-1", "CP950", "CP936", "CP932", 0 } }, - { 0, { 0 } } + { "ja_JP", { "CP932", "CP950", "CP936", "ISO-8859-1", 0 } }, + { "zh_CN", { "CP936", "CP950", "CP932", "ISO-8859-1", 0 } }, + { "zh_TW", { "CP950", "CP936", "CP932", "ISO-8859-1", 0 } }, + { "ko_KR", { "CP949", "ISO-8859-1", 0 } }, + { 0, { 0 } } }; static int lang_index = -1; @@ -91,7 +92,7 @@ _lang2cp(char *lang) if(!strcasecmp(iconv_map[cp].lang, lang)) return cp; } - return -1; + return -2; } static unsigned char* diff --git a/upnpsoap.c b/upnpsoap.c index b6d852a..aa71756 100644 --- a/upnpsoap.c +++ b/upnpsoap.c @@ -39,7 +39,7 @@ BuildSendAndCloseSoapResp(struct upnphttp * h, const char * body, int bodylen) { static const char beforebody[] = - "\r\n" + "\r\n" "" ""; @@ -601,22 +601,42 @@ callback(void *args, int argc, char **argv, char **azColName) memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; } - if( album_art && atoi(album_art) && (passed_args->filter & FILTER_UPNP_ALBUMARTURI) ) { - ret = sprintf(str_buf, "<upnp:albumArtURI "); - memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); - passed_args->size += ret; - if( passed_args->filter & FILTER_UPNP_ALBUMARTURI_DLNA_PROFILEID ) { - ret = sprintf(str_buf, "dlna:profileID=\"%s\" xmlns:dlna=\"urn:schemas-dlnaorg:metadata-1-0/\"", "JPEG_TN"); + if( album_art && atoi(album_art) ) + { + /* 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" + "</res>", + lan_addr[0].str, runtime_vars.port, album_art); + memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); + passed_args->size += ret; + } + else if( passed_args->filter & FILTER_UPNP_ALBUMARTURI ) { + ret = sprintf(str_buf, "<upnp:albumArtURI "); + memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); + passed_args->size += ret; + if( passed_args->filter & FILTER_UPNP_ALBUMARTURI_DLNA_PROFILEID ) { + ret = sprintf(str_buf, "dlna:profileID=\"%s\" xmlns:dlna=\"urn:schemas-dlnaorg:metadata-1-0/\"", "JPEG_TN"); + 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); 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); - 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 ) { + 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, "<res "); memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; @@ -668,14 +688,6 @@ callback(void *args, int argc, char **argv, char **azColName) mime, "DLNA.ORG_PN=JPEG_SM", lan_addr[0].str, runtime_vars.port, id); } #endif - if( tn && atoi(tn) && dlna_pn ) { - memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); - passed_args->size += ret; - 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; }