diff options
| -rw-r--r-- | libmat2/audio.py | 17 | ||||
| -rwxr-xr-x | mat2 | 25 | ||||
| -rw-r--r-- | tests/test_libmat2.py | 2 |
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 @@ | |||
| 1 | import mimetypes | ||
| 2 | import os | ||
| 1 | import shutil | 3 | import shutil |
| 4 | import tempfile | ||
| 2 | 5 | ||
| 3 | import mutagen | 6 | import mutagen |
| 4 | 7 | ||
| 5 | from . import abstract | 8 | from . import abstract, parser_factory |
| 6 | 9 | ||
| 7 | 10 | ||
| 8 | class MutagenParser(abstract.AbstractParser): | 11 | class 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 |
| @@ -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 | ||
| 73 | def __print_meta(metadata: dict): | 71 | def __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 | ||
| 89 | def clean_meta(filename: str, is_lightweight: bool, policy: UnknownMemberPolicy) -> bool: | 88 | def 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') |
