From 1edfac99e63662df26d9fd454284a1db658ac572 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 5 Jul 2012 00:04:11 +0100 Subject: [PATCH] Add mediashout import --- openlp/plugins/songs/lib/importer.py | 27 +++-- openlp/plugins/songs/lib/mediashoutimport.py | 108 +++++++++++++++++++ 2 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 openlp/plugins/songs/lib/mediashoutimport.py diff --git a/openlp/plugins/songs/lib/importer.py b/openlp/plugins/songs/lib/importer.py index 04ac6df56..e5f9344e8 100644 --- a/openlp/plugins/songs/lib/importer.py +++ b/openlp/plugins/songs/lib/importer.py @@ -47,6 +47,7 @@ from songshowplusimport import SongShowPlusImport from songproimport import SongProImport from foilpresenterimport import FoilPresenterImport from zionworximport import ZionWorxImport +from mediashoutimport import MediaShoutImport # Imports that might fail log = logging.getLogger(__name__) try: @@ -141,14 +142,15 @@ class SongFormat(object): EasySlides = 6 EasyWorship = 7 FoilPresenter = 8 - OpenSong = 9 - PowerSong = 10 - SongBeamer = 11 - SongPro = 12 - SongShowPlus = 13 - SongsOfFellowship = 14 - WordsOfWorship = 15 - ZionWorx = 16 + MediaShout = 9 + OpenSong = 10 + PowerSong = 11 + SongBeamer = 12 + SongPro = 13 + SongShowPlus = 14 + SongsOfFellowship = 15 + WordsOfWorship = 16 + ZionWorx = 17 # Set optional attribute defaults __defaults__ = { @@ -239,6 +241,14 @@ class SongFormat(object): u'filter': u'%s (*.foil)' % translate( 'SongsPlugin.ImportWizardForm', 'Foilpresenter Song Files') }, + MediaShout: { + u'class': MediaShoutImport, + u'name': u'MediaShout', + u'prefix': u'mediaShout', + u'selectMode': SongFormatSelect.SingleFile, + u'filter': u'%s (*.mdb)' % translate('SongsPlugin.ImportWizardForm', + 'MediaShout Database') + }, OpenSong: { u'class': OpenSongImport, u'name': WizardStrings.OS, @@ -324,6 +334,7 @@ class SongFormat(object): SongFormat.EasySlides, SongFormat.EasyWorship, SongFormat.FoilPresenter, + SongFormat.MediaShout, SongFormat.OpenSong, SongFormat.PowerSong, SongFormat.SongBeamer, diff --git a/openlp/plugins/songs/lib/mediashoutimport.py b/openlp/plugins/songs/lib/mediashoutimport.py new file mode 100644 index 000000000..c8e21644b --- /dev/null +++ b/openlp/plugins/songs/lib/mediashoutimport.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, 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 # +# --------------------------------------------------------------------------- # +# 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:`mediashoutimport` module provides the functionality for importing +a MediaShout database into the OpenLP database. +""" +import re +import os +import logging +import pyodbc + +from openlp.core.lib import translate +from openlp.plugins.songs.lib.songimport import SongImport + +log = logging.getLogger(__name__) + +VERSE_TAGS = [u'V', u'C', u'B', u'O', u'P', u'I', u'E'] + +class MediaShoutImport(SongImport): + """ + The :class:`MediaShoutImport` class provides the ability to import the + MediaShout Access Database + """ + def __init__(self, manager, **kwargs): + """ + Initialise the MediaShout importer. + """ + SongImport.__init__(self, manager, **kwargs) + + def doImport(self): + """ + Receive a single file to import. + """ + conn = pyodbc.connect(u'DRIVER={Microsoft Access Driver (*.mdb)};' + u'DBQ=%s;PWD=6NOZ4eHK7k' % self.importSource) + cursor = conn.cursor() + cursor.execute(u'SELECT Record, Title, Author, Copyright, ' + u'SongID, CCLI, Notes FROM Songs ORDER BY Title') + songs = cursor.fetchall() + self.importWizard.progressBar.setMaximum(len(songs)) + for song in songs: + if self.stopImportFlag: + break + cursor.execute(u'SELECT Type, Number, Text FROM Verses ' + u'WHERE Record = %s ORDER BY Type, Number' % song.Record) + verses = cursor.fetchall() + cursor.execute(u'SELECT Type, Number, POrder FROM PlayOrder ' + u'WHERE Record = %s ORDER BY POrder' % song.Record) + verse_order = cursor.fetchall() + cursor.execute(u'SELECT Name FROM Themes INNER JOIN SongThemes ' + u'ON SongThemes.ThemeId = Themes.ThemeId ' + u'WHERE SongThemes.Record = %s' % song.Record) + topics = cursor.fetchall() + cursor.execute(u'SELECT Name FROM Groups INNER JOIN SongGroups ' + u'ON SongGroups.GroupId = Groups.GroupId ' + u'WHERE SongGroups.Record = %s' % song.Record) + topics += cursor.fetchall() + self.processSong(song, verses, verse_order, topics) + + def processSong(self, song, verses, verse_order, topics): + """ + Create the song, i.e. title, verse etc. + """ + self.setDefaults() + self.title = song.Title + self.parseAuthor(song.Author) + self.addCopyright(song.Copyright) + self.comments = song.Notes + for topic in topics: + self.topics.append(topic.Name) + if u'-' in song.SongID: + self.songBookName, self.songNumber = song.SongID.split(u'-', 1) + else: + self.songBookName = song.SongID + for verse in verses: + tag = VERSE_TAGS[verse.Type] + unicode(verse.Number) \ + if verse.Type < len(VERSE_TAGS) else u'O' + self.addVerse(verse.Text, tag) + for order in verse_order: + if order.Type < len(VERSE_TAGS): + self.verseOrderList.append(VERSE_TAGS[order.Type] + + unicode(order.Number)) + self.finish()