26 {
"title", QMediaMetaData::Title },
27 {
"comment", QMediaMetaData::Comment },
28 {
"description", QMediaMetaData::Description },
29 {
"genre", QMediaMetaData::Genre },
30 {
"date", QMediaMetaData::Date },
31 {
"year", QMediaMetaData::Date },
32 {
"creation_time", QMediaMetaData::Date },
34 {
"language", QMediaMetaData::Language },
36 {
"copyright", QMediaMetaData::Copyright },
39 {
"album", QMediaMetaData::AlbumTitle },
40 {
"album_artist", QMediaMetaData::AlbumArtist },
41 {
"artist", QMediaMetaData::ContributingArtist },
42 {
"track", QMediaMetaData::TrackNumber },
45 {
"performer", QMediaMetaData::LeadPerformer },
47 {
nullptr, QMediaMetaData::Title }
75void QFFmpegMetaData::addEntry(QMediaMetaData &metaData, AVDictionaryEntry *entry)
77 qCDebug(qLcMetaData) <<
" checking:" << entry->key << entry->value;
78 QByteArray tag(entry->key);
79 QMediaMetaData::Key key = tagToKey(tag.toLower());
80 if (key == QMediaMetaData::Key(-1))
82 qCDebug(qLcMetaData) <<
" adding" << key;
84 auto *map = &metaData;
86 int metaTypeId = keyType(key).id();
88 case qMetaTypeId<QString>():
89 map->insert(key, QString::fromUtf8(entry->value));
91 case qMetaTypeId<QStringList>():
92 map->insert(key, QString::fromUtf8(entry->value).split(QLatin1Char(
',')));
94 case qMetaTypeId<QDateTime>(): {
96 if (!qstrcmp(entry->key,
"year")) {
97 if (map->keys().contains(QMediaMetaData::Date))
99 date = QDateTime(QDate(QByteArray(entry->value).toInt(), 1, 1), QTime(0, 0, 0));
101 date = QDateTime::fromString(QString::fromUtf8(entry->value), Qt::ISODate);
103 map->insert(key, date);
106 case qMetaTypeId<QUrl>():
107 map->insert(key, QUrl::fromEncoded(entry->value));
109 case qMetaTypeId<qint64>():
110 map->insert(key, (qint64)QByteArray(entry->value).toLongLong());
112 case qMetaTypeId<
int>():
113 map->insert(key, QByteArray(entry->value).toInt());
115 case qMetaTypeId<qreal>():
116 map->insert(key, (qreal)QByteArray(entry->value).toDouble());
121 if (metaTypeId == qMetaTypeId<QLocale::Language>()) {
122 map->insert(key, QVariant::fromValue(QLocale::codeToLanguage(QString::fromUtf8(entry->value), QLocale::ISO639Part2)));
127QMediaMetaData QFFmpegMetaData::fromAVMetaData(
const AVDictionary *tags)
129 QMediaMetaData metaData;
130 AVDictionaryEntry *entry =
nullptr;
131 while ((entry = av_dict_get(tags,
"", entry, AV_DICT_IGNORE_SUFFIX)))
132 addEntry(metaData, entry);
137QByteArray QFFmpegMetaData::value(
const QMediaMetaData &metaData, QMediaMetaData::Key key)
139 const int metaTypeId = keyType(key).id();
140 const QVariant val = metaData.value(key);
141 switch (metaTypeId) {
142 case qMetaTypeId<QString>():
143 return val.toString().toUtf8();
144 case qMetaTypeId<QStringList>():
145 return val.toStringList().join(u",").toUtf8();
146 case qMetaTypeId<QDateTime>():
147 return val.toDateTime().toString(Qt::ISODate).toUtf8();
148 case qMetaTypeId<QUrl>():
149 return val.toUrl().toEncoded();
150 case qMetaTypeId<qint64>():
151 case qMetaTypeId<
int>():
152 return QByteArray::number(val.toLongLong());
153 case qMetaTypeId<qreal>():
154 return QByteArray::number(val.toDouble());
158 if (metaTypeId == qMetaTypeId<QLocale::Language>())
159 return QLocale::languageToCode(val.value<QLocale::Language>(), QLocale::ISO639Part2).toUtf8();
164AVDictionary *QFFmpegMetaData::toAVMetaData(
const QMediaMetaData &metaData)
166 AVDictionary *dict =
nullptr;
167 for (
const auto &&[k, v] : metaData.asKeyValueRange()) {
168 const char *key = ::keyToTag(k);
171 QByteArray val = value(metaData, k);
174 av_dict_set(&dict, key, val.constData(), 0);