Tag Parser  9.1.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
mediafileinfo.cpp
Go to the documentation of this file.
1 #include "./helper.h"
2 
3 #include "../abstracttrack.h"
4 #include "../mediafileinfo.h"
5 #include "../tag.h"
6 
7 #include <c++utilities/tests/testutils.h>
8 using namespace CppUtilities;
9 
10 #include <cppunit/TestFixture.h>
11 #include <cppunit/extensions/HelperMacros.h>
12 
13 #include <cstdio>
14 
15 using namespace std;
16 using namespace CppUtilities::Literals;
17 using namespace TagParser;
18 
19 using namespace CPPUNIT_NS;
20 
25 class MediaFileInfoTests : public TestFixture {
26  CPPUNIT_TEST_SUITE(MediaFileInfoTests);
27  CPPUNIT_TEST(testInitialStatus);
28  CPPUNIT_TEST(testFileSystemMethods);
29  CPPUNIT_TEST(testParsingUnsupportedFile);
30  CPPUNIT_TEST(testFullParseAndFurtherProperties);
31  CPPUNIT_TEST_SUITE_END();
32 
33 public:
34  void setUp();
35  void tearDown();
36 
37  void testInitialStatus();
38  void testFileSystemMethods();
39  void testParsingUnsupportedFile();
40  void testPartialParsingAndTagCreationOfMp4File();
41 
42  void testFullParseAndFurtherProperties();
43 };
44 
46 
48 {
49 }
50 
52 {
53 }
54 
56 {
57  const MediaFileInfo file;
58  CPPUNIT_ASSERT(!file.areTagsSupported());
59  CPPUNIT_ASSERT(!file.areTracksSupported());
60  CPPUNIT_ASSERT(!file.areChaptersSupported());
61  CPPUNIT_ASSERT(!file.areAttachmentsSupported());
62  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.containerParsingStatus());
63  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tagsParsingStatus());
64  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tracksParsingStatus());
65  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.chaptersParsingStatus());
66  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.attachmentsParsingStatus());
67  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown, file.containerFormat());
68 }
69 
71 {
72  MediaFileInfo file("/usr/bin/unsupported.bin");
73  CPPUNIT_ASSERT_EQUAL("/usr/bin"s, file.containingDirectory());
74  CPPUNIT_ASSERT_EQUAL("unsupported.bin"s, file.fileName());
75  CPPUNIT_ASSERT_EQUAL("unsupported"s, file.fileName(true));
76  CPPUNIT_ASSERT_EQUAL("/usr/bin/unsupported"s, file.pathWithoutExtension());
77  CPPUNIT_ASSERT_EQUAL(".bin"s, file.extension());
78  CPPUNIT_ASSERT_EQUAL(static_cast<std::uint64_t>(0), file.size());
79  file.reportPathChanged(testFilePath("unsupported.bin"));
80  file.open(true);
81  CPPUNIT_ASSERT(file.isOpen());
82  CPPUNIT_ASSERT(file.isReadOnly());
83  CPPUNIT_ASSERT_EQUAL(static_cast<std::uint64_t>(41), file.size());
84 }
85 
87 {
88  Diagnostics diag;
89  MediaFileInfo file(testFilePath("unsupported.bin"));
90  file.parseContainerFormat(diag);
91  file.parseTags(diag);
92  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotSupported, file.containerParsingStatus());
93  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotSupported, file.tagsParsingStatus());
94  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tracksParsingStatus());
95  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.chaptersParsingStatus());
96  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.attachmentsParsingStatus());
97  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown, file.containerFormat());
98  file.invalidate();
99 }
100 
102 {
103  Diagnostics diag;
104  MediaFileInfo file(testFilePath("mtx-test-data/aac/he-aacv2-ps.m4a"));
105  file.open(true);
106  file.parseContainerFormat(diag);
107  file.parseTags(diag);
108  file.parseAttachments(diag);
109  file.close();
110  CPPUNIT_ASSERT_THROW_MESSAGE("std::ios_base::failure thrown if file closed", file.parseTracks(diag), std::ios_base::failure);
111  CPPUNIT_ASSERT(file.areTagsSupported());
112  CPPUNIT_ASSERT(file.areTracksSupported());
113  CPPUNIT_ASSERT(!file.areChaptersSupported());
114  CPPUNIT_ASSERT(!file.areAttachmentsSupported());
115  CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.containerParsingStatus());
116  CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.tagsParsingStatus());
117  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tracksParsingStatus());
118  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.chaptersParsingStatus());
119  CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotSupported, file.attachmentsParsingStatus());
120  CPPUNIT_ASSERT_EQUAL(0_st, file.trackCount());
121  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Mp4, file.containerFormat());
122  CPPUNIT_ASSERT_EQUAL(Diagnostics({ DiagMessage(DiagLevel::Information,
123  "Parsing attachments is not implemented for the container format of the file.", "parsing attachments") }),
124  diag);
125  CPPUNIT_ASSERT_EQUAL(DiagLevel::Information, diag.level());
126 
127  // create/remove tag
128  CPPUNIT_ASSERT_EQUAL(0_st, file.matroskaTags().size());
129  CPPUNIT_ASSERT(!file.id3v1Tag());
130  CPPUNIT_ASSERT_EQUAL(0_st, file.id3v2Tags().size());
131  CPPUNIT_ASSERT(!file.vorbisComment());
132  CPPUNIT_ASSERT(!file.mp4Tag());
133  // NOTE: Maybe it should not be possible to create ID3 tags for MP4 file? It will be ignored anyways.
134  CPPUNIT_ASSERT(file.createId3v1Tag());
135  CPPUNIT_ASSERT(file.id3v1Tag());
136  CPPUNIT_ASSERT(file.createId3v2Tag());
137  CPPUNIT_ASSERT_EQUAL(1_st, file.id3v2Tags().size());
138  CPPUNIT_ASSERT(!file.createVorbisComment());
139  CPPUNIT_ASSERT(!file.vorbisComment());
140  CPPUNIT_ASSERT(!file.removeVorbisComment());
141  file.createAppropriateTags();
142  CPPUNIT_ASSERT(file.mp4Tag());
143 }
144 
146 {
147  Diagnostics diag;
148  MediaFileInfo file(testFilePath("matroska_wave1/test1.mkv"));
149  file.open(true);
150  file.parseEverything(diag);
151  // calling parse methods twice should not do anything (and hence can not fail anymore because the file has already been closed)
152  file.close();
153  file.parseEverything(diag);
154  CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.containerParsingStatus());
155  CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.tagsParsingStatus());
156  CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.tracksParsingStatus());
157  CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.chaptersParsingStatus());
158  CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.attachmentsParsingStatus());
159  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, file.containerFormat());
160 
161  // general info
162  CPPUNIT_ASSERT(file.container());
163  CPPUNIT_ASSERT(file.areTagsSupported());
164  CPPUNIT_ASSERT(file.hasAnyTag());
165  CPPUNIT_ASSERT_EQUAL(1_st, file.tags().size());
166  CPPUNIT_ASSERT_EQUAL(1_st, file.matroskaTags().size());
167  CPPUNIT_ASSERT(!file.mp4Tag());
168  CPPUNIT_ASSERT(!file.vorbisComment());
169  CPPUNIT_ASSERT(file.areTracksSupported());
170  CPPUNIT_ASSERT_EQUAL(2_st, file.trackCount());
171  CPPUNIT_ASSERT(file.areChaptersSupported());
172  CPPUNIT_ASSERT_EQUAL(0_st, file.chapters().size());
173  CPPUNIT_ASSERT(file.areAttachmentsSupported());
174  CPPUNIT_ASSERT_EQUAL(0_st, file.attachments().size());
175 
176  // notifications
177  CPPUNIT_ASSERT_EQUAL(Diagnostics(), diag);
178  CPPUNIT_ASSERT_EQUAL(DiagLevel::None, diag.level());
179  diag.emplace_back(DiagLevel::Warning, "warning", "test");
180  CPPUNIT_ASSERT_EQUAL(DiagLevel::Warning, diag.level());
181  diag.emplace_back(DiagLevel::Critical, "error", "test");
182  CPPUNIT_ASSERT_EQUAL(DiagLevel::Critical, diag.level());
183 
184  // track info / available languages
185  file.tracks().back()->setLanguage("eng");
186  CPPUNIT_ASSERT_EQUAL(unordered_set<string>({ "eng" }), file.availableLanguages());
187  CPPUNIT_ASSERT_EQUAL(unordered_set<string>({}), file.availableLanguages(MediaType::Text));
188  CPPUNIT_ASSERT_EQUAL("ID: 2422994868, type: Video"s, file.tracks()[0]->label());
189  CPPUNIT_ASSERT_EQUAL("ID: 3653291187, type: Audio, language: English"s, file.tracks()[1]->label());
190  CPPUNIT_ASSERT_EQUAL("MS-MPEG-4-480p / MP3-2ch-eng"s, file.technicalSummary());
191 }
TagParser::SubFormats::None
Definition: mediaformat.h:110
TagParser::MediaFileInfo::mp4Tag
Mp4Tag * mp4Tag() const
Returns a pointer to the assigned MP4 tag or nullptr if none is assigned.
Definition: mediafileinfo.cpp:1204
TagParser::MediaFileInfo::parseTags
void parseTags(Diagnostics &diag)
Parses the tag(s) of the current file.
Definition: mediafileinfo.cpp:366
TagParser::MediaFileInfo::tracks
std::vector< AbstractTrack * > tracks() const
Returns the tracks for the current file.
Definition: mediafileinfo.cpp:806
MediaFileInfoTests::testFileSystemMethods
void testFileSystemMethods()
Definition: mediafileinfo.cpp:70
TagParser::BasicFileInfo::invalidate
void invalidate()
Invalidates the file info manually.
Definition: basicfileinfo.cpp:82
TagParser::MediaFileInfo::parseContainerFormat
void parseContainerFormat(Diagnostics &diag)
Parses the container format of the current file.
Definition: mediafileinfo.cpp:151
TagParser::MediaFileInfo::tags
void tags(std::vector< Tag * > &tags) const
Stores all tags assigned to the current file in the specified vector.
Definition: mediafileinfo.cpp:1447
TagParser::MediaFileInfo::matroskaTags
const std::vector< std::unique_ptr< MatroskaTag > > & matroskaTags() const
Returns pointers to the assigned Matroska tags.
Definition: mediafileinfo.cpp:1219
TagParser::MediaFileInfo::attachments
std::vector< AbstractAttachment * > attachments() const
Returns all attachments assigned to the current file.
Definition: mediafileinfo.cpp:1265
MediaFileInfoTests::setUp
void setUp()
Definition: mediafileinfo.cpp:47
MediaFileInfoTests
The MediaFileInfoTests tests convenience methods provided by TagParser::MediaFileInfo.
Definition: mediafileinfo.cpp:25
TagParser::MediaFileInfo::parseTracks
void parseTracks(Diagnostics &diag)
Parses the tracks of the current file.
Definition: mediafileinfo.cpp:295
TagParser::BasicFileInfo::containingDirectory
static std::string containingDirectory(const std::string &path)
Returns the path of the directory containing the given file.
Definition: basicfileinfo.cpp:179
TagParser::MediaFileInfo::availableLanguages
std::unordered_set< std::string > availableLanguages(TagParser::MediaType type=TagParser::MediaType::Audio) const
Determines the available languages for specified media type (by default MediaType::Audio).
Definition: mediafileinfo.cpp:900
TagParser::MediaFileInfo::id3v1Tag
Id3v1Tag * id3v1Tag() const
Returns a pointer to the assigned ID3v1 tag or nullptr if none is assigned.
Definition: mediafileinfo.h:330
TagParser::Diagnostics
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
TagParser::MediaFileInfo::createId3v2Tag
Id3v2Tag * createId3v2Tag()
Creates an ID3v2 tag for the current file.
Definition: mediafileinfo.cpp:1049
TagParser::MediaFileInfo::chaptersParsingStatus
ParsingStatus chaptersParsingStatus() const
Returns whether the chapters have been parsed yet.
Definition: mediafileinfo.h:294
TagParser::MediaFileInfo::chapters
std::vector< AbstractChapter * > chapters() const
Returns all chapters assigned to the current file.
Definition: mediafileinfo.cpp:1247
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::MediaFileInfo::areTagsSupported
bool areTagsSupported() const
Returns an indication whether this library supports the tag format of the current file.
Definition: mediafileinfo.cpp:1179
TagParser::BasicFileInfo::extension
static std::string extension(const std::string &path)
Returns the extension of the given file.
Definition: basicfileinfo.cpp:141
TagParser::BasicFileInfo::open
void open(bool readOnly=false)
Opens a std::fstream for the current file.
Definition: basicfileinfo.cpp:46
TagParser::MediaFileInfo::removeVorbisComment
bool removeVorbisComment()
Removes all assigned Vorbis comment from the current file.
Definition: mediafileinfo.cpp:1419
TagParser::MediaFileInfo::parseAttachments
void parseAttachments(Diagnostics &diag)
Parses the attachments of the current file.
Definition: mediafileinfo.cpp:483
TagParser::Diagnostics::level
DiagLevel level() const
Returns the worst diag level present in the container.
Definition: diagnostics.cpp:53
TagParser::MediaFileInfo::createAppropriateTags
bool createAppropriateTags(const TagCreationSettings &settings=TagCreationSettings())
Ensures appropriate tags are created according the given settings.
Definition: mediafileinfo.cpp:533
MediaFileInfoTests::tearDown
void tearDown()
Definition: mediafileinfo.cpp:51
MediaFileInfoTests::testFullParseAndFurtherProperties
void testFullParseAndFurtherProperties()
Definition: mediafileinfo.cpp:145
MediaFileInfoTests::testPartialParsingAndTagCreationOfMp4File
void testPartialParsingAndTagCreationOfMp4File()
Definition: mediafileinfo.cpp:101
TagParser::BasicFileInfo::reportPathChanged
void reportPathChanged(const std::string &newPath)
Call this function to report that the path changed.
Definition: basicfileinfo.h:129
TagParser::BasicFileInfo::isReadOnly
bool isReadOnly() const
Indicates whether the last open()/reopen() call was read-only.
Definition: basicfileinfo.h:73
TagParser::MediaFileInfo::container
AbstractContainer * container() const
Returns the container for the current file.
Definition: mediafileinfo.h:432
TagParser::MediaFileInfo::createVorbisComment
VorbisComment * createVorbisComment()
Creates a Vorbis comment for the current file.
Definition: mediafileinfo.cpp:1392
CppUtilities
Definition: abstractcontainer.h:15
TagParser::BasicFileInfo::isOpen
bool isOpen() const
Indicates whether a std::fstream is open for the current file.
Definition: basicfileinfo.h:65
TagParser::MediaFileInfo::containerParsingStatus
ParsingStatus containerParsingStatus() const
Returns an indication whether the container format has been parsed yet.
Definition: mediafileinfo.h:200
TagParser::MediaFileInfo::tagsParsingStatus
ParsingStatus tagsParsingStatus() const
Returns an indication whether tag information has been parsed yet.
Definition: mediafileinfo.h:265
MediaFileInfoTests::testParsingUnsupportedFile
void testParsingUnsupportedFile()
Definition: mediafileinfo.cpp:86
TagParser::DiagMessage
The DiagMessage class holds an information, warning or error gathered during parsing or making.
Definition: diagnostics.h:41
TagParser::MediaFileInfo::parseEverything
void parseEverything(Diagnostics &diag)
Parses the container format, the tracks and the tag information of the current file.
Definition: mediafileinfo.cpp:513
TagParser::MediaFileInfo::id3v2Tags
const std::vector< std::unique_ptr< Id3v2Tag > > & id3v2Tags() const
Returns pointers to the assigned ID3v2 tags.
Definition: mediafileinfo.h:342
CPPUNIT_TEST_SUITE_REGISTRATION
CPPUNIT_TEST_SUITE_REGISTRATION(MediaFileInfoTests)
TagParser::MediaFileInfo::technicalSummary
std::string technicalSummary() const
Generates a short technical summary about the file's tracks.
Definition: mediafileinfo.cpp:927
TagParser::BasicFileInfo::fileName
static std::string fileName(const std::string &path, bool cutExtension=false)
Returns the file name of the given file.
Definition: basicfileinfo.cpp:108
MediaFileInfoTests::testInitialStatus
void testInitialStatus()
Definition: mediafileinfo.cpp:55
TagParser::BasicFileInfo::size
std::uint64_t size() const
Returns size of the current file in bytes.
Definition: basicfileinfo.h:111
TagParser::MediaFileInfo::areChaptersSupported
bool areChaptersSupported() const
Returns an indication whether this library supports parsing the chapters of the current file.
Definition: mediafileinfo.cpp:1124
TagParser::MediaFileInfo::attachmentsParsingStatus
ParsingStatus attachmentsParsingStatus() const
Returns whether the attachments have been parsed yet.
Definition: mediafileinfo.h:302
TagParser::MediaFileInfo::createId3v1Tag
Id3v1Tag * createId3v1Tag()
Creates an ID3v1 tag for the current file.
Definition: mediafileinfo.cpp:982
TagParser::MediaFileInfo::tracksParsingStatus
ParsingStatus tracksParsingStatus() const
Returns an indication whether tracks have been parsed yet.
Definition: mediafileinfo.h:273
TagParser::MediaFileInfo::areAttachmentsSupported
bool areAttachmentsSupported() const
Returns an indication whether this library supports attachment format of the current file.
Definition: mediafileinfo.cpp:1141
TagParser::BasicFileInfo::close
void close()
A possibly opened std::fstream will be closed.
Definition: basicfileinfo.cpp:71
helper.h
TagParser::MediaFileInfo::areTracksSupported
bool areTracksSupported() const
Returns an indication whether this library supports parsing the tracks information of the current fil...
Definition: mediafileinfo.cpp:1158
TagParser::MediaFileInfo
The MediaFileInfo class allows to read and write tag information providing a container/tag format ind...
Definition: mediafileinfo.h:45
TagParser::MediaFileInfo::containerFormat
ContainerFormat containerFormat() const
Returns the container format of the current file.
Definition: mediafileinfo.h:211
TagParser::BasicFileInfo::pathWithoutExtension
static std::string pathWithoutExtension(const std::string &fullPath)
Returns a copy of the given path without the extension/suffix.
Definition: basicfileinfo.cpp:162
TagParser::MediaFileInfo::vorbisComment
VorbisComment * vorbisComment() const
Returns a pointer to the first assigned Vorbis comment or nullptr if none is assigned.
Definition: mediafileinfo.cpp:1235
TagParser::MediaFileInfo::trackCount
std::size_t trackCount() const
Returns the number of tracks that could be parsed.
Definition: mediafileinfo.h:286
TagParser::Mp4
Definition: signature.cpp:53
TagParser::MediaFileInfo::hasAnyTag
bool hasAnyTag() const
Returns an indication whether a tag of any format is assigned.
Definition: mediafileinfo.cpp:1470