aboutsummaryrefslogtreecommitdiffstats
path: root/src/SongPrint.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/SongPrint.cxx')
-rw-r--r--src/SongPrint.cxx111
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());
}