return score_update(aft_row, 0);
}
-static int add_playlist_entry(char *line, void *data)
+static int add_playlist_entry(char *path, void *data)
{
struct playlist_info *playlist = data;
struct osl_row *aft_row;
- int ret = aft_get_row_of_path(line, &aft_row);
+ int ret = aft_get_row_of_path(path, &aft_row);
if (ret < 0) {
- PARA_NOTICE_LOG("path not found in audio file table: %s\n",
- line);
+ PARA_NOTICE_LOG("%s: %s\n", path, PARA_STRERROR(-ret));
return 1;
}
ret = score_add(aft_row, -playlist->length);
if (ret < 0) {
- PARA_ERROR_LOG("failed to add %s: %d\n", line, ret);
+ PARA_ERROR_LOG("failed to add %s: %d\n", path, ret);
return ret;
}
playlist->length++;
return 1;
}
-static int load_playlist(struct osl_row *row, struct playlist_info *playlist)
+static int get_playlist_data(struct osl_row *row, char **playlist_name,
+ struct osl_object *playlist_def)
{
struct osl_object obj;
- int ret;
-
- ret = osl_get_object(playlists_table, row, BLOBCOL_NAME, &obj);
+ int ret = osl_get_object(playlists_table, row, BLOBCOL_NAME, &obj);
if (ret < 0)
return ret;
- playlist->name = para_strdup(obj.data);
- playlist->length = 0;
- ret = osl_open_disk_object(playlists_table, row, BLOBCOL_DEF, &obj);
+ *playlist_name = obj.data;
+ return osl_open_disk_object(playlists_table, row, BLOBCOL_DEF,
+ playlist_def);
+}
+
+/* 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 = get_playlist_data(row, &playlist_name, &playlist_def);
if (ret < 0)
goto err;
- ret = for_each_line_ro(obj.data, obj.size, add_playlist_entry,
- playlist);
- osl_close_disk_object(&obj);
+ playlist->length = 0;
+ ret = for_each_line_ro(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 1;
-err:
- free(playlist->name);
- return ret;
-}
-
-/* returns -E_PLAYLIST_LOADED on _success_ to terminate the loop */
-static int playlist_loop(struct osl_row *row, void *data)
-{
- struct playlist_info *playlist = data;
- int ret = load_playlist(row, playlist);
- if (ret < 0) {
- if (ret != -E_DUMMY_ROW)
- PARA_NOTICE_LOG("unable to load playlist, trying next\n");
- return 1;
- }
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 load_first_available_playlist(struct playlist_info *playlist)
{
int ret = osl_rbtree_loop(playlists_table, BLOBCOL_NAME, playlist,
- playlist_loop);
+ load_playlist);
if (ret == -E_PLAYLIST_LOADED) /* success */
return 1;
if (ret < 0)
return -E_NO_PLAYLIST;
}
+static int check_playlist_path(char *path, void *data)
+{
+ struct para_buffer *pb = data;
+ struct osl_row *aft_row;
+ int ret = aft_get_row_of_path(path, &aft_row);
+
+ if (ret < 0)
+ para_printf(pb, "%s: %s\n", path, PARA_STRERROR(-ret));
+ return 1;
+}
+
+static int check_playlist(struct osl_row *row, void *data)
+{
+ struct para_buffer *pb = data;
+ struct osl_object playlist_def;
+ char *playlist_name;
+ int ret = get_playlist_data(row, &playlist_name, &playlist_def);
+
+ if (ret < 0) {
+ para_printf(pb, "failed to get playlist data: %s\n",
+ PARA_STRERROR(-ret));
+ return 1;
+ }
+ if (*playlist_name) { /* skip dummy row */
+ para_printf(pb, "checking playlist %s...\n", playlist_name);
+ for_each_line_ro(playlist_def.data, playlist_def.size,
+ check_playlist_path, pb);
+ }
+ osl_close_disk_object(&playlist_def);
+ return 1;
+}
+
+int playlist_check_callback(__a_unused const struct osl_object *query,
+ struct osl_object *result)
+{
+ struct para_buffer pb = {.buf = NULL};
+
+ para_printf(&pb, "checking playlists...\n");
+ osl_rbtree_loop(playlists_table, BLOBCOL_ID, &pb,
+ check_playlist);
+ result->data = pb.buf;
+ result->size = pb.size;
+ return 1;
+}
+
/**
* Close the current playlist.
*