From a28d4d4b8edbf95520bf688907589b8c18123560 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 24 Aug 2021 15:39:13 -0400 Subject: [PATCH] scanner: Copy the Metadata code from lib/ And add an extra function for disc subtitles. Signed-off-by: Anna Schumaker --- scanner/__init__.py | 2 ++ scanner/metadata.py | 54 ++++++++++++++++++++++++++++++++++++++++ scanner/test_metadata.py | 36 +++++++++++++++++++++++++++ tools/generate_tracks.py | 1 + 4 files changed, 93 insertions(+) create mode 100644 scanner/__init__.py create mode 100644 scanner/metadata.py create mode 100644 scanner/test_metadata.py diff --git a/scanner/__init__.py b/scanner/__init__.py new file mode 100644 index 0000000..3bf7838 --- /dev/null +++ b/scanner/__init__.py @@ -0,0 +1,2 @@ +# Copyright 2021 (c) Anna Schumaker. +from . import metadata diff --git a/scanner/metadata.py b/scanner/metadata.py new file mode 100644 index 0000000..720f861 --- /dev/null +++ b/scanner/metadata.py @@ -0,0 +1,54 @@ +# Copyright 2021 (c) Anna Schumaker. +import mutagen +import re + +class Metadata: + def __init__(self, filepath): + self.path = filepath + self.file = None + + def __enter__(self): + self.file = mutagen.File(self.path) + return self + + def __exit__(self, exp_type, exp_value, traceback): + self.file = None + return exp_type == None + + def album(self): + return self.file.get("album", [ "Unknown Album" ])[0] + + def artist(self): + artist = self.file.get("artist", [ "Unknown Artist" ]) + return self.file.get("albumartist", artist)[0] + + def artistsort(self): + sort = self.file.get("artistsort", [ self.artist() ]) + return self.file.get("albumartistsort", sort)[0] + + def decade(self): + return (self.year() // 10) * 10 + + def discnumber(self): + return int(self.file.get("discnumber", [ 1 ])[0]) + + def discsubtitle(self): + return self.file.get("discsubtitle", [ None ])[0] + + def genres(self): + genre = self.file.get("genre", [ "" ])[0] + return [ g.strip() for g in re.split(",|;|/|:", genre) ] + + def length(self): + return int(self.file.info.length) + + def title(self): + return self.file.get("title", [ "" ])[0] + + def tracknumber(self): + return int(self.file.get("tracknumber", [ 0 ])[0]) + + def year(self): + year = self.file.get("date", [ "0" ]) + year = self.file.get("originalyear", year)[0] + return int(re.match("\d+", year).group(0)) diff --git a/scanner/test_metadata.py b/scanner/test_metadata.py new file mode 100644 index 0000000..13bfbd7 --- /dev/null +++ b/scanner/test_metadata.py @@ -0,0 +1,36 @@ +# Copyright 2021 (c) Anna Schumaker. +import pathlib +import scanner +import unittest + +test_tracks = pathlib.Path("./data/Test Album") +track_01 = test_tracks / "01 - Test Track.ogg" +track_02 = test_tracks / "02 - Test {Disc 2}.ogg" + +class TestMetadata(unittest.TestCase): + def test_metadata_init(self): + mdf = scanner.metadata.Metadata(track_01) + self.assertEqual(mdf.path, track_01) + self.assertIsNone(mdf.file) + + def test_metadata_track_01(self): + with scanner.metadata.Metadata(track_01) as mdf: + self.assertEqual(mdf.album(), "Test Album") + self.assertEqual(mdf.artist(), "Test Artist") + self.assertEqual(mdf.artistsort(), "Artist, Test") + self.assertEqual(mdf.decade(), 2010) + self.assertEqual(mdf.discnumber(), 1) + self.assertEqual(mdf.discsubtitle(), None) + self.assertEqual(mdf.genres(), [ "Test" ]) + self.assertEqual(mdf.length(), 10) + self.assertEqual(mdf.title(), "Test Track") + self.assertEqual(mdf.tracknumber(), 1) + self.assertEqual(mdf.year(), 2019) + + def test_metadata_track_02(self): + with scanner.metadata.Metadata(track_02) as mdf: + self.assertEqual(mdf.artist(), "Test Album Artist") + self.assertEqual(mdf.artistsort(), "Album Artist, Test") + self.assertEqual(mdf.discsubtitle(), "Electric Boogaloo") + self.assertEqual(mdf.genres(), [ "Test", "Genre", "List" ]) + self.assertEqual(mdf.year(), 2019) diff --git a/tools/generate_tracks.py b/tools/generate_tracks.py index f1ded14..a060ebd 100644 --- a/tools/generate_tracks.py +++ b/tools/generate_tracks.py @@ -50,6 +50,7 @@ generate_track(15, "Test Album/02 - Test {Disc 2}.ogg", { "Title" : "Test {Disc "artist" : "Test Artist", "artistsort" : "Artist, Test", "album" : "Test Album {Disc 2}", + "discsubtitle" : "Electric Boogaloo", "genre" : "Test, Genre, List", "originalyear" : "2019", "date" : "2020-10-18"})