Refactor MediaFileInfo::createAppropriateTags()
This commit is contained in:
parent
09df5f0a44
commit
4f53029a6e
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue