forked from openlp/openlp
Fix traceback in VideoPsalm importers traceback handler.
Skip PresentationManager files we do not support. Fix MediaShout import issue when an expected table is missing. Fixes bug 1590657. Fix traceback during songshowplus import. Fixes bug 1585489. bzr-revno: 2638 Fixes: https://launchpad.net/bugs/1585489, https://launchpad.net/bugs/1590657
This commit is contained in:
commit
9d2da2307f
@ -59,6 +59,7 @@ class MediaShoutImport(SongImport):
|
||||
songs = cursor.fetchall()
|
||||
self.import_wizard.progress_bar.setMaximum(len(songs))
|
||||
for song in songs:
|
||||
topics = []
|
||||
if self.stop_import_flag:
|
||||
break
|
||||
cursor.execute('SELECT Type, Number, Text FROM Verses WHERE Record = %s ORDER BY Type, Number'
|
||||
@ -66,9 +67,10 @@ class MediaShoutImport(SongImport):
|
||||
verses = cursor.fetchall()
|
||||
cursor.execute('SELECT Type, Number, POrder FROM PlayOrder WHERE Record = %s ORDER BY POrder' % song.Record)
|
||||
verse_order = cursor.fetchall()
|
||||
cursor.execute('SELECT Name FROM Themes INNER JOIN SongThemes ON SongThemes.ThemeId = Themes.ThemeId '
|
||||
'WHERE SongThemes.Record = %s' % song.Record)
|
||||
topics = cursor.fetchall()
|
||||
if cursor.tables(table='TableName', tableType='TABLE').fetchone():
|
||||
cursor.execute('SELECT Name FROM Themes INNER JOIN SongThemes ON SongThemes.ThemeId = Themes.ThemeId '
|
||||
'WHERE SongThemes.Record = %s' % song.Record)
|
||||
topics = cursor.fetchall()
|
||||
cursor.execute('SELECT Name FROM Groups INNER JOIN SongGroups ON SongGroups.GroupId = Groups.GroupId '
|
||||
'WHERE SongGroups.Record = %s' % song.Record)
|
||||
topics += cursor.fetchall()
|
||||
|
@ -54,7 +54,13 @@ class PresentationManagerImport(SongImport):
|
||||
# Open file with detected encoding and remove encoding declaration
|
||||
text = open(file_path, mode='r', encoding=encoding).read()
|
||||
text = re.sub('.+\?>\n', '', text)
|
||||
tree = etree.fromstring(text, parser=etree.XMLParser(recover=True))
|
||||
try:
|
||||
tree = etree.fromstring(text, parser=etree.XMLParser(recover=True))
|
||||
except ValueError:
|
||||
self.log_error(file_path,
|
||||
translate('SongsPlugin.PresentationManagerImport',
|
||||
'File is not in XML-format, which is the only format supported.'))
|
||||
continue
|
||||
root = objectify.fromstring(etree.tostring(tree))
|
||||
self.process_song(root)
|
||||
|
||||
|
@ -116,7 +116,13 @@ class SongShowPlusImport(SongImport):
|
||||
null, verse_name_length, = struct.unpack("BB", song_data.read(2))
|
||||
verse_name = self.decode(song_data.read(verse_name_length))
|
||||
length_descriptor_size, = struct.unpack("B", song_data.read(1))
|
||||
log.debug(length_descriptor_size)
|
||||
log.debug('length_descriptor_size: %d' % length_descriptor_size)
|
||||
# In the case of song_numbers the number is in the data from the
|
||||
# current position to the next block starts
|
||||
if block_key == SONG_NUMBER:
|
||||
sn_bytes = song_data.read(length_descriptor_size - 1)
|
||||
self.song_number = int.from_bytes(sn_bytes, byteorder='little')
|
||||
continue
|
||||
# Detect if/how long the length descriptor is
|
||||
if length_descriptor_size == 12 or length_descriptor_size == 20:
|
||||
length_descriptor, = struct.unpack("I", song_data.read(4))
|
||||
|
@ -117,6 +117,6 @@ class VideoPsalmImport(SongImport):
|
||||
if not self.finish():
|
||||
self.log_error('Could not import %s' % self.title)
|
||||
except Exception as e:
|
||||
self.log_error(translate('SongsPlugin.VideoPsalmImport', 'File %s' % file.name),
|
||||
self.log_error(self.import_source,
|
||||
translate('SongsPlugin.VideoPsalmImport', 'Error: %s') % e)
|
||||
song_file.close()
|
||||
|
@ -52,6 +52,8 @@ class TestSongShowPlusFileImport(SongImportTestHelper):
|
||||
self.load_external_result_data(os.path.join(TEST_PATH, 'Beautiful Garden Of Prayer.json')))
|
||||
self.file_import([os.path.join(TEST_PATH, 'a mighty fortress is our god.sbsong')],
|
||||
self.load_external_result_data(os.path.join(TEST_PATH, 'a mighty fortress is our god.json')))
|
||||
self.file_import([os.path.join(TEST_PATH, 'cleanse-me.sbsong')],
|
||||
self.load_external_result_data(os.path.join(TEST_PATH, 'cleanse-me.json')))
|
||||
|
||||
|
||||
class TestSongShowPlusImport(TestCase):
|
||||
|
38
tests/resources/songshowplussongs/cleanse-me.json
Normal file
38
tests/resources/songshowplussongs/cleanse-me.json
Normal file
@ -0,0 +1,38 @@
|
||||
{
|
||||
"authors": [
|
||||
"J. Edwin Orr"
|
||||
],
|
||||
"ccli_number": 56307,
|
||||
"comments": "",
|
||||
"copyright": "Public Domain ",
|
||||
"song_book_name": "",
|
||||
"song_number": 438,
|
||||
"title": "Cleanse Me [438]",
|
||||
"topics": [
|
||||
"Cleansing",
|
||||
"Communion",
|
||||
"Consecration",
|
||||
"Holiness",
|
||||
"Holy Spirit",
|
||||
"Revival"
|
||||
],
|
||||
"verse_order_list": [],
|
||||
"verses": [
|
||||
[
|
||||
"Search me, O God,\r\nAnd know my heart today;\r\nTry me, O Savior,\r\nKnow my thoughts, I pray.\r\nSee if there be\r\nSome wicked way in me;\r\nCleanse me from every sin\r\nAnd set me free.",
|
||||
"v1"
|
||||
],
|
||||
[
|
||||
"I praise Thee, Lord,\r\nFor cleansing me from sin;\r\nFulfill Thy Word,\r\nAnd make me pure within.\r\nFill me with fire\r\nWhere once I burned with shame;\r\nGrant my desire\r\nTo magnify Thy name.",
|
||||
"v2"
|
||||
],
|
||||
[
|
||||
"Lord, take my life,\r\nAnd make it wholly Thine;\r\nFill my poor heart\r\nWith Thy great love divine.\r\nTake all my will,\r\nMy passion, self and pride;\r\nI now surrender, Lord\r\nIn me abide.",
|
||||
"v3"
|
||||
],
|
||||
[
|
||||
"O Holy Ghost,\r\nRevival comes from Thee;\r\nSend a revival,\r\nStart the work in me.\r\nThy Word declares\r\nThou wilt supply our need;\r\nFor blessings now,\r\nO Lord, I humbly plead.",
|
||||
"v4"
|
||||
]
|
||||
]
|
||||
}
|
BIN
tests/resources/songshowplussongs/cleanse-me.sbsong
Normal file
BIN
tests/resources/songshowplussongs/cleanse-me.sbsong
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user