Tag Parser  8.0.1
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  std::unordered_set<std::string> availableLanguages(TagParser::MediaType type = TagParser::MediaType::Audio) const;
90  std::string technicalSummary() const;
91  bool areTracksSupported() const;
92  // ... the tags
93  ParsingStatus tagsParsingStatus() const;
94  bool hasId3v1Tag() const;
95  bool hasId3v2Tag() const;
96  bool hasAnyTag() const;
97  Id3v1Tag *id3v1Tag() const;
98  const std::vector<std::unique_ptr<Id3v2Tag>> &id3v2Tags() const;
99  void tags(std::vector<Tag *> &tags) const;
100  std::vector<Tag *> tags() const;
101  Mp4Tag *mp4Tag() const;
102  const std::vector<std::unique_ptr<MatroskaTag>> &matroskaTags() const;
103  VorbisComment *vorbisComment() const;
104  bool areTagsSupported() const;
105 
106  // methods to create/remove tags
107  bool createAppropriateTags(const TagCreationSettings &settings = TagCreationSettings());
108  bool removeId3v1Tag();
109  Id3v1Tag *createId3v1Tag();
110  bool removeId3v2Tag(Id3v2Tag *tag);
111  bool removeAllId3v2Tags();
112  Id3v2Tag *createId3v2Tag();
113  bool removeTag(Tag *tag);
114  void removeAllTags();
115  void mergeId3v2Tags();
116  bool id3v1ToId3v2();
117  bool id3v2ToId3v1();
118  VorbisComment *createVorbisComment();
119  bool removeVorbisComment();
120  void clearParsingResults();
121 
122  // methods to get, set object behaviour
123  const std::string &backupDirectory() const;
124  void setBackupDirectory(const std::string &backupDirectory);
125  const std::string &saveFilePath() const;
126  void setSaveFilePath(const std::string &saveFilePath);
127  const std::string writingApplication() const;
128  void setWritingApplication(const std::string &writingApplication);
129  void setWritingApplication(const char *writingApplication);
130  bool isForcingFullParse() const;
131  void setForceFullParse(bool forceFullParse);
132  bool isForcingRewrite() const;
133  void setForceRewrite(bool forceRewrite);
134  size_t minPadding() const;
135  void setMinPadding(size_t minPadding);
136  size_t maxPadding() const;
137  void setMaxPadding(size_t maxPadding);
138  size_t preferredPadding() const;
139  void setPreferredPadding(size_t preferredPadding);
140  ElementPosition tagPosition() const;
141  void setTagPosition(ElementPosition tagPosition);
142  bool forceTagPosition() const;
143  void setForceTagPosition(bool forceTagPosition);
144  ElementPosition indexPosition() const;
145  void setIndexPosition(ElementPosition indexPosition);
146  bool forceIndexPosition() const;
147  void setForceIndexPosition(bool forceTagPosition);
148 
149 protected:
150  void invalidated() override;
151 
152 private:
153  // private methods internally used when rewriting the file to apply new tag information
154  // currently only the makeMp3File() methods is present; corresponding methods for
155  // other formats are outsourced to container classes
156  void makeMp3File(Diagnostics &diag, AbortableProgressFeedback &progress);
157 
158  // fields related to the container
159  ParsingStatus m_containerParsingStatus;
160  ContainerFormat m_containerFormat;
161  std::streamoff m_containerOffset;
162  uint64 m_paddingSize;
163  bool m_actualExistingId3v1Tag;
164  std::vector<std::streamoff> m_actualId3v2TagOffsets;
165  std::unique_ptr<AbstractContainer> m_container;
166 
167  // fields related to the tracks
168  ParsingStatus m_tracksParsingStatus;
169  std::unique_ptr<AbstractTrack> m_singleTrack;
170 
171  // fields related to the tag
172  ParsingStatus m_tagsParsingStatus;
173  std::unique_ptr<Id3v1Tag> m_id3v1Tag;
174  std::vector<std::unique_ptr<Id3v2Tag>> m_id3v2Tags;
175 
176  // fields related to the chapters and the attachments
177  ParsingStatus m_chaptersParsingStatus;
178  ParsingStatus m_attachmentsParsingStatus;
179 
180  // fields specifying object behaviour
181  std::string m_backupDirectory;
182  std::string m_saveFilePath;
183  std::string m_writingApplication;
184  size_t m_minPadding;
185  size_t m_maxPadding;
186  size_t m_preferredPadding;
187  ElementPosition m_tagPosition;
188  ElementPosition m_indexPosition;
189  bool m_forceFullParse;
190  bool m_forceRewrite;
191  bool m_forceTagPosition;
192  bool m_forceIndexPosition;
193 };
194 
199 {
200  return m_containerParsingStatus;
201 }
202 
210 {
211  return m_containerFormat;
212 }
213 
224 inline const char *MediaFileInfo::containerFormatName() const
225 {
226  return TagParser::containerFormatName(m_containerFormat);
227 }
228 
240 {
241  return TagParser::containerFormatSubversion(m_containerFormat);
242 }
243 
247 inline uint64 MediaFileInfo::containerOffset() const
248 {
249  return static_cast<uint64>(m_containerOffset);
250 }
251 
255 inline uint64 MediaFileInfo::paddingSize() const
256 {
257  return m_paddingSize;
258 }
259 
264 {
265  return m_tagsParsingStatus;
266 }
267 
272 {
273  return m_tracksParsingStatus;
274 }
275 
284 inline size_t MediaFileInfo::trackCount() const
285 {
286  return m_singleTrack ? 1 : (m_container ? m_container->trackCount() : 0);
287 }
288 
293 {
294  return m_chaptersParsingStatus;
295 }
296 
301 {
302  return m_attachmentsParsingStatus;
303 }
304 
308 inline bool MediaFileInfo::hasId3v1Tag() const
309 {
310  return m_id3v1Tag != nullptr;
311 }
312 
316 inline bool MediaFileInfo::hasId3v2Tag() const
317 {
318  return !m_id3v2Tags.empty();
319 }
320 
329 {
330  return m_id3v1Tag.get();
331 }
332 
340 inline const std::vector<std::unique_ptr<Id3v2Tag>> &MediaFileInfo::id3v2Tags() const
341 {
342  return m_id3v2Tags;
343 }
344 
350 inline const std::string &MediaFileInfo::backupDirectory() const
351 {
352  return m_backupDirectory;
353 }
354 
359 inline void MediaFileInfo::setBackupDirectory(const std::string &backupDirectory)
360 {
361  m_backupDirectory = backupDirectory;
362 }
363 
368 inline const std::string &MediaFileInfo::saveFilePath() const
369 {
370  return m_saveFilePath;
371 }
372 
387 inline void MediaFileInfo::setSaveFilePath(const std::string &saveFilePath)
388 {
389  m_saveFilePath = saveFilePath;
390 }
391 
397 inline const std::string MediaFileInfo::writingApplication() const
398 {
399  return m_writingApplication;
400 }
401 
406 inline void MediaFileInfo::setWritingApplication(const std::string &writingApplication)
407 {
408  m_writingApplication = writingApplication;
409 }
410 
415 inline void MediaFileInfo::setWritingApplication(const char *writingApplication)
416 {
417  m_writingApplication = writingApplication;
418 }
419 
431 {
432  return m_container.get();
433 }
434 
444 {
445  return m_forceFullParse;
446 }
447 
453 inline void MediaFileInfo::setForceFullParse(bool forceFullParse)
454 {
455  m_forceFullParse = forceFullParse;
456 }
457 
462 {
463  return m_forceRewrite;
464 }
465 
469 inline void MediaFileInfo::setForceRewrite(bool forceRewrite)
470 {
471  m_forceRewrite = forceRewrite;
472 }
473 
486 inline size_t MediaFileInfo::minPadding() const
487 {
488  return m_minPadding;
489 }
490 
496 inline void MediaFileInfo::setMinPadding(size_t minPadding)
497 {
498  m_minPadding = minPadding;
499 }
500 
514 inline size_t MediaFileInfo::maxPadding() const
515 {
516  return m_maxPadding;
517 }
518 
524 inline void MediaFileInfo::setMaxPadding(size_t maxPadding)
525 {
526  m_maxPadding = maxPadding;
527 }
528 
535 inline size_t MediaFileInfo::preferredPadding() const
536 {
537  return m_preferredPadding;
538 }
539 
545 inline void MediaFileInfo::setPreferredPadding(size_t preferredPadding)
546 {
547  m_preferredPadding = preferredPadding;
548 }
549 
556 {
557  return m_tagPosition;
558 }
559 
571 {
572  m_tagPosition = tagPosition;
573 }
574 
581 {
582  return m_forceTagPosition;
583 }
584 
590 inline void MediaFileInfo::setForceTagPosition(bool forceTagPosition)
591 {
592  m_forceTagPosition = forceTagPosition;
593 }
594 
601 {
602  return m_indexPosition;
603 }
604 
611 {
612  m_indexPosition = indexPosition;
613 }
614 
621 {
622  return m_forceIndexPosition;
623 }
624 
630 inline void MediaFileInfo::setForceIndexPosition(bool forceIndexPosition)
631 {
632  m_forceIndexPosition = forceIndexPosition;
633 }
634 
635 } // namespace TagParser
636 
637 #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:95
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, ...) has been parsed yet and if what the parsing result is.
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, directory and size for a specified file.
Definition: basicfileinfo.h:13