From 5e808d069b22ca94c37418c5ef5f84b12b4acae2 Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 6 Apr 2022 01:15:21 +0200 Subject: [PATCH] Support many more fields --- CMakeLists.txt | 2 +- application/knownfieldmodel.cpp | 205 ++++++++++++++++++- cli/fieldmapping.cpp | 84 +++++++- cli/json.cpp | 7 +- cli/mainfeatures.cpp | 14 +- translations/tageditor_de_DE.ts | 340 ++++++++++++++++++++++++++++++++ translations/tageditor_en_US.ts | 340 ++++++++++++++++++++++++++++++++ 7 files changed, 987 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5639ef4..e09d302 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -199,7 +199,7 @@ if (WIDGETS_GUI OR QUICK_GUI) endif () # find tagparser -find_package(tagparser${CONFIGURATION_PACKAGE_SUFFIX} 11.0.0 REQUIRED) +find_package(tagparser${CONFIGURATION_PACKAGE_SUFFIX} 11.1.0 REQUIRED) use_tag_parser() # enable experimental JSON export diff --git a/application/knownfieldmodel.cpp b/application/knownfieldmodel.cpp index 558314d..38ac3ae 100644 --- a/application/knownfieldmodel.cpp +++ b/application/knownfieldmodel.cpp @@ -73,6 +73,142 @@ const char *KnownFieldModel::fieldName(KnownField field) return QT_TR_NOOP("Album artist"); case KnownField::ReleaseDate: return QT_TR_NOOP("Release date"); + case KnownField::Subtitle: + return QT_TR_NOOP("Subtitle"); + case KnownField::LeadPerformer: + return QT_TR_NOOP("Lead performer"); + case KnownField::Arranger: + return QT_TR_NOOP("Arranger"); + case KnownField::Conductor: + return QT_TR_NOOP("Conductor"); + case KnownField::Director: + return QT_TR_NOOP("Director"); + case KnownField::AssistantDirector: + return QT_TR_NOOP("Assistant directory"); + case KnownField::DirectorOfPhotography: + return QT_TR_NOOP("Director of photography"); + case KnownField::SoundEngineer: + return QT_TR_NOOP("Sounc engineer"); + case KnownField::ArtDirector: + return QT_TR_NOOP("Art director"); + case KnownField::ProductionDesigner: + return QT_TR_NOOP("Production designer"); + case KnownField::Choregrapher: + return QT_TR_NOOP("Choregrapher"); + case KnownField::CostumeDesigner: + return QT_TR_NOOP("Costume designer"); + case KnownField::Actor: + return QT_TR_NOOP("Actor"); + case KnownField::Character: + return QT_TR_NOOP("Character"); + case KnownField::WrittenBy: + return QT_TR_NOOP("Written by"); + case KnownField::ScreenplayBy: + return QT_TR_NOOP("Screenplay by"); + case KnownField::EditedBy: + return QT_TR_NOOP("Edited by"); + case KnownField::Producer: + return QT_TR_NOOP("Producer"); + case KnownField::Coproducer: + return QT_TR_NOOP("Coproducer"); + case KnownField::ExecutiveProducer: + return QT_TR_NOOP("Executive producer"); + case KnownField::DistributedBy: + return QT_TR_NOOP("Distributed by"); + case KnownField::MasteredBy: + return QT_TR_NOOP("Mastered by"); + case KnownField::EncodedBy: + return QT_TR_NOOP("Encoded by"); + case KnownField::MixedBy: + return QT_TR_NOOP("Mixed by"); + case KnownField::RemixedBy: + return QT_TR_NOOP("Remixed by"); + case KnownField::ProductionStudio: + return QT_TR_NOOP("Production studio"); + case KnownField::ThanksTo: + return QT_TR_NOOP("Thanks to"); + case KnownField::Publisher: + return QT_TR_NOOP("Publisher"); + case KnownField::Mood: + return QT_TR_NOOP("Mood"); + case KnownField::OriginalMediaType: + return QT_TR_NOOP("Original media-type"); + case KnownField::ContentType: + return QT_TR_NOOP("Content-type"); + case KnownField::Subject: + return QT_TR_NOOP("Subject"); + case KnownField::Keywords: + return QT_TR_NOOP("Keywords"); + case KnownField::Summary: + return QT_TR_NOOP("Summary"); + case KnownField::Synopsis: + return QT_TR_NOOP("Synopsis"); + case KnownField::InitialKey: + return QT_TR_NOOP("Initial key"); + case KnownField::Period: + return QT_TR_NOOP("Period"); + case KnownField::LawRating: + return QT_TR_NOOP("Law rating"); + case KnownField::EncodingDate: + return QT_TR_NOOP("Encoding date"); + case KnownField::TaggingDate: + return QT_TR_NOOP("Tagging date"); + case KnownField::DigitalizationDate: + return QT_TR_NOOP("Digitalization date"); + case KnownField::WritingDate: + return QT_TR_NOOP("Writing date"); + case KnownField::PurchasingDate: + return QT_TR_NOOP("Purchasing date"); + case KnownField::RecordingLocation: + return QT_TR_NOOP("Recording location"); + case KnownField::CompositionLocation: + return QT_TR_NOOP("Composition location"); + case KnownField::ComposerNationality: + return QT_TR_NOOP("Composer nationality"); + case KnownField::PlayCounter: + return QT_TR_NOOP("Play counter"); + case KnownField::Measure: + return QT_TR_NOOP("Measure"); + case KnownField::Tuning: + return QT_TR_NOOP("Tuning"); + case KnownField::ISRC: + return QT_TR_NOOP("ISRC"); + case KnownField::MCDI: + return QT_TR_NOOP("MCDI"); + case KnownField::ISBN: + return QT_TR_NOOP("ISBN"); + case KnownField::Barcode: + return QT_TR_NOOP("Barcode"); + case KnownField::CatalogNumber: + return QT_TR_NOOP("Catalog number"); + case KnownField::LabelCode: + return QT_TR_NOOP("Label code"); + case KnownField::LCCN: + return QT_TR_NOOP("LCCN"); + case KnownField::IMDB: + return QT_TR_NOOP("IMDB-ID"); + case KnownField::TMDB: + return QT_TR_NOOP("TMDB-ID"); + case KnownField::TVDB: + return QT_TR_NOOP("TVDB-ID"); + case KnownField::PurchaseItem: + return QT_TR_NOOP("Purchase item"); + case KnownField::PurchaseInfo: + return QT_TR_NOOP("Purchase info"); + case KnownField::PurchaseOwner: + return QT_TR_NOOP("Purchase owner"); + case KnownField::PurchasePrice: + return QT_TR_NOOP("Purchase price"); + case KnownField::PurchaseCurrency: + return QT_TR_NOOP("Purchase currency"); + case KnownField::Copyright: + return QT_TR_NOOP("Copyright"); + case KnownField::ProductionCopyright: + return QT_TR_NOOP("Production copyright"); + case KnownField::License: + return QT_TR_NOOP("License"); + case KnownField::TermsOfUse: + return QT_TR_NOOP("Terms of use"); default: return ""; } @@ -123,7 +259,74 @@ KnownFieldModel::KnownFieldModel(QObject *parent, DefaultSelection defaultSelect mkItem(KnownField::Rating, Qt::Unchecked), mkItem(KnownField::Description, Qt::Unchecked), mkItem(KnownField::Vendor, Qt::Unchecked), - mkItem(KnownField::ReleaseDate, Qt::Unchecked), + mkItem(KnownField::ReleaseDate, Qt::Checked), + mkItem(KnownField::Subtitle, Qt::Unchecked), + mkItem(KnownField::LeadPerformer, Qt::Unchecked), + mkItem(KnownField::Arranger, Qt::Unchecked), + mkItem(KnownField::Conductor, Qt::Unchecked), + mkItem(KnownField::Director, Qt::Unchecked), + mkItem(KnownField::AssistantDirector, Qt::Unchecked), + mkItem(KnownField::DirectorOfPhotography, Qt::Unchecked), + mkItem(KnownField::SoundEngineer, Qt::Unchecked), + mkItem(KnownField::ArtDirector, Qt::Unchecked), + mkItem(KnownField::ProductionDesigner, Qt::Unchecked), + mkItem(KnownField::Choregrapher, Qt::Unchecked), + mkItem(KnownField::CostumeDesigner, Qt::Unchecked), + mkItem(KnownField::Actor, Qt::Unchecked), + mkItem(KnownField::Character, Qt::Unchecked), + mkItem(KnownField::WrittenBy, Qt::Unchecked), + mkItem(KnownField::ScreenplayBy, Qt::Unchecked), + mkItem(KnownField::EditedBy, Qt::Unchecked), + mkItem(KnownField::Producer, Qt::Unchecked), + mkItem(KnownField::Coproducer, Qt::Unchecked), + mkItem(KnownField::ExecutiveProducer, Qt::Unchecked), + mkItem(KnownField::DistributedBy, Qt::Unchecked), + mkItem(KnownField::MasteredBy, Qt::Unchecked), + mkItem(KnownField::EncodedBy, Qt::Unchecked), + mkItem(KnownField::MixedBy, Qt::Unchecked), + mkItem(KnownField::RemixedBy, Qt::Unchecked), + mkItem(KnownField::ProductionStudio, Qt::Unchecked), + mkItem(KnownField::ThanksTo, Qt::Unchecked), + mkItem(KnownField::Publisher, Qt::Unchecked), + mkItem(KnownField::Mood, Qt::Unchecked), + mkItem(KnownField::OriginalMediaType, Qt::Unchecked), + mkItem(KnownField::ContentType, Qt::Unchecked), + mkItem(KnownField::Subject, Qt::Unchecked), + mkItem(KnownField::Keywords, Qt::Unchecked), + mkItem(KnownField::Summary, Qt::Unchecked), + mkItem(KnownField::Synopsis, Qt::Unchecked), + mkItem(KnownField::InitialKey, Qt::Unchecked), + mkItem(KnownField::Period, Qt::Unchecked), + mkItem(KnownField::LawRating, Qt::Unchecked), + mkItem(KnownField::EncodingDate, Qt::Unchecked), + mkItem(KnownField::TaggingDate, Qt::Unchecked), + mkItem(KnownField::OriginalReleaseDate, Qt::Unchecked), + mkItem(KnownField::DigitalizationDate, Qt::Unchecked), + mkItem(KnownField::WritingDate, Qt::Unchecked), + mkItem(KnownField::PurchasingDate, Qt::Unchecked), + mkItem(KnownField::RecordingLocation, Qt::Unchecked), + mkItem(KnownField::CompositionLocation, Qt::Unchecked), + mkItem(KnownField::ComposerNationality, Qt::Unchecked), + mkItem(KnownField::PlayCounter, Qt::Unchecked), + mkItem(KnownField::Measure, Qt::Unchecked), + mkItem(KnownField::Tuning, Qt::Unchecked), + mkItem(KnownField::ISBN, Qt::Unchecked), + mkItem(KnownField::Barcode, Qt::Unchecked), + mkItem(KnownField::CatalogNumber, Qt::Unchecked), + mkItem(KnownField::LabelCode, Qt::Unchecked), + mkItem(KnownField::LCCN, Qt::Unchecked), + mkItem(KnownField::IMDB, Qt::Unchecked), + mkItem(KnownField::TMDB, Qt::Unchecked), + mkItem(KnownField::TVDB, Qt::Unchecked), + mkItem(KnownField::PurchaseItem, Qt::Unchecked), + mkItem(KnownField::PurchaseInfo, Qt::Unchecked), + mkItem(KnownField::PurchaseOwner, Qt::Unchecked), + mkItem(KnownField::PurchasePrice, Qt::Unchecked), + mkItem(KnownField::PurchaseCurrency, Qt::Unchecked), + mkItem(KnownField::Copyright, Qt::Unchecked), + mkItem(KnownField::ProductionCopyright, Qt::Unchecked), + mkItem(KnownField::License, Qt::Unchecked), + mkItem(KnownField::TermsOfUse, Qt::Unchecked), }); // clang-format on } diff --git a/cli/fieldmapping.cpp b/cli/fieldmapping.cpp index 743575b..ddb2307 100644 --- a/cli/fieldmapping.cpp +++ b/cli/fieldmapping.cpp @@ -1,5 +1,6 @@ #include "./fieldmapping.h" +#include #include using namespace TagParser; @@ -41,6 +42,75 @@ static constexpr struct { { "description", KnownField::Description }, { "vendor", KnownField::Vendor }, { "albumartist", KnownField::AlbumArtist }, + { "Subtitle", KnownField::Subtitle }, + { "LeadPerformer", KnownField::LeadPerformer }, + { "Arranger", KnownField::Arranger }, + { "Conductor", KnownField::Conductor }, + { "Director", KnownField::Director }, + { "AssistantDirector", KnownField::AssistantDirector }, + { "DirectorOfPhotography", KnownField::DirectorOfPhotography }, + { "SoundEngineer", KnownField::SoundEngineer }, + { "ArtDirector", KnownField::ArtDirector }, + { "ProductionDesigner", KnownField::ProductionDesigner }, + { "Choregrapher", KnownField::Choregrapher }, + { "CostumeDesigner", KnownField::CostumeDesigner }, + { "Actor", KnownField::Actor }, + { "Character", KnownField::Character }, + { "WrittenBy", KnownField::WrittenBy }, + { "ScreenplayBy", KnownField::ScreenplayBy }, + { "EditedBy", KnownField::EditedBy }, + { "Producer", KnownField::Producer }, + { "Coproducer", KnownField::Coproducer }, + { "ExecutiveProducer", KnownField::ExecutiveProducer }, + { "DistributedBy", KnownField::DistributedBy }, + { "MasteredBy", KnownField::MasteredBy }, + { "EncodedBy", KnownField::EncodedBy }, + { "MixedBy", KnownField::MixedBy }, + { "RemixedBy", KnownField::RemixedBy }, + { "ProductionStudio", KnownField::ProductionStudio }, + { "ThanksTo", KnownField::ThanksTo }, + { "Publisher", KnownField::Publisher }, + { "Mood", KnownField::Mood }, + { "OriginalMediaType", KnownField::OriginalMediaType }, + { "ContentType", KnownField::ContentType }, + { "Subject", KnownField::Subject }, + { "Keywords", KnownField::Keywords }, + { "Summary", KnownField::Summary }, + { "Synopsis", KnownField::Synopsis }, + { "InitialKey", KnownField::InitialKey }, + { "Period", KnownField::Period }, + { "LawRating", KnownField::LawRating }, + { "EncodingDate", KnownField::EncodingDate }, + { "TaggingDate", KnownField::TaggingDate }, + { "OriginalReleaseDate", KnownField::OriginalReleaseDate }, + { "DigitalizationDate", KnownField::DigitalizationDate }, + { "WritingDate", KnownField::WritingDate }, + { "PurchasingDate", KnownField::PurchasingDate }, + { "RecordingLocation", KnownField::RecordingLocation }, + { "CompositionLocation", KnownField::CompositionLocation }, + { "ComposerNationality", KnownField::ComposerNationality }, + { "PlayCounter", KnownField::PlayCounter }, + { "Measure", KnownField::Measure }, + { "Tuning", KnownField::Tuning }, + { "ISRC", KnownField::ISRC }, + { "MCDI", KnownField::MCDI }, + { "ISBN", KnownField::ISBN }, + { "Barcode", KnownField::Barcode }, + { "CatalogNumber", KnownField::CatalogNumber }, + { "LabelCode", KnownField::LabelCode }, + { "LCCN", KnownField::LCCN }, + { "IMDB", KnownField::IMDB }, + { "TMDB", KnownField::TMDB }, + { "TVDB", KnownField::TVDB }, + { "PurchaseItem", KnownField::PurchaseItem }, + { "PurchaseInfo", KnownField::PurchaseInfo }, + { "PurchaseOwner", KnownField::PurchaseOwner }, + { "PurchasePrice", KnownField::PurchasePrice }, + { "PurchaseCurrency", KnownField::PurchaseCurrency }, + { "Copyright", KnownField::Copyright }, + { "ProductionCopyright", KnownField::ProductionCopyright }, + { "License", KnownField::License }, + { "TermsOfUse", KnownField::TermsOfUse }, }; const char *fieldDenotation(TagParser::KnownField knownField) @@ -55,8 +125,20 @@ const char *fieldDenotation(TagParser::KnownField knownField) TagParser::KnownField knownField(const char *fieldDenotation, std::size_t fieldDenotationSize) { + const auto d = std::string_view(fieldDenotation, fieldDenotationSize); for (const auto &mapping : fieldMapping) { - if (!strncmp(fieldDenotation, mapping.knownDenotation, fieldDenotationSize)) { + const char *mc = mapping.knownDenotation; + for (auto dc : d) { + if (!*mc) { + mc = mapping.knownDenotation; + break; + } + if (static_cast(dc) != CaseInsensitiveCharComparer::toLower(static_cast(*mc))) { + break; + } + ++mc; + } + if (!*mc) { return mapping.knownField; } } diff --git a/cli/json.cpp b/cli/json.cpp index ad8cd65..ea48f10 100644 --- a/cli/json.cpp +++ b/cli/json.cpp @@ -5,6 +5,7 @@ #include #include +#include #include @@ -128,7 +129,11 @@ TagInfo::TagInfo(const Tag &tag, RAPIDJSON_NAMESPACE::Document::AllocatorType &a for (const auto *tagValue : tagValues) { valueObjects.emplace_back(*tagValue, allocator); } - fields.insert(make_pair(FieldMapping::fieldDenotation(field), move(valueObjects))); + auto key = std::string(FieldMapping::fieldDenotation(field)); + for (auto &c : key) { + c = static_cast(CaseInsensitiveCharComparer::toLower(static_cast(c))); + } + fields.insert(std::make_pair(std::move(key), std::move(valueObjects))); } } diff --git a/cli/mainfeatures.cpp b/cli/mainfeatures.cpp index e04642d..603fb28 100644 --- a/cli/mainfeatures.cpp +++ b/cli/mainfeatures.cpp @@ -73,7 +73,19 @@ namespace Cli { #define FIELD_NAMES \ "title album artist genre recorddate comment bpm bps lyricist track disk part totalparts encoder\n" \ " releasedate performers duration language encodersettings lyrics synchronizedlyrics grouping\n" \ - " recordlabel cover composer rating description vendor albumartist" + " recordlabel cover composer rating description vendor albumartist\n" \ + " subtitle leadperformer arranger conductor director assistantdirector\n" \ + " subtitle leadperformer arranger conductor director assistantdirector\n" \ + " directorofphotography soundengineer artdirector productiondesigner choregrapher\n" \ + " costumedesigner actor character writtenby screenplayby editedby producer\n" \ + " coproducer exectiveproducer distributedby masteredby encodedby mixedby\n" \ + " remixedby productionstudio thanksto publisher mood originalmediatype\n" \ + " contenttype subject keywords summary synopsis initialkey period lawrating\n" \ + " encodingdate taggingdate originalreleasedate digitalizationdate writingdate\n" \ + " purchasingdate recordinglocation compositionlocation composernationality\n" \ + " playcounter measure tuning isrc mcdi isbn barcode catalognumber labelcode\n" \ + " lccn imdb tmdb tvdb purchaseitem purchaseinfo purchaseowner purchaseprice\n" \ + " purchasecurrency copyright productioncopyright licnese termsofuse" #define TRACK_ATTRIBUTE_NAMES "name tracknumber enabled=yes enabled=no forced=yes forced=no default=yes default=no" diff --git a/translations/tageditor_de_DE.ts b/translations/tageditor_de_DE.ts index 3ae1ae1..b91df0a 100644 --- a/translations/tageditor_de_DE.ts +++ b/translations/tageditor_de_DE.ts @@ -4900,8 +4900,348 @@ Remarks Release date + + + Subtitle + + + + + Lead performer + + + + + Arranger + + + + + Conductor + + + + + Director + + + + + Assistant directory + + + + + Director of photography + + + + + Sounc engineer + + + + + Art director + + + + + Production designer + + + + + Choregrapher + + + + + Costume designer + + + + + Actor + + + + + Character + + + + + Written by + + + + + Screenplay by + + + + + Edited by + + + + + Producer + + + + + Coproducer + + + + + Executive producer + + + + + Distributed by + + + + + Mastered by + + + + + Encoded by + + + + + Mixed by + + + + + Remixed by + + + + + Production studio + + + + + Thanks to + + + + + Publisher + + + + + Mood + + + + + Original media-type + + + + + Content-type + + + + + Subject + + + + + Keywords + + + + + Summary + + + Synopsis + + + + + Initial key + + + + + Period + + + + + Law rating + + + + + Encoding date + + + + + Tagging date + + + + + Digitalization date + + + + + Writing date + + + + + Purchasing date + + + + + Recording location + + + + + Composition location + + + + + Composer nationality + + + + + Play counter + + + + + Measure + + + + + Tuning + + + + + ISRC + + + + + MCDI + + + + + ISBN + + + + + Barcode + + + + + Catalog number + + + + + Label code + + + + + LCCN + + + + + IMDB-ID + + + + + TMDB-ID + + + + + TVDB-ID + + + + + Purchase item + + + + + Purchase info + + + + + Purchase owner + + + + + Purchase price + + + + + Purchase currency + + + + + Copyright + + + + + Production copyright + + + + + License + + + + + Terms of use + + + + Field diff --git a/translations/tageditor_en_US.ts b/translations/tageditor_en_US.ts index 5e5b619..493861e 100644 --- a/translations/tageditor_en_US.ts +++ b/translations/tageditor_en_US.ts @@ -5037,8 +5037,348 @@ Remarks Release date + + + Subtitle + + + + + Lead performer + + + + + Arranger + + + + + Conductor + + + + + Director + + + + + Assistant directory + + + + + Director of photography + + + + + Sounc engineer + + + + + Art director + + + + + Production designer + + + + + Choregrapher + + + + + Costume designer + + + + + Actor + + + + + Character + + + + + Written by + + + + + Screenplay by + + + + + Edited by + + + + + Producer + + + + + Coproducer + + + + + Executive producer + + + + + Distributed by + + + + + Mastered by + + + + + Encoded by + + + + + Mixed by + + + + + Remixed by + + + + + Production studio + + + + + Thanks to + + + + + Publisher + + + + + Mood + + + + + Original media-type + + + + + Content-type + + + + + Subject + + + + + Keywords + + + + + Summary + + + Synopsis + + + + + Initial key + + + + + Period + + + + + Law rating + + + + + Encoding date + + + + + Tagging date + + + + + Digitalization date + + + + + Writing date + + + + + Purchasing date + + + + + Recording location + + + + + Composition location + + + + + Composer nationality + + + + + Play counter + + + + + Measure + + + + + Tuning + + + + + ISRC + + + + + MCDI + + + + + ISBN + + + + + Barcode + + + + + Catalog number + + + + + Label code + + + + + LCCN + + + + + IMDB-ID + + + + + TMDB-ID + + + + + TVDB-ID + + + + + Purchase item + + + + + Purchase info + + + + + Purchase owner + + + + + Purchase price + + + + + Purchase currency + + + + + Copyright + + + + + Production copyright + + + + + License + + + + + Terms of use + + + + Field