Fix decoding for SongShowPlus imports

bzr-revno: 2304
This commit is contained in:
Philip Ridout 2013-10-05 06:30:00 +01:00 committed by Tim Bentley
commit 9ded4fee45
1 changed files with 22 additions and 13 deletions

View File

@ -30,13 +30,14 @@
The :mod:`songshowplusimport` module provides the functionality for importing
SongShow Plus songs into the OpenLP database.
"""
import chardet
import os
import logging
import re
import struct
from openlp.core.ui.wizard import WizardStrings
from openlp.plugins.songs.lib import VerseType
from openlp.plugins.songs.lib import VerseType, retrieve_windows_encoding
from openlp.plugins.songs.lib.songimport import SongImport
TITLE = 1
@ -132,41 +133,43 @@ class SongShowPlusImport(SongImport):
else:
length_descriptor, = struct.unpack("B", song_data.read(1))
log.debug(length_descriptor_size)
data = song_data.read(length_descriptor).decode()
data = song_data.read(length_descriptor)
if block_key == TITLE:
self.title = data
self.title = self.decode(data)
elif block_key == AUTHOR:
authors = data.split(" / ")
authors = self.decode(data).split(" / ")
for author in authors:
if author.find(",") !=-1:
authorParts = author.split(", ")
author = authorParts[1] + " " + authorParts[0]
self.parse_author(author)
elif block_key == COPYRIGHT:
self.addCopyright(data)
self.addCopyright(self.decode(data))
elif block_key == CCLI_NO:
self.ccliNumber = int(data)
elif block_key == VERSE:
self.addVerse(data, "%s%s" % (VerseType.tags[VerseType.Verse], verse_no))
self.addVerse(self.decode(data), "%s%s" % (VerseType.tags[VerseType.Verse], verse_no))
elif block_key == CHORUS:
self.addVerse(data, "%s%s" % (VerseType.tags[VerseType.Chorus], verse_no))
self.addVerse(self.decode(data), "%s%s" % (VerseType.tags[VerseType.Chorus], verse_no))
elif block_key == BRIDGE:
self.addVerse(data, "%s%s" % (VerseType.tags[VerseType.Bridge], verse_no))
self.addVerse(self.decode(data), "%s%s" % (VerseType.tags[VerseType.Bridge], verse_no))
elif block_key == TOPIC:
self.topics.append(data)
self.topics.append(self.decode(data))
elif block_key == COMMENTS:
self.comments = data
self.comments = self.decode(data)
elif block_key == VERSE_ORDER:
verse_tag = self.to_openlp_verse_tag(data, True)
verse_tag = self.to_openlp_verse_tag(self.decode(data), True)
if verse_tag:
if not isinstance(verse_tag, str):
verse_tag = self.decode(verse_tag)
self.ssp_verse_order_list.append(verse_tag)
elif block_key == SONG_BOOK:
self.songBookName = data
self.songBookName = self.decode(data)
elif block_key == SONG_NUMBER:
self.songNumber = ord(data)
elif block_key == CUSTOM_VERSE:
verse_tag = self.to_openlp_verse_tag(verse_name)
self.addVerse(data, verse_tag)
self.addVerse(self.decode(data), verse_tag)
else:
log.debug("Unrecognised blockKey: %s, data: %s" % (block_key, data))
song_data.seek(next_block_starts)
@ -204,3 +207,9 @@ class SongShowPlusImport(SongImport):
verse_tag = VerseType.tags[VerseType.Other]
verse_number = self.other_list[verse_name]
return verse_tag + verse_number
def decode(self, data):
try:
return str(data, chardet.detect(data)['encoding'])
except:
return str(data, retrieve_windows_encoding())