forked from openlp/openlp
parent
046f661d37
commit
9f34552364
70
openlp/plugins/songs/lib/powerpraiseimport.py
Normal file
70
openlp/plugins/songs/lib/powerpraiseimport.py
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# OpenLP - Open Source Lyrics Projection #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# Copyright (c) 2008-2013 Raoul Snyman #
|
||||||
|
# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan #
|
||||||
|
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
|
||||||
|
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
|
||||||
|
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
|
||||||
|
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
|
||||||
|
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
|
||||||
|
# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# This program is free software; you can redistribute it and/or modify it #
|
||||||
|
# under the terms of the GNU General Public License as published by the Free #
|
||||||
|
# Software Foundation; version 2 of the License. #
|
||||||
|
# #
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||||
|
# more details. #
|
||||||
|
# #
|
||||||
|
# You should have received a copy of the GNU General Public License along #
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||||
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
|
###############################################################################
|
||||||
|
"""
|
||||||
|
The :mod:`powerpraiseimport` module provides the functionality for importing
|
||||||
|
Powerpraise song files into the current database.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import base64
|
||||||
|
from lxml import objectify
|
||||||
|
|
||||||
|
from openlp.core.ui.wizard import WizardStrings
|
||||||
|
from openlp.plugins.songs.lib import strip_rtf
|
||||||
|
from .songimport import SongImport
|
||||||
|
|
||||||
|
|
||||||
|
class PowerpraiseImport(SongImport):
|
||||||
|
"""
|
||||||
|
The :class:`PowerpraiseImport` class provides OpenLP with the
|
||||||
|
ability to import Powerpraise song files.
|
||||||
|
"""
|
||||||
|
def do_import(self):
|
||||||
|
self.import_wizard.progress_bar.setMaximum(len(self.import_source))
|
||||||
|
for file_path in self.import_source:
|
||||||
|
if self.stop_import_flag:
|
||||||
|
return
|
||||||
|
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path))
|
||||||
|
root = objectify.parse(open(file_path, 'rb')).getroot()
|
||||||
|
self.process_song(root)
|
||||||
|
|
||||||
|
def process_song(self, root):
|
||||||
|
self.set_defaults()
|
||||||
|
self.title = root.general.title
|
||||||
|
count = 0;
|
||||||
|
for part in root.songtext.part:
|
||||||
|
verse_text = ""
|
||||||
|
count += 1
|
||||||
|
for slide in part.slide:
|
||||||
|
for line in slide.line:
|
||||||
|
verse_text += line
|
||||||
|
print(verse_text)
|
||||||
|
self.add_verse(verse_text, "v%d" % count)
|
||||||
|
if not self.finish():
|
||||||
|
self.log_error(self.import_source)
|
@ -0,0 +1,54 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# OpenLP - Open Source Lyrics Projection #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# Copyright (c) 2008-2013 Raoul Snyman #
|
||||||
|
# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan #
|
||||||
|
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
|
||||||
|
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
|
||||||
|
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
|
||||||
|
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
|
||||||
|
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
|
||||||
|
# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# This program is free software; you can redistribute it and/or modify it #
|
||||||
|
# under the terms of the GNU General Public License as published by the Free #
|
||||||
|
# Software Foundation; version 2 of the License. #
|
||||||
|
# #
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||||
|
# more details. #
|
||||||
|
# #
|
||||||
|
# You should have received a copy of the GNU General Public License along #
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||||
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
|
###############################################################################
|
||||||
|
"""
|
||||||
|
The :mod:`powerpraiseimport` module provides the functionality for importing
|
||||||
|
ProPresenter song files into the current installation database.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from tests.helpers.songfileimport import SongImportTestHelper
|
||||||
|
|
||||||
|
TEST_PATH = os.path.abspath(
|
||||||
|
os.path.join(os.path.dirname(__file__), '..', '..', '..', 'resources', 'powerpraisesongs'))
|
||||||
|
|
||||||
|
|
||||||
|
class TestPowerpraiseFileImport(SongImportTestHelper):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.importer_class_name = 'PowerpraiseImport'
|
||||||
|
self.importer_module_name = 'powerpraiseimport'
|
||||||
|
super(TestPowerpraiseFileImport, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def test_song_import(self):
|
||||||
|
"""
|
||||||
|
Test that loading a PowerPraise file works correctly
|
||||||
|
"""
|
||||||
|
self.file_import([os.path.join(TEST_PATH, 'Näher, mein Gott zu Dir.ppl')],
|
||||||
|
self.load_external_result_data(os.path.join(TEST_PATH, 'Näher, mein Gott zu Dir.json')))
|
@ -48,7 +48,7 @@ class TestProPresenterFileImport(SongImportTestHelper):
|
|||||||
|
|
||||||
def test_song_import(self):
|
def test_song_import(self):
|
||||||
"""
|
"""
|
||||||
Test that loading an ProPresenter file works correctly
|
Test that loading a ProPresenter file works correctly
|
||||||
"""
|
"""
|
||||||
self.file_import([os.path.join(TEST_PATH, 'Amazing Grace.pro4')],
|
self.file_import([os.path.join(TEST_PATH, 'Amazing Grace.pro4')],
|
||||||
self.load_external_result_data(os.path.join(TEST_PATH, 'Amazing Grace.json')))
|
self.load_external_result_data(os.path.join(TEST_PATH, 'Amazing Grace.json')))
|
||||||
|
@ -31,10 +31,13 @@ The :mod:`songfileimporthelper` modules provides a helper class and methods to e
|
|||||||
song files from third party applications.
|
song files from third party applications.
|
||||||
"""
|
"""
|
||||||
import json
|
import json
|
||||||
|
import logging
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
|
|
||||||
from tests.functional import patch, MagicMock, call
|
from tests.functional import patch, MagicMock, call
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SongImportTestHelper(TestCase):
|
class SongImportTestHelper(TestCase):
|
||||||
"""
|
"""
|
||||||
@ -107,9 +110,21 @@ class SongImportTestHelper(TestCase):
|
|||||||
topics = self._get_data(result_data, 'topics')
|
topics = self._get_data(result_data, 'topics')
|
||||||
verse_order_list = self._get_data(result_data, 'verse_order_list')
|
verse_order_list = self._get_data(result_data, 'verse_order_list')
|
||||||
|
|
||||||
# THEN: do_import should return none, the song data should be as expected, and finish should have been
|
# THEN: do_import should return none, the song data should be as expected, and finish should have been called.
|
||||||
# called.
|
|
||||||
self.assertIsNone(importer.do_import(), 'do_import should return None when it has completed')
|
self.assertIsNone(importer.do_import(), 'do_import should return None when it has completed')
|
||||||
|
|
||||||
|
# Debug information - will be displayed when the test fails
|
||||||
|
log.debug("Title imported: %s" % importer.title)
|
||||||
|
log.debug("Verses imported: %s" % self.mocked_add_verse.mock_calls)
|
||||||
|
log.debug("Verse order imported: %s" % importer.verse_order_list)
|
||||||
|
log.debug("Authors imported: %s" % self.mocked_add_author.mock_calls)
|
||||||
|
log.debug("CCLI No. imported: %s" % importer.ccli_number)
|
||||||
|
log.debug("Comments imported: %s" % importer.comments)
|
||||||
|
log.debug("Songbook imported: %s" % importer.song_book_name)
|
||||||
|
log.debug("Song number imported: %s" % importer.song_number)
|
||||||
|
log.debug("Song copyright imported: %s" % importer.song_number)
|
||||||
|
log.debug("Topics imported: %s" % importer.topics)
|
||||||
|
|
||||||
self.assertEqual(importer.title, title, 'title for %s should be "%s"' % (source_file_name, title))
|
self.assertEqual(importer.title, title, 'title for %s should be "%s"' % (source_file_name, title))
|
||||||
for author in author_calls:
|
for author in author_calls:
|
||||||
self.mocked_add_author.assert_any_call(author)
|
self.mocked_add_author.assert_any_call(author)
|
||||||
@ -119,6 +134,7 @@ class SongImportTestHelper(TestCase):
|
|||||||
self.assertEqual(importer.ccli_number, ccli_number,
|
self.assertEqual(importer.ccli_number, ccli_number,
|
||||||
'ccli_number for %s should be %s' % (source_file_name, ccli_number))
|
'ccli_number for %s should be %s' % (source_file_name, ccli_number))
|
||||||
expected_calls = []
|
expected_calls = []
|
||||||
|
print(self.mocked_add_verse.mock_calls)
|
||||||
for verse_text, verse_tag in add_verse_calls:
|
for verse_text, verse_tag in add_verse_calls:
|
||||||
self.mocked_add_verse.assert_any_call(verse_text, verse_tag)
|
self.mocked_add_verse.assert_any_call(verse_text, verse_tag)
|
||||||
expected_calls.append(call(verse_text, verse_tag))
|
expected_calls.append(call(verse_text, verse_tag))
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"title": "Näher, mein Gott, zu Dir",
|
||||||
|
"verse_order_list": [],
|
||||||
|
"verses": [
|
||||||
|
[
|
||||||
|
"Näher, mein Gott, zu Dir,sei meine Bitt'!Näher, o Herr, zu Dirmit jedem Schritt.Nur an dem Herzen Deinkann ich geborgen sein;deshalb die Bitte mein:Näher zu Dir!",
|
||||||
|
"v1"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Näher, mein Gott, zu Dir!Ein jeder Tagsoll es neu zeigen mir,was er vermag:Wie seiner Gnade Macht,Erlösung hat gebracht,in uns're Sündennacht.Näher zu Dir!",
|
||||||
|
"v2"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Näher, mein Gott, zu Dir!Dich bet' ich an.Wie vieles hast an mir,Du doch getan!Von Banden frei und los,ruh' ich in Deinem Schoss.Ja, Deine Gnad' ist gross!Näher zu Dir!",
|
||||||
|
"v3"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
|
<ppl version="3.0"><general><title>Näher, mein Gott, zu Dir</title><category>Anbetung</category><language>Deutsch</language></general><songtext><part caption="Teil 1"><slide mainsize="42" backgroundnr="0"><line>Näher, mein Gott, zu Dir,</line><line>sei meine Bitt'!</line><line>Näher, o Herr, zu Dir</line><line>mit jedem Schritt.</line></slide><slide mainsize="44" backgroundnr="0"><line>Nur an dem Herzen Dein</line><line>kann ich geborgen sein;</line><line>deshalb die Bitte mein:</line><line>Näher zu Dir!</line></slide></part><part caption="Teil 2"><slide mainsize="42" backgroundnr="0"><line>Näher, mein Gott, zu Dir!</line><line>Ein jeder Tag</line><line>soll es neu zeigen mir,</line><line>was er vermag:</line></slide><slide mainsize="42" backgroundnr="0"><line>Wie seiner Gnade Macht,</line><line>Erlösung hat gebracht,</line><line>in uns're Sündennacht.</line><line>Näher zu Dir!</line></slide></part><part caption="Teil 3"><slide mainsize="42" backgroundnr="0"><line>Näher, mein Gott, zu Dir!</line><line>Dich bet' ich an.</line><line>Wie vieles hast an mir,</line><line>Du doch getan!</line></slide><slide mainsize="42" backgroundnr="0"><line>Von Banden frei und los,</line><line>ruh' ich in Deinem Schoss.</line><line>Ja, Deine Gnad' ist gross!</line><line>Näher zu Dir!</line></slide></part></songtext><order><item>Teil 1</item><item>Teil 2</item><item>Teil 3</item></order><information><copyright><position>lastslide</position><text><line>Text und Musik: Lowell Mason, 1792-1872</line></text></copyright><source><position>firstslide</position><text><line>grünes Buch 339</line></text></source></information><formatting><font><maintext><name>Times New Roman</name><size>44</size><bold>true</bold><italic>true</italic><color>16777215</color><outline>30</outline><shadow>15</shadow></maintext><translationtext><name>Times New Roman</name><size>20</size><bold>false</bold><italic>false</italic><color>16777215</color><outline>30</outline><shadow>20</shadow></translationtext><copyrighttext><name>Times New Roman</name><size>14</size><bold>false</bold><italic>false</italic><color>16777215</color><outline>30</outline><shadow>20</shadow></copyrighttext><sourcetext><name>Times New Roman</name><size>30</size><bold>false</bold><italic>false</italic><color>16777215</color><outline>30</outline><shadow>20</shadow></sourcetext><outline><enabled>false</enabled><color>0</color></outline><shadow><enabled>true</enabled><color>0</color><direction>125</direction></shadow></font><background><file>Blumen\Blume 3.jpg</file></background><linespacing><main>30</main><translation>20</translation></linespacing><textorientation><horizontal>left</horizontal><vertical>center</vertical><transpos>inline</transpos></textorientation><borders><mainleft>50</mainleft><maintop>40</maintop><mainright>60</mainright><mainbottom>70</mainbottom><copyrightbottom>30</copyrightbottom><sourcetop>20</sourcetop><sourceright>40</sourceright></borders></formatting></ppl>
|
Loading…
Reference in New Issue
Block a user