diff options
-rw-r--r-- | src/DetachedSong.hxx | 6 | ||||
-rw-r--r-- | src/SongLoader.cxx | 14 | ||||
-rw-r--r-- | src/SongUpdate.cxx | 36 | ||||
-rw-r--r-- | src/command/OtherCommands.cxx | 2 | ||||
-rw-r--r-- | test/test_translate_song.cxx | 4 |
5 files changed, 36 insertions, 26 deletions
diff --git a/src/DetachedSong.hxx b/src/DetachedSong.hxx index c3d9f6289..844283dcf 100644 --- a/src/DetachedSong.hxx +++ b/src/DetachedSong.hxx @@ -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 diff --git a/src/SongLoader.cxx b/src/SongLoader.cxx index e66e60e70..5ea8df80c 100644 --- a/src/SongLoader.cxx +++ b/src/SongLoader.cxx @@ -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; diff --git a/src/SongUpdate.cxx b/src/SongUpdate.cxx index a8b19a8d1..c2d1f5fed 100644 --- a/src/SongUpdate.cxx +++ b/src/SongUpdate.cxx @@ -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, diff --git a/src/command/OtherCommands.cxx b/src/command/OtherCommands.cxx index d9c198973..596c9c7f6 100644 --- a/src/command/OtherCommands.cxx +++ b/src/command/OtherCommands.cxx @@ -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; } diff --git a/test/test_translate_song.cxx b/test/test_translate_song.cxx index 9e627d170..b6be581e4 100644 --- a/test/test_translate_song.cxx +++ b/test/test_translate_song.cxx @@ -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; } |