← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~crichter/openlp/testing into lp:openlp

 

rimach has proposed merging lp:~crichter/openlp/testing into lp:openlp.

Requested reviews:
  Jon Tibble (meths)


add songbeamer import
-- 
https://code.launchpad.net/~crichter/openlp/testing/+merge/37064
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py	2010-09-21 18:12:46 +0000
+++ openlp/plugins/songs/forms/songimportform.py	2010-09-29 21:09:42 +0000
@@ -112,6 +112,12 @@
         QtCore.QObject.connect(self.ewBrowseButton,
             QtCore.SIGNAL(u'clicked()'),
             self.onEWBrowseButtonClicked)
+        QtCore.QObject.connect(self.songBeamerAddButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onSongBeamerAddButtonClicked)
+        QtCore.QObject.connect(self.songBeamerRemoveButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onSongBeamerRemoveButtonClicked)
         QtCore.QObject.connect(self.cancelButton,
             QtCore.SIGNAL(u'clicked(bool)'),
             self.onCancelButtonClicked)
@@ -227,6 +233,16 @@
                             'file to import from.'))
                     self.ewBrowseButton.setFocus()
                     return False
+            elif source_format == SongFormat.SongBeamer:
+                if self.songBeamerFileListWidget.count() == 0:
+                    QtGui.QMessageBox.critical(self,
+                        translate('SongsPlugin.ImportWizardForm',
+                            'No SongBeamer File Selected'),
+                        translate('SongsPlugin.ImportWizardForm',
+                            'You need to add at least one SongBeamer '
+                            'file to import from.'))
+                    self.songBeamerAddButton.setFocus()
+                    return False
             return True
         elif self.currentId() == 2:
             # Progress page
@@ -342,6 +358,16 @@
             self.ewFilenameEdit
         )
 
+    def onSongBeamerAddButtonClicked(self):
+        self.getFiles(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select SongBeamer Files'),
+            self.songBeamerFileListWidget
+        )
+
+    def onSongBeamerRemoveButtonClicked(self):
+        self.removeSelectedItems(self.songBeamerFileListWidget)
+
     def onCancelButtonClicked(self, checked):
         """
         Stop the import on pressing the cancel button.
@@ -373,6 +399,7 @@
         self.songsOfFellowshipFileListWidget.clear()
         self.genericFileListWidget.clear()
         self.ewFilenameEdit.setText(u'')
+        self.songBeamerFileListWidget.clear()
         #self.csvFilenameEdit.setText(u'')
 
     def incrementProgressBar(self, status_text, increment=1):
@@ -448,6 +475,12 @@
             importer = self.plugin.importSongs(SongFormat.EasyWorship,
                 filename=unicode(self.ewFilenameEdit.text())
             )
+        elif source_format == SongFormat.SongBeamer:
+            # Import SongBeamer songs
+            importer = self.plugin.importSongs(SongFormat.SongBeamer,
+                filenames=self.getListOfFiles(
+                    self.songBeamerFileListWidget)
+            )
         success = importer.do_import()
         if success:
             # reload songs

=== modified file 'openlp/plugins/songs/forms/songimportwizard.py'
--- openlp/plugins/songs/forms/songimportwizard.py	2010-09-23 19:23:56 +0000
+++ openlp/plugins/songs/forms/songimportwizard.py	2010-09-29 21:09:42 +0000
@@ -116,6 +116,8 @@
         self.addMultiFileSelectItem(u'generic', None, True)
         # EasyWorship
         self.addSingleFileSelectItem(u'ew')
+        # Words of Worship
+        self.addMultiFileSelectItem(u'songBeamer')
 #        Commented out for future use.
 #        self.addSingleFileSelectItem(u'csv', u'CSV')
         self.sourceLayout.addWidget(self.formatStackedWidget)
@@ -180,6 +182,8 @@
             'Generic Document/Presentation'))
         self.formatComboBox.setItemText(8,
             translate('SongsPlugin.ImportWizardForm', 'EasyWorship'))
+        self.formatComboBox.setItemText(9,
+            translate('SongsPlugin.ImportWizardForm', 'SongBeamer'))
 #        self.formatComboBox.setItemText(9,
 #            translate('SongsPlugin.ImportWizardForm', 'CSV'))
         self.openLP2FilenameLabel.setText(
@@ -236,6 +240,10 @@
             translate('SongsPlugin.ImportWizardForm', 'Filename:'))
         self.ewBrowseButton.setText(
             translate('SongsPlugin.ImportWizardForm', 'Browse...'))
+        self.songBeamerAddButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
+        self.songBeamerRemoveButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
 #        self.csvFilenameLabel.setText(
 #            translate('SongsPlugin.ImportWizardForm', 'Filename:'))
 #        self.csvBrowseButton.setText(

=== modified file 'openlp/plugins/songs/lib/importer.py'
--- openlp/plugins/songs/lib/importer.py	2010-09-20 18:22:57 +0000
+++ openlp/plugins/songs/lib/importer.py	2010-09-29 21:09:42 +0000
@@ -29,6 +29,7 @@
 from wowimport import WowImport
 from cclifileimport import CCLIFileImport
 from ewimport import EasyWorshipSongImport
+from songbeamerimport import SongBeamerImport
 # Imports that might fail
 try:
     from olp1import import OpenLP1SongImport
@@ -64,6 +65,7 @@
     Generic = 7
     #CSV = 8
     EasyWorship = 8
+    SongBeamer = 9
 
     @staticmethod
     def get_class(format):
@@ -89,6 +91,8 @@
             return CCLIFileImport
         elif format == SongFormat.EasyWorship:
             return EasyWorshipSongImport
+        elif format == SongFormat.SongBeamer:
+            return SongBeamerImport
 #        else:
         return None
 
@@ -106,7 +110,8 @@
             SongFormat.CCLI,
             SongFormat.SongsOfFellowship,
             SongFormat.Generic,
-            SongFormat.EasyWorship
+            SongFormat.EasyWorship,
+            SongFormat.SongBeamer
         ]
 
     @staticmethod

=== added file 'openlp/plugins/songs/lib/songbeamerimport.py'
--- openlp/plugins/songs/lib/songbeamerimport.py	1970-01-01 00:00:00 +0000
+++ openlp/plugins/songs/lib/songbeamerimport.py	2010-09-29 21:09:42 +0000
@@ -0,0 +1,236 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# 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:`songbeamerimport` module provides the functionality for importing 
+ SongBeamer songs into the OpenLP database.
+"""
+import logging
+import os
+import re
+import chardet
+import codecs
+
+from openlp.plugins.songs.lib.songimport import SongImport
+
+log = logging.getLogger(__name__)
+
+class SongBeamerTypes(object):
+    MarkTypes = {
+        u'Refrain': u'C',
+        u'Chorus': u'C',
+        u'Vers': u'V',
+        u'Verse': u'V',
+        u'Strophe': u'V', 
+        u'Intro': u'I',
+        u'Coda': u'E',
+        u'Ending': u'E',
+        u'Bridge': u'B',
+        u'Interlude': u'B', 
+        u'Zwischenspiel': u'B',
+        u'Pre-Chorus': u'P',
+        u'Pre-Refrain': u'P', 
+        u'Pre-Bridge': u'O',
+        u'Pre-Coda': u'O',
+        u'Unbekannt': u'O', 
+        u'Unknown': u'O'
+        }
+
+class SongBeamerImport(SongImport):
+    """
+        Import Song Beamer files(s)
+        Song Beamer file format is text based
+        in the beginning are one or more control tags written
+    """
+    def __init__(self, master_manager, **kwargs):
+        """
+        Initialise the import.
+        ``master_manager``
+            The song manager for the running OpenLP installation.
+        """
+        SongImport.__init__(self, master_manager)
+        self.master_manager = master_manager
+        if kwargs.has_key(u'filename'):
+            self.import_source = kwargs[u'filename']
+        if kwargs.has_key(u'filenames'):
+            self.import_source = kwargs[u'filenames']
+        log.debug(self.import_source)
+
+    def do_import(self):
+        """
+        Recieve a single file, or a list of files to import.
+        """
+        if isinstance(self.import_source,  list):
+            self.import_wizard.importProgressBar.setMaximum(
+                len(self.import_source))
+            for file in self.import_source:
+                # TODO: check that it is a valid SongBeamer file
+                self.current_verse = u'' 
+                self.current_verse_type = u'V'
+                self.file_name = os.path.split(file)[1]
+                self.import_wizard.incrementProgressBar(
+                    "Importing %s" % (self.file_name),  0)
+                if os.path.isfile(file):
+                    detect_file = open(file, u'r')
+                    details = chardet.detect(detect_file.read(2048))
+                    detect_file.close()
+                    infile = codecs.open(file, u'r', details['encoding'])
+                    self.songData = infile.readlines()
+                else:
+                    return False
+                for line in self.songData:
+                    line = line.strip()
+                    if line.startswith('#'):
+                        log.debug(u'find tag: %s' % line)
+                        if not self.parse_tags(line):
+                            return False
+                    elif line.startswith('---'):
+                        log.debug(u'find ---')
+                        if len(self.current_verse) > 0:
+                            self.add_verse(self.current_verse, 
+                                self.current_verse_type)
+                            self.current_verse = u'' 
+                            self.current_verse_type = u'V'
+                        self.read_verse = True
+                        self.verse_start = True
+                    elif self.read_verse:
+                        if self.verse_start:
+                            self.check_verse_marks(line)
+                            self.verse_start = False
+                        else:
+                            self.current_verse += u'%s\n' % line
+                if len(self.current_verse) > 0:
+                    self.add_verse(self.current_verse, self.current_verse_type)
+                self.finish()
+                self.import_wizard.incrementProgressBar(
+                    "Importing %s" % (self.file_name))
+            return True
+            
+    def parse_tags(self, line):
+        tag_val = line.split('=')
+        if len(tag_val[0]) == 0 or \
+            len(tag_val[1]) == 0:
+            return True
+        if tag_val[0] == '#(c)':
+            self.add_copyright(tag_val[1])
+        elif tag_val[0] == '#AddCopyrightInfo':
+            pass
+        elif tag_val[0] == '#Author':
+            #TODO split Authors
+            self.add_author(tag_val[1])
+        elif tag_val[0] == '#BackgroundImage':
+            pass
+        elif tag_val[0] == '#Bible':
+            pass
+        elif tag_val[0] == '#Categories':
+            self.topics = line.split(',')
+        elif tag_val[0] == '#CCLI':
+            self.ccli_number = tag_val[1]
+        elif tag_val[0] == '#Chords':
+            pass
+        elif tag_val[0] == '#ChurchSongID':
+            pass
+        elif tag_val[0] == '#ColorChords':
+            pass
+        elif tag_val[0] == '#Comments':
+            self.comments = tag_val[1]
+        elif tag_val[0] == '#Editor':
+            pass
+        elif tag_val[0] == '#Font':
+            pass
+        elif tag_val[0] == '#FontLang2':
+            pass
+        elif tag_val[0] == '#FontSize':
+            pass
+        elif tag_val[0] == '#Format':
+            pass
+        elif tag_val[0] == '#Format_PreLine':
+            pass
+        elif tag_val[0] == '#Format_PrePage':
+            pass
+        elif tag_val[0] == '#ID':
+            pass
+        elif tag_val[0] == '#Key':
+            pass
+        elif tag_val[0] == '#Keywords':
+            pass
+        elif tag_val[0] == '#LangCount':
+            pass
+        elif tag_val[0] == '#Melody':
+            #TODO split Authors
+            self.add_author(tag_val[1])
+        elif tag_val[0] == '#NatCopyright':
+            pass
+        elif tag_val[0] == '#OTitle':
+            pass
+        elif tag_val[0] == '#OutlineColor':
+            pass
+        elif tag_val[0] == '#OutlinedFont':
+            pass
+        elif tag_val[0] == '#QuickFind':
+            pass
+        elif tag_val[0] == '#Rights':
+            song_book_pub = tag_val[1]
+        elif tag_val[0] == '#Songbook':
+            book_num = tag_val[1].split(' / ')
+            self.song_book_name = book_num[0]
+            if len(book_num) == book_num[1]:
+                self.song_number = u''
+        elif tag_val[0] == '#Speed':
+            pass
+        elif tag_val[0] == '#TextAlign':
+            pass
+        elif tag_val[0] == '#Title':
+            self.title = u'%s' % tag_val[1]
+        elif tag_val[0] == '#TitleAlign':
+            pass
+        elif tag_val[0] == '#TitleFontSize':
+            pass
+        elif tag_val[0] == '#TitleLang2':
+            pass
+        elif tag_val[0] == '#TitleLang3':
+            pass
+        elif tag_val[0] == '#TitleLang4':
+            pass
+        elif tag_val[0] == '#Translation':
+            pass
+        elif tag_val[0] == '#Transpose':
+            pass
+        elif tag_val[0] == '#TransposeAccidental':
+            pass
+        elif tag_val[0] == '#Version':
+            pass
+        else:
+            pass
+        return True
+        
+    def check_verse_marks(self, line):
+        marks = line.split(' ')
+        if len(marks) <= 2 and \
+            marks[0] in SongBeamerTypes.MarkTypes:
+            self.current_verse_type = SongBeamerTypes.MarkTypes[marks[0]]
+            if len(marks) == 2:
+                #TODO: may check, because of only digits are allowed
+                self.current_verse_type += marks[1]


Follow ups