diff options
Diffstat (limited to '')
-rw-r--r-- | src/SongUpdate.cxx | 40 | ||||
-rw-r--r-- | src/db/Song.hxx | 6 | ||||
-rw-r--r-- | src/db/update/Archive.cxx | 2 | ||||
-rw-r--r-- | src/db/update/UpdateSong.cxx | 4 |
4 files changed, 33 insertions, 19 deletions
diff --git a/src/SongUpdate.cxx b/src/SongUpdate.cxx index 04bab5d1e..8990d83c0 100644 --- a/src/SongUpdate.cxx +++ b/src/SongUpdate.cxx @@ -21,7 +21,10 @@ #include "DetachedSong.hxx" #include "db/Song.hxx" #include "db/Directory.hxx" +#include "storage/StorageInterface.hxx" +#include "storage/FileInfo.hxx" #include "util/UriUtil.hxx" +#include "util/Error.hxx" #include "Mapper.hxx" #include "fs/AllocatedPath.hxx" #include "fs/Traits.hxx" @@ -42,7 +45,7 @@ #ifdef ENABLE_DATABASE Song * -Song::LoadFile(const char *path_utf8, Directory &parent) +Song::LoadFile(Storage &storage, const char *path_utf8, Directory &parent) { assert(!uri_has_scheme(path_utf8)); assert(strchr(path_utf8, '\n') == nullptr); @@ -52,7 +55,7 @@ Song::LoadFile(const char *path_utf8, Directory &parent) //in archive ? bool success = parent.device == DEVICE_INARCHIVE ? song->UpdateFileInArchive() - : song->UpdateFile(); + : song->UpdateFile(storage); if (!success) { song->Free(); return nullptr; @@ -77,27 +80,36 @@ tag_scan_fallback(Path path, #ifdef ENABLE_DATABASE bool -Song::UpdateFile() +Song::UpdateFile(Storage &storage) { - const auto path_fs = map_song_fs(*this); - if (path_fs.IsNull()) + const auto &relative_uri = GetURI(); + + FileInfo info; + if (!storage.GetInfo(relative_uri.c_str(), true, info, IgnoreError())) return false; - struct stat st; - if (!StatFile(path_fs, st) || !S_ISREG(st.st_mode)) + if (!info.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); + const auto path_fs = storage.MapFS(relative_uri.c_str()); + if (path_fs.IsNull()) { + const auto absolute_uri = + storage.MapUTF8(relative_uri.c_str()); + if (!tag_stream_scan(absolute_uri.c_str(), + full_tag_handler, &tag_builder)) + return false; + } else { + if (!tag_file_scan(path_fs, full_tag_handler, &tag_builder)) + return false; - mtime = st.st_mtime; + if (tag_builder.IsEmpty()) + tag_scan_fallback(path_fs, &full_tag_handler, + &tag_builder); + } + mtime = info.mtime; tag_builder.Commit(tag); return true; } diff --git a/src/db/Song.hxx b/src/db/Song.hxx index 0b94fe6d0..616a566eb 100644 --- a/src/db/Song.hxx +++ b/src/db/Song.hxx @@ -32,6 +32,7 @@ struct LightSong; struct Directory; class DetachedSong; +class Storage; /** * A song file inside the configured music directory. @@ -91,11 +92,12 @@ struct Song { * data, nullptr is returned. */ gcc_malloc - static Song *LoadFile(const char *path_utf8, Directory &parent); + static Song *LoadFile(Storage &storage, const char *name_utf8, + Directory &parent); void Free(); - bool UpdateFile(); + bool UpdateFile(Storage &storage); bool UpdateFileInArchive(); /** diff --git a/src/db/update/Archive.cxx b/src/db/update/Archive.cxx index ab03ea3fa..940448921 100644 --- a/src/db/update/Archive.cxx +++ b/src/db/update/Archive.cxx @@ -65,7 +65,7 @@ UpdateWalk::UpdateArchiveTree(Directory &directory, const char *name) Song *song = directory.FindSong(name); db_unlock(); if (song == nullptr) { - song = Song::LoadFile(name, directory); + song = Song::LoadFile(storage, name, directory); if (song != nullptr) { db_lock(); directory.AddSong(song); diff --git a/src/db/update/UpdateSong.cxx b/src/db/update/UpdateSong.cxx index 2868249e7..804aea952 100644 --- a/src/db/update/UpdateSong.cxx +++ b/src/db/update/UpdateSong.cxx @@ -61,7 +61,7 @@ UpdateWalk::UpdateSongFile2(Directory &directory, if (song == nullptr) { FormatDebug(update_domain, "reading %s/%s", directory.GetPath(), name); - song = Song::LoadFile(name, directory); + song = Song::LoadFile(storage, name, directory); if (song == nullptr) { FormatDebug(update_domain, "ignoring unrecognized file %s/%s", @@ -79,7 +79,7 @@ UpdateWalk::UpdateSongFile2(Directory &directory, } else if (info.mtime != song->mtime || walk_discard) { FormatDefault(update_domain, "updating %s/%s", directory.GetPath(), name); - if (!song->UpdateFile()) { + if (!song->UpdateFile(storage)) { FormatDebug(update_domain, "deleting unrecognized file %s/%s", directory.GetPath(), name); |