summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjvoisin2018-10-11 19:52:47 +0200
committerjvoisin2018-10-11 19:52:47 +0200
commitb9dbd12ef91f4dfba8c1d0737ab52ff87ac515f1 (patch)
tree89a3eccfc073233d0ba3973e0a46ef91e791aed4
parentb2e153b69caac208fb1821e2f21436a2f0487188 (diff)
Implement recursive metadata for FLAC files
Since FLAC files can contain covers, it makes sense to parse their metadata
-rw-r--r--libmat2/audio.py17
-rwxr-xr-xmat225
-rw-r--r--tests/test_libmat2.py2
3 files changed, 27 insertions, 17 deletions
diff --git a/libmat2/audio.py b/libmat2/audio.py
index f2a5e94..b67f766 100644
--- a/libmat2/audio.py
+++ b/libmat2/audio.py
@@ -1,8 +1,11 @@
1import mimetypes
2import os
1import shutil 3import shutil
4import tempfile
2 5
3import mutagen 6import mutagen
4 7
5from . import abstract 8from . import abstract, parser_factory
6 9
7 10
8class MutagenParser(abstract.AbstractParser): 11class MutagenParser(abstract.AbstractParser):
@@ -55,6 +58,14 @@ class FLACParser(MutagenParser):
55 58
56 def get_meta(self): 59 def get_meta(self):
57 meta = super().get_meta() 60 meta = super().get_meta()
58 if mutagen.File(self.filename).pictures: 61 for num, picture in enumerate(mutagen.File(self.filename).pictures):
59 meta['Picture'] = 'Cover' 62 name = picture.desc if picture.desc else 'Cover %d' % num
63 _, fname = tempfile.mkstemp()
64 with open(fname, 'wb') as f:
65 f.write(picture.data)
66 extension = mimetypes.guess_extension(picture.mime)
67 shutil.move(fname, fname + extension)
68 p, _ = parser_factory.get_parser(fname+extension)
69 meta[name] = p.get_meta() if p else 'harmful data'
70 os.remove(fname + extension)
60 return meta 71 return meta
diff --git a/mat2 b/mat2
index cc193e9..2a76b4c 100755
--- a/mat2
+++ b/mat2
@@ -65,25 +65,24 @@ def show_meta(filename: str):
65 if p is None: 65 if p is None:
66 print("[-] %s's format (%s) is not supported" % (filename, mtype)) 66 print("[-] %s's format (%s) is not supported" % (filename, mtype))
67 return 67 return
68 print("[+] Metadata for %s:" % filename) 68 __print_meta(filename, p.get_meta())
69 metadata = p.get_meta().items() # type: dict
70 __print_meta(metadata)
71 69
72 70
73def __print_meta(metadata: dict): 71def __print_meta(filename:str, metadata: dict, depth:int=1):
72 padding = " " * depth*2
74 if not metadata: 73 if not metadata:
75 print(" No metadata found") 74 print(padding + "No metadata found")
76 return 75 return
77 76
78 for k, v in metadata: 77 print("[%s] Metadata for %s:" % ('+'*depth, filename))
78
79 for k, v in metadata.items():
79 if isinstance(v, dict): 80 if isinstance(v, dict):
80 __print_meta(v) 81 return __print_meta(k, v, depth+1)
81 else: 82 try: # FIXME this is ugly.
82 try: # FIXME this is ugly. 83 print(padding + " %s: %s" % (k, v))
83 print(" %s: %s" % (k, v)) 84 except UnicodeEncodeError:
84 except UnicodeEncodeError: 85 print(padding + " %s: harmful content" % k)
85 print(" %s: harmful content" % k)
86 return
87 86
88 87
89def clean_meta(filename: str, is_lightweight: bool, policy: UnknownMemberPolicy) -> bool: 88def clean_meta(filename: str, is_lightweight: bool, policy: UnknownMemberPolicy) -> bool:
diff --git a/tests/test_libmat2.py b/tests/test_libmat2.py
index 2f7d0c5..6a2af91 100644
--- a/tests/test_libmat2.py
+++ b/tests/test_libmat2.py
@@ -96,7 +96,7 @@ class TestGetMeta(unittest.TestCase):
96 p = audio.FLACParser('./tests/data/dirty.flac') 96 p = audio.FLACParser('./tests/data/dirty.flac')
97 meta = p.get_meta() 97 meta = p.get_meta()
98 self.assertEqual(meta['title'], 'I am so') 98 self.assertEqual(meta['title'], 'I am so')
99 self.assertEqual(meta['Picture'], 'Cover') 99 self.assertEqual(meta['Cover 0'], {'Comment': 'Created with GIMP'})
100 100
101 def test_docx(self): 101 def test_docx(self):
102 p = office.MSOfficeParser('./tests/data/dirty.docx') 102 p = office.MSOfficeParser('./tests/data/dirty.docx')