diff --git a/src/parsers/audio.py b/src/parsers/audio.py new file mode 100644 index 0000000000000000000000000000000000000000..5c5c527c1e1f855d0e095933fa9344908459af53 --- /dev/null +++ b/src/parsers/audio.py @@ -0,0 +1,35 @@ +import subprocess +import shutil +import json + +import mutagen + +from . import abstract + +class MutagenParser(abstract.AbstractParser): + def get_meta(self): + f = mutagen.File(self.filename) + if f.tags: + return f.tags + return {} + + def remove_all(self): + shutil.copy(self.filename, self.output_filename) + f = mutagen.File(self.output_filename) + f.delete() + f.save() + return True + +class MP3Parser(MutagenParser): + mimetypes = {'audio/mpeg', } + + def get_meta(self): + metadata = {} + f = mutagen.File(self.filename) + if f.tags: + for key in f.tags: + metadata[key] = f.tags[key].text + return metadata + +class OGGParser(MutagenParser): + mimetypes = {'audio/ogg', } diff --git a/tests/data/dirty.mp3 b/tests/data/dirty.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7b6de6abe9ca6838235c17ecea58c33c8125105b Binary files /dev/null and b/tests/data/dirty.mp3 differ diff --git a/tests/data/dirty.ogg b/tests/data/dirty.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b938099cfc25193c4d425239cc6969b0b6fd7045 Binary files /dev/null and b/tests/data/dirty.ogg differ diff --git a/tests/test_libmat2.py b/tests/test_libmat2.py index 1d316956332e5095cd528eccde9c9ecf15d30605..50a9a9709be7089631110402b73d6507d2a9ab71 100644 --- a/tests/test_libmat2.py +++ b/tests/test_libmat2.py @@ -5,7 +5,7 @@ import shutil import os from src import parsers -from src.parsers import pdf, png, jpg +from src.parsers import pdf, png, jpg, audio class TestGetMeta(unittest.TestCase): def test_pdf(self): @@ -25,6 +25,17 @@ class TestGetMeta(unittest.TestCase): meta = p.get_meta() self.assertEqual(meta['Comment'], 'Created with GIMP') + def test_mp3(self): + p = audio.MP3Parser('./tests/data/dirty.mp3') + meta = p.get_meta() + self.assertEqual(meta['TXXX:I am a '], ['various comment']) + + def test_ogg(self): + p = audio.OGGParser('./tests/data/dirty.ogg') + meta = p.get_meta() + self.assertEqual(meta['TITLE'], ['I am so']) + + class TestCleaning(unittest.TestCase): def test_pdf(self): shutil.copy('./tests/data/dirty.pdf', './tests/data/clean.pdf') @@ -57,7 +68,6 @@ class TestCleaning(unittest.TestCase): os.remove('./tests/data/clean.png') - def test_jpg(self): shutil.copy('./tests/data/dirty.jpg', './tests/data/clean.jpg') p = jpg.JPGParser('./tests/data/clean.jpg') @@ -72,3 +82,33 @@ class TestCleaning(unittest.TestCase): self.assertEqual(p.get_meta(), {}) os.remove('./tests/data/clean.jpg') + + def test_mp3(self): + shutil.copy('./tests/data/dirty.mp3', './tests/data/clean.mp3') + p = audio.MP3Parser('./tests/data/clean.mp3') + + meta = p.get_meta() + self.assertEqual(meta['TXXX:I am a '], ['various comment']) + + ret = p.remove_all() + self.assertTrue(ret) + + p = audio.MP3Parser('./tests/data/clean.mp3.cleaned') + self.assertEqual(p.get_meta(), {}) + + os.remove('./tests/data/clean.mp3') + + def test_ogg(self): + shutil.copy('./tests/data/dirty.ogg', './tests/data/clean.ogg') + p = audio.OGGParser('./tests/data/clean.ogg') + + meta = p.get_meta() + self.assertEqual(meta['TITLE'], ['I am so']) + + ret = p.remove_all() + self.assertTrue(ret) + + p = audio.OGGParser('./tests/data/clean.ogg.cleaned') + self.assertEqual(p.get_meta(), {}) + + os.remove('./tests/data/clean.ogg')