Commit 35567e65 authored by Max Kellermann's avatar Max Kellermann

SongUpdate: add UpdateFileInArchive(ArchiveFile&)

parent ae37e254
......@@ -106,6 +106,47 @@ Song::UpdateFile(Storage &storage)
#ifdef ENABLE_ARCHIVE
Song *
Song::LoadFromArchive(ArchiveFile &archive, const char *name_utf8,
Directory &parent)
{
assert(!uri_has_scheme(name_utf8));
assert(strchr(name_utf8, '\n') == nullptr);
Song *song = NewFile(name_utf8, parent);
if (!song->UpdateFileInArchive(archive)) {
song->Free();
return nullptr;
}
return song;
}
bool
Song::UpdateFileInArchive(ArchiveFile &archive)
{
assert(parent != nullptr);
assert(parent->device == DEVICE_INARCHIVE);
std::string path_utf8(uri);
for (const Directory *directory = parent;
directory->parent != nullptr &&
directory->parent->device == DEVICE_INARCHIVE;
directory = directory->parent) {
path_utf8.insert(path_utf8.begin(), '/');
path_utf8.insert(0, directory->GetName());
}
TagBuilder tag_builder;
if (!tag_archive_scan(archive, path_utf8.c_str(), tag_builder))
return false;
tag_builder.Commit(tag);
return true;
}
bool
Song::UpdateFileInArchive(const Storage &storage)
{
......
......@@ -36,6 +36,7 @@ struct LightSong;
struct Directory;
class DetachedSong;
class Storage;
class ArchiveFile;
/**
* A song file inside the configured music directory. Internal
......@@ -112,6 +113,11 @@ struct Song {
bool UpdateFile(Storage &storage);
#ifdef ENABLE_ARCHIVE
static Song *LoadFromArchive(ArchiveFile &archive,
const char *name_utf8,
Directory &parent);
bool UpdateFileInArchive(ArchiveFile &archive);
bool UpdateFileInArchive(const Storage &storage);
#endif
......
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