From b233c145fa28f2a9e90a40993bc35f408d256e08 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 25 Jul 2010 13:18:57 +0200 Subject: [PATCH] {queue,song}_print: print relative paths if possible If a song with an absolute path points inside the music directory, print only the relative part. This happens when partial songs from a playlist file were loaded. --- src/mapper.c | 10 ++++++++++ src/mapper.h | 8 ++++++++ src/queue_print.c | 1 + src/song_print.c | 4 +++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/mapper.c b/src/mapper.c index 03822ca9e..108de9531 100644 --- a/src/mapper.c +++ b/src/mapper.c @@ -93,6 +93,16 @@ mapper_has_music_directory(void) return music_dir != NULL; } +const char * +map_to_relative_path(const char *path_utf8) +{ + return music_dir != NULL && + memcmp(path_utf8, music_dir, music_dir_length) == 0 && + G_IS_DIR_SEPARATOR(path_utf8[music_dir_length]) + ? path_utf8 + music_dir_length + 1 + : path_utf8; +} + char * map_uri_fs(const char *uri) { diff --git a/src/mapper.h b/src/mapper.h index 3575a0e9d..9f84f96fe 100644 --- a/src/mapper.h +++ b/src/mapper.h @@ -41,6 +41,14 @@ void mapper_finish(void); bool mapper_has_music_directory(void); +/** + * If the specified absolute path points inside the music directory, + * this function converts it to a relative path. If not, it returns + * the unmodified string pointer. + */ +const char * +map_to_relative_path(const char *path_utf8); + /** * Determines the absolute file system path of a relative URI. This * is basically done by converting the URI to the file system charset diff --git a/src/queue_print.c b/src/queue_print.c index 3b49dee61..53ddfb689 100644 --- a/src/queue_print.c +++ b/src/queue_print.c @@ -24,6 +24,7 @@ #include "song_print.h" #include "locate.h" #include "client.h" +#include "mapper.h" /** * Send detailed information about a range of songs in the queue to a diff --git a/src/song_print.c b/src/song_print.c index 11b241fbc..16239e03b 100644 --- a/src/song_print.c +++ b/src/song_print.c @@ -25,6 +25,7 @@ #include "tag_print.h" #include "client.h" #include "uri.h" +#include "mapper.h" void song_print_uri(struct client *client, struct song *song) @@ -40,7 +41,8 @@ song_print_uri(struct client *client, struct song *song) if (uri == NULL) uri = song->uri; - client_printf(client, "%s%s\n", SONG_FILE, uri); + client_printf(client, "%s%s\n", SONG_FILE, + map_to_relative_path(uri)); g_free(allocated); }