Refactor MediaFileInfo::createAppropriateTags()

This commit is contained in:
Martchus 2018-03-11 18:58:20 +01:00
parent 09df5f0a44
commit 4f53029a6e
5 changed files with 61 additions and 54 deletions

View File

@ -6,9 +6,10 @@
#include <c++utilities/conversion/types.h>
#include <tagparser/abstractcontainer.h>
#include <tagparser/tagvalue.h>
#include <tagparser/settings.h>
#include <tagparser/tag.h>
#include <tagparser/mediafileinfo.h>
#include <qtutilities/settingsdialog/qtsettings.h>
@ -77,15 +78,6 @@ struct FileBrowser
bool readOnly = true;
};
struct Id3Processing
{
TagParser::TagUsage v1Usage = TagParser::TagUsage::Always;
TagParser::TagUsage v2Usage = TagParser::TagUsage::Always;
byte v2Version = 3;
bool keepVersionOfExistingId3v2Tag = true;
bool mergeMultipleSuccessiveId3v2Tags = true;
};
struct FileLayout
{
bool forceRewrite = true;
@ -103,7 +95,7 @@ struct TagProcessing
TagParser::TagTextEncoding preferredEncoding = TagParser::TagTextEncoding::Utf8;
UnsupportedFieldHandling unsupportedFieldHandling = UnsupportedFieldHandling::Ignore;
bool autoTagManagement = true;
Id3Processing id3;
TagParser::TagCreationSettings creationSettings;
FileLayout fileLayout;
};

View File

@ -389,12 +389,15 @@ void setTagInfo(const SetTagInfoArgs &args)
cerr << Phrases::Warning << "No fields/attachments have been specified." << Phrases::End;
}
TagCreationSettings settings;
settings.flags = TagCreationFlags::None;
// determine required targets
vector<TagTarget> requiredTargets;
for (const auto &fieldDenotation : fields) {
const FieldScope &scope = fieldDenotation.first;
if (!scope.isTrack() && find(requiredTargets.cbegin(), requiredTargets.cend(), scope.tagTarget) == requiredTargets.cend()) {
requiredTargets.push_back(scope.tagTarget);
if (!scope.isTrack()
&& find(settings.requiredTargets.cbegin(), settings.requiredTargets.cend(), scope.tagTarget) == settings.requiredTargets.cend()) {
settings.requiredTargets.push_back(scope.tagTarget);
}
}
@ -418,24 +421,40 @@ void setTagInfo(const SetTagInfoArgs &args)
}
// parse ID3v2 version
uint32 id3v2Version = 3;
if (args.id3v2VersionArg.isPresent()) {
try {
id3v2Version = stringToNumber<uint32>(args.id3v2VersionArg.values().front());
if (id3v2Version < 1 || id3v2Version > 4) {
settings.id3v2MajorVersion = stringToNumber<byte>(args.id3v2VersionArg.values().front());
if (settings.id3v2MajorVersion < 1 || settings.id3v2MajorVersion > 4) {
throw ConversionException();
}
} catch (const ConversionException &) {
id3v2Version = 3;
settings.id3v2MajorVersion = 3;
cerr << Phrases::Warning << "The specified ID3v2 version \"" << args.id3v2VersionArg.values().front()
<< "\" is invalid and will be ingored." << Phrases::End;
}
}
// parse flags
if (args.treatUnknownFilesAsMp3FilesArg.isPresent()) {
settings.flags |= TagCreationFlags::TreatUnknownFilesAsMp3Files;
}
if (args.id3InitOnCreateArg.isPresent()) {
settings.flags |= TagCreationFlags::Id3InitOnCreate;
}
if (args.id3TransferOnRemovalArg.isPresent()) {
settings.flags |= TagCreationFlags::Id3TransferValuesOnRemoval;
}
if (args.mergeMultipleSuccessiveTagsArg.isPresent()) {
settings.flags |= TagCreationFlags::MergeMultipleSuccessiveId3v2Tags;
}
if (!args.id3v2VersionArg.isPresent()) {
settings.flags |= TagCreationFlags::KeepExistingId3v2Version;
}
// parse other settings
const TagTextEncoding denotedEncoding = parseEncodingDenotation(args.encodingArg, TagTextEncoding::Utf8);
const TagUsage id3v1Usage = parseUsageDenotation(args.id3v1UsageArg, TagUsage::KeepExisting);
const TagUsage id3v2Usage = parseUsageDenotation(args.id3v2UsageArg, TagUsage::Always);
settings.id3v1usage = parseUsageDenotation(args.id3v1UsageArg, TagUsage::KeepExisting);
settings.id3v2usage = parseUsageDenotation(args.id3v2UsageArg, TagUsage::Always);
// setup media file info
MediaFileInfo fileInfo;
@ -479,9 +498,7 @@ void setTagInfo(const SetTagInfoArgs &args)
}
// create new tags according to settings
fileInfo.createAppropriateTags(args.treatUnknownFilesAsMp3FilesArg.isPresent(), id3v1Usage, id3v2Usage,
args.id3InitOnCreateArg.isPresent(), args.id3TransferOnRemovalArg.isPresent(), args.mergeMultipleSuccessiveTagsArg.isPresent(),
!args.id3v2VersionArg.isPresent(), id3v2Version, requiredTargets);
fileInfo.createAppropriateTags(settings);
auto container = fileInfo.container();
if (args.docTitleArg.isPresent() && !args.docTitleArg.values().empty()) {
if (container && container->supportsTitle()) {

View File

@ -396,13 +396,13 @@ Id3v1OptionPage::~Id3v1OptionPage()
bool Id3v1OptionPage::apply()
{
if (hasBeenShown()) {
auto &settings = values().tagPocessing.id3;
auto &settings = values().tagPocessing.creationSettings;
if (ui()->alwaysCreateRadioButton->isChecked()) {
settings.v1Usage = TagUsage::Always;
settings.id3v1usage = TagUsage::Always;
} else if (ui()->keepExistingRadioButton->isChecked()) {
settings.v1Usage = TagUsage::KeepExisting;
settings.id3v1usage = TagUsage::KeepExisting;
} else if (ui()->removeExistingRadioButton->isChecked()) {
settings.v1Usage = TagUsage::Never;
settings.id3v1usage = TagUsage::Never;
}
}
return true;
@ -411,8 +411,8 @@ bool Id3v1OptionPage::apply()
void Id3v1OptionPage::reset()
{
if (hasBeenShown()) {
const auto &settings = values().tagPocessing.id3;
switch (settings.v1Usage) {
const auto &settings = values().tagPocessing.creationSettings;
switch (settings.id3v1usage) {
case TagUsage::Always:
ui()->alwaysCreateRadioButton->setChecked(true);
break;
@ -439,23 +439,23 @@ Id3v2OptionPage::~Id3v2OptionPage()
bool Id3v2OptionPage::apply()
{
if (hasBeenShown()) {
auto &settings = values().tagPocessing.id3;
auto &settings = values().tagPocessing.creationSettings;
if (ui()->alwaysCreateRadioButton->isChecked()) {
settings.v2Usage = TagUsage::Always;
settings.id3v2usage = TagUsage::Always;
} else if (ui()->keepExistingRadioButton->isChecked()) {
settings.v2Usage = TagUsage::KeepExisting;
settings.id3v2usage = TagUsage::KeepExisting;
} else if (ui()->removeExistingRadioButton->isChecked()) {
settings.v2Usage = TagUsage::Never;
settings.id3v2usage = TagUsage::Never;
}
if (ui()->version230radioButton->isChecked()) {
settings.v2Version = 3;
settings.id3v2MajorVersion = 3;
} else if (ui()->version240radioButton->isChecked()) {
settings.v2Version = 4;
settings.id3v2MajorVersion = 4;
} else if (ui()->version220radioButton->isChecked()) {
settings.v2Version = 2;
settings.id3v2MajorVersion = 2;
}
settings.keepVersionOfExistingId3v2Tag = ui()->keepExistingVersionCheckBox->isChecked();
settings.mergeMultipleSuccessiveId3v2Tags = ui()->mergeRadioButton->isChecked();
settings.setFlag(TagCreationFlags::KeepExistingId3v2Version, ui()->keepExistingVersionCheckBox->isChecked());
settings.setFlag(TagCreationFlags::MergeMultipleSuccessiveId3v2Tags, ui()->mergeRadioButton->isChecked());
}
return true;
}
@ -463,8 +463,8 @@ bool Id3v2OptionPage::apply()
void Id3v2OptionPage::reset()
{
if (hasBeenShown()) {
const auto &settings = values().tagPocessing.id3;
switch (settings.v2Usage) {
const auto &settings = values().tagPocessing.creationSettings;
switch (settings.id3v2usage) {
case TagUsage::Always:
ui()->alwaysCreateRadioButton->setChecked(true);
break;
@ -475,7 +475,7 @@ void Id3v2OptionPage::reset()
ui()->removeExistingRadioButton->setChecked(true);
break;
}
switch (settings.v2Version) {
switch (settings.id3v2MajorVersion) {
case 3:
ui()->version230radioButton->setChecked(true);
break;
@ -486,8 +486,8 @@ void Id3v2OptionPage::reset()
ui()->version220radioButton->setChecked(true);
break;
}
ui()->keepExistingVersionCheckBox->setChecked(settings.keepVersionOfExistingId3v2Tag);
if (settings.mergeMultipleSuccessiveId3v2Tags) {
ui()->keepExistingVersionCheckBox->setChecked(settings.flags & TagCreationFlags::KeepExistingId3v2Version);
if (settings.flags & TagCreationFlags::MergeMultipleSuccessiveId3v2Tags) {
ui()->mergeRadioButton->setChecked(true);
} else {
ui()->keepSeparateRadioButton->setChecked(true);

View File

@ -870,7 +870,7 @@ void TagEditorWidget::showFile(char result)
}
// create appropriate tags according to file type and user preferences when automatic tag management is enabled
const auto &settings = Settings::values().tagPocessing;
auto &settings = Settings::values().tagPocessing;
if (settings.autoTagManagement) {
vector<TagTarget> requiredTargets;
requiredTargets.reserve(2);
@ -882,13 +882,11 @@ void TagEditorWidget::showFile(char result)
}
// TODO: allow initialization of new ID3 tag with values from already present ID3 tag
// TODO: allow not to transfer values from removed ID3 tag to remaining ID3 tags
if (!m_fileInfo.createAppropriateTags(false, settings.id3.v1Usage, settings.id3.v2Usage, false, true,
settings.id3.mergeMultipleSuccessiveId3v2Tags, settings.id3.keepVersionOfExistingId3v2Tag, settings.id3.v2Version,
requiredTargets)) {
settings.creationSettings.flags -= TagCreationFlags::KeepExistingId3v2Version;
if (!m_fileInfo.createAppropriateTags(settings.creationSettings)) {
if (confirmCreationOfId3TagForUnsupportedFile()) {
m_fileInfo.createAppropriateTags(true, settings.id3.v1Usage, settings.id3.v2Usage, false, true,
settings.id3.mergeMultipleSuccessiveId3v2Tags, settings.id3.keepVersionOfExistingId3v2Tag, settings.id3.v2Version,
requiredTargets);
settings.creationSettings.flags += TagCreationFlags::KeepExistingId3v2Version;
m_fileInfo.createAppropriateTags(settings.creationSettings);
}
}
// tags might have been adjusted -> reload tags

View File

@ -177,7 +177,7 @@ bool TagFieldEdit::setValue(const TagValue &value, PreviousValueHandling previou
*/
bool TagFieldEdit::hasDescription() const
{
for (Tag *tag : tags()) {
for (const Tag *tag : tags()) {
if (tag->supportsDescription(m_field)) {
return true;
}
@ -190,15 +190,15 @@ bool TagFieldEdit::hasDescription() const
*/
bool TagFieldEdit::canApply(KnownField field) const
{
for (Tag *tag : tags()) {
for (const Tag *tag : tags()) {
switch (tag->type()) {
case TagType::Id3v1Tag:
if (Settings::values().tagPocessing.id3.v1Usage == TagUsage::Never) {
if (Settings::values().tagPocessing.creationSettings.id3v1usage == TagUsage::Never) {
continue;
}
break;
case TagType::Id3v2Tag:
if (Settings::values().tagPocessing.id3.v2Usage == TagUsage::Never) {
if (Settings::values().tagPocessing.creationSettings.id3v2usage == TagUsage::Never) {
continue;
}
break;