]> granicus.if.org Git - taglib/commitdiff
Add a method to check if an MP4 file on disk actually has a tag.
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Fri, 12 Jun 2015 06:12:58 +0000 (15:12 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Fri, 13 Nov 2015 02:14:12 +0000 (11:14 +0900)
taglib/mp4/mp4file.cpp
taglib/mp4/mp4file.h
tests/test_mp4.cpp

index 1fc1524fd1f79ebe50bc4beb6af97d71f9ccca6a..566a5e32b98fb47724f602ec730dfb2c252d0569 100644 (file)
@@ -34,7 +34,7 @@ using namespace TagLib;
 
 namespace
 {
-  bool checkValid(const MP4::AtomList &list)
+  inline bool checkValid(const MP4::AtomList &list)
   {
     for(MP4::AtomList::ConstIterator it = list.begin(); it != list.end(); ++it) {
 
@@ -55,7 +55,8 @@ public:
   FilePrivate() :
     tag(0),
     atoms(0),
-    properties(0) {}
+    properties(0),
+    hasMP4Tag(false) {}
 
   ~FilePrivate()
   {
@@ -67,6 +68,8 @@ public:
   MP4::Tag        *tag;
   MP4::Atoms      *atoms;
   MP4::Properties *properties;
+
+  bool hasMP4Tag;
 };
 
 MP4::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle) :
@@ -130,12 +133,15 @@ MP4::File::read(bool readProperties)
   }
 
   // must have a moov atom, otherwise consider it invalid
-  MP4::Atom *moov = d->atoms->find("moov");
-  if(!moov) {
+  if(!d->atoms->find("moov")) {
     setValid(false);
     return;
   }
 
+  if(d->atoms->find("moov", "udta", "meta", "ilst")) {
+    d->hasMP4Tag = true;
+  }
+
   d->tag = new Tag(this, d->atoms);
   if(readProperties) {
     d->properties = new Properties(this, d->atoms);
@@ -155,6 +161,16 @@ MP4::File::save()
     return false;
   }
 
-  return d->tag->save();
+  const bool success = d->tag->save();
+  if(success) {
+    d->hasMP4Tag = true;
+  }
+
+  return success;
 }
 
+bool
+MP4::File::hasMP4Tag() const
+{
+  return d->hasMP4Tag;
+}
index 791a019234fb7e381943822191b3c413370d1e89..8c049301d08f7cceb6642f6360f2a46d660830cd 100644 (file)
@@ -117,6 +117,11 @@ namespace TagLib {
        */
       bool save();
 
+      /*!
+       * Returns whether or not the file on disk actually has an MP4 tag.
+       */
+      bool hasMP4Tag() const;
+
     private:
       void read(bool readProperties);
 
index 6841c43f87946537c12c690decb28ab5f0017932..ed93f0435c2bbe56720aee95fa1fa8d497787130 100644 (file)
@@ -69,6 +69,10 @@ public:
     CPPUNIT_ASSERT(!f.isValid());
     MP4::File f2(TEST_FILE_PATH_C("has-tags.m4a"));
     CPPUNIT_ASSERT(f2.isValid());
+    CPPUNIT_ASSERT(f2.hasMP4Tag());
+    MP4::File f3(TEST_FILE_PATH_C("no-tags.m4a"));
+    CPPUNIT_ASSERT(f3.isValid());
+    CPPUNIT_ASSERT(!f3.hasMP4Tag());
   }
 
   void testIsEmpty()