Commit fc2154ee authored by Max Kellermann's avatar Max Kellermann

DetachedSong: move code from Update() to LoadFile()

Avoid duplicate AllocatedPath::FromUTF8() invocations in two callers.
parent 76f85e6f
......@@ -32,6 +32,7 @@
struct LightSong;
class Storage;
class Path;
class DetachedSong {
friend DetachedSong DatabaseDetachSong(const Storage &db,
......@@ -220,6 +221,11 @@ public:
* @return true on success
*/
bool Update();
/**
* Load #tag and #mtime from a local file.
*/
bool LoadFile(Path path);
};
#endif
......@@ -54,17 +54,15 @@ SongLoader::LoadFile(const char *path_utf8, Error &error) const
}
#endif
if (client != nullptr) {
const auto path_fs = AllocatedPath::FromUTF8(path_utf8, error);
if (path_fs.IsNull())
return nullptr;
const auto path_fs = AllocatedPath::FromUTF8(path_utf8, error);
if (path_fs.IsNull())
return nullptr;
if (!client->AllowFile(path_fs, error))
return nullptr;
}
if (client != nullptr && !client->AllowFile(path_fs, error))
return nullptr;
DetachedSong *song = new DetachedSong(path_utf8);
if (!song->Update()) {
if (!song->LoadFile(path_fs)) {
error.Set(playlist_domain, int(PlaylistResult::NO_SUCH_SONG),
"No such file");
delete song;
......
......@@ -154,27 +154,33 @@ Song::UpdateFileInArchive(const Storage &storage)
#endif
bool
DetachedSong::LoadFile(Path path)
{
FileInfo fi;
if (!GetFileInfo(path, fi) || !fi.IsRegular())
return false;
TagBuilder tag_builder;
if (!tag_file_scan(path, full_tag_handler, &tag_builder))
return false;
if (tag_builder.IsEmpty())
tag_scan_fallback(path, &full_tag_handler,
&tag_builder);
mtime = fi.GetModificationTime();
tag_builder.Commit(tag);
return true;
}
bool
DetachedSong::Update()
{
if (IsAbsoluteFile()) {
const AllocatedPath path_fs =
AllocatedPath::FromUTF8(GetRealURI());
FileInfo fi;
if (!GetFileInfo(path_fs, fi) || !fi.IsRegular())
return false;
TagBuilder tag_builder;
if (!tag_file_scan(path_fs, full_tag_handler, &tag_builder))
return false;
if (tag_builder.IsEmpty())
tag_scan_fallback(path_fs, &full_tag_handler,
&tag_builder);
mtime = fi.GetModificationTime();
tag_builder.Commit(tag);
return true;
return LoadFile(path_fs);
} else if (IsRemote()) {
TagBuilder tag_builder;
if (!tag_stream_scan(uri.c_str(), full_tag_handler,
......
......@@ -176,7 +176,7 @@ handle_lsinfo(Client &client, Request args, Response &r)
return print_error(r, error);
DetachedSong song(path_utf8);
if (!song.Update()) {
if (!song.LoadFile(path_fs)) {
r.Error(ACK_ERROR_NO_EXIST, "No such file");
return CommandResult::ERROR;
}
......
......@@ -121,9 +121,9 @@ DatabaseDetachSong(gcc_unused const Database &db,
}
bool
DetachedSong::Update()
DetachedSong::LoadFile(Path path)
{
if (strcmp(GetURI(), uri1) == 0) {
if (path.ToUTF8() == uri1) {
SetTag(MakeTag1a());
return true;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment