Tag Parser  10.0.1
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
matroskachapter.cpp
Go to the documentation of this file.
1 #include "./matroskachapter.h"
2 #include "./ebmlelement.h"
3 #include "./matroskaid.h"
4 
5 #include "../diagnostics.h"
6 
7 #include <c++utilities/conversion/stringbuilder.h>
8 
9 #include <memory>
10 
11 using namespace std;
12 using namespace CppUtilities;
13 
14 namespace TagParser {
15 
24 MatroskaChapter::MatroskaChapter(EbmlElement *chapterAtomElement)
25  : m_chapterAtomElement(chapterAtomElement)
26 {
27 }
28 
33 {
34 }
35 
43 {
44  CPP_UTILITIES_UNUSED(progress)
45 
46  // clear previous values and status
47  static const string context("parsing \"ChapterAtom\"-element");
48  clear();
49  // iterate through children of "ChapterAtom"-element
50  for (EbmlElement *chapterAtomChild = m_chapterAtomElement->firstChild(); chapterAtomChild; chapterAtomChild = chapterAtomChild->nextSibling()) {
51  chapterAtomChild->parse(diag);
52  switch (chapterAtomChild->id()) {
54  m_id = chapterAtomChild->readUInteger();
55  break;
57  break;
59  m_startTime = TimeSpan(static_cast<std::int64_t>(chapterAtomChild->readUInteger() / 100u));
60  break;
62  m_endTime = TimeSpan(static_cast<std::int64_t>(chapterAtomChild->readUInteger() / 100u));
63  break;
65  m_hidden = chapterAtomChild->readUInteger() == 1;
66  break;
68  m_enabled = chapterAtomChild->readUInteger() == 1;
69  break;
73  break;
75  for (EbmlElement *chapterTrackElement = chapterAtomChild->firstChild(); chapterTrackElement;
76  chapterTrackElement = chapterTrackElement->nextSibling()) {
77  chapterTrackElement->parse(diag);
78  switch (chapterTrackElement->id()) {
80  m_tracks.emplace_back(chapterTrackElement->readUInteger());
81  break;
82  default:
83  diag.emplace_back(DiagLevel::Warning,
84  "\"ChapterTrack\"-element contains unknown child element \"" % chapterAtomChild->idToString() + "\". It will be ignored.",
85  context);
86  }
87  }
88  break;
90  m_names.emplace_back();
91  for (EbmlElement *chapterDisplayElement = chapterAtomChild->firstChild(); chapterDisplayElement;
92  chapterDisplayElement = chapterDisplayElement->nextSibling()) {
93  chapterDisplayElement->parse(diag);
94  switch (chapterDisplayElement->id()) {
96  if (m_names.back().empty()) {
97  m_names.back().assign(chapterDisplayElement->readString());
98  } else {
99  diag.emplace_back(DiagLevel::Warning,
100  "\"ChapterDisplay\"-element contains multiple \"ChapString\"-elements. Surplus occurrences will be ignored.", context);
101  }
102  break;
104  m_names.back().locale().emplace_back(chapterDisplayElement->readString(), LocaleFormat::ISO_639_2_B);
105  break;
107  m_names.back().locale().emplace_back(chapterDisplayElement->readString(), LocaleFormat::BCP_47);
108  break;
110  m_names.back().locale().emplace_back(chapterDisplayElement->readString(), LocaleFormat::DomainCountry);
111  break;
112  }
113  }
114  break;
116  break;
118  m_nestedChapters.emplace_back(make_unique<MatroskaChapter>(chapterAtomChild));
119  break;
120  default:
121  diag.emplace_back(DiagLevel::Warning,
122  "\"ChapterAtom\"-element contains unknown child element \"" % chapterAtomChild->idToString() + "\". It will be ignored.", context);
123  }
124  }
125  // "eng" is default language
126  for (LocaleAwareString &name : m_names) {
127  if (name.locale().empty()) {
128  name.locale().emplace_back("eng"sv, LocaleFormat::ISO_639_2_B);
129  }
130  }
131 }
132 
134 {
136  m_nestedChapters.clear();
137 }
138 
139 } // namespace TagParser
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks.
std::vector< std::uint64_t > m_tracks
CppUtilities::TimeSpan m_endTime
CppUtilities::TimeSpan m_startTime
virtual void clear()
Resets the object to its initial state.
std::vector< LocaleAwareString > m_names
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
The EbmlElement class helps to parse EBML files such as Matroska files.
Definition: ebmlelement.h:32
ImplementationType * nextSibling()
Returns the next sibling of the element.
ImplementationType * firstChild()
Returns the first child of the element.
The LocaleAwareString class is a standard string with locale information (languages,...
void internalParse(Diagnostics &diag, AbortableProgressFeedback &progress) override
Parses the "ChapterAtom"-element which has been specified when constructing the object.
~MatroskaChapter() override
Destroys the chapter.
void clear() override
Resets the object to its initial state.
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10