Added support for importing EW songs even if RTF is not escaped as espected, also fixed importing og songs with unicode in metadata.

Fixes: https://launchpad.net/bugs/1299837
This commit is contained in:
Tomas Groth 2014-05-02 23:07:56 +02:00
parent 0160c583e9
commit 5d63820b17
4 changed files with 42 additions and 7 deletions

View File

@ -281,7 +281,7 @@ class EasyWorshipSongImport(SongImport):
raw_record = db_file.read(record_size)
self.fields = self.record_structure.unpack(raw_record)
self.set_defaults()
self.title = self.get_field(fi_title).decode()
self.title = self.get_field(fi_title).decode('unicode-escape')
# Get remaining fields.
copy = self.get_field(fi_copy)
admin = self.get_field(fi_admin)
@ -289,16 +289,16 @@ class EasyWorshipSongImport(SongImport):
authors = self.get_field(fi_author)
words = self.get_field(fi_words)
if copy:
self.copyright = copy.decode()
self.copyright = copy.decode('unicode-escape')
if admin:
if copy:
self.copyright += ', '
self.copyright += translate('SongsPlugin.EasyWorshipSongImport',
'Administered by %s') % admin.decode()
'Administered by %s') % admin.decode('unicode-escape')
if ccli:
self.ccli_number = ccli.decode()
self.ccli_number = ccli.decode('unicode-escape')
if authors:
authors = authors.decode()
authors = authors.decode('unicode-escape')
else:
authors = ''
# Set the SongImport object members.
@ -328,7 +328,20 @@ class EasyWorshipSongImport(SongImport):
self.add_author(author_name.strip())
if words:
# Format the lyrics
result = strip_rtf(words.decode(), self.encoding)
result = None
decoded_words = None
try:
decoded_words = words.decode()
except UnicodeDecodeError:
log.debug('The unicode chars in the rtf was not escaped in the expected manor, doing it manually.')
newbytes = bytearray()
for b in words:
if b > 127:
newbytes += bytearray(b'\\\'') + bytearray(str(hex(b))[-2:].encode())
else:
newbytes.append(b)
decoded_words = newbytes.decode()
result = strip_rtf(decoded_words, self.encoding)
if result is None:
return
words, self.encoding = result

View File

@ -67,6 +67,20 @@ SONG_TEST_DATA = [
'Just to learn from His lips, words of comfort,\nIn the beautiful garden of prayer.', 'v2'),
('There\'s a garden where Jesus is waiting,\nAnd He bids you to come meet Him there,\n'
'Just to bow and receive a new blessing,\nIn the beautiful garden of prayer.', 'v3')],
'verse_order_list': []},
{'title': 'Vi pløjed og vi så\'de',
'authors': ['Matthias Claudius'],
'copyright': 'Public Domain',
'ccli_number': 0,
'verses':
[('Vi pløjed og vi så\'de\nvor sæd i sorten jord,\nså bad vi ham os hjælpe,\nsom højt i Himlen bor,\n'
'og han lod snefald hegne\nmod frosten barsk og hård,\nhan lod det tø og regne\nog varme mildt i vår.',
'v1'),
('Alle gode gaver\nde kommer ovenned,\nså tak da Gud, ja, pris dog Gud\nfor al hans kærlighed!', 'c1'),
('Han er jo den, hvis vilje\nopholder alle ting,\nhan klæder markens lilje\nog runder himlens ring,\n'
'ham lyder vind og vove,\nham rører ravnes nød,\nhvi skulle ej hans småbørn\nda og få dagligt brød?', 'v2'),
('Ja, tak, du kære Fader,\nså mild, så rig, så rund,\nfor korn i hæs og lader,\nfor godt i allen stund!\n'
'Vi kan jo intet give,\nsom nogen ting er værd,\nmen tag vort stakkels hjerte,\nså ringe som det er!', 'v3')],
'verse_order_list': []}]
EWS_SONG_TEST_DATA =\
@ -139,6 +153,14 @@ class TestEasyWorshipSongImport(TestCase):
"""
Test the functions in the :mod:`ewimport` module.
"""
def setUp(self):
self.songimport_patcher = patch('openlp.plugins.songs.lib.ewimport.EasyWorshipSongImport.__init__')
self.mocked_songimport = self.songimport_patcher.start()
self.mocked_songimport.return_value = None
def tearDown(self):
self.songimport_patcher.stop()
def create_field_desc_entry_test(self):
"""
Test creating an instance of the :class`FieldDescEntry` class.