[httpd/cache] Misc fixing up
This commit is contained in:
parent
2d9200fcdf
commit
088c393dd6
|
@ -859,7 +859,7 @@ cache_daap_update_cb(int fd, short what, void *arg)
|
||||||
static enum command_state
|
static enum command_state
|
||||||
xcode_header_get(void *arg, int *retval)
|
xcode_header_get(void *arg, int *retval)
|
||||||
{
|
{
|
||||||
#define Q_TMPL "SELECT header FROM data WHERE length(header) > 0 AND id = ? AND format = ?;"
|
#define Q_TMPL "SELECT header FROM data WHERE length(header) > 0 AND file_id = ? AND format = ?;"
|
||||||
struct cache_arg *cmdarg = arg;
|
struct cache_arg *cmdarg = arg;
|
||||||
sqlite3_stmt *stmt = NULL;
|
sqlite3_stmt *stmt = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -915,10 +915,13 @@ xcode_toggle(void *arg, int *retval)
|
||||||
{
|
{
|
||||||
bool *enable = arg;
|
bool *enable = arg;
|
||||||
|
|
||||||
cache_xcode_is_enabled = *enable;
|
if (*enable == cache_xcode_is_enabled)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
cache_xcode_is_enabled = *enable;
|
||||||
xcode_trigger();
|
xcode_trigger();
|
||||||
|
|
||||||
|
end:
|
||||||
*retval = 0;
|
*retval = 0;
|
||||||
return COMMAND_END;
|
return COMMAND_END;
|
||||||
}
|
}
|
||||||
|
|
24
src/httpd.c
24
src/httpd.c
|
@ -925,7 +925,7 @@ speaker_update_handler_cb(void *arg)
|
||||||
const char *prefer_format = cfg_getstr(cfg_getsec(cfg, "library"), "prefer_format");
|
const char *prefer_format = cfg_getstr(cfg_getsec(cfg, "library"), "prefer_format");
|
||||||
bool want_mp4;
|
bool want_mp4;
|
||||||
|
|
||||||
want_mp4 = (prefer_format && strcmp(prefer_format, "alac"));
|
want_mp4 = (prefer_format && (strcmp(prefer_format, "alac") == 0));
|
||||||
if (!want_mp4)
|
if (!want_mp4)
|
||||||
player_speaker_enumerate(speaker_enum_cb, &want_mp4);
|
player_speaker_enumerate(speaker_enum_cb, &want_mp4);
|
||||||
|
|
||||||
|
@ -1009,6 +1009,7 @@ httpd_stream_file(struct httpd_request *hreq, int id)
|
||||||
struct media_file_info *mfi = NULL;
|
struct media_file_info *mfi = NULL;
|
||||||
struct stream_ctx *st = NULL;
|
struct stream_ctx *st = NULL;
|
||||||
enum transcode_profile profile;
|
enum transcode_profile profile;
|
||||||
|
enum transcode_profile spk_profile;
|
||||||
const char *param;
|
const char *param;
|
||||||
const char *param_end;
|
const char *param_end;
|
||||||
const char *ctype;
|
const char *ctype;
|
||||||
|
@ -1069,7 +1070,7 @@ httpd_stream_file(struct httpd_request *hreq, int id)
|
||||||
}
|
}
|
||||||
|
|
||||||
param = httpd_header_find(hreq->in_headers, "Accept-Codecs");
|
param = httpd_header_find(hreq->in_headers, "Accept-Codecs");
|
||||||
profile = httpd_xcode_profile_get(hreq->user_agent, hreq->peer_address, param, mfi->codectype);
|
profile = transcode_needed(hreq->user_agent, param, mfi->codectype);
|
||||||
if (profile == XCODE_UNKNOWN)
|
if (profile == XCODE_UNKNOWN)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_HTTPD, "Could not serve '%s' to client, unable to determine output format\n", mfi->path);
|
DPRINTF(E_LOG, L_HTTPD, "Could not serve '%s' to client, unable to determine output format\n", mfi->path);
|
||||||
|
@ -1082,6 +1083,10 @@ httpd_stream_file(struct httpd_request *hreq, int id)
|
||||||
{
|
{
|
||||||
DPRINTF(E_INFO, L_HTTPD, "Preparing to transcode %s\n", mfi->path);
|
DPRINTF(E_INFO, L_HTTPD, "Preparing to transcode %s\n", mfi->path);
|
||||||
|
|
||||||
|
spk_profile = httpd_xcode_profile_get(hreq);
|
||||||
|
if (spk_profile != XCODE_NONE)
|
||||||
|
profile = spk_profile;
|
||||||
|
|
||||||
st = stream_new_transcode(mfi, profile, hreq, offset, end_offset, stream_chunk_xcode_cb);
|
st = stream_new_transcode(mfi, profile, hreq, offset, end_offset, stream_chunk_xcode_cb);
|
||||||
if (!st)
|
if (!st)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -1191,23 +1196,18 @@ httpd_stream_file(struct httpd_request *hreq, int id)
|
||||||
// Returns enum transcode_profile, but is just declared with int so we don't
|
// Returns enum transcode_profile, but is just declared with int so we don't
|
||||||
// need to include transcode.h in httpd_internal.h
|
// need to include transcode.h in httpd_internal.h
|
||||||
int
|
int
|
||||||
httpd_xcode_profile_get(const char *user_agent, const char *address, const char *accept_codecs, const char *codec)
|
httpd_xcode_profile_get(struct httpd_request *hreq)
|
||||||
{
|
{
|
||||||
enum transcode_profile profile;
|
|
||||||
struct player_speaker_info spk;
|
struct player_speaker_info spk;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
profile = transcode_needed(user_agent, accept_codecs, codec);
|
DPRINTF(E_DBG, L_HTTPD, "Checking if client '%s' is a speaker\n", hreq->peer_address);
|
||||||
if (profile == XCODE_NONE)
|
|
||||||
return profile;
|
|
||||||
|
|
||||||
DPRINTF(E_DBG, L_HTTPD, "Checking if client '%s' is a speaker\n", address);
|
|
||||||
|
|
||||||
// A Roku Soundbridge may also be RCP device/speaker for which the user may
|
// A Roku Soundbridge may also be RCP device/speaker for which the user may
|
||||||
// have set a prefered streaming format
|
// have set a prefered streaming format
|
||||||
ret = player_speaker_get_byaddress(&spk, address);
|
ret = player_speaker_get_byaddress(&spk, hreq->peer_address);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return profile;
|
return XCODE_NONE;
|
||||||
|
|
||||||
if (spk.format == MEDIA_FORMAT_WAV)
|
if (spk.format == MEDIA_FORMAT_WAV)
|
||||||
return XCODE_WAV;
|
return XCODE_WAV;
|
||||||
|
@ -1216,7 +1216,7 @@ httpd_xcode_profile_get(const char *user_agent, const char *address, const char
|
||||||
if (spk.format == MEDIA_FORMAT_ALAC)
|
if (spk.format == MEDIA_FORMAT_ALAC)
|
||||||
return XCODE_MP4_ALAC;
|
return XCODE_MP4_ALAC;
|
||||||
|
|
||||||
return profile;
|
return XCODE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct evbuffer *
|
struct evbuffer *
|
||||||
|
|
|
@ -1149,6 +1149,7 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist)
|
||||||
const char *accept_codecs;
|
const char *accept_codecs;
|
||||||
const char *tag;
|
const char *tag;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
enum transcode_profile spk_profile;
|
||||||
enum transcode_profile profile;
|
enum transcode_profile profile;
|
||||||
struct transcode_metadata_string xcode_metadata;
|
struct transcode_metadata_string xcode_metadata;
|
||||||
struct media_quality quality = { 0 };
|
struct media_quality quality = { 0 };
|
||||||
|
@ -1222,6 +1223,8 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist)
|
||||||
accept_codecs = httpd_header_find(hreq->in_headers, "Accept-Codecs");
|
accept_codecs = httpd_header_find(hreq->in_headers, "Accept-Codecs");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spk_profile = httpd_xcode_profile_get(hreq);
|
||||||
|
|
||||||
nsongs = 0;
|
nsongs = 0;
|
||||||
while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0)
|
while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0)
|
||||||
{
|
{
|
||||||
|
@ -1229,13 +1232,16 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist)
|
||||||
|
|
||||||
// Not sure if the is_remote path is really needed. Note that if you
|
// Not sure if the is_remote path is really needed. Note that if you
|
||||||
// change the below you might need to do the same in rsp_reply_playlist()
|
// change the below you might need to do the same in rsp_reply_playlist()
|
||||||
profile = s->is_remote ? XCODE_WAV : httpd_xcode_profile_get(hreq->user_agent, hreq->peer_address, accept_codecs, dbmfi.codectype);
|
profile = s->is_remote ? XCODE_WAV : transcode_needed(hreq->user_agent, accept_codecs, dbmfi.codectype);
|
||||||
if (profile == XCODE_UNKNOWN)
|
if (profile == XCODE_UNKNOWN)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DAAP, "Cannot transcode '%s', codec type is unknown\n", dbmfi.fname);
|
DPRINTF(E_LOG, L_DAAP, "Cannot transcode '%s', codec type is unknown\n", dbmfi.fname);
|
||||||
}
|
}
|
||||||
else if (profile != XCODE_NONE)
|
else if (profile != XCODE_NONE)
|
||||||
{
|
{
|
||||||
|
if (spk_profile != XCODE_NONE)
|
||||||
|
profile = spk_profile;
|
||||||
|
|
||||||
if (safe_atou32(dbmfi.song_length, &len_ms) < 0)
|
if (safe_atou32(dbmfi.song_length, &len_ms) < 0)
|
||||||
len_ms = 3 * 60 * 1000; // just a fallback default
|
len_ms = 3 * 60 * 1000; // just a fallback default
|
||||||
|
|
||||||
|
|
|
@ -207,7 +207,7 @@ void
|
||||||
httpd_stream_file(struct httpd_request *hreq, int id);
|
httpd_stream_file(struct httpd_request *hreq, int id);
|
||||||
|
|
||||||
int
|
int
|
||||||
httpd_xcode_profile_get(const char *user_agent, const char *address, const char *accept_codecs, const char *codec);
|
httpd_xcode_profile_get(struct httpd_request *hreq);
|
||||||
|
|
||||||
void
|
void
|
||||||
httpd_request_handler_set(struct httpd_request *hreq);
|
httpd_request_handler_set(struct httpd_request *hreq);
|
||||||
|
|
|
@ -415,7 +415,7 @@ rsp_reply_db(struct httpd_request *hreq)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
item_add(xml_node *parent, struct query_params *qp, const char *user_agent, const char *address, const char *accept_codecs, int mode)
|
item_add(xml_node *parent, struct query_params *qp, enum transcode_profile spk_profile, const char *user_agent, const char *accept_codecs, int mode)
|
||||||
{
|
{
|
||||||
struct media_quality quality = { 0 };
|
struct media_quality quality = { 0 };
|
||||||
struct db_media_file_info dbmfi;
|
struct db_media_file_info dbmfi;
|
||||||
|
@ -432,13 +432,16 @@ item_add(xml_node *parent, struct query_params *qp, const char *user_agent, cons
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
profile = httpd_xcode_profile_get(user_agent, address, accept_codecs, dbmfi.codectype);
|
profile = transcode_needed(user_agent, accept_codecs, dbmfi.codectype);
|
||||||
if (profile == XCODE_UNKNOWN)
|
if (profile == XCODE_UNKNOWN)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DAAP, "Cannot transcode '%s', codec type is unknown\n", dbmfi.fname);
|
DPRINTF(E_LOG, L_DAAP, "Cannot transcode '%s', codec type is unknown\n", dbmfi.fname);
|
||||||
}
|
}
|
||||||
else if (profile != XCODE_NONE)
|
else if (profile != XCODE_NONE)
|
||||||
{
|
{
|
||||||
|
if (spk_profile != XCODE_NONE)
|
||||||
|
profile = spk_profile; // User has configured a specific transcode format for this speaker
|
||||||
|
|
||||||
orgcodec = dbmfi.codectype;
|
orgcodec = dbmfi.codectype;
|
||||||
|
|
||||||
if (safe_atou32(dbmfi.song_length, &len_ms) < 0)
|
if (safe_atou32(dbmfi.song_length, &len_ms) < 0)
|
||||||
|
@ -485,6 +488,7 @@ rsp_reply_playlist(struct httpd_request *hreq)
|
||||||
struct query_params qp;
|
struct query_params qp;
|
||||||
const char *param;
|
const char *param;
|
||||||
const char *accept_codecs;
|
const char *accept_codecs;
|
||||||
|
enum transcode_profile spk_profile;
|
||||||
xml_node *response;
|
xml_node *response;
|
||||||
xml_node *items;
|
xml_node *items;
|
||||||
int mode;
|
int mode;
|
||||||
|
@ -494,6 +498,7 @@ rsp_reply_playlist(struct httpd_request *hreq)
|
||||||
memset(&qp, 0, sizeof(struct query_params));
|
memset(&qp, 0, sizeof(struct query_params));
|
||||||
|
|
||||||
accept_codecs = httpd_header_find(hreq->in_headers, "Accept-Codecs");
|
accept_codecs = httpd_header_find(hreq->in_headers, "Accept-Codecs");
|
||||||
|
spk_profile = httpd_xcode_profile_get(hreq);
|
||||||
|
|
||||||
ret = safe_atoi32(hreq->path_parts[2], &qp.id);
|
ret = safe_atoi32(hreq->path_parts[2], &qp.id);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -555,7 +560,7 @@ rsp_reply_playlist(struct httpd_request *hreq)
|
||||||
items = xml_new_node(response, "items", NULL);
|
items = xml_new_node(response, "items", NULL);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ret = item_add(items, &qp, hreq->user_agent, hreq->peer_address, accept_codecs, mode);
|
ret = item_add(items, &qp, spk_profile, hreq->user_agent, accept_codecs, mode);
|
||||||
}
|
}
|
||||||
while (ret == 0);
|
while (ret == 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue