'Convert older (and newer) tags into an ID3v2.3 tag.
This updates incompatible ID3v2 frames to ID3v2.3 ones. If you
intend to save tags as ID3v2.3, you must call this function
at some point.
If you want to to go off spec and include some v2.4 frames
in v2.3, remove them before calling this and add them back afterwards.'

def update_to_v23(self):

    self.__update_common()
    if (('TIPL' in self) or ('TMCL' in self)):
        people = []
        if ('TIPL' in self):
            f = self.pop('TIPL')
            people.extend(f.people)
        if ('TMCL' in self):
            f = self.pop('TMCL')
            people.extend(f.people)
        if ('IPLS' not in self):
            self.add(IPLS(encoding=f.encoding, people=people))
    if ('TDOR' in self):
        f = self.pop('TDOR')
        if f.text:
            d = f.text[0]
            if (d.year and ('TORY' not in self)):
                self.add(TORY(encoding=f.encoding, text=('%04d' % d.year)))
    if ('TDRC' in self):
        f = self.pop('TDRC')
        if f.text:
            d = f.text[0]
            if (d.year and ('TYER' not in self)):
                self.add(TYER(encoding=f.encoding, text=('%04d' % d.year)))
            if (d.month and d.day and ('TDAT' not in self)):
                self.add(TDAT(encoding=f.encoding, text=('%02d%02d' % (d.day, d.month))))
            if (d.hour and d.minute and ('TIME' not in self)):
                self.add(TIME(encoding=f.encoding, text=('%02d%02d' % (d.hour, d.minute))))
    v24_frames = ['ASPI', 'EQU2', 'RVA2', 'SEEK', 'SIGN', 'TDEN', 'TDOR', 'TDRC', 'TDRL', 'TDTG', 'TIPL', 'TMCL', 'TMOO', 'TPRO', 'TSOA', 'TSOP', 'TSOT', 'TSST']
    for key in v24_frames:
        if (key in self):
            del self[key]
    for f in self.getall('CHAP'):
        f.sub_frames.update_to_v23()
    for f in self.getall('CTOC'):
        f.sub_frames.update_to_v23()
