From ae1a45bacc44a821150c9f0d6b100586650d6464 Mon Sep 17 00:00:00 2001 From: chme Date: Sun, 1 Jan 2017 16:51:21 +0100 Subject: [PATCH] [library/spotify] Implement rescan in spotify.c and purge old files after rescan --- src/db.c | 6 +++--- src/db.h | 2 +- src/filescanner.c | 8 +++++++- src/library.c | 11 ++++++++--- src/spotify.c | 29 +++++++++++++++++++++++------ 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/db.c b/src/db.c index 9bcf0453..d0f79b75 100644 --- a/src/db.c +++ b/src/db.c @@ -3528,12 +3528,12 @@ db_directory_addorupdate(char *virtual_path, int disabled, int parent_id) } void -db_directory_ping_bymatch(char *path) +db_directory_ping_bymatch(char *virtual_path) { -#define Q_TMPL_DIR "UPDATE directories SET db_timestamp = %" PRIi64 " WHERE virtual_path = '/file:%q' OR virtual_path LIKE '/file:%q/%%';" +#define Q_TMPL_DIR "UPDATE directories SET db_timestamp = %" PRIi64 " WHERE virtual_path = '%q' OR virtual_path LIKE '%q/%%';" char *query; - query = sqlite3_mprintf(Q_TMPL_DIR, (int64_t)time(NULL), path, path); + query = sqlite3_mprintf(Q_TMPL_DIR, (int64_t)time(NULL), virtual_path, virtual_path); db_query_run(query, 1, 0); #undef Q_TMPL_DIR diff --git a/src/db.h b/src/db.h index 6e2c21b3..079e1044 100644 --- a/src/db.h +++ b/src/db.h @@ -633,7 +633,7 @@ int db_directory_addorupdate(char *virtual_path, int disabled, int parent_id); void -db_directory_ping_bymatch(char *path); +db_directory_ping_bymatch(char *virtual_path); void db_directory_disable_bymatch(char *path, char *strip, uint32_t cookie); diff --git a/src/filescanner.c b/src/filescanner.c index 267c1126..34cd9169 100644 --- a/src/filescanner.c +++ b/src/filescanner.c @@ -766,6 +766,8 @@ bulk_scan(int flags) time_t end; int parent_id; int i; + char virtual_path[PATH_MAX]; + int ret; start = time(NULL); @@ -793,7 +795,11 @@ bulk_scan(int flags) db_file_ping_bymatch(path, 1); db_pl_ping_bymatch(path, 1); - db_directory_ping_bymatch(path); + ret = snprintf(virtual_path, sizeof(virtual_path), "/file:%s", path); + if ((ret < 0) || (ret >= sizeof(virtual_path))) + DPRINTF(E_LOG, L_SCAN, "Virtual path exceeds PATH_MAX (/file:%s)\n", path); + else + db_directory_ping_bymatch(virtual_path); continue; } diff --git a/src/library.c b/src/library.c index bb9b060f..12a56c7a 100644 --- a/src/library.c +++ b/src/library.c @@ -572,6 +572,8 @@ rescan(void *arg, int *ret) sources[i]->rescan(); } + purge_cruft(starttime); + endtime = time(NULL); DPRINTF(E_LOG, L_LIB, "Library rescan completed in %.f sec\n", difftime(endtime, starttime)); @@ -646,10 +648,13 @@ initscan() sources[i]->initscan(); } - purge_cruft(starttime); + if (! (cfg_getbool(cfg_getsec(cfg, "library"), "filescan_disable"))) + { + purge_cruft(starttime); - DPRINTF(E_DBG, L_LIB, "Running post library scan jobs\n"); - db_hook_post_scan(); + DPRINTF(E_DBG, L_LIB, "Running post library scan jobs\n"); + db_hook_post_scan(); + } endtime = time(NULL); DPRINTF(E_LOG, L_LIB, "Library init scan completed in %.f sec\n", difftime(endtime, starttime)); diff --git a/src/spotify.c b/src/spotify.c index 9eb93127..d0b06b3d 100644 --- a/src/spotify.c +++ b/src/spotify.c @@ -2233,7 +2233,7 @@ scan_playlists() /* Thread: library */ static int -spotify_initscan() +initscan() { cfg_t *spotify_cfg; int ret; @@ -2283,14 +2283,31 @@ spotify_initscan() /* Thread: library */ static int -spotify_rescan() +rescan() { + /* + * Scan saved tracks from the web api + */ + if (spotify_access_token_valid) + { + scan_saved_albums(); + scan_playlists(); + } + else + { + db_transaction_begin(); + db_file_ping_bymatch("spotify:", 0); + db_pl_ping_bymatch("spotify:", 0); + db_directory_ping_bymatch("/spotify:"); + db_transaction_end(); + } + return 0; } /* Thread: library */ static int -spotify_fullrescan() +fullrescan() { return 0; } @@ -2498,7 +2515,7 @@ struct library_source spotifyscanner = .disabled = 0, .init = spotify_init, .deinit = spotify_deinit, - .rescan = spotify_rescan, - .initscan = spotify_initscan, - .fullrescan = spotify_fullrescan, + .rescan = rescan, + .initscan = initscan, + .fullrescan = fullrescan, };