Tag Parser  8.3.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
mediafileinfo.h
Go to the documentation of this file.
1 #ifndef TAG_PARSER_MEDIAINFO_H
2 #define TAG_PARSER_MEDIAINFO_H
3 
4 #include "./abstractcontainer.h"
5 #include "./basicfileinfo.h"
6 #include "./settings.h"
7 #include "./signature.h"
8 
9 #include <memory>
10 #include <unordered_set>
11 #include <vector>
12 
13 namespace TagParser {
14 
15 class Tag;
16 class Id3v1Tag;
17 class Id3v2Tag;
18 class Mp4Container;
19 class Mp4Atom;
20 class Mp4Tag;
21 class MatroskaContainer;
22 class OggContainer;
23 class EbmlElement;
24 class MatroskaTag;
25 class AbstractTrack;
26 class VorbisComment;
27 class Diagnostics;
28 class AbortableProgressFeedback;
29 
30 DECLARE_ENUM_CLASS(MediaType, unsigned int);
31 DECLARE_ENUM_CLASS(TagType, unsigned int);
32 
37 enum class ParsingStatus : byte {
38  NotParsedYet,
39  Ok,
40  NotSupported,
42 };
43 
45 public:
46  // constructor, destructor
47  MediaFileInfo();
48  MediaFileInfo(const std::string &path);
49  MediaFileInfo(const MediaFileInfo &) = delete;
50  MediaFileInfo &operator=(const MediaFileInfo &) = delete;
51  ~MediaFileInfo() override;
52 
53  // methods to parse file
54  void parseContainerFormat(Diagnostics &diag);
55  void parseTracks(Diagnostics &diag);
56  void parseTags(Diagnostics &diag);
57  void parseChapters(Diagnostics &diag);
58  void parseAttachments(Diagnostics &diag);
59  void parseEverything(Diagnostics &diag);
60 
61  // methods to apply changes
62  void applyChanges(Diagnostics &diag, AbortableProgressFeedback &progress);
63 
64  // methods to get parsed information regarding ...
65  // ... the container
66  ContainerFormat containerFormat() const;
67  const char *containerFormatName() const;
68  const char *containerFormatAbbreviation() const;
69  const char *containerFormatSubversion() const;
70  const char *mimeType() const;
71  uint64 containerOffset() const;
72  uint64 paddingSize() const;
73  AbstractContainer *container() const;
74  ParsingStatus containerParsingStatus() const;
75  // ... the capters
76  ParsingStatus chaptersParsingStatus() const;
77  std::vector<AbstractChapter *> chapters() const;
78  bool areChaptersSupported() const;
79  // ... the attachments
80  ParsingStatus attachmentsParsingStatus() const;
81  std::vector<AbstractAttachment *> attachments() const;
82  bool areAttachmentsSupported() const;
83  // ... the tracks
84  ParsingStatus tracksParsingStatus() const;
85  std::size_t trackCount() const;
86  std::vector<AbstractTrack *> tracks() const;
87  bool hasTracksOfType(TagParser::MediaType type) const;
89  double overallAverageBitrate() const;
90  std::unordered_set<std::string> availableLanguages(TagParser::MediaType type = TagParser::MediaType::Audio) const;
91  std::string technicalSummary() const;
92  bool areTracksSupported() const;
93  // ... the tags
94  ParsingStatus tagsParsingStatus() const;
95  bool hasId3v1Tag() const;
96  bool hasId3v2Tag() const;
97  bool hasAnyTag() const;
98  Id3v1Tag *id3v1Tag() const;
99  const std::vector<std::unique_ptr<Id3v2Tag>> &id3v2Tags() const;
100  void tags(std::vector<Tag *> &tags) const;
101  std::vector<Tag *> tags() const;
102  Mp4Tag *mp4Tag() const;
103  const std::vector<std::unique_ptr<MatroskaTag>> &matroskaTags() const;
104  VorbisComment *vorbisComment() const;
105  bool areTagsSupported() const;
106 
107  // methods to create/remove tags
108  bool createAppropriateTags(const TagCreationSettings &settings = TagCreationSettings());
109  bool removeId3v1Tag();
110  Id3v1Tag *createId3v1Tag();
111  bool removeId3v2Tag(Id3v2Tag *tag);
112  bool removeAllId3v2Tags();
113  Id3v2Tag *createId3v2Tag();
114  bool removeTag(Tag *tag);
115  void removeAllTags();
116  void mergeId3v2Tags();
117  bool id3v1ToId3v2();
118  bool id3v2ToId3v1();
119  VorbisComment *createVorbisComment();
120  bool removeVorbisComment();
121  void clearParsingResults();
122 
123  // methods to get, set object behaviour
124  const std::string &backupDirectory() const;
125  void setBackupDirectory(const std::string &backupDirectory);
126  const std::string &saveFilePath() const;
127  void setSaveFilePath(const std::string &saveFilePath);
128  const std::string writingApplication() const;
129  void setWritingApplication(const std::string &writingApplication);
130  void setWritingApplication(const char *writingApplication);
131  bool isForcingFullParse() const;
132  void setForceFullParse(bool forceFullParse);
133  bool isForcingRewrite() const;
134  void setForceRewrite(bool forceRewrite);
135  size_t minPadding() const;
136  void setMinPadding(size_t minPadding);
137  size_t maxPadding() const;
138  void setMaxPadding(size_t maxPadding);
139  size_t preferredPadding() const;
140  void setPreferredPadding(size_t preferredPadding);
141  ElementPosition tagPosition() const;
142  void setTagPosition(ElementPosition tagPosition);
143  bool forceTagPosition() const;
144  void setForceTagPosition(bool forceTagPosition);
145  ElementPosition indexPosition() const;
146  void setIndexPosition(ElementPosition indexPosition);
147  bool forceIndexPosition() const;
148  void setForceIndexPosition(bool forceTagPosition);
149 
150 protected:
151  void invalidated() override;
152 
153 private:
154  // private methods internally used when rewriting the file to apply new tag information
155  // currently only the makeMp3File() methods is present; corresponding methods for
156  // other formats are outsourced to container classes
157  void makeMp3File(Diagnostics &diag, AbortableProgressFeedback &progress);
158 
159  // fields related to the container
160  ParsingStatus m_containerParsingStatus;
161  ContainerFormat m_containerFormat;
162  std::streamoff m_containerOffset;
163  uint64 m_paddingSize;
164  bool m_actualExistingId3v1Tag;
165  std::vector<std::streamoff> m_actualId3v2TagOffsets;
166  std::unique_ptr<AbstractContainer> m_container;
167 
168  // fields related to the tracks
169  ParsingStatus m_tracksParsingStatus;
170  std::unique_ptr<AbstractTrack> m_singleTrack;
171 
172  // fields related to the tag
173  ParsingStatus m_tagsParsingStatus;
174  std::unique_ptr<Id3v1Tag> m_id3v1Tag;
175  std::vector<std::unique_ptr<Id3v2Tag>> m_id3v2Tags;
176 
177  // fields related to the chapters and the attachments
178  ParsingStatus m_chaptersParsingStatus;
179  ParsingStatus m_attachmentsParsingStatus;
180 
181  // fields specifying object behaviour
182  std::string m_backupDirectory;
183  std::string m_saveFilePath;
184  std::string m_writingApplication;
185  size_t m_minPadding;
186  size_t m_maxPadding;
187  size_t m_preferredPadding;
188  ElementPosition m_tagPosition;
189  ElementPosition m_indexPosition;
190  bool m_forceFullParse;
191  bool m_forceRewrite;
192  bool m_forceTagPosition;
193  bool m_forceIndexPosition;
194 };
195 
200 {
201  return m_containerParsingStatus;
202 }
203 
211 {
212  return m_containerFormat;
213 }
214 
225 inline const char *MediaFileInfo::containerFormatName() const
226 {
227  return TagParser::containerFormatName(m_containerFormat);
228 }
229 
241 {
242  return TagParser::containerFormatSubversion(m_containerFormat);
243 }
244 
248 inline uint64 MediaFileInfo::containerOffset() const
249 {
250  return static_cast<uint64>(m_containerOffset);
251 }
252 
256 inline uint64 MediaFileInfo::paddingSize() const
257 {
258  return m_paddingSize;
259 }
260 
265 {
266  return m_tagsParsingStatus;
267 }
268 
273 {
274  return m_tracksParsingStatus;
275 }
276 
285 inline size_t MediaFileInfo::trackCount() const
286 {
287  return m_singleTrack ? 1 : (m_container ? m_container->trackCount() : 0);
288 }
289 
294 {
295  return m_chaptersParsingStatus;
296 }
297 
302 {
303  return m_attachmentsParsingStatus;
304 }
305 
309 inline bool MediaFileInfo::hasId3v1Tag() const
310 {
311  return m_id3v1Tag != nullptr;
312 }
313 
317 inline bool MediaFileInfo::hasId3v2Tag() const
318 {
319  return !m_id3v2Tags.empty();
320 }
321 
330 {
331  return m_id3v1Tag.get();
332 }
333 
341 inline const std::vector<std::unique_ptr<Id3v2Tag>> &MediaFileInfo::id3v2Tags() const
342 {
343  return m_id3v2Tags;
344 }
345 
351 inline const std::string &MediaFileInfo::backupDirectory() const
352 {
353  return m_backupDirectory;
354 }
355 
360 inline void MediaFileInfo::setBackupDirectory(const std::string &backupDirectory)
361 {
362  m_backupDirectory = backupDirectory;
363 }
364 
369 inline const std::string &MediaFileInfo::saveFilePath() const
370 {
371  return m_saveFilePath;
372 }
373 
388 inline void MediaFileInfo::setSaveFilePath(const std::string &saveFilePath)
389 {
390  m_saveFilePath = saveFilePath;
391 }
392 
398 inline const std::string MediaFileInfo::writingApplication() const
399 {
400  return m_writingApplication;
401 }
402 
407 inline void MediaFileInfo::setWritingApplication(const std::string &writingApplication)
408 {
409  m_writingApplication = writingApplication;
410 }
411 
416 inline void MediaFileInfo::setWritingApplication(const char *writingApplication)
417 {
418  m_writingApplication = writingApplication;
419 }
420 
432 {
433  return m_container.get();
434 }
435 
445 {
446  return m_forceFullParse;
447 }
448 
454 inline void MediaFileInfo::setForceFullParse(bool forceFullParse)
455 {
456  m_forceFullParse = forceFullParse;
457 }
458 
463 {
464  return m_forceRewrite;
465 }
466 
470 inline void MediaFileInfo::setForceRewrite(bool forceRewrite)
471 {
472  m_forceRewrite = forceRewrite;
473 }
474 
487 inline size_t MediaFileInfo::minPadding() const
488 {
489  return m_minPadding;
490 }
491 
497 inline void MediaFileInfo::setMinPadding(size_t minPadding)
498 {
499  m_minPadding = minPadding;
500 }
501 
515 inline size_t MediaFileInfo::maxPadding() const
516 {
517  return m_maxPadding;
518 }
519 
525 inline void MediaFileInfo::setMaxPadding(size_t maxPadding)
526 {
527  m_maxPadding = maxPadding;
528 }
529 
536 inline size_t MediaFileInfo::preferredPadding() const
537 {
538  return m_preferredPadding;
539 }
540 
546 inline void MediaFileInfo::setPreferredPadding(size_t preferredPadding)
547 {
548  m_preferredPadding = preferredPadding;
549 }
550 
557 {
558  return m_tagPosition;
559 }
560 
572 {
573  m_tagPosition = tagPosition;
574 }
575 
582 {
583  return m_forceTagPosition;
584 }
585 
591 inline void MediaFileInfo::setForceTagPosition(bool forceTagPosition)
592 {
593  m_forceTagPosition = forceTagPosition;
594 }
595 
602 {
603  return m_indexPosition;
604 }
605 
612 {
613  m_indexPosition = indexPosition;
614 }
615 
622 {
623  return m_forceIndexPosition;
624 }
625 
631 inline void MediaFileInfo::setForceIndexPosition(bool forceIndexPosition)
632 {
633  m_forceIndexPosition = forceIndexPosition;
634 }
635 
636 } // namespace TagParser
637 
638 #endif // TAG_PARSER_MEDIAINFO_H
Implementation of TagParser::Tag for the MP4 container.
Definition: mp4tag.h:97
const char * containerFormatSubversion() const
Returns the subversion of the container format as C-style string.
size_t preferredPadding() const
Returns the padding to be written before the data block when applying changes and the file needs to b...
The Tag class is used to store, read and write tag information.
Definition: tag.h:98
Id3v1Tag * id3v1Tag() const
Returns a pointer to the assigned ID3v1 tag or nullptr if none is assigned.
DECLARE_ENUM_CLASS(MediaType, unsigned int)
bool forceTagPosition() const
Returns whether tagPosition() is forced.
ParsingStatus tagsParsingStatus() const
Returns an indication whether tag information has been parsed yet.
bool hasId3v1Tag() const
Returns an indication whether an ID3v1 tag is assigned.
std::size_t trackCount() const
Returns the number of tracks that could be parsed.
void setForceRewrite(bool forceRewrite)
Sets whether forcing rewriting (when applying changes) is enabled.
ParsingStatus attachmentsParsingStatus() const
Returns whether the attachments have been parsed yet.
MediaType
The MediaType enum specifies the type of media data (audio, video, text, ...).
Definition: mediaformat.h:13
const std::vector< std::unique_ptr< Id3v2Tag > > & id3v2Tags() const
Returns pointers to the assigned ID3v2 tags.
void setMaxPadding(size_t maxPadding)
Sets the maximum padding to be written before the data blocks when applying changes.
The TagSettings struct contains settings which can be passed to MediaFileInfo::createAppropriateTags(...
Definition: settings.h:70
bool isForcingRewrite() const
Returns whether forcing rewriting (when applying changes) is enabled.
uint64 paddingSize() const
Returns the padding size.
The AbstractContainer class provides an interface and common functionality to parse and make a certai...
ParsingStatus chaptersParsingStatus() const
Returns whether the chapters have been parsed yet.
size_t maxPadding() const
Returns the maximum padding to be written before the data blocks when applying changes.
void setTagPosition(ElementPosition tagPosition)
Sets the position (in the output file) where the tag information is written when applying changes.
void setBackupDirectory(const std::string &backupDirectory)
Sets the directory used to store backup files.
The MediaFileInfo class allows to read and write tag information providing a container/tag format ind...
Definition: mediafileinfo.h:44
ContainerFormat containerFormat() const
Returns the container format of the current file.
void setForceTagPosition(bool forceTagPosition)
Sets whether tagPosition() is forced.
const char * containerFormatName() const
Returns the name of the container format as C-style string.
ContainerFormat
Specifies the container format.
Definition: signature.h:17
bool hasId3v2Tag() const
Returns an indication whether an ID3v2 tag is assigned.
Implementation of TagParser::Tag for Vorbis comments.
Definition: vorbiscomment.h:25
TAG_PARSER_EXPORT const char * containerFormatName(ContainerFormat containerFormat)
Returns the name of the specified container format as C-style string.
Definition: signature.cpp:371
void setPreferredPadding(size_t preferredPadding)
Sets the padding to be written before the data block when applying changes and the file needs to be r...
bool isForcingFullParse() const
Returns an indication whether forcing a full parse is enabled.
size_t minPadding() const
Returns the minimum padding to be written before the data blocks when applying changes.
bool forceIndexPosition() const
Returns whether indexPosition() is forced.
TAG_PARSER_EXPORT const char * 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...
Definition: signature.cpp:249
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks.
void setForceIndexPosition(bool forceTagPosition)
Sets whether indexPosition() is forced.
ParsingStatus
The ParsingStatus enum specifies whether a certain part of the file (tracks, tags,...
Definition: mediafileinfo.h:37
void setForceFullParse(bool forceFullParse)
Sets whether forcing a full parse is enabled.
ParsingStatus tracksParsingStatus() const
Returns an indication whether tracks have been parsed yet.
const std::string & saveFilePath() const
Returns the "save file path" which has been set using setSaveFilePath().
ElementPosition tagPosition() const
Returns the position (in the output file) where the tag information is written when applying changes.
uint64 containerOffset() const
Returns the actual container start offset.
AbstractContainer * container() const
Returns the container for the current file.
ElementPosition indexPosition() const
Returns the position (in the output file) where the index is written when applying changes.
Implementation of TagParser::Tag for ID3v2 tags.
Definition: id3v2tag.h:61
void setSaveFilePath(const std::string &saveFilePath)
Sets the "save file path".
constexpr TAG_PARSER_EXPORT const char * duration()
Implementation of TagParser::Tag for ID3v1 tags.
Definition: id3v1tag.h:10
ParsingStatus containerParsingStatus() const
Returns an indication whether the container format has been parsed yet.
void setMinPadding(size_t minPadding)
Sets the minimum padding to be written before the data blocks when applying changes.
const std::string & backupDirectory() const
Returns the directory used to store backup files.
void setIndexPosition(ElementPosition indexPosition)
Sets the position (in the output file) where the index is written when applying changes.
TagType
Specifies the tag type.
Definition: tag.h:20
TAG_PARSER_EXPORT const char * containerFormatSubversion(ContainerFormat containerFormat)
Returns the subversion of the container format as C-style string.
Definition: signature.cpp:476
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:9
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
void setWritingApplication(const std::string &writingApplication)
Sets the writing application as container-level meta-data.
const std::string writingApplication() const
Sets the writing application as container-level meta-data.
ElementPosition
Definition: settings.h:10
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
The BasicFileInfo class provides basic file information such as file name, extension,...
Definition: basicfileinfo.h:13