Browse Source

added Track.comment; made comment available in symuid-list expressions

Fabian Peter Hammerle 5 years ago
parent
commit
1fe09012b4
3 changed files with 38 additions and 19 deletions
  1. 5 2
      symuid-list
  2. 4 0
      symuid/__init__.py
  3. 29 17
      symuid/tag_interface.py

+ 5 - 2
symuid-list

@@ -6,7 +6,9 @@ import symuid
 
 def symuid_list(path, path_ignore_regex, filter_expression, sort_expression, limit):
     # use generators until sort is required
-    attr_it = ({'path': track.path, 'play_count': track.get_play_count_sum()}
+    attr_it = ({'path': track.path,
+                'comment': track.comment,
+                'play_count': track.get_play_count_sum()}
                for track in symuid.Track.walk(path, path_ignore_regex))
     if filter_expression:
         attr_it = filter(lambda a: eval(filter_expression, a), attr_it)
@@ -37,8 +39,9 @@ def _init_argparser():
         '--filter',
         metavar='expression',
         dest='filter_expression',
-        help='(example: {!r})'.format(
+        help='(example: {!r} or {!r})'.format(
             "play_count > 16 and path.endswith('.mp3')",
+            "comment is None or len(comment) < 16",
         ),
     )
     argparser.add_argument(

+ 4 - 0
symuid/__init__.py

@@ -48,6 +48,10 @@ class Track:
     def path(self):
         return self._iface.track_path
 
+    @property
+    def comment(self):
+        return self._iface.get_comment()
+
     def get_uuid(self):
         return self._iface.get_track_uuid()
 

+ 29 - 17
symuid/tag_interface.py

@@ -26,20 +26,24 @@ class ID3(_mutagen):
             mutagen_file.tags
         self._mutagen_file = mutagen_file
 
+    def _get_single_text(self, tag_label):
+        tag = self._mutagen_file.tags.get(tag_label, None)
+        if tag is None:
+            # {}.get('a') == None
+            return None
+        elif len(tag.text) == 1:
+            return tag.text[0]
+        else:
+            raise ValueError(tag)
+
     def get_free_ints(self, tag_label_prefix):
         for t in self._mutagen_file.tags.getall('TXXX:' + tag_label_prefix):
             assert len(t.text) == 1, t
             yield (t.desc, int(t.text[0]))
 
     def get_free_int(self, tag_label):
-        tags = [t for t in self.get_free_ints(tag_label)]
-        if len(tags) == 0:
-            # {}.get('a') == None
-            return None
-        else:
-            assert len(tags) == 1, tags
-            assert tags[0][0] == tag_label, tag
-            return tags[0][1]
+        text = self._get_single_text('TXXX:' + tag_label)
+        return int(text) if text else None
 
     def set_free_int(self, tag_label, data):
         # mutagen.id3._specs.EncodedTextSpec.write encodes 'desc' and 'text'
@@ -52,6 +56,9 @@ class ID3(_mutagen):
         self._mutagen_file.tags.add(tag)
         return tag
 
+    def get_comment(self):
+        return self._get_single_text('COMM::eng')
+
     def get_track_uuid(self):
         for ufid in self._mutagen_file.tags.getall('UFID'):
             if ufid.owner == self._UFID_OWNER_ID:
@@ -75,6 +82,16 @@ class MP4(_mutagen):
             mutagen_file.tags
         self._mutagen_file = mutagen_file
 
+    def _get_single(self, tag_label):
+        tag = self._mutagen_file.tags.get(tag_label, None)
+        if tag is None:
+            # {}.get('a') == None
+            return None
+        elif len(tag) == 1:
+            return tag[0]
+        else:
+            raise ValueError(tag)
+
     @staticmethod
     def _freeform_to_int(freeform):
         # "a signed big-endian integer with length one of { 1,2,3,4,8 } bytes"
@@ -95,15 +112,7 @@ class MP4(_mutagen):
     def _get_free(self, tag_label):
         # freeform keys start with '----'
         # http://mutagen.readthedocs.io/en/latest/api/mp4.html
-        try:
-            tags = self._mutagen_file.tags['----:' + tag_label]
-        except KeyError:
-            # {}.get('a') == None
-            return None
-        if len(tags) == 1:
-            return tags[0]
-        else:
-            raise ValueError(tags)
+        return self._get_single('----:' + tag_label)
 
     def get_free_int(self, tag_label):
         t = self._get_free(tag_label)
@@ -138,6 +147,9 @@ class MP4(_mutagen):
             data=data,
         )
 
+    def get_comment(self):
+        return self._get_single('\xa9cmt')
+
     def get_track_uuid(self):
         return self._get_free_uuid(self._UUID_TAG_KEY)