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 template<
typename Model_t>
44 TagLib::MP4::ItemMap::ConstIterator findKey(
const TagLib::MP4::ItemMap& itemMap)
const
46 return std::find_if(itemMap.begin(), itemMap.end(), [&](
const auto& itemList) {
47 const auto convertedString = Tagging::convertString(itemList.first);
48 return (convertedString.compare(key(), Qt::CaseInsensitive) == 0);
52 void eraseAllFromTag(TagLib::MP4::Tag* tag,
const QString& key)
54 const auto taglibKey = Tagging::convertString(key);
55 while(tag->contains(taglibKey))
57 tag->removeItem(taglibKey);
61 virtual std::optional<Model_t> mapItemToData(
const TagLib::MP4::Item& item)
const = 0;
62 virtual std::optional<TagLib::MP4::Item> mapDataToItem(
const Model_t& model) = 0;
65 MP4Frame(TagLib::MP4::Tag* tag,
const QString& identifier) :
70 bool read(Model_t& data)
const
77 const auto& itemMap = tag()->itemMap();
78 const auto it = findKey(itemMap);
79 if(it != itemMap.end() && it->second.isValid())
81 const auto optionalData = mapItemToData(it->second);
82 if(optionalData.has_value())
84 data = optionalData.value();
92 bool write(
const Model_t& data)
99 eraseAllFromTag(tag(), key());
101 const auto item = mapDataToItem(data);
102 if(item.has_value() && item.value().isValid())
104 tag()->setItem(tagKey(), *item);
107 return item.has_value();
110 bool isFrameAvailable()
const
117 const auto& itemMap = tag()->itemMap();
118 return (findKey(itemMap) != itemMap.end());
Definition: MP4Frame.h:42
Definition: AbstractFrame.h:54