aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/directory_print.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/directory_print.c b/src/directory_print.c
index 5bc32e6f8..ef4738e45 100644
--- a/src/directory_print.c
+++ b/src/directory_print.c
@@ -22,6 +22,15 @@
#include "directory.h"
#include "client.h"
#include "song_print.h"
+#include "mapper.h"
+#include "playlist_list.h"
+#include "decoder_list.h"
+#include "path.h"
+#include "uri.h"
+#include "input_stream.h"
+
+#include <sys/types.h>
+#include <dirent.h>
static void
dirvec_print(struct client *client, const struct dirvec *dv)
@@ -33,9 +42,61 @@ dirvec_print(struct client *client, const struct dirvec *dv)
directory_get_path(dv->base[i]));
}
+static void
+print_playlist_in_directory(struct client *client,
+ const struct directory *directory,
+ const char *name_utf8)
+{
+ if (directory_is_root(directory))
+ client_printf(client, "playlist: %s\n", name_utf8);
+ else
+ client_printf(client, "playlist: %s/%s\n",
+ directory_get_path(directory), name_utf8);
+}
+
+/**
+ * Print a list of playlists in the specified directory.
+ */
+static void
+directory_print_playlists(struct client *client,
+ const struct directory *directory)
+{
+ char *path_fs = map_directory_fs(directory);
+ if (path_fs == NULL)
+ return;
+
+ DIR *dir = opendir(path_fs);
+ g_free(path_fs);
+ if (dir == NULL)
+ return;
+
+ struct dirent *ent;
+ while ((ent = readdir(dir))) {
+ char *name_utf8 = fs_charset_to_utf8(ent->d_name);
+ if (name_utf8 == NULL)
+ continue;
+
+ const char *suffix = uri_get_suffix(name_utf8);
+ if (suffix != NULL &&
+ /* ignore files which are handled by a decoder for
+ now, too expensive to probe them all, and most
+ of them probably don't contain a playlist
+ (e.g. FLAC files without embedded cue sheet) */
+ decoder_plugin_from_suffix(suffix, NULL) == NULL &&
+ playlist_suffix_supported(suffix))
+ print_playlist_in_directory(client, directory,
+ name_utf8);
+
+ g_free(name_utf8);
+ }
+
+ closedir(dir);
+}
+
void
directory_print(struct client *client, const struct directory *directory)
{
dirvec_print(client, &directory->children);
songvec_print(client, &directory->songs);
+ directory_print_playlists(client, directory);
}