Skip to content

Commit 50e5e37

Browse files
committed
Allow TXXX:ALBUMARTISTSORT to be a fallback for albumartistsort
I noticed that my previous fix for duplicate key registration of albumartistsort would break reading files already having TXXX:ALBUMARTISTSORT so this commit fixes it by making TXXX:ALBUMARTISTSORT a fallback for albumartistsort if the first getter can't get a value and also by making EasyID3 delete TXXX:ALBUMARTISTSORT frames when deleting albumartistsort. Still, when setting an albumartistsort value only TSO2 frames are used. This also adds tests for all those cases.
1 parent 11629ef commit 50e5e37

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

mutagen/easyid3.py

+43
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"""
1313

1414
from typing import Callable, Dict
15+
from functools import partial
1516

1617
import mutagen.id3
1718

@@ -542,6 +543,48 @@ def peakgain_list(id3, key):
542543
EasyID3.RegisterTXXXKey(key, desc)
543544

544545

546+
def fallback_getter_helper(id3, key, original, fallback):
547+
try:
548+
return original(id3, key)
549+
except KeyError as e:
550+
try:
551+
return fallback(id3, key)
552+
except KeyError:
553+
raise e
554+
555+
def fallback_deleter_helper(id3, key, original, fallback):
556+
try:
557+
original(id3, key)
558+
except KeyError as e:
559+
exception1 = e
560+
else:
561+
exception1 = None
562+
563+
try:
564+
return fallback(id3, key)
565+
except KeyError:
566+
if exception1:
567+
raise exception1
568+
569+
def txxxkey_getter(id3, key, frameid):
570+
return list(id3[frameid])
571+
572+
def txxxkey_deleter(id3, key, frameid):
573+
del id3[frameid]
574+
575+
for key, extra_source in {
576+
"albumartistsort": "TXXX:ALBUMARTISTSORT",
577+
}.items():
578+
EasyID3.Get[key] = partial(fallback_getter_helper,
579+
original=EasyID3.Get[key],
580+
fallback=partial(txxxkey_getter,
581+
frameid=extra_source))
582+
EasyID3.Delete[key] = partial(fallback_deleter_helper,
583+
original=EasyID3.Delete[key],
584+
fallback=partial(txxxkey_deleter,
585+
frameid=extra_source))
586+
587+
545588
class EasyID3FileType(ID3FileType):
546589
"""EasyID3FileType(filething=None)
547590

tests/test_easyid3.py

+37-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import pickle
44

55
from mutagen import MutagenError
6-
from mutagen.id3 import ID3FileType, ID3, RVA2, CHAP, TDRC, CTOC, TSO2
6+
from mutagen.id3 import ID3FileType, ID3, RVA2, CHAP, TDRC, CTOC, TSO2, TXXX
77
from mutagen.easyid3 import EasyID3, error as ID3Error
88

99
from tests import TestCase, DATA_DIR, get_temp_copy
@@ -434,3 +434,39 @@ def test_albumartistsort(self):
434434
self.id3.save(self.filename)
435435
id3 = EasyID3(self.filename)
436436
self.failUnlessEqual(id3["albumartistsort"], [u"someartist"])
437+
438+
self.id3["albumartistsort"] = [u"otherartist"]
439+
self.assertEqual(self.realid3["TSO2"], [u"otherartist"])
440+
441+
del self.id3["albumartistsort"]
442+
self.assertEqual(len(self.id3), 0)
443+
444+
def test_albumartistsort_from_TXXX(self):
445+
self.realid3.add(TXXX(desc="ALBUMARTISTSORT", text=u"someartist"))
446+
self.id3.save(self.filename)
447+
id3 = EasyID3(self.filename)
448+
self.failUnlessEqual(id3["albumartistsort"], [u"someartist"])
449+
450+
self.id3["albumartistsort"] = [u"otherartist"]
451+
self.assertEqual(self.realid3["TSO2"], [u"otherartist"])
452+
453+
del self.id3["albumartistsort"]
454+
self.assertEqual(len(self.id3), 0)
455+
456+
def test_albumartistsort_with_both_frames(self):
457+
self.realid3.add(TSO2(text=u"someartist"))
458+
self.realid3.add(TXXX(desc="ALBUMARTISTSORT", text=u"someotherartist"))
459+
self.id3.save(self.filename)
460+
id3 = EasyID3(self.filename)
461+
self.failUnlessEqual(id3["albumartistsort"], [u"someartist"])
462+
self.assertEqual(len(self.id3), 1)
463+
self.assertEqual(len(self.realid3), 2)
464+
465+
self.id3["albumartistsort"] = [u"otherartist"]
466+
self.assertEqual(self.realid3["TSO2"], [u"otherartist"])
467+
468+
del self.id3["albumartistsort"]
469+
self.assertEqual(len(self.id3), 0)
470+
self.assertEqual(len(self.realid3), 0)
471+
472+
self.failUnlessRaises(KeyError, self.id3.__delitem__, "albumartistsort")

0 commit comments

Comments
 (0)