Skip to content

Commit ec25722

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 ec25722

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

mutagen/easyid3.py

+46
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,51 @@ 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+
556+
def fallback_deleter_helper(id3, key, original, fallback):
557+
try:
558+
original(id3, key)
559+
except KeyError as e:
560+
exception1 = e
561+
else:
562+
exception1 = None
563+
564+
try:
565+
return fallback(id3, key)
566+
except KeyError:
567+
if exception1:
568+
raise exception1
569+
570+
571+
def txxxkey_getter(id3, key, frameid):
572+
return list(id3[frameid])
573+
574+
575+
def txxxkey_deleter(id3, key, frameid):
576+
del id3[frameid]
577+
578+
for key, extra_source in {
579+
"albumartistsort": "TXXX:ALBUMARTISTSORT",
580+
}.items():
581+
EasyID3.Get[key] = partial(fallback_getter_helper,
582+
original=EasyID3.Get[key],
583+
fallback=partial(txxxkey_getter,
584+
frameid=extra_source))
585+
EasyID3.Delete[key] = partial(fallback_deleter_helper,
586+
original=EasyID3.Delete[key],
587+
fallback=partial(txxxkey_deleter,
588+
frameid=extra_source))
589+
590+
545591
class EasyID3FileType(ID3FileType):
546592
"""EasyID3FileType(filething=None)
547593

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)