Move ssc check to dmap-building time, rather than scanning time so that transcoding can be done on a per-user-agent basis
This commit is contained in:
parent
c9d7a75774
commit
17c7b8d875
184
src/dbs-sqlite.c
184
src/dbs-sqlite.c
|
@ -37,6 +37,7 @@
|
||||||
#include "mp3-scanner.h"
|
#include "mp3-scanner.h"
|
||||||
#include "db-generic.h"
|
#include "db-generic.h"
|
||||||
#include "dbs-sqlite.h"
|
#include "dbs-sqlite.h"
|
||||||
|
#include "ssc.h"
|
||||||
|
|
||||||
/* Globals */
|
/* Globals */
|
||||||
static sqlite *db_sqlite_songs; /**< Database that holds the mp3 info */
|
static sqlite *db_sqlite_songs; /**< Database that holds the mp3 info */
|
||||||
|
@ -58,6 +59,7 @@ int db_sqlite_get_version(void);
|
||||||
int db_sqlite_update_playlists(void);
|
int db_sqlite_update_playlists(void);
|
||||||
|
|
||||||
#define STR(a) (a) ? (a) : ""
|
#define STR(a) (a) ? (a) : ""
|
||||||
|
#define ISSTR(a) ((a) && strlen((a)))
|
||||||
#define MAYBEFREE(a) { if((a)) free((a)); };
|
#define MAYBEFREE(a) { if((a)) free((a)); };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,15 +83,13 @@ int db_sqlite_unlock(void) {
|
||||||
/**
|
/**
|
||||||
* exec a simple statement
|
* exec a simple statement
|
||||||
*
|
*
|
||||||
* \param fatal whether failure of this to execute is fatal or not
|
* \param what level to log a failure of this sql statement to exec
|
||||||
*/
|
*/
|
||||||
int db_sqlite_exec(int fatal, char *fmt, ...) {
|
int db_sqlite_exec(int loglevel, char *fmt, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char *query;
|
char *query;
|
||||||
int err;
|
int err;
|
||||||
char *perr;
|
char *perr;
|
||||||
int loglevel;
|
|
||||||
|
|
||||||
|
|
||||||
va_start(ap,fmt);
|
va_start(ap,fmt);
|
||||||
query=sqlite_vmprintf(fmt,ap);
|
query=sqlite_vmprintf(fmt,ap);
|
||||||
|
@ -104,11 +104,7 @@ int db_sqlite_exec(int fatal, char *fmt, ...) {
|
||||||
db_sqlite_unlock();
|
db_sqlite_unlock();
|
||||||
|
|
||||||
if(err != SQLITE_OK) {
|
if(err != SQLITE_OK) {
|
||||||
loglevel=E_FATAL;
|
DPRINTF(loglevel,L_DB,"Query: %s\n",query);
|
||||||
if(!fatal)
|
|
||||||
loglevel=E_LOG;
|
|
||||||
|
|
||||||
DPRINTF(E_LOG,L_DB,"Query: %s\n",query);
|
|
||||||
DPRINTF(loglevel,L_DB,"Error: %s\n",perr);
|
DPRINTF(loglevel,L_DB,"Error: %s\n",perr);
|
||||||
db_sqlite_lock();
|
db_sqlite_lock();
|
||||||
sqlite_freemem(query);
|
sqlite_freemem(query);
|
||||||
|
@ -123,12 +119,11 @@ int db_sqlite_exec(int fatal, char *fmt, ...) {
|
||||||
* get a sqlite table
|
* get a sqlite table
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int db_sqlite_get_table(int fatal, char ***resarray, int *rows, int *cols, char *fmt, ...) {
|
int db_sqlite_get_table(int loglevel, char ***resarray, int *rows, int *cols, char *fmt, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char *query;
|
char *query;
|
||||||
int err;
|
int err;
|
||||||
char *perr;
|
char *perr;
|
||||||
int loglevel;
|
|
||||||
|
|
||||||
va_start(ap,fmt);
|
va_start(ap,fmt);
|
||||||
query=sqlite_vmprintf(fmt,ap);
|
query=sqlite_vmprintf(fmt,ap);
|
||||||
|
@ -143,11 +138,8 @@ int db_sqlite_get_table(int fatal, char ***resarray, int *rows, int *cols, char
|
||||||
db_sqlite_unlock();
|
db_sqlite_unlock();
|
||||||
|
|
||||||
if(err != SQLITE_OK) {
|
if(err != SQLITE_OK) {
|
||||||
loglevel=E_FATAL;
|
DPRINTF(loglevel,L_DB,"Query: %s\n",query);
|
||||||
if(!fatal)
|
DPRINTF(loglevel,L_DB,"Error: %s\n",perr);
|
||||||
loglevel=E_LOG;
|
|
||||||
|
|
||||||
DPRINTF(loglevel,L_DB,"Query: %s, Error: %s\n",query,perr);
|
|
||||||
db_sqlite_lock();
|
db_sqlite_lock();
|
||||||
sqlite_freemem(query);
|
sqlite_freemem(query);
|
||||||
db_sqlite_unlock();
|
db_sqlite_unlock();
|
||||||
|
@ -179,6 +171,8 @@ int db_sqlite_open(char *parameters) {
|
||||||
if(!db_sqlite_songs)
|
if(!db_sqlite_songs)
|
||||||
DPRINTF(E_FATAL,L_DB,"db_sqlite_open: %s (%s)\n",perr,db_path);
|
DPRINTF(E_FATAL,L_DB,"db_sqlite_open: %s (%s)\n",perr,db_path);
|
||||||
|
|
||||||
|
sqlite_busy_timeout(db_sqlite_songs,30000); /* 30 seconds */
|
||||||
|
|
||||||
db_sqlite_unlock();
|
db_sqlite_unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -199,8 +193,8 @@ int db_sqlite_init(int reload) {
|
||||||
DPRINTF(E_LOG,L_DB,"Full reload...\n");
|
DPRINTF(E_LOG,L_DB,"Full reload...\n");
|
||||||
/* this may or may not fail, depending if the index is already in place */
|
/* this may or may not fail, depending if the index is already in place */
|
||||||
db_sqlite_reload=1;
|
db_sqlite_reload=1;
|
||||||
db_sqlite_exec(0,"DROP INDEX idx_path");
|
db_sqlite_exec(E_DBG,"DROP INDEX idx_path");
|
||||||
db_sqlite_exec(1,"DELETE FROM songs");
|
db_sqlite_exec(E_FATAL,"DELETE FROM songs");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -223,12 +217,12 @@ int db_sqlite_deinit(void) {
|
||||||
int db_sqlite_start_scan(void) {
|
int db_sqlite_start_scan(void) {
|
||||||
|
|
||||||
if(db_sqlite_reload) {
|
if(db_sqlite_reload) {
|
||||||
db_sqlite_exec(0,"PRAGMA synchronous = OFF");
|
db_sqlite_exec(E_FATAL,"PRAGMA synchronous = OFF");
|
||||||
db_sqlite_exec(0,"BEGIN TRANSACTION");
|
db_sqlite_exec(E_FATAL,"BEGIN TRANSACTION");
|
||||||
} else {
|
} else {
|
||||||
/* if not a full reload, we'll be doing update checks */
|
/* if not a full reload, we'll be doing update checks */
|
||||||
db_sqlite_exec(0,"DROP TABLE updated");
|
db_sqlite_exec(E_DBG,"DROP TABLE updated");
|
||||||
db_sqlite_exec(1,"CREATE TEMP TABLE updated (id int)");
|
db_sqlite_exec(E_FATAL,"CREATE TEMP TABLE updated (id int)");
|
||||||
}
|
}
|
||||||
|
|
||||||
db_sqlite_in_scan=1;
|
db_sqlite_in_scan=1;
|
||||||
|
@ -241,12 +235,12 @@ int db_sqlite_start_scan(void) {
|
||||||
int db_sqlite_end_scan(void) {
|
int db_sqlite_end_scan(void) {
|
||||||
|
|
||||||
if(db_sqlite_reload) {
|
if(db_sqlite_reload) {
|
||||||
db_sqlite_exec(1,"COMMIT TRANSACTION");
|
db_sqlite_exec(E_FATAL,"COMMIT TRANSACTION");
|
||||||
db_sqlite_exec(1,"CREATE INDEX idx_path ON songs(path)");
|
db_sqlite_exec(E_FATAL,"CREATE INDEX idx_path ON songs(path)");
|
||||||
db_sqlite_exec(1,"PRAGMA synchronous=NORMAL");
|
db_sqlite_exec(E_FATAL,"PRAGMA synchronous=NORMAL");
|
||||||
} else {
|
} else {
|
||||||
db_sqlite_exec(1,"DELETE FROM songs WHERE id NOT IN (SELECT id FROM updated)");
|
db_sqlite_exec(E_FATAL,"DELETE FROM songs WHERE id NOT IN (SELECT id FROM updated)");
|
||||||
db_sqlite_exec(1,"DROP TABLE updated");
|
db_sqlite_exec(E_FATAL,"DROP TABLE updated");
|
||||||
}
|
}
|
||||||
|
|
||||||
db_sqlite_update_playlists();
|
db_sqlite_update_playlists();
|
||||||
|
@ -277,7 +271,7 @@ int db_sqlite_add(MP3FILE *pmp3) {
|
||||||
pmp3->play_count=0;
|
pmp3->play_count=0;
|
||||||
pmp3->time_played=0;
|
pmp3->time_played=0;
|
||||||
|
|
||||||
err=db_sqlite_exec(0,"INSERT INTO songs VALUES "
|
err=db_sqlite_exec(E_DBG,"INSERT INTO songs VALUES "
|
||||||
"(NULL," // id
|
"(NULL," // id
|
||||||
"'%q'," // path
|
"'%q'," // path
|
||||||
"'%q'," // fname
|
"'%q'," // fname
|
||||||
|
@ -359,7 +353,7 @@ int db_sqlite_add(MP3FILE *pmp3) {
|
||||||
DPRINTF(E_FATAL,L_DB,"Error inserting file %s in database\n",pmp3->fname);
|
DPRINTF(E_FATAL,L_DB,"Error inserting file %s in database\n",pmp3->fname);
|
||||||
|
|
||||||
if((db_sqlite_in_scan)&&(!db_sqlite_reload)) {
|
if((db_sqlite_in_scan)&&(!db_sqlite_reload)) {
|
||||||
db_sqlite_exec(1,"INSERT INTO updated VALUES (last_insert_rowid())");
|
db_sqlite_exec(E_FATAL,"INSERT INTO updated VALUES (last_insert_rowid())");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!db_sqlite_in_scan)
|
if(!db_sqlite_in_scan)
|
||||||
|
@ -382,7 +376,7 @@ int db_sqlite_update(MP3FILE *pmp3) {
|
||||||
|
|
||||||
pmp3->db_timestamp = (int)time(NULL);
|
pmp3->db_timestamp = (int)time(NULL);
|
||||||
|
|
||||||
err=db_sqlite_exec(1,"UPDATE songs SET "
|
err=db_sqlite_exec(E_FATAL,"UPDATE songs SET "
|
||||||
"title='%q'," // title
|
"title='%q'," // title
|
||||||
"artist='%q'," // artist
|
"artist='%q'," // artist
|
||||||
"album='%q'," // album
|
"album='%q'," // album
|
||||||
|
@ -439,7 +433,7 @@ int db_sqlite_update(MP3FILE *pmp3) {
|
||||||
pmp3->path);
|
pmp3->path);
|
||||||
|
|
||||||
if((db_sqlite_in_scan) && (!db_sqlite_reload)) {
|
if((db_sqlite_in_scan) && (!db_sqlite_reload)) {
|
||||||
db_sqlite_exec(1,"INSERT INTO updated (id) select id from songs where path='%q'",
|
db_sqlite_exec(E_FATAL,"INSERT INTO updated (id) select id from songs where path='%q'",
|
||||||
pmp3->path);
|
pmp3->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,16 +451,16 @@ int db_sqlite_update_playlists(void) {
|
||||||
char **resarray;
|
char **resarray;
|
||||||
int rows, cols, index;
|
int rows, cols, index;
|
||||||
|
|
||||||
db_sqlite_get_table(1,&resarray, &rows, &cols, "SELECT * FROM playlists");
|
db_sqlite_get_table(E_FATAL,&resarray, &rows, &cols, "SELECT * FROM playlists");
|
||||||
|
|
||||||
for(index=1;index <= rows; index ++) {
|
for(index=1;index <= rows; index ++) {
|
||||||
DPRINTF(E_DBG,L_DB,"Updating playlist counts for %s\n",resarray[cols * index + 1]);
|
DPRINTF(E_DBG,L_DB,"Updating playlist counts for %s\n",resarray[cols * index + 1]);
|
||||||
if(atoi(resarray[cols * index + 2])) { // is a smart playlist
|
if(atoi(resarray[cols * index + 2])) { // is a smart playlist
|
||||||
db_sqlite_exec(1,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
db_sqlite_exec(E_FATAL,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
||||||
"FROM songs WHERE %s) WHERE id=%s",resarray[cols * index + 4],
|
"FROM songs WHERE %s) WHERE id=%s",resarray[cols * index + 4],
|
||||||
resarray[cols * index]);
|
resarray[cols * index]);
|
||||||
} else {
|
} else {
|
||||||
db_sqlite_exec(1,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
db_sqlite_exec(E_FATAL,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
||||||
"FROM playlistitems WHERE id=%s) WHERE id=%s",
|
"FROM playlistitems WHERE id=%s) WHERE id=%s",
|
||||||
resarray[cols * index], resarray[cols * index]);
|
resarray[cols * index], resarray[cols * index]);
|
||||||
}
|
}
|
||||||
|
@ -755,6 +749,7 @@ int db_sqlite_enum_end(void) {
|
||||||
|
|
||||||
int db_sqlite_get_size(DBQUERYINFO *pinfo, char **valarray) {
|
int db_sqlite_get_size(DBQUERYINFO *pinfo, char **valarray) {
|
||||||
int size;
|
int size;
|
||||||
|
int transcode;
|
||||||
|
|
||||||
switch(pinfo->query_type) {
|
switch(pinfo->query_type) {
|
||||||
case queryTypeBrowseArtists: /* simple 'mlit' entry */
|
case queryTypeBrowseArtists: /* simple 'mlit' entry */
|
||||||
|
@ -772,6 +767,18 @@ int db_sqlite_get_size(DBQUERYINFO *pinfo, char **valarray) {
|
||||||
break;
|
break;
|
||||||
case queryTypeItems:
|
case queryTypeItems:
|
||||||
case queryTypePlaylistItems: /* essentially the same query */
|
case queryTypePlaylistItems: /* essentially the same query */
|
||||||
|
/* see if this is going to be transcoded */
|
||||||
|
transcode = server_side_convert(valarray[2]);
|
||||||
|
|
||||||
|
/* Items that get changed by transcode:
|
||||||
|
*
|
||||||
|
* type: item 8: changes to 'wav'
|
||||||
|
* description: item 29: changes to 'wav audio file'
|
||||||
|
* bitrate: item 15: guestimated, based on item 15, samplerate
|
||||||
|
*
|
||||||
|
* probably file size should change as well, but currently doesn't
|
||||||
|
*/
|
||||||
|
|
||||||
size = 8; /* mlit */
|
size = 8; /* mlit */
|
||||||
if(db_wantsmeta(pinfo->meta, metaItemKind))
|
if(db_wantsmeta(pinfo->meta, metaItemKind))
|
||||||
/* mikd */
|
/* mikd */
|
||||||
|
@ -779,31 +786,38 @@ int db_sqlite_get_size(DBQUERYINFO *pinfo, char **valarray) {
|
||||||
if(db_wantsmeta(pinfo->meta, metaSongDataKind))
|
if(db_wantsmeta(pinfo->meta, metaSongDataKind))
|
||||||
/* asdk */
|
/* asdk */
|
||||||
size += 9;
|
size += 9;
|
||||||
if(valarray[13] && db_wantsmeta(pinfo->meta, metaSongDataURL))
|
if(ISSTR(valarray[13]) && db_wantsmeta(pinfo->meta, metaSongDataURL))
|
||||||
/* asul */
|
/* asul */
|
||||||
size += (8 + strlen(valarray[13]));
|
size += (8 + strlen(valarray[13]));
|
||||||
if(valarray[5] && db_wantsmeta(pinfo->meta, metaSongAlbum))
|
if(ISSTR(valarray[5]) && db_wantsmeta(pinfo->meta, metaSongAlbum))
|
||||||
/* asal */
|
/* asal */
|
||||||
size += (8 + strlen(valarray[5]));
|
size += (8 + strlen(valarray[5]));
|
||||||
if(valarray[4] && db_wantsmeta(pinfo->meta, metaSongArtist))
|
if(ISSTR(valarray[4]) && db_wantsmeta(pinfo->meta, metaSongArtist))
|
||||||
/* asar */
|
/* asar */
|
||||||
size += (8 + strlen(valarray[4]));
|
size += (8 + strlen(valarray[4]));
|
||||||
if(valarray[23] && atoi(valarray[23]) && db_wantsmeta(pinfo->meta, metaSongBPM))
|
if(valarray[23] && atoi(valarray[23]) && db_wantsmeta(pinfo->meta, metaSongBPM))
|
||||||
/* asbt */
|
/* asbt */
|
||||||
size += 10;
|
size += 10;
|
||||||
if(valarray[14] && atoi(valarray[14]) && db_wantsmeta(pinfo->meta, metaSongBitRate))
|
if(db_wantsmeta(pinfo->meta, metaSongBitRate)) {
|
||||||
/* asbr */
|
/* asbr */
|
||||||
|
if(transcode) {
|
||||||
|
if(valarray[15] && atoi(valarray[15]))
|
||||||
size += 10;
|
size += 10;
|
||||||
if(valarray[7] && db_wantsmeta(pinfo->meta, metaSongComment))
|
} else {
|
||||||
|
if(valarray[14] && atoi(valarray[14]))
|
||||||
|
size += 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ISSTR(valarray[7]) && db_wantsmeta(pinfo->meta, metaSongComment))
|
||||||
/* ascm */
|
/* ascm */
|
||||||
size += (8 + strlen(valarray[7]));
|
size += (8 + strlen(valarray[7]));
|
||||||
if(valarray[24] && atoi(valarray[24]) && db_wantsmeta(pinfo->meta,metaSongCompilation))
|
if(valarray[24] && atoi(valarray[24]) && db_wantsmeta(pinfo->meta,metaSongCompilation))
|
||||||
/* asco */
|
/* asco */
|
||||||
size += 9;
|
size += 9;
|
||||||
if(valarray[9] && db_wantsmeta(pinfo->meta, metaSongComposer))
|
if(ISSTR(valarray[9]) && db_wantsmeta(pinfo->meta, metaSongComposer))
|
||||||
/* ascp */
|
/* ascp */
|
||||||
size += (8 + strlen(valarray[9]));
|
size += (8 + strlen(valarray[9]));
|
||||||
if(valarray[12] && db_wantsmeta(pinfo->meta, metaSongGrouping))
|
if(ISSTR(valarray[12]) && db_wantsmeta(pinfo->meta, metaSongGrouping))
|
||||||
/* agrp */
|
/* agrp */
|
||||||
size += (8 + strlen(valarray[12]));
|
size += (8 + strlen(valarray[12]));
|
||||||
if(valarray[30] && atoi(valarray[30]) && db_wantsmeta(pinfo->meta, metaSongDateAdded))
|
if(valarray[30] && atoi(valarray[30]) && db_wantsmeta(pinfo->meta, metaSongDateAdded))
|
||||||
|
@ -815,19 +829,29 @@ int db_sqlite_get_size(DBQUERYINFO *pinfo, char **valarray) {
|
||||||
if(valarray[22] && atoi(valarray[22]) && db_wantsmeta(pinfo->meta, metaSongDiscCount))
|
if(valarray[22] && atoi(valarray[22]) && db_wantsmeta(pinfo->meta, metaSongDiscCount))
|
||||||
/* asdc */
|
/* asdc */
|
||||||
size += 10;
|
size += 10;
|
||||||
if(valarray[6] && db_wantsmeta(pinfo->meta, metaSongGenre))
|
if(ISSTR(valarray[6]) && db_wantsmeta(pinfo->meta, metaSongGenre))
|
||||||
/* asgn */
|
/* asgn */
|
||||||
size += (8 + strlen(valarray[6]));
|
size += (8 + strlen(valarray[6]));
|
||||||
if(db_wantsmeta(pinfo->meta,metaItemId))
|
if(db_wantsmeta(pinfo->meta,metaItemId))
|
||||||
/* miid */
|
/* miid */
|
||||||
size += 12;
|
size += 12;
|
||||||
if(valarray[8] && db_wantsmeta(pinfo->meta,metaSongFormat))
|
if(ISSTR(valarray[8]) && db_wantsmeta(pinfo->meta,metaSongFormat)) {
|
||||||
/* asfm */
|
/* asfm */
|
||||||
|
if(transcode) {
|
||||||
|
size += 11; /* 'wav' */
|
||||||
|
} else {
|
||||||
size += (8 + strlen(valarray[8]));
|
size += (8 + strlen(valarray[8]));
|
||||||
if(valarray[29] && db_wantsmeta(pinfo->meta,metaSongDescription))
|
}
|
||||||
|
}
|
||||||
|
if(ISSTR(valarray[29]) && db_wantsmeta(pinfo->meta,metaSongDescription)) {
|
||||||
/* asdt */
|
/* asdt */
|
||||||
|
if(transcode) {
|
||||||
|
size += 22; /* 'wav audio file' */
|
||||||
|
} else {
|
||||||
size += (8 + strlen(valarray[29]));
|
size += (8 + strlen(valarray[29]));
|
||||||
if(valarray[3] && db_wantsmeta(pinfo->meta,metaItemName))
|
}
|
||||||
|
}
|
||||||
|
if(ISSTR(valarray[3]) && db_wantsmeta(pinfo->meta,metaItemName))
|
||||||
/* minm */
|
/* minm */
|
||||||
size += (8 + strlen(valarray[3]));
|
size += (8 + strlen(valarray[3]));
|
||||||
if(valarray[34] && atoi(valarray[34]) && db_wantsmeta(pinfo->meta,metaSongDisabled))
|
if(valarray[34] && atoi(valarray[34]) && db_wantsmeta(pinfo->meta,metaSongDisabled))
|
||||||
|
@ -876,6 +900,8 @@ int db_sqlite_get_size(DBQUERYINFO *pinfo, char **valarray) {
|
||||||
|
|
||||||
int db_sqlite_build_dmap(DBQUERYINFO *pinfo, char **valarray, char *presult, int len) {
|
int db_sqlite_build_dmap(DBQUERYINFO *pinfo, char **valarray, char *presult, int len) {
|
||||||
unsigned char *current = presult;
|
unsigned char *current = presult;
|
||||||
|
int transcode;
|
||||||
|
int samplerate=0;
|
||||||
|
|
||||||
switch(pinfo->query_type) {
|
switch(pinfo->query_type) {
|
||||||
case queryTypeBrowseArtists: /* simple 'mlit' entry */
|
case queryTypeBrowseArtists: /* simple 'mlit' entry */
|
||||||
|
@ -893,28 +919,49 @@ int db_sqlite_build_dmap(DBQUERYINFO *pinfo, char **valarray, char *presult, int
|
||||||
break;
|
break;
|
||||||
case queryTypeItems:
|
case queryTypeItems:
|
||||||
case queryTypePlaylistItems: /* essentially the same query */
|
case queryTypePlaylistItems: /* essentially the same query */
|
||||||
|
/* see if this is going to be transcoded */
|
||||||
|
transcode = server_side_convert(valarray[2]);
|
||||||
|
|
||||||
|
/* Items that get changed by transcode:
|
||||||
|
*
|
||||||
|
* type: item 8: changes to 'wav'
|
||||||
|
* description: item 29: changes to 'wav audio file'
|
||||||
|
* bitrate: item 15: guestimated, but doesn't change file size
|
||||||
|
*
|
||||||
|
* probably file size should change as well, but currently doesn't
|
||||||
|
*/
|
||||||
|
|
||||||
current += db_dmap_add_container(current,"mlit",len-8);
|
current += db_dmap_add_container(current,"mlit",len-8);
|
||||||
if(db_wantsmeta(pinfo->meta, metaItemKind))
|
if(db_wantsmeta(pinfo->meta, metaItemKind))
|
||||||
current += db_dmap_add_char(current,"mikd",(char)atoi(valarray[28]));
|
current += db_dmap_add_char(current,"mikd",(char)atoi(valarray[28]));
|
||||||
if(db_wantsmeta(pinfo->meta, metaSongDataKind))
|
if(db_wantsmeta(pinfo->meta, metaSongDataKind))
|
||||||
current += db_dmap_add_char(current,"asdk",(char)atoi(valarray[27]));
|
current += db_dmap_add_char(current,"asdk",(char)atoi(valarray[27]));
|
||||||
if(valarray[13] && db_wantsmeta(pinfo->meta, metaSongDataURL))
|
if(ISSTR(valarray[13]) && db_wantsmeta(pinfo->meta, metaSongDataURL))
|
||||||
current += db_dmap_add_string(current,"asul",valarray[13]);
|
current += db_dmap_add_string(current,"asul",valarray[13]);
|
||||||
if(valarray[5] && db_wantsmeta(pinfo->meta, metaSongAlbum))
|
if(ISSTR(valarray[5]) && db_wantsmeta(pinfo->meta, metaSongAlbum))
|
||||||
current += db_dmap_add_string(current,"asal",valarray[5]);
|
current += db_dmap_add_string(current,"asal",valarray[5]);
|
||||||
if(valarray[4] && db_wantsmeta(pinfo->meta, metaSongArtist))
|
if(ISSTR(valarray[4]) && db_wantsmeta(pinfo->meta, metaSongArtist))
|
||||||
current += db_dmap_add_string(current,"asar",valarray[4]);
|
current += db_dmap_add_string(current,"asar",valarray[4]);
|
||||||
if(valarray[23] && atoi(valarray[23]) && db_wantsmeta(pinfo->meta, metaSongBPM))
|
if(valarray[23] && atoi(valarray[23]) && db_wantsmeta(pinfo->meta, metaSongBPM))
|
||||||
current += db_dmap_add_short(current,"asbt",(short)atoi(valarray[23]));
|
current += db_dmap_add_short(current,"asbt",(short)atoi(valarray[23]));
|
||||||
if(valarray[14] && atoi(valarray[14]) && db_wantsmeta(pinfo->meta, metaSongBitRate))
|
if(valarray[14] && atoi(valarray[14]) && db_wantsmeta(pinfo->meta, metaSongBitRate)) {
|
||||||
|
if(transcode) {
|
||||||
|
if(valarray[15]) samplerate=atoi(valarray[15]);
|
||||||
|
if(samplerate) {
|
||||||
|
current += db_dmap_add_short(current,"asbr",
|
||||||
|
(short)(samplerate * 4 * 8)/1000);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
current += db_dmap_add_short(current,"asbr",(short)atoi(valarray[14]));
|
current += db_dmap_add_short(current,"asbr",(short)atoi(valarray[14]));
|
||||||
if(valarray[7] && db_wantsmeta(pinfo->meta, metaSongComment))
|
}
|
||||||
|
}
|
||||||
|
if(ISSTR(valarray[7]) && db_wantsmeta(pinfo->meta, metaSongComment))
|
||||||
current += db_dmap_add_string(current,"ascm",valarray[7]);
|
current += db_dmap_add_string(current,"ascm",valarray[7]);
|
||||||
if(valarray[24] && atoi(valarray[24]) && db_wantsmeta(pinfo->meta,metaSongCompilation))
|
if(valarray[24] && atoi(valarray[24]) && db_wantsmeta(pinfo->meta,metaSongCompilation))
|
||||||
current += db_dmap_add_char(current,"asco",(char)atoi(valarray[24]));
|
current += db_dmap_add_char(current,"asco",(char)atoi(valarray[24]));
|
||||||
if(valarray[9] && db_wantsmeta(pinfo->meta, metaSongComposer))
|
if(ISSTR(valarray[9]) && db_wantsmeta(pinfo->meta, metaSongComposer))
|
||||||
current += db_dmap_add_string(current,"ascp",valarray[9]);
|
current += db_dmap_add_string(current,"ascp",valarray[9]);
|
||||||
if(valarray[12] && db_wantsmeta(pinfo->meta, metaSongGrouping))
|
if(ISSTR(valarray[12]) && db_wantsmeta(pinfo->meta, metaSongGrouping))
|
||||||
current += db_dmap_add_string(current,"agrp",valarray[12]);
|
current += db_dmap_add_string(current,"agrp",valarray[12]);
|
||||||
if(valarray[30] && atoi(valarray[30]) && db_wantsmeta(pinfo->meta, metaSongDateAdded))
|
if(valarray[30] && atoi(valarray[30]) && db_wantsmeta(pinfo->meta, metaSongDateAdded))
|
||||||
current += db_dmap_add_int(current,"asda",(int)atoi(valarray[30]));
|
current += db_dmap_add_int(current,"asda",(int)atoi(valarray[30]));
|
||||||
|
@ -922,15 +969,25 @@ int db_sqlite_build_dmap(DBQUERYINFO *pinfo, char **valarray, char *presult, int
|
||||||
current += db_dmap_add_int(current,"asdm",(int)atoi(valarray[31]));
|
current += db_dmap_add_int(current,"asdm",(int)atoi(valarray[31]));
|
||||||
if(valarray[22] && atoi(valarray[22]) && db_wantsmeta(pinfo->meta, metaSongDiscCount))
|
if(valarray[22] && atoi(valarray[22]) && db_wantsmeta(pinfo->meta, metaSongDiscCount))
|
||||||
current += db_dmap_add_short(current,"asdc",(short)atoi(valarray[22]));
|
current += db_dmap_add_short(current,"asdc",(short)atoi(valarray[22]));
|
||||||
if(valarray[6] && db_wantsmeta(pinfo->meta, metaSongGenre))
|
if(ISSTR(valarray[6]) && db_wantsmeta(pinfo->meta, metaSongGenre))
|
||||||
current += db_dmap_add_string(current,"asgn",valarray[6]);
|
current += db_dmap_add_string(current,"asgn",valarray[6]);
|
||||||
if(db_wantsmeta(pinfo->meta,metaItemId))
|
if(db_wantsmeta(pinfo->meta,metaItemId))
|
||||||
current += db_dmap_add_int(current,"miid",(int)atoi(valarray[0]));
|
current += db_dmap_add_int(current,"miid",(int)atoi(valarray[0]));
|
||||||
if(valarray[8] && db_wantsmeta(pinfo->meta,metaSongFormat))
|
if(ISSTR(valarray[8]) && db_wantsmeta(pinfo->meta,metaSongFormat)) {
|
||||||
|
if(transcode) {
|
||||||
|
current += db_dmap_add_string(current,"asfm","wav");
|
||||||
|
} else {
|
||||||
current += db_dmap_add_string(current,"asfm",valarray[8]);
|
current += db_dmap_add_string(current,"asfm",valarray[8]);
|
||||||
if(valarray[29] && db_wantsmeta(pinfo->meta,metaSongDescription))
|
}
|
||||||
|
}
|
||||||
|
if(ISSTR(valarray[29]) && db_wantsmeta(pinfo->meta,metaSongDescription)) {
|
||||||
|
if(transcode) {
|
||||||
|
current += db_dmap_add_string(current,"asdt","wav audio file");
|
||||||
|
} else {
|
||||||
current += db_dmap_add_string(current,"asdt",valarray[29]);
|
current += db_dmap_add_string(current,"asdt",valarray[29]);
|
||||||
if(valarray[3] && db_wantsmeta(pinfo->meta,metaItemName))
|
}
|
||||||
|
}
|
||||||
|
if(ISSTR(valarray[3]) && db_wantsmeta(pinfo->meta,metaItemName))
|
||||||
current += db_dmap_add_string(current,"minm",valarray[3]);
|
current += db_dmap_add_string(current,"minm",valarray[3]);
|
||||||
if(valarray[34] && atoi(valarray[34]) && db_wantsmeta(pinfo->meta,metaSongDisabled))
|
if(valarray[34] && atoi(valarray[34]) && db_wantsmeta(pinfo->meta,metaSongDisabled))
|
||||||
current += db_dmap_add_char(current,"asdb",(char)atoi(valarray[34]));
|
current += db_dmap_add_char(current,"asdb",(char)atoi(valarray[34]));
|
||||||
|
@ -1019,7 +1076,7 @@ MP3FILE *db_sqlite_fetch_item(int id) {
|
||||||
char **resarray;
|
char **resarray;
|
||||||
MP3FILE *pmp3=NULL;
|
MP3FILE *pmp3=NULL;
|
||||||
|
|
||||||
db_sqlite_get_table(0,&resarray,&rows,&cols,"SELECT * FROM songs WHERE id=%d",id);
|
db_sqlite_get_table(E_DBG,&resarray,&rows,&cols,"SELECT * FROM songs WHERE id=%d",id);
|
||||||
|
|
||||||
if(rows != 0) {
|
if(rows != 0) {
|
||||||
pmp3=(MP3FILE*)malloc(sizeof(MP3FILE));
|
pmp3=(MP3FILE*)malloc(sizeof(MP3FILE));
|
||||||
|
@ -1032,7 +1089,7 @@ MP3FILE *db_sqlite_fetch_item(int id) {
|
||||||
db_sqlite_free_table(resarray);
|
db_sqlite_free_table(resarray);
|
||||||
|
|
||||||
if ((rows) && (db_sqlite_in_scan) && (!db_sqlite_reload)) {
|
if ((rows) && (db_sqlite_in_scan) && (!db_sqlite_reload)) {
|
||||||
db_sqlite_exec(1,"INSERT INTO updated VALUES (%d)",id);
|
db_sqlite_exec(E_FATAL,"INSERT INTO updated VALUES (%d)",id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pmp3;
|
return pmp3;
|
||||||
|
@ -1048,7 +1105,7 @@ MP3FILE *db_sqlite_fetch_path(char *path) {
|
||||||
char **resarray;
|
char **resarray;
|
||||||
MP3FILE *pmp3=NULL;
|
MP3FILE *pmp3=NULL;
|
||||||
|
|
||||||
db_sqlite_get_table(0,&resarray,&rows,&cols,"SELECT * FROM songs WHERE path='%q'",path);
|
db_sqlite_get_table(E_DBG,&resarray,&rows,&cols,"SELECT * FROM songs WHERE path='%q'",path);
|
||||||
|
|
||||||
if(rows != 0) {
|
if(rows != 0) {
|
||||||
pmp3=(MP3FILE*)malloc(sizeof(MP3FILE));
|
pmp3=(MP3FILE*)malloc(sizeof(MP3FILE));
|
||||||
|
@ -1061,7 +1118,7 @@ MP3FILE *db_sqlite_fetch_path(char *path) {
|
||||||
db_sqlite_free_table(resarray);
|
db_sqlite_free_table(resarray);
|
||||||
|
|
||||||
if ((rows) && (db_sqlite_in_scan) && (!db_sqlite_reload)) {
|
if ((rows) && (db_sqlite_in_scan) && (!db_sqlite_reload)) {
|
||||||
db_sqlite_exec(1,"INSERT INTO updated VALUES (%d)",pmp3->id);
|
db_sqlite_exec(E_FATAL,"INSERT INTO updated VALUES (%d)",pmp3->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pmp3;
|
return pmp3;
|
||||||
|
@ -1117,7 +1174,7 @@ int db_sqlite_get_count(CountType_t type) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
db_sqlite_get_table(0,&resarray, &rows, &cols,"SELECT COUNT(*) FROM %q", table);
|
db_sqlite_get_table(E_DBG,&resarray, &rows, &cols,"SELECT COUNT(*) FROM %q", table);
|
||||||
|
|
||||||
if(rows != 0) {
|
if(rows != 0) {
|
||||||
retval=atoi(resarray[cols]);
|
retval=atoi(resarray[cols]);
|
||||||
|
@ -1135,7 +1192,7 @@ int db_sqlite_get_version(void) {
|
||||||
char **resarray;
|
char **resarray;
|
||||||
int retval=0;
|
int retval=0;
|
||||||
|
|
||||||
db_sqlite_get_table(0,&resarray, &rows, &cols,
|
db_sqlite_get_table(E_DBG,&resarray, &rows, &cols,
|
||||||
"select value from config where term='version'");
|
"select value from config where term='version'");
|
||||||
|
|
||||||
if(rows != 0) {
|
if(rows != 0) {
|
||||||
|
@ -1187,6 +1244,7 @@ char *db_sqlite_upgrade_scripts[] = {
|
||||||
" sample_count INTEGER DEFAULT 0,\n"
|
" sample_count INTEGER DEFAULT 0,\n"
|
||||||
" force_update INTEGER DEFAULT 0\n"
|
" force_update INTEGER DEFAULT 0\n"
|
||||||
");\n"
|
");\n"
|
||||||
|
"CREATE INDEX idx_path ON songs(path)\n"
|
||||||
"CREATE TABLE config (\n"
|
"CREATE TABLE config (\n"
|
||||||
" term VARCHAR(255) NOT NULL,\n"
|
" term VARCHAR(255) NOT NULL,\n"
|
||||||
" subterm VARCHAR(255) DEFAULT NULL,\n"
|
" subterm VARCHAR(255) DEFAULT NULL,\n"
|
||||||
|
@ -1218,7 +1276,7 @@ int db_sqlite_update_version(int from_version) {
|
||||||
while(db_sqlite_upgrade_scripts[from_version]) {
|
while(db_sqlite_upgrade_scripts[from_version]) {
|
||||||
DPRINTF(E_LOG,L_DB,"Upgrading database from version %d to version %d\n",from_version,
|
DPRINTF(E_LOG,L_DB,"Upgrading database from version %d to version %d\n",from_version,
|
||||||
from_version+1);
|
from_version+1);
|
||||||
db_sqlite_exec(1,db_sqlite_upgrade_scripts[from_version]);
|
db_sqlite_exec(E_FATAL,db_sqlite_upgrade_scripts[from_version]);
|
||||||
from_version++;
|
from_version++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -563,7 +563,6 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
|
||||||
MP3FILE *pmp3;
|
MP3FILE *pmp3;
|
||||||
FILE *file_ptr;
|
FILE *file_ptr;
|
||||||
int file_fd;
|
int file_fd;
|
||||||
char *real_path;
|
|
||||||
int bytes_copied;
|
int bytes_copied;
|
||||||
off_t real_len;
|
off_t real_len;
|
||||||
off_t file_len;
|
off_t file_len;
|
||||||
|
@ -586,13 +585,13 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
|
||||||
if(!pmp3) {
|
if(!pmp3) {
|
||||||
DPRINTF(E_LOG,L_DAAP|L_WS|L_DB,"Could not find requested item %lu\n",item);
|
DPRINTF(E_LOG,L_DAAP|L_WS|L_DB,"Could not find requested item %lu\n",item);
|
||||||
ws_returnerror(pwsc,404,"File Not Found");
|
ws_returnerror(pwsc,404,"File Not Found");
|
||||||
} else if ((real_path=server_side_convert_path(pmp3->path)) != NULL) {
|
} else if (server_side_convert(pmp3->fname)) {
|
||||||
/************************
|
/************************
|
||||||
* Server side conversion
|
* Server side conversion
|
||||||
************************/
|
************************/
|
||||||
DPRINTF(E_WARN,L_WS,"Thread %d: Autoconvert file %s for client\n",
|
DPRINTF(E_WARN,L_WS,"Thread %d: Autoconvert file %s for client\n",
|
||||||
pwsc->threadno,real_path);
|
pwsc->threadno,pmp3->path);
|
||||||
file_ptr = server_side_convert_open(real_path,
|
file_ptr = server_side_convert_open(pmp3->path,
|
||||||
offset,
|
offset,
|
||||||
pmp3->song_length);
|
pmp3->song_length);
|
||||||
if (file_ptr) {
|
if (file_ptr) {
|
||||||
|
@ -607,11 +606,10 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
|
||||||
pwsc->error=errno;
|
pwsc->error=errno;
|
||||||
DPRINTF(E_WARN,L_WS,
|
DPRINTF(E_WARN,L_WS,
|
||||||
"Thread %d: Error opening %s for conversion\n",
|
"Thread %d: Error opening %s for conversion\n",
|
||||||
pwsc->threadno,real_path);
|
pwsc->threadno,pmp3->path);
|
||||||
ws_returnerror(pwsc,404,"Not found");
|
ws_returnerror(pwsc,404,"Not found");
|
||||||
config_set_status(pwsc,pqi->session_id,NULL);
|
config_set_status(pwsc,pqi->session_id,NULL);
|
||||||
db_dispose_item(pmp3);
|
db_dispose_item(pmp3);
|
||||||
free(real_path);
|
|
||||||
} else {
|
} else {
|
||||||
if(pmp3->type)
|
if(pmp3->type)
|
||||||
ws_addresponseheader(pwsc,"Content-Type","audio/%s",
|
ws_addresponseheader(pwsc,"Content-Type","audio/%s",
|
||||||
|
@ -654,8 +652,6 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
|
||||||
server_side_convert_close(file_ptr);
|
server_side_convert_close(file_ptr);
|
||||||
config_set_status(pwsc,pqi->session_id,NULL);
|
config_set_status(pwsc,pqi->session_id,NULL);
|
||||||
db_dispose_item(pmp3);
|
db_dispose_item(pmp3);
|
||||||
free(pmp3);
|
|
||||||
free(real_path);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/**********************
|
/**********************
|
||||||
|
@ -669,7 +665,6 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
|
||||||
ws_returnerror(pwsc,404,"Not found");
|
ws_returnerror(pwsc,404,"Not found");
|
||||||
config_set_status(pwsc,pqi->session_id,NULL);
|
config_set_status(pwsc,pqi->session_id,NULL);
|
||||||
db_dispose_item(pmp3);
|
db_dispose_item(pmp3);
|
||||||
free(pmp3);
|
|
||||||
} else {
|
} else {
|
||||||
real_len=lseek(file_fd,0,SEEK_END);
|
real_len=lseek(file_fd,0,SEEK_END);
|
||||||
lseek(file_fd,0,SEEK_SET);
|
lseek(file_fd,0,SEEK_SET);
|
||||||
|
|
|
@ -559,7 +559,7 @@ void scan_music_file(char *path, struct dirent *pde, struct stat *psb) {
|
||||||
mp3file.time_added=psb->st_ctime;
|
mp3file.time_added=psb->st_ctime;
|
||||||
mp3file.time_modified=psb->st_mtime;
|
mp3file.time_modified=psb->st_mtime;
|
||||||
|
|
||||||
server_side_convert_set(&mp3file);
|
// server_side_convert_set(&mp3file);
|
||||||
|
|
||||||
DPRINTF(E_DBG,L_SCAN," Date Added: %d\n",mp3file.time_added);
|
DPRINTF(E_DBG,L_SCAN," Date Added: %d\n",mp3file.time_added);
|
||||||
|
|
||||||
|
|
33
src/ssc.c
33
src/ssc.c
|
@ -69,6 +69,39 @@ char *server_side_convert_path(char *path)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the file specified by fname should be converted in
|
||||||
|
* server to wav. Currently it does this by file extension, but
|
||||||
|
* could in the future decided to transcode based on user agent.
|
||||||
|
*
|
||||||
|
* @param fname file name of file to check for conversion
|
||||||
|
* @returns 1 if should be converted. 0 if not
|
||||||
|
*/
|
||||||
|
int server_side_convert(char *fname) {
|
||||||
|
char *ext;
|
||||||
|
|
||||||
|
DPRINTF(E_DBG,L_SCAN,"Checking for ssc: %s\n",fname);
|
||||||
|
|
||||||
|
if ((!config.ssc_extensions) ||
|
||||||
|
(!config.ssc_extensions[0]) ||
|
||||||
|
(!config.ssc_prog) ||
|
||||||
|
(!config.ssc_prog[0]) ||
|
||||||
|
(!fname)) {
|
||||||
|
DPRINTF(E_DBG,L_SCAN,"Nope\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(((ext = strrchr(fname, '.')) != NULL) &&
|
||||||
|
(strcasestr(config.ssc_extensions, ext))) {
|
||||||
|
DPRINTF(E_DBG,L_SCAN,"Yup\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINTF(E_DBG,L_SCAN,"Nope\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the file entry (otherwise complete) is such that
|
* Check if the file entry (otherwise complete) is such that
|
||||||
* file should be converted in server end to wav-format.
|
* file should be converted in server end to wav-format.
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#define SERVER_SIDE_CONVERT_SUFFIX ".-*-ssc-*-.wav"
|
#define SERVER_SIDE_CONVERT_SUFFIX ".-*-ssc-*-.wav"
|
||||||
#define SERVER_SIDE_CONVERT_DESCR " (converted to WAV)"
|
#define SERVER_SIDE_CONVERT_DESCR " (converted to WAV)"
|
||||||
|
|
||||||
|
extern int server_side_convert(char *fname);
|
||||||
extern int server_side_convert_set(MP3FILE *pmp3);
|
extern int server_side_convert_set(MP3FILE *pmp3);
|
||||||
extern char *server_side_convert_path(char *path);
|
extern char *server_side_convert_path(char *path);
|
||||||
extern FILE *server_side_convert_open(char *path,
|
extern FILE *server_side_convert_open(char *path,
|
||||||
|
|
Loading…
Reference in New Issue