trackdb: Pull out the tags we need from audio files

I have some fallbacks in place in case a tag is missing, and we can
always add more tags later if something interests us.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2020-10-18 12:53:57 -04:00
parent 4e4cac25e0
commit 31d89d4729
3 changed files with 87 additions and 14 deletions

View File

@ -11,15 +11,65 @@ class TestTrack(unittest.TestCase):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.trackid, 1)
self.assertEqual(trak.filepath, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.playcount, 0)
self.assertIsNone(trak.lastplayed)
self.assertIsInstance(trak.tags, dict)
self.assertEqual(trak.length, 10.0)
def test_track_album(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.tags["album"], "Test Album")
self.assertEqual(trak["album"], "Test Album")
def test_track_artist(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.tags["artist"], "Test Artist")
self.assertEqual(trak["artist"], "Test Artist")
trak2 = track.Track(2, test_tracks / "02 - Test {Disc 2}.ogg")
self.assertEqual(trak2.tags["artist"], "Test Album Artist")
def test_track_discnumber(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.tags["discnumber"], 1)
self.assertEqual(trak["discnumber"], "01")
def test_track_length(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.tags["length"], 10)
self.assertEqual(trak["length"], "0:10")
trak.tags["length"] = 61
self.assertEqual(trak["length"], "1:01")
trak.tags["length"] = 3
self.assertEqual(trak["length"], "0:03")
def test_track_played(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak.tags["playcount"] = 0
trak.tags["lastplayed"] = None
self.assertEqual(trak["playcount"], "0")
self.assertEqual(trak["lastplayed"], "Never")
trak.played()
self.assertEqual(trak.playcount, 1)
self.assertEqual(trak.lastplayed, datetime.date.today())
self.assertEqual(trak.tags["playcount"], 1)
self.assertEqual(trak.tags["lastplayed"], datetime.date.today())
self.assertEqual(trak["playcount"], "1")
self.assertEqual(trak["lastplayed"], str(datetime.date.today()))
trak.played()
self.assertEqual(trak.playcount, 2)
self.assertEqual(trak.tags["playcount"], 2)
self.assertEqual(trak["playcount"], "2")
def test_track_title(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.tags["title"], "Test Track")
self.assertEqual(trak["title"], "Test Track")
def test_track_tracknumber(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.tags["tracknumber"], 1)
self.assertEqual(trak["tracknumber"], "01")
trak.tags["tracknumber"] = 10
self.assertEqual(trak["tracknumber"], "10")
def test_track_year(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.tags["year"], 2019)
self.assertEqual(trak["year"], "2019")
trak2 = track.Track(2, test_tracks / "02 - Test {Disc 2}.ogg")
self.assertEqual(trak2.tags["year"], 2019)
self.assertEqual(trak2["year"], "2019")

View File

@ -1,18 +1,37 @@
# Copyright 2020 (c) Anna Schumaker.
import datetime
import mutagen
import re
class Track:
def __init__(self, trackid, filepath):
self.trackid = trackid
self.filepath = filepath
self.playcount = 0
self.lastplayed = None
self.tags = { "lastplayed" : None, "playcount" : 0 }
f = mutagen.File(filepath)
self.tags = dict(f)
self.length = f.info.length
self.tags["album"] = f.get("album", ["Unknown Album"])[0]
self.tags["artist"] = f.get("artist", ["Unknown Artist"])[0]
self.tags["artist"] = f.get("albumartist", [self.tags["artist"]])[0]
self.tags["discnumber"] = int(f.get("discnumber", [1])[0])
self.tags["length"] = int(f.info.length)
self.tags["title"] = f.get("title", [""])[0]
self.tags["tracknumber"] = int(f.get("tracknumber", [0])[0])
self.tags["year"] = f.get("date", ["0"])[0]
self.tags["year"] = f.get("originalyear", [self.tags["year"]])[0]
self.tags["year"] = int(re.match("\d+", self.tags["year"]).group(0))
def __getitem__(self, item):
tag = self.tags.get(item, None)
if item == "length":
(m, s) = divmod(tag, 60)
return f"{m}:{s:02}"
elif item in ("discnumber", "tracknumber"):
return f"{tag:02}"
elif item == "lastplayed":
return "Never" if tag == None else str(tag)
return None if tag == None else str(tag)
def played(self):
self.playcount += 1
self.lastplayed = datetime.date.today()
self.tags["playcount"] += 1
self.tags["lastplayed"] = datetime.date.today()

View File

@ -39,12 +39,16 @@ generate_track(10, "Test Album/01 - Test Track.ogg", { "title" : "Test Track",
"artist" : "Test Artist",
"album" : "Test Album",
"genre" : "Test",
"date" : "2019",
"date" : "2019-02",
"tracknumber" : "1",
"tracktotal" : "12",
"discnumber" : "1" })
generate_track(15, "Test Album/02 - Test {Disc 2}.ogg", { "Title" : "Test {Disc 2}",
"album" : "Test Album {Disc 2}" })
"albumartist" : "Test Album Artist",
"artist" : "Test Artist",
"album" : "Test Album {Disc 2}",
"originalyear" : "2019",
"date" : "2020-10-18"})
generate_track(20, "Test Album/03 - Test [Disk One].ogg", { "Title" : "Test [Disk One]",
"album" : "Test Album [Disk One]",
"discnumber" : "2"})