directory_print: print a list of playlist files in "lsinfo"
Print those files which can be handled by a playlist plugin.
This commit is contained in:
parent
6f28eb4c0a
commit
37e69a89b9
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user