Tag Parser 12.1.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
Loading...
Searching...
No Matches
mediafileinfo.h
Go to the documentation of this file.
1#ifndef TAG_PARSER_MEDIAINFO_H
2#define TAG_PARSER_MEDIAINFO_H
3
5#include "./basicfileinfo.h"
6#include "./settings.h"
7#include "./signature.h"
8
9#include <cstdint>
10#include <memory>
11#include <unordered_set>
12#include <vector>
13
14#include <c++utilities/misc/flagenumclass.h>
15
16namespace TagParser {
17
18class Tag;
19class Id3v1Tag;
20class Id3v2Tag;
21class Mp4Container;
22class Mp4Atom;
23class Mp4Tag;
24class MatroskaContainer;
25class OggContainer;
26class EbmlElement;
27class MatroskaTag;
28class AbstractTrack;
29class VorbisComment;
30class Diagnostics;
31class AbortableProgressFeedback;
32
33enum class MediaType : unsigned int;
34enum class TagType : unsigned int;
35
40enum class ParsingStatus : std::uint8_t {
42 Ok,
45};
46
50enum class MediaFileStructureFlags : std::uint64_t {
51 None,
52 ActualExistingId3v1Tag = (1 << 0),
53};
54
58enum class MediaFileHandlingFlags : std::uint64_t {
59 None,
61 = (1 << 0),
62 ForceRewrite = (1 << 1),
63 ForceTagPosition = (1 << 2),
64 ForceIndexPosition = (1 << 3),
65 NormalizeKnownTagFieldIds = (1 << 4),
66 PreserveRawTimingValues = (1 << 8),
67 PreserveMuxingApplication = (1 << 9),
68 PreserveWritingApplication = (1 << 10),
69};
70
71} // namespace TagParser
72
75
76namespace TagParser {
77
78struct MediaFileInfoPrivate;
79
81public:
82 // constructor, destructor
83 explicit MediaFileInfo();
84 explicit MediaFileInfo(std::string_view path);
85 explicit MediaFileInfo(std::string &&path);
86 MediaFileInfo(const MediaFileInfo &) = delete;
88 ~MediaFileInfo() override;
89
90 // methods to parse file
91 void parseContainerFormat(Diagnostics &diag, AbortableProgressFeedback &progress);
92 void parseTracks(Diagnostics &diag, AbortableProgressFeedback &progress);
93 void parseTags(Diagnostics &diag, AbortableProgressFeedback &progress);
94 void parseChapters(Diagnostics &diag, AbortableProgressFeedback &progress);
95 void parseAttachments(Diagnostics &diag, AbortableProgressFeedback &progress);
96 void parseEverything(Diagnostics &diag, AbortableProgressFeedback &progress);
97
98 // methods to apply changes
99 void applyChanges(Diagnostics &diag, AbortableProgressFeedback &progress);
100
101 // methods to get parsed information regarding ...
102 // ... the container
103 ContainerFormat containerFormat() const;
104 std::string_view containerFormatName() const;
105 std::string_view containerFormatAbbreviation() const;
106 std::string_view containerFormatSubversion() const;
107 std::string_view mimeType() const;
108 std::uint64_t containerOffset() const;
109 std::uint64_t paddingSize() const;
110 std::uint64_t effectiveSize() const;
111 AbstractContainer *container() const;
112 ParsingStatus containerParsingStatus() const;
113 // ... the chapters
114 ParsingStatus chaptersParsingStatus() const;
115 std::vector<AbstractChapter *> chapters() const;
116 bool areChaptersSupported() const;
117 // ... the attachments
118 ParsingStatus attachmentsParsingStatus() const;
119 std::vector<AbstractAttachment *> attachments() const;
120 bool areAttachmentsSupported() const;
121 // ... the tracks
122 ParsingStatus tracksParsingStatus() const;
123 std::size_t trackCount() const;
124 std::vector<AbstractTrack *> tracks() const;
125 bool hasTracksOfType(TagParser::MediaType type) const;
126 CppUtilities::TimeSpan duration() const;
127 double overallAverageBitrate() const;
128 std::unordered_set<std::string> availableLanguages(TagParser::MediaType type = TagParser::MediaType::Audio) const;
129 std::string technicalSummary() const;
130 bool areTracksSupported() const;
131 // ... the tags
132 ParsingStatus tagsParsingStatus() const;
133 bool hasId3v1Tag() const;
134 bool hasId3v2Tag() const;
135 bool hasAnyTag() const;
136 Id3v1Tag *id3v1Tag() const;
137 const std::vector<std::unique_ptr<Id3v2Tag>> &id3v2Tags() const;
138 void tags(std::vector<Tag *> &tags) const;
139 std::vector<Tag *> tags() const;
140 void parsedTags(std::vector<Tag *> &tags) const;
141 std::vector<Tag *> parsedTags() const;
142 Mp4Tag *mp4Tag() const;
143 const std::vector<std::unique_ptr<MatroskaTag>> &matroskaTags() const;
144 VorbisComment *vorbisComment() const;
145 bool areTagsSupported() const;
146
147 // methods to create/remove tags
148 bool createAppropriateTags(const TagCreationSettings &settings = TagCreationSettings());
149 bool removeId3v1Tag();
150 Id3v1Tag *createId3v1Tag();
151 bool removeId3v2Tag(Id3v2Tag *tag);
152 bool removeAllId3v2Tags();
153 Id3v2Tag *createId3v2Tag();
154 bool removeTag(Tag *tag);
155 void removeAllTags();
156 void mergeId3v2Tags();
157 bool id3v1ToId3v2();
158 bool id3v2ToId3v1();
159 VorbisComment *createVorbisComment();
160 bool removeVorbisComment();
161 void clearParsingResults();
162
163 // methods to get, set object behaviour
164 const std::string &backupDirectory() const;
165 void setBackupDirectory(std::string_view backupDirectory);
166 void setBackupDirectory(std::string &&backupDirectory);
167 const std::string &saveFilePath() const;
168 void setSaveFilePath(std::string_view saveFilePath);
169 void setSaveFilePath(std::string &&saveFilePath);
170 const std::string &writingApplication() const;
171 void setWritingApplication(std::string_view writingApplication);
172 MediaFileHandlingFlags fileHandlingFlags();
173 void setFileHandlingFlags(MediaFileHandlingFlags flags);
174 bool isForcingFullParse() const;
175 void setForceFullParse(bool forceFullParse);
176 bool isForcingRewrite() const;
177 void setForceRewrite(bool forceRewrite);
178 std::size_t minPadding() const;
179 void setMinPadding(std::size_t minPadding);
180 std::size_t maxPadding() const;
181 void setMaxPadding(std::size_t maxPadding);
182 std::size_t preferredPadding() const;
183 void setPreferredPadding(std::size_t preferredPadding);
184 ElementPosition tagPosition() const;
185 void setTagPosition(ElementPosition tagPosition);
186 bool forceTagPosition() const;
187 void setForceTagPosition(bool forceTagPosition);
188 ElementPosition indexPosition() const;
189 void setIndexPosition(ElementPosition indexPosition);
190 bool forceIndexPosition() const;
191 void setForceIndexPosition(bool forceTagPosition);
192 std::uint64_t maxFullParseSize() const;
193 void setMaxFullParseSize(std::uint64_t maxFullParseSize);
194
195protected:
196 void invalidated() override;
197
198private:
199 // private methods internally used when rewriting the file to apply new tag information
200 // currently only the makeMp3File() methods is present; corresponding methods for
201 // other formats are outsourced to container classes
202 void makeMp3File(Diagnostics &diag, AbortableProgressFeedback &progress);
203
204 // fields related to the container
205 ParsingStatus m_containerParsingStatus;
206 ContainerFormat m_containerFormat;
207 std::streamoff m_containerOffset;
208 std::uint64_t m_paddingSize;
209 std::uint64_t m_effectiveSize;
210 std::vector<std::streamoff> m_actualId3v2TagOffsets;
211 std::unique_ptr<AbstractContainer> m_container;
212 MediaFileStructureFlags m_fileStructureFlags;
213
214 // fields related to the tracks
215 ParsingStatus m_tracksParsingStatus;
216 std::unique_ptr<AbstractTrack> m_singleTrack;
217
218 // fields related to the tag
219 ParsingStatus m_tagsParsingStatus;
220 std::unique_ptr<Id3v1Tag> m_id3v1Tag;
221 std::vector<std::unique_ptr<Id3v2Tag>> m_id3v2Tags;
222
223 // fields related to the chapters and the attachments
224 ParsingStatus m_chaptersParsingStatus;
225 ParsingStatus m_attachmentsParsingStatus;
226
227 // fields specifying object behaviour
228 std::string m_backupDirectory;
229 std::string m_saveFilePath;
230 std::string m_writingApplication;
231 std::size_t m_minPadding;
232 std::size_t m_maxPadding;
233 std::size_t m_preferredPadding;
234 ElementPosition m_tagPosition;
235 ElementPosition m_indexPosition;
236 MediaFileHandlingFlags m_fileHandlingFlags;
237 std::uint64_t m_maxFullParseSize;
238 std::unique_ptr<MediaFileInfoPrivate> m_p;
239};
240
245{
246 return m_containerParsingStatus;
247}
248
256{
257 return m_containerFormat;
258}
259
270inline std::string_view MediaFileInfo::containerFormatName() const
271{
272 return TagParser::containerFormatName(m_containerFormat);
273}
274
285inline std::string_view MediaFileInfo::containerFormatSubversion() const
286{
287 return TagParser::containerFormatSubversion(m_containerFormat);
288}
289
293inline std::uint64_t MediaFileInfo::containerOffset() const
294{
295 return static_cast<std::uint64_t>(m_containerOffset);
296}
297
301inline std::uint64_t MediaFileInfo::paddingSize() const
302{
303 return m_paddingSize;
304}
305
310inline std::uint64_t MediaFileInfo::effectiveSize() const
311{
312 return m_effectiveSize;
313}
314
319{
320 return m_tagsParsingStatus;
321}
322
327{
328 return m_tracksParsingStatus;
329}
330
339inline std::size_t MediaFileInfo::trackCount() const
340{
341 return m_singleTrack ? 1 : (m_container ? m_container->trackCount() : 0);
342}
343
348{
349 return m_chaptersParsingStatus;
350}
351
356{
357 return m_attachmentsParsingStatus;
358}
359
363inline bool MediaFileInfo::hasId3v1Tag() const
364{
365 return m_id3v1Tag != nullptr;
366}
367
371inline bool MediaFileInfo::hasId3v2Tag() const
372{
373 return !m_id3v2Tags.empty();
374}
375
384{
385 return m_id3v1Tag.get();
386}
387
395inline const std::vector<std::unique_ptr<Id3v2Tag>> &MediaFileInfo::id3v2Tags() const
396{
397 return m_id3v2Tags;
398}
399
405inline const std::string &MediaFileInfo::backupDirectory() const
406{
407 return m_backupDirectory;
408}
409
414inline void MediaFileInfo::setBackupDirectory(std::string_view backupDirectory)
415{
416 m_backupDirectory = backupDirectory;
417}
418
423inline void MediaFileInfo::setBackupDirectory(std::string &&backupDirectory)
424{
425 m_backupDirectory = std::move(backupDirectory);
426}
427
432inline const std::string &MediaFileInfo::saveFilePath() const
433{
434 return m_saveFilePath;
435}
436
451inline void MediaFileInfo::setSaveFilePath(std::string_view saveFilePath)
452{
453 m_saveFilePath = saveFilePath;
454}
455
459inline void MediaFileInfo::setSaveFilePath(std::string &&saveFilePath)
460{
461 m_saveFilePath = std::move(saveFilePath);
462}
463
469inline const std::string &MediaFileInfo::writingApplication() const
470{
471 return m_writingApplication;
472}
473
480inline void MediaFileInfo::setWritingApplication(std::string_view writingApplication)
481{
482 m_writingApplication = writingApplication;
483}
484
496{
497 return m_container.get();
498}
499
504{
505 return m_fileHandlingFlags;
506}
507
512{
513 m_fileHandlingFlags = flags;
514}
515
525{
526 return m_fileHandlingFlags & MediaFileHandlingFlags::ForceFullParse;
527}
528
534inline void MediaFileInfo::setForceFullParse(bool forceFullParse)
535{
536 CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceFullParse, forceFullParse);
537}
538
543{
544 return m_fileHandlingFlags & MediaFileHandlingFlags::ForceRewrite;
545}
546
550inline void MediaFileInfo::setForceRewrite(bool forceRewrite)
551{
552 CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceRewrite, forceRewrite);
553}
554
567inline std::size_t MediaFileInfo::minPadding() const
568{
569 return m_minPadding;
570}
571
577inline void MediaFileInfo::setMinPadding(std::size_t minPadding)
578{
579 m_minPadding = minPadding;
580}
581
595inline std::size_t MediaFileInfo::maxPadding() const
596{
597 return m_maxPadding;
598}
599
605inline void MediaFileInfo::setMaxPadding(std::size_t maxPadding)
606{
607 m_maxPadding = maxPadding;
608}
609
616inline std::size_t MediaFileInfo::preferredPadding() const
617{
618 return m_preferredPadding;
619}
620
626inline void MediaFileInfo::setPreferredPadding(std::size_t preferredPadding)
627{
628 m_preferredPadding = preferredPadding;
629}
630
637{
638 return m_tagPosition;
639}
640
652{
653 m_tagPosition = tagPosition;
654}
655
662{
663 return m_fileHandlingFlags & MediaFileHandlingFlags::ForceTagPosition;
664}
665
671inline void MediaFileInfo::setForceTagPosition(bool forceTagPosition)
672{
673 CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceTagPosition, forceTagPosition);
674}
675
682{
683 return m_indexPosition;
684}
685
692{
693 m_indexPosition = indexPosition;
694}
695
702{
703 return m_fileHandlingFlags & MediaFileHandlingFlags::ForceIndexPosition;
704}
705
711inline void MediaFileInfo::setForceIndexPosition(bool forceIndexPosition)
712{
713 CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceIndexPosition, forceIndexPosition);
714}
715
729inline std::uint64_t MediaFileInfo::maxFullParseSize() const
730{
731 return m_maxFullParseSize;
732}
733
738inline void MediaFileInfo::setMaxFullParseSize(std::uint64_t maxFullParseSize)
739{
740 m_maxFullParseSize = maxFullParseSize;
741}
742
743} // namespace TagParser
744
745#endif // TAG_PARSER_MEDIAINFO_H
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks.
The AbstractContainer class provides an interface and common functionality to parse and make a certai...
The BasicFileInfo class provides basic file information such as file name, extension,...
The Diagnostics class is a container for DiagMessage.
Implementation of TagParser::Tag for ID3v1 tags.
Definition id3v1tag.h:10
Implementation of TagParser::Tag for ID3v2 tags.
Definition id3v2tag.h:78
The MediaFileInfo class allows to read and write tag information providing a container/tag format ind...
std::uint64_t maxFullParseSize() const
Returns the maximal file size for a "full parse" in byte.
bool isForcingRewrite() const
Returns whether forcing rewriting (when applying changes) is enabled.
const std::vector< std::unique_ptr< Id3v2Tag > > & id3v2Tags() const
Returns pointers to the assigned ID3v2 tags.
std::uint64_t paddingSize() const
Returns the padding size.
std::string_view containerFormatName() const
Returns the name of the container format as C-style string.
void setSaveFilePath(std::string_view saveFilePath)
Sets the "save file path".
std::string_view containerFormatSubversion() const
Returns the subversion of the container format as C-style string.
bool forceIndexPosition() const
Returns whether indexPosition() is forced.
MediaFileHandlingFlags fileHandlingFlags()
Returns the currently configured file handling flags.
ParsingStatus tagsParsingStatus() const
Returns an indication whether tag information has been parsed yet.
void setForceRewrite(bool forceRewrite)
Sets whether forcing rewriting (when applying changes) is enabled.
const std::string & saveFilePath() const
Returns the "save file path" which has been set using setSaveFilePath().
void setFileHandlingFlags(MediaFileHandlingFlags flags)
Replaces all currently configured file handling flags with the specified flags.
void setMaxFullParseSize(std::uint64_t maxFullParseSize)
Sets the maximal file size for a "full parse" in byte.
void setMaxPadding(std::size_t maxPadding)
Sets the maximum padding to be written before the data blocks when applying changes.
std::size_t trackCount() const
Returns the number of tracks that could be parsed.
void setMinPadding(std::size_t minPadding)
Sets the minimum padding to be written before the data blocks when applying changes.
MediaFileInfo & operator=(const MediaFileInfo &)=delete
std::size_t maxPadding() const
Returns the maximum padding to be written before the data blocks when applying changes.
ParsingStatus tracksParsingStatus() const
Returns an indication whether tracks have been parsed yet.
Id3v1Tag * id3v1Tag() const
Returns a pointer to the assigned ID3v1 tag or nullptr if none is assigned.
std::size_t preferredPadding() const
Returns the padding to be written before the data block when applying changes and the file needs to b...
const std::string & writingApplication() const
Sets the writing application as container-level meta-data.
void setForceTagPosition(bool forceTagPosition)
Sets whether tagPosition() is forced.
void setForceFullParse(bool forceFullParse)
Sets whether forcing a full parse is enabled.
std::size_t minPadding() const
Returns the minimum padding to be written before the data blocks when applying changes.
ParsingStatus attachmentsParsingStatus() const
Returns whether the attachments have been parsed yet.
bool hasId3v2Tag() const
Returns an indication whether an ID3v2 tag is assigned.
void setTagPosition(ElementPosition tagPosition)
Sets the position (in the output file) where the tag information is written when applying changes.
void setWritingApplication(std::string_view writingApplication)
Sets the writing application as container-level meta-data.
bool isForcingFullParse() const
Returns an indication whether forcing a full parse is enabled.
ElementPosition tagPosition() const
Returns the position (in the output file) where the tag information is written when applying changes.
std::uint64_t effectiveSize() const
Returns the "effective size" of the file if know; otherwise returns 0.
void setBackupDirectory(std::string_view backupDirectory)
Sets the directory used to store backup files.
AbstractContainer * container() const
Returns the container for the current file.
ContainerFormat containerFormat() const
Returns the container format of the current file.
ParsingStatus containerParsingStatus() const
Returns an indication whether the container format has been parsed yet.
MediaFileInfo(const MediaFileInfo &)=delete
std::uint64_t containerOffset() const
Returns the actual container start offset.
bool forceTagPosition() const
Returns whether tagPosition() is forced.
bool hasId3v1Tag() const
Returns an indication whether an ID3v1 tag is assigned.
ParsingStatus chaptersParsingStatus() const
Returns whether the chapters have been parsed yet.
void setIndexPosition(ElementPosition indexPosition)
Sets the position (in the output file) where the index is written when applying changes.
void setPreferredPadding(std::size_t preferredPadding)
Sets the padding to be written before the data block when applying changes and the file needs to be r...
ElementPosition indexPosition() const
Returns the position (in the output file) where the index is written when applying changes.
void setForceIndexPosition(bool forceTagPosition)
Sets whether indexPosition() is forced.
const std::string & backupDirectory() const
Returns the directory used to store backup files.
Implementation of TagParser::Tag for the MP4 container.
Definition mp4tag.h:97
The Tag class is used to store, read and write tag information.
Definition tag.h:166
Implementation of TagParser::Tag for Vorbis comments.
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
Definition global.h:13
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10
TAG_PARSER_EXPORT std::string_view containerFormatSubversion(ContainerFormat containerFormat)
Returns the subversion of the container format as C-style string.
ElementPosition
Definition settings.h:13
TAG_PARSER_EXPORT std::string_view containerFormatAbbreviation(ContainerFormat containerFormat, MediaType mediaType=MediaType::Unknown, unsigned int version=0)
Returns the abbreviation of the container format as C-style string considering the specified media ty...
TAG_PARSER_EXPORT std::string_view containerFormatName(ContainerFormat containerFormat)
Returns the name of the specified container format as C-style string.
TagType
Specifies the tag type.
Definition tagtype.h:11
ParsingStatus
The ParsingStatus enum specifies whether a certain part of the file (tracks, tags,...
MediaType
The MediaType enum specifies the type of media data (audio, video, text, ...).
Definition mediaformat.h:14
MediaFileStructureFlags
The MediaFileStructureFlags enum specifies flags which describing the structure of a media file.
ContainerFormat
Specifies the container format.
Definition signature.h:18
MediaFileHandlingFlags
The MediaFileHandlingFlags enum specifies flags which controls the behavior of MediaFileInfo objects.
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(TagParser, TagParser::TagCreationFlags)
The TagSettings struct contains settings which can be passed to MediaFileInfo::createAppropriateTags(...
Definition settings.h:50