* Add initial support for video cover art.
* Try to handle id3 tags that use non-utf8 and iso8859 charsets.
This commit is contained in:
parent
feb2fd1e87
commit
c011c4a087
23
metadata.c
23
metadata.c
@ -142,6 +142,7 @@ sqlite_int64
|
|||||||
GetAudioMetadata(const char * path, char * name)
|
GetAudioMetadata(const char * path, char * name)
|
||||||
{
|
{
|
||||||
char duration[16], mime[16], type[4];
|
char duration[16], mime[16], type[4];
|
||||||
|
static char lang[6] = { '\0' };
|
||||||
struct stat file;
|
struct stat file;
|
||||||
sqlite_int64 ret;
|
sqlite_int64 ret;
|
||||||
char *sql;
|
char *sql;
|
||||||
@ -189,7 +190,16 @@ GetAudioMetadata(const char * path, char * name)
|
|||||||
return 0;
|
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);
|
DPRINTF(E_WARN, L_GENERAL, "Cannot extract tags from %s!\n", path);
|
||||||
freetags(&song);
|
freetags(&song);
|
||||||
@ -484,6 +494,8 @@ GetVideoMetadata(const char * path, char * name)
|
|||||||
ts_timestamp_t ts_timestamp = NONE;
|
ts_timestamp_t ts_timestamp = NONE;
|
||||||
int duration, hours, min, sec, ms;
|
int duration, hours, min, sec, ms;
|
||||||
aac_object_type_t aac_type = AAC_INVALID;
|
aac_object_type_t aac_type = AAC_INVALID;
|
||||||
|
sqlite_int64 album_art = 0;
|
||||||
|
char art_dlna_pn[9];
|
||||||
metadata_t m;
|
metadata_t m;
|
||||||
memset(&m, '\0', sizeof(m));
|
memset(&m, '\0', sizeof(m));
|
||||||
date[0] = '\0';
|
date[0] = '\0';
|
||||||
@ -868,15 +880,18 @@ GetVideoMetadata(const char * path, char * name)
|
|||||||
asprintf(&m.mime, "video/x-tivo-mpeg");
|
asprintf(&m.mime, "video/x-tivo-mpeg");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
album_art = find_album_art(path, art_dlna_pn, NULL, 0);
|
||||||
|
|
||||||
sql = sqlite3_mprintf( "INSERT into DETAILS"
|
sql = sqlite3_mprintf( "INSERT into DETAILS"
|
||||||
" (PATH, SIZE, DURATION, DATE, CHANNELS, BITRATE, SAMPLERATE, RESOLUTION,"
|
" (PATH, SIZE, DURATION, DATE, CHANNELS, BITRATE, SAMPLERATE, RESOLUTION,"
|
||||||
" CREATOR, TITLE, DLNA_PN, MIME) "
|
" CREATOR, TITLE, DLNA_PN, MIME, ALBUM_ART, ART_DLNA_PN) "
|
||||||
"VALUES"
|
"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,
|
path, size, m.duration,
|
||||||
strlen(date) ? date : NULL,
|
strlen(date) ? date : NULL,
|
||||||
m.channels, m.bitrate, m.frequency, m.resolution,
|
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);
|
//DEBUG DPRINTF(E_DEBUG, L_METADATA, "SQL: %s\n", sql);
|
||||||
if( sql_exec(db, sql) != SQLITE_OK )
|
if( sql_exec(db, sql) != SQLITE_OK )
|
||||||
{
|
{
|
||||||
|
@ -72,9 +72,10 @@ struct {
|
|||||||
char *lang;
|
char *lang;
|
||||||
char *cpnames[N_LANG_ALT];
|
char *cpnames[N_LANG_ALT];
|
||||||
} iconv_map[] = {
|
} iconv_map[] = {
|
||||||
{ "JA", { "ISO-8859-1", "CP932", "ISO8859-1", "CP950", "CP936", 0 } },
|
{ "ja_JP", { "CP932", "CP950", "CP936", "ISO-8859-1", 0 } },
|
||||||
{ "ZH_CN", { "ISO-8859-1", "CP936", "CP950", "CP932", 0 } },
|
{ "zh_CN", { "CP936", "CP950", "CP932", "ISO-8859-1", 0 } },
|
||||||
{ "ZH_TW", { "ISO-8859-1", "CP950", "CP936", "CP932", 0 } },
|
{ "zh_TW", { "CP950", "CP936", "CP932", "ISO-8859-1", 0 } },
|
||||||
|
{ "ko_KR", { "CP949", "ISO-8859-1", 0 } },
|
||||||
{ 0, { 0 } }
|
{ 0, { 0 } }
|
||||||
};
|
};
|
||||||
static int lang_index = -1;
|
static int lang_index = -1;
|
||||||
@ -91,7 +92,7 @@ _lang2cp(char *lang)
|
|||||||
if(!strcasecmp(iconv_map[cp].lang, lang))
|
if(!strcasecmp(iconv_map[cp].lang, lang))
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
return -1;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char*
|
static unsigned char*
|
||||||
|
32
upnpsoap.c
32
upnpsoap.c
@ -39,7 +39,7 @@ BuildSendAndCloseSoapResp(struct upnphttp * h,
|
|||||||
const char * body, int bodylen)
|
const char * body, int bodylen)
|
||||||
{
|
{
|
||||||
static const char beforebody[] =
|
static const char beforebody[] =
|
||||||
"<?xml version=\"1.0\"?>\r\n"
|
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
|
||||||
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
|
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
|
||||||
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
|
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
|
||||||
"<s:Body>";
|
"<s:Body>";
|
||||||
@ -601,7 +601,18 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
passed_args->size += ret;
|
passed_args->size += ret;
|
||||||
}
|
}
|
||||||
if( album_art && atoi(album_art) && (passed_args->filter & FILTER_UPNP_ALBUMARTURI) ) {
|
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 ");
|
ret = sprintf(str_buf, "<upnp:albumArtURI ");
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
passed_args->size += ret;
|
passed_args->size += ret;
|
||||||
@ -615,8 +626,17 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
passed_args->size += ret;
|
passed_args->size += ret;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if( passed_args->filter & FILTER_RES ) {
|
if( passed_args->filter & FILTER_RES ) {
|
||||||
mime_to_ext(mime, ext);
|
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 ");
|
ret = sprintf(str_buf, "<res ");
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
passed_args->size += ret;
|
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);
|
mime, "DLNA.ORG_PN=JPEG_SM", lan_addr[0].str, runtime_vars.port, id);
|
||||||
}
|
}
|
||||||
#endif
|
#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);
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
passed_args->size += ret;
|
passed_args->size += ret;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user