21#ifndef SAYONARA_ABSTRACT_MP4_FRAME_H
22#define SAYONARA_ABSTRACT_MP4_FRAME_H
24#include "Utils/Tagging/AbstractFrame.h"
25#include "Utils/Algorithm.h"
29#include <taglib/tag.h>
30#include <taglib/tstringlist.h>
31#include <taglib/mp4tag.h>
32#include <taglib/tpropertymap.h>
39 bool isFrameAvailable(TagLib::MP4::Tag* tag,
const QByteArray& key,
const QByteArray& propertyMapKey);
40 TagLib::MP4::ItemMap::ConstIterator findKey(
const QByteArray& key,
const TagLib::MP4::ItemMap& itemMap);
41 void eraseAllFromTag(TagLib::MP4::Tag* tag,
const QString& key);
43 template<
typename Model_t>
48 virtual std::optional<Model_t> mapItemToData(
const TagLib::MP4::Item& item)
const = 0;
49 virtual std::optional<TagLib::MP4::Item> mapDataToItem(
const Model_t& model) = 0;
52 MP4Frame(TagLib::MP4::Tag* tag,
const QByteArray& identifier) :
57 bool read(Model_t& data)
const
61 if(
const auto maybeData = findDataInItemMap(); maybeData.has_value())
63 data = maybeData.value();
67 if(
const auto maybeData = findDataInPropertyMap(); maybeData.has_value())
69 data = maybeData.value();
77 bool write(
const Model_t& data)
84 eraseAllFromTag(tag(), key());
86 const auto item = mapDataToItem(data);
87 if(item.has_value() && item.value().isValid())
89 tag()->setItem(tagKey(), *item);
92 return item.has_value();
95 [[nodiscard]]
bool isFrameAvailable()
const
97 return MP4::isFrameAvailable(tag(), key(), propertyMapKey());
101 std::optional<Model_t> findDataInItemMap()
const
103 const auto& itemMap = tag()->itemMap();
105 if(
const auto it = findKey(key(), itemMap); (it != itemMap.end() && it->second.isValid()))
107 const auto optionalData = mapItemToData(it->second);
108 if(optionalData.has_value())
117 virtual std::optional<Model_t> findDataInPropertyMap()
const {
return std::nullopt; };
119 [[nodiscard]]
virtual QByteArray propertyMapKey()
const {
return {}; };
Definition AbstractFrame.h:54