ported rclkar to python3

This commit is contained in:
Jean-Francois Dockes 2018-02-22 09:30:42 +01:00
parent c68e6679ad
commit fead7bb491

View File

@ -43,6 +43,16 @@ htmltemplate = '''
</html> </html>
''' '''
PY3 = sys.version > '3'
if PY3:
nlbytes = bytes('\n', encoding='iso-8859-1')
bsbytes = bytes('\\', encoding='iso-8859-1')
nullchar = 0
else:
nlbytes = '\n'
bsbytes = '\\'
nullchar = chr(0)
class KarTextExtractor: class KarTextExtractor:
# Afaik, the only charset encodings with null bytes are variations on # Afaik, the only charset encodings with null bytes are variations on
# utf-16 and utf-32 and iso relatives. A hopefully comprehensive # utf-16 and utf-32 and iso relatives. A hopefully comprehensive
@ -91,11 +101,12 @@ class KarTextExtractor:
if not data: if not data:
return data return data
try:
firstnull = data.find(chr(0)) firstnull = data.index(nullchar)
if firstnull != -1:
self.hadnulls = True self.hadnulls = True
data = data[0 : firstnull] data = data[0 : firstnull]
except:
pass
return data return data
@ -117,8 +128,7 @@ class KarTextExtractor:
self.em.rclog("Encode failed: " + str(err)) self.em.rclog("Encode failed: " + str(err))
return "" return ""
data = self.em.htmlescape(data).replace("\n", "<br>\n") data = self.em.htmlescape(data).decode('utf-8').replace('\n', '<br>\n')
return data return data
@ -208,29 +218,29 @@ class KarTextExtractor:
title = None title = None
author = None author = None
language = None language = None
lyrics = "" lyrics = b""
lyricsN = "" lyricsN = b""
self.hadnulls = False self.hadnulls = False
for event in stream.iterevents(): for event in stream.iterevents():
edata = "" edata = b""
if isinstance(event, midi.TextMetaEvent): if isinstance(event, midi.TextMetaEvent):
if not event.data: if not event.data:
continue continue
elif event.data[0] == '/' or event.data[0] == '\\': elif event.data[0] == b'/'[0] or event.data[0] == bsbytes[0]:
edata = "\n" + event.data[1:] edata = nlbytes + event.data[1:]
elif event.data[0] == '[' or event.data[0] == ']': elif event.data[0] == b'['[0] or event.data[0] == b']'[0]:
edata = event.data[1:] edata = event.data[1:]
elif event.data[0] == '@': elif event.data[0] == b'@'[0]:
if len(event.data) == 1: if len(event.data) == 1:
continue continue
else: else:
if event.data[1] == 'I': if event.data[1] == b'I'[0]:
edata = event.data[2:] + '\n' edata = event.data[2:] + nlbytes
elif event.data[1] == 'L': elif event.data[1] == b'L'[0]:
language = self.nulltrunc(event.data[2:]) language = self.nulltrunc(event.data[2:])
languageN = event.data[2:] languageN = event.data[2:]
elif event.data[1] == 'T': elif event.data[1] == b'T'[0]:
if title is None: if title is None:
title = self.nulltrunc(event.data[2:]) title = self.nulltrunc(event.data[2:])
titleN = event.data[2:] titleN = event.data[2:]
@ -241,13 +251,13 @@ class KarTextExtractor:
edata = event.data edata = event.data
elif isinstance(event, midi.LryricsEvent) or \ elif isinstance(event, midi.LryricsEvent) or \
isinstance(event, midi.TrackNameEvent): isinstance(event, midi.TrackNameEvent):
space = "" space = b""
if isinstance(event, midi.TrackNameEvent): if isinstance(event, midi.TrackNameEvent):
nl = "\n" nl = nlbytes
if not event.data: if not event.data:
continue continue
elif event.data[0] == '/' or event.data[0] == '\\': elif event.data[0] == b'/'[0] or event.data[0] == bsbytes[0]:
edata = "\n" + event.data[1:] + nl edata = nlbytes + event.data[1:] + nl
else: else:
edata = event.data + nl edata = event.data + nl
@ -295,7 +305,8 @@ class KarTextExtractor:
title = self.reencode(title) title = self.reencode(title)
author = self.reencode(author) author = self.reencode(author)
lyrics = self.reencode(lyrics) lyrics = self.reencode(lyrics)
language = self.reencode(language)
self.em.setmimetype("text/html") self.em.setmimetype("text/html")
docdata = htmltemplate % (title, author, language, lyrics) docdata = htmltemplate % (title, author, language, lyrics)