TagFile: add TagBuilder overload with ScanGenericTags() fallback

This commit is contained in:
Max Kellermann 2016-02-26 13:18:32 +01:00
parent b1d60b5c85
commit a9130cb99c
3 changed files with 29 additions and 9 deletions

View File

@ -96,12 +96,8 @@ Song::UpdateFile(Storage &storage)
full_tag_handler, &tag_builder)) full_tag_handler, &tag_builder))
return false; return false;
} else { } else {
if (!tag_file_scan(path_fs, full_tag_handler, &tag_builder)) if (!tag_file_scan(path_fs, tag_builder))
return false; return false;
if (tag_builder.IsEmpty())
ScanGenericTags(path_fs, full_tag_handler,
&tag_builder);
} }
mtime = info.mtime; mtime = info.mtime;
@ -149,12 +145,9 @@ DetachedSong::LoadFile(Path path)
return false; return false;
TagBuilder tag_builder; TagBuilder tag_builder;
if (!tag_file_scan(path, full_tag_handler, &tag_builder)) if (!tag_file_scan(path, tag_builder))
return false; return false;
if (tag_builder.IsEmpty())
ScanGenericTags(path, full_tag_handler, &tag_builder);
mtime = fi.GetModificationTime(); mtime = fi.GetModificationTime();
tag_builder.Commit(tag); tag_builder.Commit(tag);
return true; return true;

View File

@ -19,6 +19,9 @@
#include "config.h" #include "config.h"
#include "TagFile.hxx" #include "TagFile.hxx"
#include "tag/Generic.hxx"
#include "tag/TagHandler.hxx"
#include "tag/TagBuilder.hxx"
#include "fs/Path.hxx" #include "fs/Path.hxx"
#include "util/UriUtil.hxx" #include "util/UriUtil.hxx"
#include "util/Error.hxx" #include "util/Error.hxx"
@ -94,3 +97,15 @@ tag_file_scan(Path path_fs, const TagHandler &handler, void *handler_ctx)
return tfs.Scan(plugin); return tfs.Scan(plugin);
}); });
} }
bool
tag_file_scan(Path path, TagBuilder &builder)
{
if (!tag_file_scan(path, full_tag_handler, &builder))
return false;
if (builder.IsEmpty())
ScanGenericTags(path, full_tag_handler, &builder);
return true;
}

View File

@ -24,6 +24,7 @@
class Path; class Path;
struct TagHandler; struct TagHandler;
class TagBuilder;
/** /**
* Scan the tags of a song file. Invokes matching decoder plugins, * Scan the tags of a song file. Invokes matching decoder plugins,
@ -35,4 +36,15 @@ struct TagHandler;
bool bool
tag_file_scan(Path path, const TagHandler &handler, void *handler_ctx); tag_file_scan(Path path, const TagHandler &handler, void *handler_ctx);
/**
* Scan the tags of a song file. Invokes matching decoder plugins,
* and falls back to generic scanners (APE and ID3) if no tags were
* found (but the file was recognized).
*
* @return true if the file was recognized (even if no metadata was
* found)
*/
bool
tag_file_scan(Path path, TagBuilder &builder);
#endif #endif