diff options
Diffstat (limited to 'src/SongPrint.cxx')
-rw-r--r-- | src/SongPrint.cxx | 111 |
1 files changed, 84 insertions, 27 deletions
diff --git a/src/SongPrint.cxx b/src/SongPrint.cxx index ea164d02b..0c1b93265 100644 --- a/src/SongPrint.cxx +++ b/src/SongPrint.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2013 The Music Player Daemon Project + * Copyright (C) 2003-2014 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -19,50 +19,107 @@ #include "config.h" #include "SongPrint.hxx" -#include "Song.hxx" -#include "Directory.hxx" +#include "db/LightSong.hxx" +#include "storage/StorageInterface.hxx" +#include "DetachedSong.hxx" #include "TimePrint.hxx" #include "TagPrint.hxx" -#include "Mapper.hxx" -#include "Client.hxx" +#include "client/Client.hxx" #include "util/UriUtil.hxx" -void -song_print_uri(Client &client, const Song &song) +#define SONG_FILE "file: " + +static void +song_print_uri(Client &client, const char *uri, bool base) { - if (song.IsInDatabase() && !song.parent->IsRoot()) { - client_printf(client, "%s%s/%s\n", SONG_FILE, - song.parent->GetPath(), song.uri); + std::string allocated; + + if (base) { + uri = PathTraitsUTF8::GetBase(uri); } else { - const char *uri = song.uri; - const std::string allocated = uri_remove_auth(uri); +#ifdef ENABLE_DATABASE + const Storage *storage = client.GetStorage(); + if (storage != nullptr) { + const char *suffix = storage->MapToRelativeUTF8(uri); + if (suffix != nullptr) + uri = suffix; + } +#endif + + allocated = uri_remove_auth(uri); if (!allocated.empty()) uri = allocated.c_str(); - - client_printf(client, "%s%s\n", SONG_FILE, - map_to_relative_path(uri)); } + + client_printf(client, "%s%s\n", SONG_FILE, uri); +} + +void +song_print_uri(Client &client, const LightSong &song, bool base) +{ + if (!base && song.directory != nullptr) { + client_printf(client, "%s%s/%s\n", SONG_FILE, + song.directory, song.uri); + } else + song_print_uri(client, song.uri, base); +} + +void +song_print_uri(Client &client, const DetachedSong &song, bool base) +{ + song_print_uri(client, song.GetURI(), base); } void -song_print_info(Client &client, const Song &song) +song_print_info(Client &client, const LightSong &song, bool base) { - song_print_uri(client, song); + song_print_uri(client, song, base); - if (song.end_ms > 0) + const unsigned start_ms = song.start_time.ToMS(); + const unsigned end_ms = song.end_time.ToMS(); + + if (end_ms > 0) client_printf(client, "Range: %u.%03u-%u.%03u\n", - song.start_ms / 1000, - song.start_ms % 1000, - song.end_ms / 1000, - song.end_ms % 1000); - else if (song.start_ms > 0) + start_ms / 1000, + start_ms % 1000, + end_ms / 1000, + end_ms % 1000); + else if (start_ms > 0) client_printf(client, "Range: %u.%03u-\n", - song.start_ms / 1000, - song.start_ms % 1000); + start_ms / 1000, + start_ms % 1000); if (song.mtime > 0) time_print(client, "Last-Modified", song.mtime); - if (song.tag != nullptr) - tag_print(client, *song.tag); + tag_print(client, *song.tag); +} + +void +song_print_info(Client &client, const DetachedSong &song, bool base) +{ + song_print_uri(client, song, base); + + const unsigned start_ms = song.GetStartTime().ToMS(); + const unsigned end_ms = song.GetEndTime().ToMS(); + + if (end_ms > 0) + client_printf(client, "Range: %u.%03u-%u.%03u\n", + start_ms / 1000, + start_ms % 1000, + end_ms / 1000, + end_ms % 1000); + else if (start_ms > 0) + client_printf(client, "Range: %u.%03u-\n", + start_ms / 1000, + start_ms % 1000); + + if (song.GetLastModified() > 0) + time_print(client, "Last-Modified", song.GetLastModified()); + + tag_print_values(client, song.GetTag()); + + const auto duration = song.GetDuration(); + if (!duration.IsNegative()) + client_printf(client, "Time: %u\n", duration.RoundS()); } |