From 5295d787ad8dcfbf6f16da5b401382ab4a9e87da Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Tue, 4 Feb 2020 23:15:56 +0100 Subject: [PATCH] [scan] Change library_playlist_save return + fix Spotify * fix Spotify invalid mem access * fix clearing of Spotify files --- src/db.c | 10 +++--- src/library.h | 6 ++++ src/library/filescanner.c | 1 - src/library/filescanner_itunes.c | 4 +-- src/library/filescanner_playlist.c | 2 +- src/library/filescanner_smartpl.c | 2 +- src/spotify_webapi.c | 51 ++++++++++++++++++++---------- 7 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/db.c b/src/db.c index 98c8d2ec..de51ceb5 100644 --- a/src/db.c +++ b/src/db.c @@ -3495,16 +3495,16 @@ db_pl_add(struct playlist_info *pli) if (ret < 0) return -1; - pli->id = (int)sqlite3_last_insert_rowid(hdl); - if (pli->id == 0) + ret = (int)sqlite3_last_insert_rowid(hdl); + if (ret == 0) { DPRINTF(E_LOG, L_DB, "Successful playlist insert but no last_insert_rowid!\n"); return -1; } - DPRINTF(E_DBG, L_DB, "Added playlist %s (path %s) as id %d\n", pli->title, pli->path, pli->id); + DPRINTF(E_DBG, L_DB, "Added playlist %s (path %s) as id %d\n", pli->title, pli->path, ret); - return 0; + return ret; } int @@ -3527,7 +3527,7 @@ db_pl_update(struct playlist_info *pli) if (ret < 0) return -1; - return 0; + return pli->id; } int diff --git a/src/library.h b/src/library.h index ca98f785..cfe6b24c 100644 --- a/src/library.h +++ b/src/library.h @@ -97,6 +97,12 @@ struct library_source int library_media_save(struct media_file_info *mfi); +/* + * Adds a playlist if pli->id == 0, otherwise updates. + * + * @param pli Playlist to save + * @return playlist id if operation succeeded, -1 on failure. + */ int library_playlist_save(struct playlist_info *pli); diff --git a/src/library/filescanner.c b/src/library/filescanner.c index 8a3f3917..4e5a3615 100644 --- a/src/library/filescanner.c +++ b/src/library/filescanner.c @@ -470,7 +470,6 @@ playlist_add(const char *path) return -1; } - ret = pli.id; free_pli(&pli, 1); return ret; diff --git a/src/library/filescanner_itunes.c b/src/library/filescanner_itunes.c index 5e8a113d..86a1d177 100644 --- a/src/library/filescanner_itunes.c +++ b/src/library/filescanner_itunes.c @@ -850,9 +850,9 @@ process_pls(plist_t playlists, const char *file) continue; } - DPRINTF(E_INFO, L_SCAN, "Added playlist as id %d\n", pli.id); + DPRINTF(E_INFO, L_SCAN, "Added playlist as id %d\n", ret); - process_pl_items(items, pli.id, name); + process_pl_items(items, ret, name); free_pli(&pli, 1); free(name); diff --git a/src/library/filescanner_playlist.c b/src/library/filescanner_playlist.c index e3eb6644..2a928283 100644 --- a/src/library/filescanner_playlist.c +++ b/src/library/filescanner_playlist.c @@ -208,7 +208,7 @@ process_nested_playlist(int parent_id, const char *path) free_pli(pli, 0); - return ret; + return 0; error: DPRINTF(E_LOG, L_SCAN, "Error processing nested playlist '%s' in playlist %d\n", path, parent_id); diff --git a/src/library/filescanner_smartpl.c b/src/library/filescanner_smartpl.c index f6b5c40f..34d5f4b9 100644 --- a/src/library/filescanner_smartpl.c +++ b/src/library/filescanner_smartpl.c @@ -84,7 +84,7 @@ scan_smartpl(const char *file, time_t mtime, int dir_id) goto free_pli; } - DPRINTF(E_INFO, L_SCAN, "Added or updated smart playlist '%s'\n", file); + DPRINTF(E_INFO, L_SCAN, "Added or updated smart playlist '%s' with id %d\n", file, ret); free_pli: free_pli(pli, 0); diff --git a/src/spotify_webapi.c b/src/spotify_webapi.c index a04d427a..338f9293 100644 --- a/src/spotify_webapi.c +++ b/src/spotify_webapi.c @@ -1438,6 +1438,22 @@ track_add(struct spotify_track *track, struct spotify_album *album, const char * return 0; } +static int +playlist_add_or_update(struct playlist_info *pli) +{ + int pl_id; + + pl_id = db_pl_id_bypath(pli->path); + if (pl_id < 0) + return library_playlist_save(pli); + + pli->id = pl_id; + + db_pl_clear_items(pli->id); + + return library_playlist_save(pli); +} + /* * Add a saved album to the library */ @@ -1574,6 +1590,7 @@ scan_playlist_tracks(const char *playlist_tracks_endpoint_uri, int plid) static void map_playlist_to_pli(struct playlist_info *pli, struct spotify_playlist *playlist) { + memset(pli, 0, sizeof(struct playlist_info)); pli->type = PL_PLAIN; pli->path = strdup(playlist->uri); @@ -1609,12 +1626,9 @@ saved_playlist_add(json_object *item, int index, int total, void *arg) return -1; } - memset(&pli, 0, sizeof(struct playlist_info)); - map_playlist_to_pli(&pli, &playlist); - library_playlist_save(&pli); - pl_id = db_pl_id_bypath(pli.path); + pl_id = playlist_add_or_update(&pli); free_pli(&pli, 1); @@ -1648,22 +1662,22 @@ create_saved_tracks_playlist() { struct playlist_info pli = { - .path = "spotify:savedtracks", - .title = "Spotify Saved", - .virtual_path = "/spotify:/Spotify Saved", + .path = strdup("spotify:savedtracks"), + .title = strdup("Spotify Saved"), + .virtual_path = strdup("/spotify:/Spotify Saved"), .type = PL_PLAIN, .parent_id = spotify_base_plid, .directory_id = DIR_SPOTIFY, }; - library_playlist_save(&pli); - - spotify_saved_plid = db_pl_id_bypath(pli.path); - if (spotify_saved_plid <= 0) + spotify_saved_plid = playlist_add_or_update(&pli); + if (spotify_saved_plid < 0) { DPRINTF(E_LOG, L_SPOTIFY, "Error adding playlist for saved tracks\n"); spotify_saved_plid = 0; } + + free_pli(&pli, 1); } /* @@ -1675,24 +1689,27 @@ create_base_playlist() cfg_t *spotify_cfg; struct playlist_info pli = { - .path = "spotify:playlistfolder", - .title = "Spotify", + .path = strdup("spotify:playlistfolder"), + .title = strdup("Spotify"), .type = PL_FOLDER, }; spotify_base_plid = 0; spotify_cfg = cfg_getsec(cfg, "spotify"); if (cfg_getbool(spotify_cfg, "base_playlist_disable")) - return; + { + free_pli(&pli, 1); + return; + } - library_playlist_save(&pli); - - spotify_base_plid = db_pl_id_bypath(pli.path); + spotify_base_plid = playlist_add_or_update(&pli); if (spotify_base_plid < 0) { DPRINTF(E_LOG, L_SPOTIFY, "Error adding base playlist\n"); spotify_base_plid = 0; } + + free_pli(&pli, 1); } static void