]> granicus.if.org Git - taglib/commitdiff
add options R, I, D for replace/insert/delete of arbitrary tags
authorPeter Bauer <p-bauer-schriesheim@t-online.de>
Wed, 23 Sep 2015 09:35:58 +0000 (11:35 +0200)
committerPeter Bauer <p-bauer-schriesheim@t-online.de>
Wed, 23 Sep 2015 12:11:40 +0000 (14:11 +0200)
examples/tagwriter.cpp

index f2896d76e3cec3169213271c0915f4ac1884f264..ed8b0d7ab9afbece8292bcfe5753583d0c47a4e0 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include <iostream>
+#include <iomanip>
 #include <string.h>
 
 #include <stdio.h>
@@ -34,6 +35,7 @@
 #include <fileref.h>
 #include <tfile.h>
 #include <tag.h>
+#include <tpropertymap.h>
 
 using namespace std;
 
@@ -65,11 +67,32 @@ void usage()
   cout << "  -g <genre>"   << endl;
   cout << "  -y <year>"    << endl;
   cout << "  -T <track>"   << endl;
+  cout << "  -R <tagname> <tagvalue>"   << endl;
+  cout << "  -I <tagname> <tagvalue>"   << endl;
+  cout << "  -D <tagname>"   << endl;
   cout << endl;
 
   exit(1);
 }
 
+void checkForRejectedProperties(const TagLib::PropertyMap &tags)
+{ // stolen from tagreader.cpp
+  if(tags.size() > 0) {
+    unsigned int longest = 0;
+    for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) {
+      if(i->first.size() > longest) {
+        longest = i->first.size();
+      }
+    }
+    cout << "-- rejected TAGs (properties) --" << endl;
+    for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) {
+      for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) {
+        cout << left << std::setw(longest) << i->first << " - " << '"' << *j << '"' << endl;
+      }
+    }
+  }
+}
+
 int main(int argc, char *argv[])
 {
   TagLib::List<TagLib::FileRef> fileList;
@@ -121,6 +144,29 @@ int main(int argc, char *argv[])
         case 'T':
           t->setTrack(value.toInt());
           break;
+        case 'R':
+        case 'I':
+          if(i + 2 < argc) {
+            TagLib::PropertyMap map = (*it).file()->properties ();
+            if(field == 'R') {
+              map.replace(value, TagLib::String(argv[i + 2]));
+            }
+            else {
+              map.insert(value, TagLib::String(argv[i + 2]));
+            }
+            ++i;
+            checkForRejectedProperties((*it).file()->setProperties(map));
+          }
+          else {
+            usage();
+          }
+          break;
+        case 'D': {
+          TagLib::PropertyMap map = (*it).file()->properties();
+          map.erase(value);
+          checkForRejectedProperties((*it).file()->setProperties(map));
+          break;
+        }
         default:
           usage();
           break;