Tag Parser  10.0.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
mp4tag.h
Go to the documentation of this file.
1 #ifndef TAG_PARSER_MP4TAG_H
2 #define TAG_PARSER_MP4TAG_H
3 
4 #include "./mp4tagfield.h"
5 
6 #include "../fieldbasedtag.h"
7 
8 namespace TagParser {
9 
10 class Mp4Atom;
11 class Mp4Tag;
12 
14  Mp4ExtendedFieldId(std::string_view mean, std::string_view name, bool updateOnly = false);
16 
17  operator bool() const;
18  bool matches(const Mp4TagField &field) const;
19 
21  std::string_view mean;
23  std::string_view name;
25  bool updateOnly = false;
26 };
27 
31 inline Mp4ExtendedFieldId::Mp4ExtendedFieldId(std::string_view mean, std::string_view name, bool updateOnly)
32  : mean(mean)
33  , name(name)
34  , updateOnly(updateOnly)
35 {
36 }
37 
41 inline Mp4ExtendedFieldId::operator bool() const
42 {
43  return !mean.empty() && !name.empty();
44 }
45 
49 inline bool Mp4ExtendedFieldId::matches(const Mp4TagField &field) const
50 {
51  return field.mean() == mean && field.name() == name;
52 }
53 
55  friend class Mp4Tag;
56 
57 public:
58  void make(std::ostream &stream, Diagnostics &diag);
59  const Mp4Tag &tag() const;
60  std::uint64_t requiredSize() const;
61 
62 private:
63  Mp4TagMaker(Mp4Tag &tag, Diagnostics &diag);
64 
65  Mp4Tag &m_tag;
66  std::vector<Mp4TagFieldMaker> m_maker;
67  std::uint64_t m_metaSize;
68  std::uint64_t m_ilstSize;
69  bool m_omitPreDefinedGenre;
70 };
71 
75 inline const Mp4Tag &Mp4TagMaker::tag() const
76 {
77  return m_tag;
78 }
79 
83 inline std::uint64_t Mp4TagMaker::requiredSize() const
84 {
85  return m_metaSize;
86 }
87 
92 public:
94  using Compare = std::less<typename FieldType::IdentifierType>;
95 };
96 
97 class TAG_PARSER_EXPORT Mp4Tag final : public FieldMapBasedTag<Mp4Tag> {
98  friend class FieldMapBasedTag<Mp4Tag>;
99 
100 public:
101  Mp4Tag();
102 
103  static constexpr TagType tagType = TagType::Mp4Tag;
104  static constexpr std::string_view tagName = "MP4/iTunes tag";
105  static constexpr TagTextEncoding defaultTextEncoding = TagTextEncoding::Utf8;
106  bool canEncodingBeUsed(TagTextEncoding encoding) const override;
107 
108  bool supportsField(KnownField field) const override;
110  const TagValue &value(KnownField value) const override;
112  std::vector<const TagValue *> values(KnownField field) const override;
113  const TagValue &value(std::string_view mean, std::string_view name) const;
115  bool setValue(KnownField field, const TagValue &value) override;
117  bool setValues(KnownField field, const std::vector<TagValue> &values) override;
118  bool setValue(std::string_view mean, std::string_view name, const TagValue &value);
120  bool hasField(KnownField value) const override;
121  bool supportsMultipleValues(KnownField) const override;
122 
123  void parse(Mp4Atom &metaAtom, Diagnostics &diag);
124  Mp4TagMaker prepareMaking(Diagnostics &diag);
125  void make(std::ostream &stream, Diagnostics &diag);
126 
127 protected:
128  IdentifierType internallyGetFieldId(KnownField field) const;
129  KnownField internallyGetKnownField(const IdentifierType &id) const;
130  void internallyGetValuesFromField(const FieldType &field, std::vector<const TagValue *> &values) const;
131 };
132 
137 {
138 }
139 
140 inline bool Mp4Tag::supportsField(KnownField field) const
141 {
142  switch (field) {
144  return true;
145  default:
147  }
148 }
149 
156 {
157  return false;
158 }
159 
160 } // namespace TagParser
161 
162 #endif // TAG_PARSER_MP4TAG_H
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
std::less< typename FieldType::IdentifierType > Compare
Definition: mp4tag.h:94
Defines traits for the specified ImplementationType.
Definition: fieldbasedtag.h:17
The FieldMapBasedTag provides a generic implementation of Tag which stores the tag fields using std::...
Definition: fieldbasedtag.h:31
bool supportsField(KnownField field) const
Returns an indication whether the specified field is supported by the tag.
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:38
The Mp4TagField class is used by Mp4Tag to store the fields.
Definition: mp4tagfield.h:112
const std::string & name() const
Returns the "name" for "extended" fields.
Definition: mp4tagfield.h:189
const std::string & mean() const
Returns the "mean" for "extended" fields.
Definition: mp4tagfield.h:205
The Mp4TagMaker class helps writing MP4 tags.
Definition: mp4tag.h:54
const Mp4Tag & tag() const
Returns the associated tag.
Definition: mp4tag.h:75
std::uint64_t requiredSize() const
Returns the number of bytes which will be written when making the tag.
Definition: mp4tag.h:83
Implementation of TagParser::Tag for the MP4 container.
Definition: mp4tag.h:97
bool supportsMultipleValues(KnownField) const override
Returns false for all fields (for now).
Definition: mp4tag.h:155
bool supportsField(KnownField field) const override
Returns an indication whether the specified field is supported by the tag.
Definition: mp4tag.h:140
Mp4Tag()
Constructs a new tag.
Definition: mp4tag.h:136
The TagValue class wraps values of different types.
Definition: tagvalue.h:95
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
KnownField
Specifies the field.
Definition: tag.h:42
TagTextEncoding
Specifies the text encoding.
Definition: tagvalue.h:28
TagType
Specifies the tag type.
Definition: tag.h:20
The Mp4ExtendedFieldId specifies parameter for an extended field denoted via Mp4TagAtomIds::Extended.
Definition: mp4tag.h:13
bool matches(const Mp4TagField &field) const
Returns whether the current parameter match the specified field.
Definition: mp4tag.h:49
std::string_view mean
mean parameter, usually Mp4TagExtendedMeanIds::iTunes
Definition: mp4tag.h:21
Mp4ExtendedFieldId(std::string_view mean, std::string_view name, bool updateOnly=false)
Constructs a new instance with the specified parameter.
Definition: mp4tag.h:31
std::string_view name
name parameter
Definition: mp4tag.h:23