[db] inc playcount using filter

This commit is contained in:
whatdoineed2do/Ray 2020-03-22 22:01:04 +00:00
parent 1a912d9808
commit 286525a85c
2 changed files with 49 additions and 6 deletions

View File

@ -2514,10 +2514,10 @@ db_files_get_count(uint32_t *nitems, uint32_t *nstreams, const char *filter)
return 0;
}
void
db_file_inc_playcount(int id)
static void
db_file_inc_playcount_byfilter(const char *filter)
{
#define Q_TMPL "UPDATE files SET play_count = play_count + 1, time_played = %" PRIi64 ", seek = 0 WHERE id = %d;"
#define Q_TMPL "UPDATE files SET play_count = play_count + 1, time_played = %" PRIi64 ", seek = 0 WHERE %s;"
/*
* Rating calculation is taken from from the beets plugin "mpdstats" (see https://beets.readthedocs.io/en/latest/plugins/mpdstats.html)
* and adapted to the forked-daapd rating rage (0 to 100).
@ -2536,14 +2536,16 @@ db_file_inc_playcount(int id)
"UPDATE files "\
" SET play_count = play_count + 1, time_played = %" PRIi64 ", seek = 0, "\
" rating = CAST(((play_count + 1.0) / (play_count + skip_count + 2.0) * 100 * 0.75) + ((rating + ((100.0 - rating) / 2.0)) * 0.25) AS INT)" \
" WHERE id = %d;"
" WHERE %s;"
char *query;
int ret;
if (db_rating_updates)
query = sqlite3_mprintf(Q_TMPL_WITH_RATING, (int64_t)time(NULL), id);
query = sqlite3_mprintf(Q_TMPL_WITH_RATING, (int64_t)time(NULL), filter);
else
query = sqlite3_mprintf(Q_TMPL, (int64_t)time(NULL), id);
query = sqlite3_mprintf(Q_TMPL, (int64_t)time(NULL), filter);
if (!query)
{
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
@ -2558,6 +2560,41 @@ db_file_inc_playcount(int id)
#undef Q_TMPL_WITH_RATING
}
void
db_file_inc_playcount_byplid(int id, bool only_unplayed)
{
char *filter;
filter = sqlite3_mprintf("path IN (SELECT filepath FROM playlistitems WHERE playlistid = %d) %s",
id, only_unplayed ? "AND play_count = 0" : "");
db_file_inc_playcount_byfilter(filter);
sqlite3_free(filter);
}
void
db_file_inc_playcount_bysongalbumid(int64_t id, bool only_unplayed)
{
char *filter;
filter = sqlite3_mprintf("songalbumid = %" PRIi64 " %s",
id, only_unplayed ? "AND play_count = 0" : "");
db_file_inc_playcount_byfilter(filter);
sqlite3_free(filter);
}
void
db_file_inc_playcount(int id)
{
char *filter;
filter = sqlite3_mprintf("id = %d", id);
db_file_inc_playcount_byfilter(filter);
sqlite3_free(filter);
}
void
db_file_inc_skipcount(int id)
{

View File

@ -580,6 +580,12 @@ db_files_get_count(uint32_t *nitems, uint32_t *nstreams, const char *filter);
void
db_file_inc_playcount(int id);
void
db_file_inc_playcount_byplid(int id, bool only_unplayed);
void
db_file_inc_playcount_bysongalbumid(int64_t id, bool only_unplayed);
void
db_file_inc_skipcount(int id);