@classmethod<EOL><INDENT>def RegisterTXXXKey(cls, key, desc):<DEDENT>
frameid = "<STR_LIT>" + desc<EOL>def getter(id3, key):<EOL><INDENT>return list(id3[frameid])<EOL><DEDENT>def setter(id3, key, value):<EOL><INDENT>try:<EOL><INDENT>frame = id3[frameid]<EOL><DEDENT>except KeyError:<EOL><INDENT>enc = <NUM_LIT:0><EOL>try:<EOL><INDENT>for v in value:<EOL><INDENT>v.encode('<STR_LIT>')<EOL><DEDENT><DEDENT>except UnicodeError:<EOL><INDENT>enc = <NUM_LIT:3><EOL><DEDENT>id3.add(mutagen.id3.TXXX(encoding=enc, text=value, desc=desc))<EOL><DEDENT>else:<EOL><INDENT>frame.text = value<EOL><DEDENT><DEDENT>def deleter(id3, key):<EOL><INDENT>del(id3[frameid])<EOL><DEDENT>cls.RegisterKey(key, getter, setter, deleter)<EOL>
Register a user-defined text frame key.

        Some ID3 tags are stored in TXXX frames, which allow a
        freeform 'description' which acts as a subkey,
        e.g. TXXX:BARCODE.::

            EasyID3.RegisterTXXXKey('barcode', 'BARCODE').