diff options
Diffstat (limited to 'src/SongUpdate.cxx')
-rw-r--r-- | src/SongUpdate.cxx | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/SongUpdate.cxx b/src/SongUpdate.cxx index 70a05bf2a..669d0568d 100644 --- a/src/SongUpdate.cxx +++ b/src/SongUpdate.cxx @@ -19,6 +19,7 @@ #include "config.h" /* must be first for large file support */ #include "Song.hxx" +#include "DetachedSong.hxx" #include "util/UriUtil.hxx" #include "Directory.hxx" #include "Mapper.hxx" @@ -126,3 +127,39 @@ Song::UpdateFileInArchive() tag = tag_builder.CommitNew(); return true; } + +bool +DetachedSong::Update() +{ + if (IsAbsoluteFile()) { + const AllocatedPath path_fs = + AllocatedPath::FromUTF8(uri.c_str()); + + struct stat st; + if (!StatFile(path_fs, st) || !S_ISREG(st.st_mode)) + 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 = st.st_mtime; + tag_builder.Commit(tag); + return true; + } else if (IsRemote()) { + TagBuilder tag_builder; + if (!tag_stream_scan(uri.c_str(), full_tag_handler, + &tag_builder)) + return false; + + mtime = 0; + tag_builder.Commit(tag); + return true; + } else + // TODO: implement + return false; +} |