From 11f6b66a8eb345185c4a4bc8dc8d6059835d37f0 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Fri, 11 Mar 2022 23:38:13 +0100 Subject: [PATCH] Merge load_playlist() into playlist_open() and simplify. They are reasonably small. Remove the weird calling convention with the PLAYLIST_LOADED error code and the pointless check for the dummy row because they only obfuscate the code. Moreover, the comment of load_playlist() is actively misleading because this function is not a loop callback. Extend the documentation of the combined public playlist_open() while at it. The code can be simplified by calling pl_get_def_by_name() rather than osl_get_row() followed by pl_get_name_and_def_by_row(). --- error.h | 1 - playlist.c | 76 +++++++++++++++++++++++------------------------------- 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/error.h b/error.h index 5268feae..4cd8dafc 100644 --- a/error.h +++ b/error.h @@ -168,7 +168,6 @@ PARA_ERROR(OPUS_SET_GAIN, "opus: could not set gain"), \ PARA_ERROR(PATH_FOUND, ""), /* not really an error */ \ PARA_ERROR(PLAYLIST_EMPTY, "attempted to load empty playlist"), \ - PARA_ERROR(PLAYLIST_LOADED, ""), /* not really an error */ \ PARA_ERROR(PREBUFFER_SUCCESS, "prebuffering complete"), \ PARA_ERROR(PRIVATE_KEY, "can not read private key"), \ PARA_ERROR(QUEUE, "packet queue overrun"), \ diff --git a/playlist.c b/playlist.c index 65c2148a..171a6d26 100644 --- a/playlist.c +++ b/playlist.c @@ -55,37 +55,6 @@ static int add_playlist_entry(char *path, void *data) return 1; } -/* returns -E_PLAYLIST_LOADED on _success_ to terminate the loop */ -static int load_playlist(struct osl_row *row, void *data) -{ - struct playlist_info *playlist = data; - struct osl_object playlist_def; - char *playlist_name; - int ret; - - ret = pl_get_name_and_def_by_row(row, &playlist_name, &playlist_def); - if (ret < 0) - goto err; - playlist->length = 0; - ret = for_each_line(FELF_READ_ONLY, playlist_def.data, - playlist_def.size, add_playlist_entry, playlist); - osl_close_disk_object(&playlist_def); - if (ret < 0) - goto err; - ret = -E_PLAYLIST_EMPTY; - if (!playlist->length) - goto err; - playlist->name = para_strdup(playlist_name); - PARA_NOTICE_LOG("loaded playlist %s (%u files)\n", playlist->name, - playlist->length); - return -E_PLAYLIST_LOADED; -err: - if (ret != -E_DUMMY_ROW) - PARA_NOTICE_LOG("unable to load playlist (%s)\n", - para_strerror(-ret)); - return 1; -} - static int check_playlist_path(char *path, void *data) { struct para_buffer *pb = data; @@ -144,38 +113,57 @@ void playlist_close(void) return; free(current_playlist.name); current_playlist.name = NULL; + current_playlist.length = 0; } /** - * Open and load the given playlist. + * Populate the score table from the paths of a playlist database object. + * + * This loads the blob object which corresponds to the given name from the + * playlist table. Each line of the blob is regarded as a path which is looked + * up in the audio file table. If the path lookup succeeds, a reference to the + * corresponding row of the audio file table is added to the score table. * * \param name The name of the playlist to open. * \param errmsg To be sent to the client (if called via select command). * - * Files which are listed in the playlist, but not contained in the database - * are ignored. This is not considered an error. - * * \return The length of the loaded playlist on success, negative error code - * else. + * else. Files which are listed in the playlist, but are not contained in the + * database are ignored. This is not considered an error. */ int playlist_open(const char *name, char **errmsg) { - struct osl_object obj; int ret; - struct osl_row *row; + struct playlist_info *playlist = ¤t_playlist; + struct osl_object playlist_def; - obj.data = (char *)name; - obj.size = strlen(obj.data); - ret = osl(osl_get_row(playlists_table, BLOBCOL_NAME, &obj, &row)); + ret = pl_get_def_by_name(name, &playlist_def); if (ret < 0) { if (errmsg) - *errmsg = make_message("could not open playlist %s", + *errmsg = make_message("could not read playlist %s", name); return ret; } playlist_close(); - ret = load_playlist(row, ¤t_playlist); - return (ret == -E_PLAYLIST_LOADED)? current_playlist.length : ret; + ret = for_each_line(FELF_READ_ONLY, playlist_def.data, + playlist_def.size, add_playlist_entry, playlist); + osl_close_disk_object(&playlist_def); + if (ret < 0) + goto err; + ret = -E_PLAYLIST_EMPTY; + if (!playlist->length) + goto err; + playlist->name = para_strdup(name); + PARA_NOTICE_LOG("loaded playlist %s (%u files)\n", playlist->name, + playlist->length); + /* success */ + return current_playlist.length; +err: + PARA_NOTICE_LOG("unable to load playlist %s\n", name); + if (errmsg) + *errmsg = make_message("unable to load playlist %s: %s\n", + name, para_strerror(-ret)); + return ret; } static int search_path(char *path, void *data) -- 2.39.2