diff options
| -rw-r--r-- | src/parsers/audio.py | 35 | ||||
| -rw-r--r-- | tests/data/dirty.mp3 | bin | 0 -> 33646 bytes | |||
| -rw-r--r-- | tests/data/dirty.ogg | bin | 0 -> 23298 bytes | |||
| -rw-r--r-- | tests/test_libmat2.py | 44 |
4 files changed, 77 insertions, 2 deletions
diff --git a/src/parsers/audio.py b/src/parsers/audio.py new file mode 100644 index 0000000..5c5c527 --- /dev/null +++ b/src/parsers/audio.py | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | import subprocess | ||
| 2 | import shutil | ||
| 3 | import json | ||
| 4 | |||
| 5 | import mutagen | ||
| 6 | |||
| 7 | from . import abstract | ||
| 8 | |||
| 9 | class MutagenParser(abstract.AbstractParser): | ||
| 10 | def get_meta(self): | ||
| 11 | f = mutagen.File(self.filename) | ||
| 12 | if f.tags: | ||
| 13 | return f.tags | ||
| 14 | return {} | ||
| 15 | |||
| 16 | def remove_all(self): | ||
| 17 | shutil.copy(self.filename, self.output_filename) | ||
| 18 | f = mutagen.File(self.output_filename) | ||
| 19 | f.delete() | ||
| 20 | f.save() | ||
| 21 | return True | ||
| 22 | |||
| 23 | class MP3Parser(MutagenParser): | ||
| 24 | mimetypes = {'audio/mpeg', } | ||
| 25 | |||
| 26 | def get_meta(self): | ||
| 27 | metadata = {} | ||
| 28 | f = mutagen.File(self.filename) | ||
| 29 | if f.tags: | ||
| 30 | for key in f.tags: | ||
| 31 | metadata[key] = f.tags[key].text | ||
| 32 | return metadata | ||
| 33 | |||
| 34 | class OGGParser(MutagenParser): | ||
| 35 | mimetypes = {'audio/ogg', } | ||
diff --git a/tests/data/dirty.mp3 b/tests/data/dirty.mp3 new file mode 100644 index 0000000..7b6de6a --- /dev/null +++ b/tests/data/dirty.mp3 | |||
| Binary files differ | |||
diff --git a/tests/data/dirty.ogg b/tests/data/dirty.ogg new file mode 100644 index 0000000..b938099 --- /dev/null +++ b/tests/data/dirty.ogg | |||
| Binary files differ | |||
diff --git a/tests/test_libmat2.py b/tests/test_libmat2.py index 1d31695..50a9a97 100644 --- a/tests/test_libmat2.py +++ b/tests/test_libmat2.py | |||
| @@ -5,7 +5,7 @@ import shutil | |||
| 5 | import os | 5 | import os |
| 6 | 6 | ||
| 7 | from src import parsers | 7 | from src import parsers |
| 8 | from src.parsers import pdf, png, jpg | 8 | from src.parsers import pdf, png, jpg, audio |
| 9 | 9 | ||
| 10 | class TestGetMeta(unittest.TestCase): | 10 | class TestGetMeta(unittest.TestCase): |
| 11 | def test_pdf(self): | 11 | def test_pdf(self): |
| @@ -25,6 +25,17 @@ class TestGetMeta(unittest.TestCase): | |||
| 25 | meta = p.get_meta() | 25 | meta = p.get_meta() |
| 26 | self.assertEqual(meta['Comment'], 'Created with GIMP') | 26 | self.assertEqual(meta['Comment'], 'Created with GIMP') |
| 27 | 27 | ||
| 28 | def test_mp3(self): | ||
| 29 | p = audio.MP3Parser('./tests/data/dirty.mp3') | ||
| 30 | meta = p.get_meta() | ||
| 31 | self.assertEqual(meta['TXXX:I am a '], ['various comment']) | ||
| 32 | |||
| 33 | def test_ogg(self): | ||
| 34 | p = audio.OGGParser('./tests/data/dirty.ogg') | ||
| 35 | meta = p.get_meta() | ||
| 36 | self.assertEqual(meta['TITLE'], ['I am so']) | ||
| 37 | |||
| 38 | |||
| 28 | class TestCleaning(unittest.TestCase): | 39 | class TestCleaning(unittest.TestCase): |
| 29 | def test_pdf(self): | 40 | def test_pdf(self): |
| 30 | shutil.copy('./tests/data/dirty.pdf', './tests/data/clean.pdf') | 41 | shutil.copy('./tests/data/dirty.pdf', './tests/data/clean.pdf') |
| @@ -57,7 +68,6 @@ class TestCleaning(unittest.TestCase): | |||
| 57 | 68 | ||
| 58 | os.remove('./tests/data/clean.png') | 69 | os.remove('./tests/data/clean.png') |
| 59 | 70 | ||
| 60 | |||
| 61 | def test_jpg(self): | 71 | def test_jpg(self): |
| 62 | shutil.copy('./tests/data/dirty.jpg', './tests/data/clean.jpg') | 72 | shutil.copy('./tests/data/dirty.jpg', './tests/data/clean.jpg') |
| 63 | p = jpg.JPGParser('./tests/data/clean.jpg') | 73 | p = jpg.JPGParser('./tests/data/clean.jpg') |
| @@ -72,3 +82,33 @@ class TestCleaning(unittest.TestCase): | |||
| 72 | self.assertEqual(p.get_meta(), {}) | 82 | self.assertEqual(p.get_meta(), {}) |
| 73 | 83 | ||
| 74 | os.remove('./tests/data/clean.jpg') | 84 | os.remove('./tests/data/clean.jpg') |
| 85 | |||
| 86 | def test_mp3(self): | ||
| 87 | shutil.copy('./tests/data/dirty.mp3', './tests/data/clean.mp3') | ||
| 88 | p = audio.MP3Parser('./tests/data/clean.mp3') | ||
| 89 | |||
| 90 | meta = p.get_meta() | ||
| 91 | self.assertEqual(meta['TXXX:I am a '], ['various comment']) | ||
| 92 | |||
| 93 | ret = p.remove_all() | ||
| 94 | self.assertTrue(ret) | ||
| 95 | |||
| 96 | p = audio.MP3Parser('./tests/data/clean.mp3.cleaned') | ||
| 97 | self.assertEqual(p.get_meta(), {}) | ||
| 98 | |||
| 99 | os.remove('./tests/data/clean.mp3') | ||
| 100 | |||
| 101 | def test_ogg(self): | ||
| 102 | shutil.copy('./tests/data/dirty.ogg', './tests/data/clean.ogg') | ||
| 103 | p = audio.OGGParser('./tests/data/clean.ogg') | ||
| 104 | |||
| 105 | meta = p.get_meta() | ||
| 106 | self.assertEqual(meta['TITLE'], ['I am so']) | ||
| 107 | |||
| 108 | ret = p.remove_all() | ||
| 109 | self.assertTrue(ret) | ||
| 110 | |||
| 111 | p = audio.OGGParser('./tests/data/clean.ogg.cleaned') | ||
| 112 | self.assertEqual(p.get_meta(), {}) | ||
| 113 | |||
| 114 | os.remove('./tests/data/clean.ogg') | ||
