[scan] Change library_playlist_save return + fix Spotify

* fix Spotify invalid mem access
* fix clearing of Spotify files
This commit is contained in:
ejurgensen 2020-02-04 23:15:56 +01:00
parent da29fa5f93
commit 5295d787ad
7 changed files with 49 additions and 27 deletions

View File

@ -3495,16 +3495,16 @@ db_pl_add(struct playlist_info *pli)
if (ret < 0) if (ret < 0)
return -1; return -1;
pli->id = (int)sqlite3_last_insert_rowid(hdl); ret = (int)sqlite3_last_insert_rowid(hdl);
if (pli->id == 0) if (ret == 0)
{ {
DPRINTF(E_LOG, L_DB, "Successful playlist insert but no last_insert_rowid!\n"); DPRINTF(E_LOG, L_DB, "Successful playlist insert but no last_insert_rowid!\n");
return -1; 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 int
@ -3527,7 +3527,7 @@ db_pl_update(struct playlist_info *pli)
if (ret < 0) if (ret < 0)
return -1; return -1;
return 0; return pli->id;
} }
int int

View File

@ -97,6 +97,12 @@ struct library_source
int int
library_media_save(struct media_file_info *mfi); 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 int
library_playlist_save(struct playlist_info *pli); library_playlist_save(struct playlist_info *pli);

View File

@ -470,7 +470,6 @@ playlist_add(const char *path)
return -1; return -1;
} }
ret = pli.id;
free_pli(&pli, 1); free_pli(&pli, 1);
return ret; return ret;

View File

@ -850,9 +850,9 @@ process_pls(plist_t playlists, const char *file)
continue; 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_pli(&pli, 1);
free(name); free(name);

View File

@ -208,7 +208,7 @@ process_nested_playlist(int parent_id, const char *path)
free_pli(pli, 0); free_pli(pli, 0);
return ret; return 0;
error: error:
DPRINTF(E_LOG, L_SCAN, "Error processing nested playlist '%s' in playlist %d\n", path, parent_id); DPRINTF(E_LOG, L_SCAN, "Error processing nested playlist '%s' in playlist %d\n", path, parent_id);

View File

@ -84,7 +84,7 @@ scan_smartpl(const char *file, time_t mtime, int dir_id)
goto free_pli; 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:
free_pli(pli, 0); free_pli(pli, 0);

View File

@ -1438,6 +1438,22 @@ track_add(struct spotify_track *track, struct spotify_album *album, const char *
return 0; 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 * Add a saved album to the library
*/ */
@ -1574,6 +1590,7 @@ scan_playlist_tracks(const char *playlist_tracks_endpoint_uri, int plid)
static void static void
map_playlist_to_pli(struct playlist_info *pli, struct spotify_playlist *playlist) map_playlist_to_pli(struct playlist_info *pli, struct spotify_playlist *playlist)
{ {
memset(pli, 0, sizeof(struct playlist_info));
pli->type = PL_PLAIN; pli->type = PL_PLAIN;
pli->path = strdup(playlist->uri); pli->path = strdup(playlist->uri);
@ -1609,12 +1626,9 @@ saved_playlist_add(json_object *item, int index, int total, void *arg)
return -1; return -1;
} }
memset(&pli, 0, sizeof(struct playlist_info));
map_playlist_to_pli(&pli, &playlist); map_playlist_to_pli(&pli, &playlist);
library_playlist_save(&pli); pl_id = playlist_add_or_update(&pli);
pl_id = db_pl_id_bypath(pli.path);
free_pli(&pli, 1); free_pli(&pli, 1);
@ -1648,22 +1662,22 @@ create_saved_tracks_playlist()
{ {
struct playlist_info pli = struct playlist_info pli =
{ {
.path = "spotify:savedtracks", .path = strdup("spotify:savedtracks"),
.title = "Spotify Saved", .title = strdup("Spotify Saved"),
.virtual_path = "/spotify:/Spotify Saved", .virtual_path = strdup("/spotify:/Spotify Saved"),
.type = PL_PLAIN, .type = PL_PLAIN,
.parent_id = spotify_base_plid, .parent_id = spotify_base_plid,
.directory_id = DIR_SPOTIFY, .directory_id = DIR_SPOTIFY,
}; };
library_playlist_save(&pli); spotify_saved_plid = playlist_add_or_update(&pli);
if (spotify_saved_plid < 0)
spotify_saved_plid = db_pl_id_bypath(pli.path);
if (spotify_saved_plid <= 0)
{ {
DPRINTF(E_LOG, L_SPOTIFY, "Error adding playlist for saved tracks\n"); DPRINTF(E_LOG, L_SPOTIFY, "Error adding playlist for saved tracks\n");
spotify_saved_plid = 0; spotify_saved_plid = 0;
} }
free_pli(&pli, 1);
} }
/* /*
@ -1675,24 +1689,27 @@ create_base_playlist()
cfg_t *spotify_cfg; cfg_t *spotify_cfg;
struct playlist_info pli = struct playlist_info pli =
{ {
.path = "spotify:playlistfolder", .path = strdup("spotify:playlistfolder"),
.title = "Spotify", .title = strdup("Spotify"),
.type = PL_FOLDER, .type = PL_FOLDER,
}; };
spotify_base_plid = 0; spotify_base_plid = 0;
spotify_cfg = cfg_getsec(cfg, "spotify"); spotify_cfg = cfg_getsec(cfg, "spotify");
if (cfg_getbool(spotify_cfg, "base_playlist_disable")) if (cfg_getbool(spotify_cfg, "base_playlist_disable"))
{
free_pli(&pli, 1);
return; return;
}
library_playlist_save(&pli); spotify_base_plid = playlist_add_or_update(&pli);
spotify_base_plid = db_pl_id_bypath(pli.path);
if (spotify_base_plid < 0) if (spotify_base_plid < 0)
{ {
DPRINTF(E_LOG, L_SPOTIFY, "Error adding base playlist\n"); DPRINTF(E_LOG, L_SPOTIFY, "Error adding base playlist\n");
spotify_base_plid = 0; spotify_base_plid = 0;
} }
free_pli(&pli, 1);
} }
static void static void