21#ifndef SAYONARA_ID3V2_FRAME_H
22#define SAYONARA_ID3V2_FRAME_H
24#include "Utils/Tagging/AbstractFrame.h"
28#include <taglib/fileref.h>
29#include <taglib/mpegfile.h>
30#include <taglib/id3v2tag.h>
31#include <taglib/id3v2frame.h>
37 template<
typename ModelType_t,
typename FrameType_t>
42 FrameType_t* mFrame {
nullptr};
45 virtual TagLib::ID3v2::Frame* createId3v2Frame() = 0;
47 virtual void mapDataToFrame(
const ModelType_t& model, FrameType_t* frame) = 0;
48 virtual std::optional<ModelType_t> mapFrameToData(
const FrameType_t* frame)
const = 0;
51 ID3v2Frame(TagLib::ID3v2::Tag* tag,
const char* four) :
54 const auto byteVector = TagLib::ByteVector(four, 4);
55 const auto frameListMap = tag->frameListMap();
56 const auto frameList = frameListMap[byteVector];
57 if(!frameList.isEmpty())
59 mFrame =
dynamic_cast<FrameType_t*
>(frameList.front());
65 virtual bool read(ModelType_t& data)
const
69 if(
const auto optData = mapFrameToData(mFrame); optData.has_value())
71 data = optData.value();
79 virtual bool write(
const ModelType_t& data)
89 mFrame =
dynamic_cast<FrameType_t*
>(createId3v2Frame());
98 mapDataToFrame(data, mFrame);
102 tag()->addFrame(mFrame);
108 bool isFrameAvailable()
const
110 return (mFrame !=
nullptr);
Definition: ID3v2Frame.h:40
Definition: AbstractFrame.h:54