diff --git a/extractors/WavExtractor.py b/extractors/WavExtractor.py new file mode 100644 index 0000000000000000000000000000000000000000..b0a647cee9d35be816cd6d714d4752cb82b4647c --- /dev/null +++ b/extractors/WavExtractor.py @@ -0,0 +1,42 @@ +from typing import Optional + +from mutagen.wave import WAVE + +from extractors.MediaExtractor import MediaExtractor +from models.TrackMeta import TrackMeta +from util.extract_numbers import extract_numbers + + +class WaveExtractor(MediaExtractor): + file: WAVE + + def __init__(self, filename: str): + self.file = WAVE(filename) + + def extract_tag(self, tag: str) -> Optional[str]: + if tag not in self.file.tags: + return None + return str(self.file.tags[tag]) + + def extract_tags(self) -> TrackMeta: + discnumber, disctotal = extract_numbers(self.extract_tag('TPOS')) + tracknumber, tracktotal = extract_numbers(self.extract_tag('TRCK')) + return TrackMeta( + album=self.extract_tag('TALB'), + albumsort=self.extract_tag('TSOA'), + albumartist=self.extract_tag('TPE2'), + albumartistsort=self.extract_tag('TSO2'), + artist=self.extract_tag('TPE1'), + artistsort=self.extract_tag('TSOP'), + catalognumber=self.extract_tag('TXXX:CATALOGNUMBER'), + discnumber=discnumber, + disctotal=disctotal, + label=self.extract_tag('TPUB'), + media=self.extract_tag('TMED'), + originaldate=self.extract_tag('TDOR'), + originalyear=self.extract_tag('TDRC'), + title=self.extract_tag('TIT2'), + titlesort=self.extract_tag('TSOT'), + tracknumber=tracknumber, + tracktotal=tracktotal, + ) diff --git a/extractors/get_extractor.py b/extractors/get_extractor.py index 1d015cb628e98857b9c28b600a4d52c45f0d9c17..9796627be0b82c1afa656573073d14ee01d7afc4 100644 --- a/extractors/get_extractor.py +++ b/extractors/get_extractor.py @@ -6,6 +6,7 @@ from extractors.FlacExtractor import FlacExtractor from extractors.MediaExtractor import MediaExtractor from extractors.Mp3Extractor import Mp3Extractor from extractors.Mp4Extractor import Mp4Extractor +from extractors.WavExtractor import WaveExtractor def get_extractor(filename) -> Optional[MediaExtractor]: @@ -19,5 +20,8 @@ def get_extractor(filename) -> Optional[MediaExtractor]: return AacExtractor(filename) elif filename.endswith(".mp4") or filename.endswith(".m4a"): return Mp4Extractor(filename) + elif filename.endswith(".aiff") or filename.endswith(".wav") \ + or filename.endswith(".wave") or filename.endswith(".pcm"): + return WaveExtractor(filename) else: return None