Fix bug #1194610 by detecting the encoding rather than assuming that it set (because its not) add fall back to the windows encoding dialog

bzr-revno: 2162
Fixes: https://launchpad.net/bugs/1194610
This commit is contained in:
Philip Ridout 2013-08-21 21:54:14 +02:00 committed by Raoul Snyman
commit 0b6d389f35
1 changed files with 19 additions and 12 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
@ -142,44 +143,44 @@ class SongShowPlusImport(SongImport):
log.debug(length_descriptor_size)
data = song_data.read(length_descriptor)
if block_key == TITLE:
self.title = unicode(data, u'cp1252')
self.title = self.decode(data)
elif block_key == AUTHOR:
authors = data.split(" / ")
for author in authors:
if author.find(",") !=-1:
authorParts = author.split(", ")
author = authorParts[1] + " " + authorParts[0]
self.parseAuthor(unicode(author, u'cp1252'))
self.parseAuthor(self.decode(author))
elif block_key == COPYRIGHT:
self.addCopyright(unicode(data, u'cp1252'))
self.addCopyright(self.decode(data))
elif block_key == CCLI_NO:
self.ccliNumber = int(data)
elif block_key == VERSE:
self.addVerse(unicode(data, u'cp1252'),
self.addVerse(self.decode(data),
"%s%s" % (VerseType.Tags[VerseType.Verse], verse_no))
elif block_key == CHORUS:
self.addVerse(unicode(data, u'cp1252'),
self.addVerse(self.decode(data),
"%s%s" % (VerseType.Tags[VerseType.Chorus], verse_no))
elif block_key == BRIDGE:
self.addVerse(unicode(data, u'cp1252'),
self.addVerse(self.decode(data),
"%s%s" % (VerseType.Tags[VerseType.Bridge], verse_no))
elif block_key == TOPIC:
self.topics.append(unicode(data, u'cp1252'))
self.topics.append(self.decode(data))
elif block_key == COMMENTS:
self.comments = unicode(data, u'cp1252')
self.comments = self.decode(data)
elif block_key == VERSE_ORDER:
verse_tag = self.toOpenLPVerseTag(data, True)
if verse_tag:
if not isinstance(verse_tag, unicode):
verse_tag = unicode(verse_tag, u'cp1252')
verse_tag = self.decode(verse_tag)
self.sspVerseOrderList.append(verse_tag)
elif block_key == SONG_BOOK:
self.songBookName = unicode(data, u'cp1252')
self.songBookName = self.decode(data)
elif block_key == SONG_NUMBER:
self.songNumber = ord(data)
elif block_key == CUSTOM_VERSE:
verse_tag = self.toOpenLPVerseTag(verse_name)
self.addVerse(unicode(data, u'cp1252'), verse_tag)
self.addVerse(self.decode(data), verse_tag)
else:
log.debug("Unrecognised blockKey: %s, data: %s"
% (block_key, data))
@ -221,3 +222,9 @@ class SongShowPlusImport(SongImport):
verse_tag = VerseType.Tags[VerseType.Other]
verse_number = self.otherList[verse_name]
return verse_tag + verse_number
def decode(self, data):
try:
return unicode(data, chardet.detect(data)['encoding'])
except:
return unicode(data, retrieve_windows_encoding())