Handle TRACKTOTAL/DISCTOTAL/PARTTOTAL fields in Vorbis Comments
See the corresponding tagparser commit
This commit is contained in:
parent
abc80c24ff
commit
22aa2f0851
|
@ -85,6 +85,9 @@ SetTagInfoArgs::SetTagInfoArgs(Argument &filesArg, Argument &verboseArg, Argumen
|
||||||
, preserveModificationTimeArg("preserve-modification-time", '\0', "preserves the file's modification time")
|
, preserveModificationTimeArg("preserve-modification-time", '\0', "preserves the file's modification time")
|
||||||
, preserveMuxingAppArg("preserve-muxing-app", '\0', "preserves the file's muxing app meta-data value")
|
, preserveMuxingAppArg("preserve-muxing-app", '\0', "preserves the file's muxing app meta-data value")
|
||||||
, preserveWritingAppArg("preserve-writing-app", '\0', "preserves the file's writing app meta-data value")
|
, preserveWritingAppArg("preserve-writing-app", '\0', "preserves the file's writing app meta-data value")
|
||||||
|
, preserveTotalFieldsArg("preserve-total-fields", '\0',
|
||||||
|
"preserves the TRACKTOTAL/DISCTOTAL/PARTTOTAL fields in Vorbis Comments (which are otherwise automatically included into the "
|
||||||
|
"TRACKNUMBER/DISCNUMBER/PARTNUMBER fields)")
|
||||||
, jsArg("script", 'j', "modifies tag fields via the specified JavaScript", { "path" })
|
, jsArg("script", 'j', "modifies tag fields via the specified JavaScript", { "path" })
|
||||||
, jsSettingsArg("script-settings", '\0', "passes settings to the JavaScript specified via --script", { "key=value" })
|
, jsSettingsArg("script-settings", '\0', "passes settings to the JavaScript specified via --script", { "key=value" })
|
||||||
, setTagInfoArg("set", 's', "sets the specified tag information and attachments")
|
, setTagInfoArg("set", 's', "sets the specified tag information and attachments")
|
||||||
|
@ -142,7 +145,8 @@ SetTagInfoArgs::SetTagInfoArgs(Argument &filesArg, Argument &verboseArg, Argumen
|
||||||
&id3v2UsageArg, &id3InitOnCreateArg, &id3TransferOnRemovalArg, &mergeMultipleSuccessiveTagsArg, &id3v2VersionArg, &encodingArg,
|
&id3v2UsageArg, &id3InitOnCreateArg, &id3TransferOnRemovalArg, &mergeMultipleSuccessiveTagsArg, &id3v2VersionArg, &encodingArg,
|
||||||
&removeTargetArg, &addAttachmentArg, &updateAttachmentArg, &removeAttachmentArg, &removeExistingAttachmentsArg, &minPaddingArg,
|
&removeTargetArg, &addAttachmentArg, &updateAttachmentArg, &removeAttachmentArg, &removeExistingAttachmentsArg, &minPaddingArg,
|
||||||
&maxPaddingArg, &prefPaddingArg, &tagPosArg, &indexPosArg, &forceRewriteArg, &backupDirArg, &layoutOnlyArg, &preserveModificationTimeArg,
|
&maxPaddingArg, &prefPaddingArg, &tagPosArg, &indexPosArg, &forceRewriteArg, &backupDirArg, &layoutOnlyArg, &preserveModificationTimeArg,
|
||||||
&preserveMuxingAppArg, &preserveWritingAppArg, &jsArg, &jsSettingsArg, &verboseArg, &pedanticArg, &quietArg, &outputFilesArg });
|
&preserveMuxingAppArg, &preserveWritingAppArg, &preserveTotalFieldsArg, &jsArg, &jsSettingsArg, &verboseArg, &pedanticArg, &quietArg,
|
||||||
|
&outputFilesArg });
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Cli
|
} // namespace Cli
|
||||||
|
|
|
@ -131,6 +131,7 @@ void restore()
|
||||||
= settings.value(QStringLiteral("preservemodificationtime"), v.tagPocessing.preserveModificationTime).toBool();
|
= settings.value(QStringLiteral("preservemodificationtime"), v.tagPocessing.preserveModificationTime).toBool();
|
||||||
v.tagPocessing.preserveMuxingApp = settings.value(QStringLiteral("preservemuxingapp"), v.tagPocessing.preserveMuxingApp).toBool();
|
v.tagPocessing.preserveMuxingApp = settings.value(QStringLiteral("preservemuxingapp"), v.tagPocessing.preserveMuxingApp).toBool();
|
||||||
v.tagPocessing.preserveWritingApp = settings.value(QStringLiteral("preservewritingapp"), v.tagPocessing.preserveWritingApp).toBool();
|
v.tagPocessing.preserveWritingApp = settings.value(QStringLiteral("preservewritingapp"), v.tagPocessing.preserveWritingApp).toBool();
|
||||||
|
v.tagPocessing.convertTotalFields = settings.value(QStringLiteral("converttotalfields"), v.tagPocessing.convertTotalFields).toBool();
|
||||||
settings.beginGroup(QStringLiteral("id3v1"));
|
settings.beginGroup(QStringLiteral("id3v1"));
|
||||||
switch (settings.value(QStringLiteral("usage"), 0).toInt()) {
|
switch (settings.value(QStringLiteral("usage"), 0).toInt()) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -270,6 +271,7 @@ void save()
|
||||||
settings.setValue(QStringLiteral("preservemodificationtime"), v.tagPocessing.preserveModificationTime);
|
settings.setValue(QStringLiteral("preservemodificationtime"), v.tagPocessing.preserveModificationTime);
|
||||||
settings.setValue(QStringLiteral("preservemuxingapp"), v.tagPocessing.preserveMuxingApp);
|
settings.setValue(QStringLiteral("preservemuxingapp"), v.tagPocessing.preserveMuxingApp);
|
||||||
settings.setValue(QStringLiteral("preservewritingapp"), v.tagPocessing.preserveWritingApp);
|
settings.setValue(QStringLiteral("preservewritingapp"), v.tagPocessing.preserveWritingApp);
|
||||||
|
settings.setValue(QStringLiteral("converttotalfields"), v.tagPocessing.convertTotalFields);
|
||||||
settings.beginGroup(QStringLiteral("id3v1"));
|
settings.beginGroup(QStringLiteral("id3v1"));
|
||||||
settings.setValue(QStringLiteral("usage"), static_cast<int>(v.tagPocessing.creationSettings.id3v1usage));
|
settings.setValue(QStringLiteral("usage"), static_cast<int>(v.tagPocessing.creationSettings.id3v1usage));
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
|
@ -82,6 +82,7 @@ struct TagProcessing {
|
||||||
bool preserveModificationTime = false;
|
bool preserveModificationTime = false;
|
||||||
bool preserveMuxingApp = false;
|
bool preserveMuxingApp = false;
|
||||||
bool preserveWritingApp = false;
|
bool preserveWritingApp = false;
|
||||||
|
bool convertTotalFields = true;
|
||||||
TagParser::TagCreationSettings creationSettings;
|
TagParser::TagCreationSettings creationSettings;
|
||||||
FileLayout fileLayout;
|
FileLayout fileLayout;
|
||||||
};
|
};
|
||||||
|
|
|
@ -391,7 +391,8 @@ void displayTagInfo(
|
||||||
// parse specified fields
|
// parse specified fields
|
||||||
const auto fields = parseFieldDenotations(fieldsArg, true);
|
const auto fields = parseFieldDenotations(fieldsArg, true);
|
||||||
|
|
||||||
MediaFileInfo fileInfo;
|
auto fileInfo = MediaFileInfo();
|
||||||
|
fileInfo.setFileHandlingFlags(fileInfo.fileHandlingFlags() | MediaFileHandlingFlags::ConvertTotalFields);
|
||||||
for (const char *file : filesArg.values()) {
|
for (const char *file : filesArg.values()) {
|
||||||
Diagnostics diag;
|
Diagnostics diag;
|
||||||
AbortableProgressFeedback progress; // FIXME: actually use the progress object
|
AbortableProgressFeedback progress; // FIXME: actually use the progress object
|
||||||
|
@ -709,6 +710,9 @@ void setTagInfo(const SetTagInfoArgs &args)
|
||||||
if (args.preserveWritingAppArg.isPresent()) {
|
if (args.preserveWritingAppArg.isPresent()) {
|
||||||
fileInfo.setFileHandlingFlags(fileInfo.fileHandlingFlags() | MediaFileHandlingFlags::PreserveWritingApplication);
|
fileInfo.setFileHandlingFlags(fileInfo.fileHandlingFlags() | MediaFileHandlingFlags::PreserveWritingApplication);
|
||||||
}
|
}
|
||||||
|
if (!args.preserveTotalFieldsArg.isPresent()) {
|
||||||
|
fileInfo.setFileHandlingFlags(fileInfo.fileHandlingFlags() | MediaFileHandlingFlags::ConvertTotalFields);
|
||||||
|
}
|
||||||
|
|
||||||
// set backup path
|
// set backup path
|
||||||
if (args.backupDirArg.isPresent()) {
|
if (args.backupDirArg.isPresent()) {
|
||||||
|
|
|
@ -50,6 +50,7 @@ struct SetTagInfoArgs {
|
||||||
CppUtilities::ConfigValueArgument preserveModificationTimeArg;
|
CppUtilities::ConfigValueArgument preserveModificationTimeArg;
|
||||||
CppUtilities::ConfigValueArgument preserveMuxingAppArg;
|
CppUtilities::ConfigValueArgument preserveMuxingAppArg;
|
||||||
CppUtilities::ConfigValueArgument preserveWritingAppArg;
|
CppUtilities::ConfigValueArgument preserveWritingAppArg;
|
||||||
|
CppUtilities::ConfigValueArgument preserveTotalFieldsArg;
|
||||||
CppUtilities::ConfigValueArgument jsArg;
|
CppUtilities::ConfigValueArgument jsArg;
|
||||||
CppUtilities::ConfigValueArgument jsSettingsArg;
|
CppUtilities::ConfigValueArgument jsSettingsArg;
|
||||||
CppUtilities::OperationArgument setTagInfoArg;
|
CppUtilities::OperationArgument setTagInfoArg;
|
||||||
|
|
|
@ -360,6 +360,7 @@ bool TagProcessingGeneralOptionPage::apply()
|
||||||
settings.preserveModificationTime = ui()->preserveModificationTimeCheckBox->isChecked();
|
settings.preserveModificationTime = ui()->preserveModificationTimeCheckBox->isChecked();
|
||||||
settings.preserveMuxingApp = ui()->preserveMuxingAppCheckBox->isChecked();
|
settings.preserveMuxingApp = ui()->preserveMuxingAppCheckBox->isChecked();
|
||||||
settings.preserveWritingApp = ui()->preserveWritingAppCheckBox->isChecked();
|
settings.preserveWritingApp = ui()->preserveWritingAppCheckBox->isChecked();
|
||||||
|
settings.convertTotalFields = ui()->convertTotalFieldsCheckBox->isChecked();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -397,6 +398,7 @@ void TagProcessingGeneralOptionPage::reset()
|
||||||
ui()->preserveModificationTimeCheckBox->setChecked(settings.preserveModificationTime);
|
ui()->preserveModificationTimeCheckBox->setChecked(settings.preserveModificationTime);
|
||||||
ui()->preserveMuxingAppCheckBox->setChecked(settings.preserveMuxingApp);
|
ui()->preserveMuxingAppCheckBox->setChecked(settings.preserveMuxingApp);
|
||||||
ui()->preserveWritingAppCheckBox->setChecked(settings.preserveWritingApp);
|
ui()->preserveWritingAppCheckBox->setChecked(settings.preserveWritingApp);
|
||||||
|
ui()->convertTotalFieldsCheckBox->setChecked(settings.convertTotalFields);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -835,6 +835,11 @@ bool TagEditorWidget::startParsing(const QString &path, bool forceRefresh)
|
||||||
m_currentDir = fileInfo.absolutePath();
|
m_currentDir = fileInfo.absolutePath();
|
||||||
m_fileName = fileInfo.fileName();
|
m_fileName = fileInfo.fileName();
|
||||||
}
|
}
|
||||||
|
// set flags that are also important when parsing
|
||||||
|
auto &generalSettings = Settings::values().tagPocessing;
|
||||||
|
auto flags = m_fileInfo.fileHandlingFlags();
|
||||||
|
CppUtilities::modFlagEnum(flags, MediaFileHandlingFlags::ConvertTotalFields, generalSettings.convertTotalFields);
|
||||||
|
m_fileInfo.setFileHandlingFlags(flags);
|
||||||
// write diagnostics to m_diagReparsing if making results are available
|
// write diagnostics to m_diagReparsing if making results are available
|
||||||
m_makingResultsAvailable &= sameFile;
|
m_makingResultsAvailable &= sameFile;
|
||||||
Diagnostics &diag = m_makingResultsAvailable ? m_diagReparsing : m_diag;
|
Diagnostics &diag = m_makingResultsAvailable ? m_diagReparsing : m_diag;
|
||||||
|
@ -1166,12 +1171,11 @@ bool TagEditorWidget::startSaving()
|
||||||
m_fileInfo.setMaxPadding(fileLayoutSettings.maxPadding);
|
m_fileInfo.setMaxPadding(fileLayoutSettings.maxPadding);
|
||||||
m_fileInfo.setPreferredPadding(fileLayoutSettings.preferredPadding);
|
m_fileInfo.setPreferredPadding(fileLayoutSettings.preferredPadding);
|
||||||
m_fileInfo.setBackupDirectory(settings.editor.backupDirectory);
|
m_fileInfo.setBackupDirectory(settings.editor.backupDirectory);
|
||||||
if (generalSettings.preserveMuxingApp) {
|
auto flags = m_fileInfo.fileHandlingFlags();
|
||||||
m_fileInfo.setFileHandlingFlags(m_fileInfo.fileHandlingFlags() | MediaFileHandlingFlags::PreserveMuxingApplication);
|
CppUtilities::modFlagEnum(flags, MediaFileHandlingFlags::PreserveMuxingApplication, generalSettings.preserveMuxingApp);
|
||||||
}
|
CppUtilities::modFlagEnum(flags, MediaFileHandlingFlags::PreserveWritingApplication, generalSettings.preserveWritingApp);
|
||||||
if (generalSettings.preserveWritingApp) {
|
CppUtilities::modFlagEnum(flags, MediaFileHandlingFlags::ConvertTotalFields, generalSettings.convertTotalFields);
|
||||||
m_fileInfo.setFileHandlingFlags(m_fileInfo.fileHandlingFlags() | MediaFileHandlingFlags::PreserveWritingApplication);
|
m_fileInfo.setFileHandlingFlags(flags);
|
||||||
}
|
|
||||||
const auto startThread = [this, preserveModificationTime = settings.tagPocessing.preserveModificationTime] {
|
const auto startThread = [this, preserveModificationTime = settings.tagPocessing.preserveModificationTime] {
|
||||||
// define functions to show the saving progress and to actually applying the changes
|
// define functions to show the saving progress and to actually applying the changes
|
||||||
auto showPercentage([this](AbortableProgressFeedback &progress) {
|
auto showPercentage([this](AbortableProgressFeedback &progress) {
|
||||||
|
|
|
@ -159,6 +159,16 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="convertTotalFieldsCheckBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Ensures fields usually holding values like "3/15" such as the track position are actually stored as such (and <i>not</i> as two separate fields for the position and total values). This is required for the tag editor to support handling such separately stored total values at all. So far this only affects Vorbis Comments where it will convert the fields TRACKTOTAL/DISCTOTAL/PARTTOTAL to be included in the TRACKNUMBER/DISCNUMBER/PARTNUMBER fields.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Convert total fields (see tooltip for details)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
Loading…
Reference in New Issue