diff --git a/src/db.c b/src/db.c index 70975f0e..66c0b9f6 100644 --- a/src/db.c +++ b/src/db.c @@ -663,7 +663,7 @@ db_set_cfg_names(void) continue; } - query = sqlite3_mprintf(Q_TMPL, title, PL_SMART, special_id[i]); + query = sqlite3_mprintf(Q_TMPL, title, PL_SPECIAL, special_id[i]); if (!query) { DPRINTF(E_LOG, L_DB, "Out of memory for query string\n"); @@ -718,7 +718,7 @@ db_purge_cruft(time_t ref) for (i = 0; i < (sizeof(queries_tmpl) / sizeof(queries_tmpl[0])); i++) { - queries[i] = sqlite3_mprintf(queries_tmpl[i], PL_SMART, (int64_t)ref); + queries[i] = sqlite3_mprintf(queries_tmpl[i], PL_SPECIAL, (int64_t)ref); if (!queries[i]) { DPRINTF(E_LOG, L_DB, "Out of memory for query string\n"); @@ -780,7 +780,7 @@ db_purge_all(void) DPRINTF(E_DBG, L_DB, "Purged %d rows\n", sqlite3_changes(hdl)); } - query = sqlite3_mprintf(Q_TMPL, PL_SMART); + query = sqlite3_mprintf(Q_TMPL, PL_SPECIAL); if (!query) { DPRINTF(E_LOG, L_DB, "Out of memory for query string\n"); @@ -1141,6 +1141,7 @@ db_build_query_plitems(struct query_params *qp, char **q) switch (pli->type) { + case PL_SPECIAL: case PL_SMART: ret = db_build_query_plitems_smart(qp, pli->query, q); break; @@ -1722,6 +1723,7 @@ db_query_fetch_pl(struct query_params *qp, struct db_playlist_info *dbpli) nstreams = db_pl_count_items(id, 1); break; + case PL_SPECIAL: case PL_SMART: nitems = db_smartpl_count_items(dbpli->query); nstreams = 0; @@ -3041,6 +3043,7 @@ db_pl_fetch_byquery(char *query) pli->streams = db_pl_count_items(pli->id, 1); break; + case PL_SPECIAL: case PL_SMART: pli->items = db_smartpl_count_items(pli->query); break; diff --git a/src/db.h b/src/db.h index 04672267..90bd107f 100644 --- a/src/db.h +++ b/src/db.h @@ -166,11 +166,12 @@ struct media_file_info { #define mfi_offsetof(field) offsetof(struct media_file_info, field) -/* PL_SMART value must be in sync with type value in Q_PL* in db.c */ +/* PL_SPECIAL value must be in sync with type value in Q_PL* in db.c */ enum pl_type { PL_PLAIN = 0, PL_FOLDER = 1, - PL_SMART = 2, + PL_SPECIAL = 2, + PL_SMART = 3, PL_MAX, }; diff --git a/src/httpd_daap.c b/src/httpd_daap.c index 7aa7ad53..90f83b05 100644 --- a/src/httpd_daap.c +++ b/src/httpd_daap.c @@ -1685,8 +1685,8 @@ daap_reply_playlists(struct evhttp_request *req, struct evbuffer *evbuf, char ** if (!cfg_radiopl && (database != DAAP_DB_RADIO) && (plstreams > 0) && (plstreams == plitems)) continue; - /* Don't add empty Smart playlists */ - if ((plid > 1) && (plitems == 0) && (pltype == PL_SMART)) + /* Don't add empty Special playlists */ + if ((plid > 1) && (plitems == PL_SPECIAL) && (pltype == 1)) continue; npls++; @@ -1700,14 +1700,20 @@ daap_reply_playlists(struct evhttp_request *req, struct evbuffer *evbuf, char ** if (dfm == &dfm_dmap_mimc) continue; - /* com.apple.itunes.smart-playlist - type = PL_SMART AND id != 1 */ + /* Add field "com.apple.itunes.smart-playlist" for special and smart playlists + (excluding the special playlist for "library" with id = 1) */ if (dfm == &dfm_dmap_aeSP) { - if ((pltype == PL_SMART) && (plid != 1)) + if ((pltype == PL_SMART) || ((pltype == PL_SPECIAL) && (plid != 1))) + { + dmap_add_char(playlist, "aeSP", 1); + } + + /* Add field "com.apple.itunes.special-playlist" for special playlists + (excluding the special playlist for "library" with id = 1) */ + if ((pltype == PL_SPECIAL) && (plid != 1)) { int32_t aePS = 0; - dmap_add_char(playlist, "aeSP", 1); - ret = safe_atoi32(dbpli.special_id, &aePS); if ((ret == 0) && (aePS > 0)) dmap_add_char(playlist, "aePS", aePS);