diff options
author | Max Kellermann <max@duempel.org> | 2010-05-31 22:18:13 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2010-06-01 10:00:01 +0200 |
commit | 37e69a89b95d6269c1747ed898579dd778627355 (patch) | |
tree | e95b065d59aa50f84fe7b224702de4746538555b /src/directory_print.c | |
parent | 6f28eb4c0a0f7987b8863244f96551984db2b3de (diff) | |
download | mpd-37e69a89b95d6269c1747ed898579dd778627355.tar.gz mpd-37e69a89b95d6269c1747ed898579dd778627355.tar.xz mpd-37e69a89b95d6269c1747ed898579dd778627355.zip |
directory_print: print a list of playlist files in "lsinfo"
Print those files which can be handled by a playlist plugin.
Diffstat (limited to '')
-rw-r--r-- | src/directory_print.c | 61 |
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); } |