forked from openlp/openlp
First attempt at class openlp.plugins.songs.lib.PowerSongImport
This commit is contained in:
parent
7b99c97174
commit
21a88085e3
@ -53,6 +53,7 @@ class WizardStrings(object):
|
|||||||
OL = u'OpenLyrics'
|
OL = u'OpenLyrics'
|
||||||
OS = u'OpenSong'
|
OS = u'OpenSong'
|
||||||
OSIS = u'OSIS'
|
OSIS = u'OSIS'
|
||||||
|
PS = u'PowerSong'
|
||||||
SB = u'SongBeamer'
|
SB = u'SongBeamer'
|
||||||
SoF = u'Songs of Fellowship'
|
SoF = u'Songs of Fellowship'
|
||||||
SSP = u'SongShow Plus'
|
SSP = u'SongShow Plus'
|
||||||
|
142
openlp/plugins/songs/lib/powersongimport.py
Normal file
142
openlp/plugins/songs/lib/powersongimport.py
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
# -*- 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, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
|
||||||
|
# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias #
|
||||||
|
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
|
||||||
|
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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:`powersongimport` module provides the functionality for importing
|
||||||
|
PowerSong songs into the OpenLP database.
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from openlp.core.lib import translate
|
||||||
|
from openlp.plugins.songs.lib.songimport import SongImport
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class PowerSongImport(SongImport):
|
||||||
|
"""
|
||||||
|
The :class:`PowerSongImport` class provides the ability to import song files
|
||||||
|
from PowerSong.
|
||||||
|
|
||||||
|
**PowerSong Song File Format:**
|
||||||
|
|
||||||
|
* Encoded as UTF-8.
|
||||||
|
* The file has a number of fields, with the song metadata fields first,
|
||||||
|
followed by the lyrics fields.
|
||||||
|
|
||||||
|
Fields:
|
||||||
|
Each field begins with one of four labels, each of which begin with one
|
||||||
|
non-printing byte:
|
||||||
|
|
||||||
|
* ``ENQ`` (0x05) ``TITLE``
|
||||||
|
* ``ACK`` (0x06) ``AUTHOR``
|
||||||
|
* ``CR`` (0x0D) ``COPYRIGHTLINE``
|
||||||
|
* ``EOT`` (0x04) ``PART``
|
||||||
|
|
||||||
|
The field label is separated from the field contents by one random byte.
|
||||||
|
Each field ends at the next field label, or at the end of the file.
|
||||||
|
|
||||||
|
Metadata fields:
|
||||||
|
* Every PowerSong file begins with a TITLE field.
|
||||||
|
* This is followed by zero or more AUTHOR fields.
|
||||||
|
* The next field is always COPYRIGHTLINE, but it may be empty (in which
|
||||||
|
case the byte following the label is the null byte 0x00).
|
||||||
|
When the field contents are not empty, the first byte is 0xC2 and
|
||||||
|
should be discarded.
|
||||||
|
This field may contain a CCLI number at the end: e.g. "CCLI 176263"
|
||||||
|
|
||||||
|
Lyrics fields:
|
||||||
|
* The COPYRIGHTLINE field is followed by zero or more PART fields, each
|
||||||
|
of which contains one verse.
|
||||||
|
* Lines have Windows line endings ``CRLF`` (0x0D, 0x0A).
|
||||||
|
* There is no concept of verse types.
|
||||||
|
|
||||||
|
Valid extensions for a PowerSong song file are:
|
||||||
|
|
||||||
|
* .song
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, manager, **kwargs):
|
||||||
|
"""
|
||||||
|
Initialise the PowerSong importer.
|
||||||
|
"""
|
||||||
|
SongImport.__init__(self, manager, **kwargs)
|
||||||
|
|
||||||
|
def doImport(self):
|
||||||
|
"""
|
||||||
|
Receive a single file or a list of files to import.
|
||||||
|
"""
|
||||||
|
if isinstance(self.importSource, list):
|
||||||
|
self.importWizard.progressBar.setMaximum(len(self.importSource))
|
||||||
|
for file in self.importSource:
|
||||||
|
if self.stopImportFlag:
|
||||||
|
return
|
||||||
|
self.setDefaults()
|
||||||
|
with open(file, 'rb') as song_file:
|
||||||
|
# Check file is valid PowerSong song format
|
||||||
|
if song_file.read(6) != u'\x05TITLE':
|
||||||
|
self.logError(file, unicode(
|
||||||
|
translate('SongsPlugin.PowerSongSongImport',
|
||||||
|
('Invalid PowerSong song file. Missing '
|
||||||
|
'"\x05TITLE" header.'))))
|
||||||
|
continue
|
||||||
|
song_data = song_file.read()
|
||||||
|
first_part, sep, song_data = song_data.partition(
|
||||||
|
u'\x0DCOPYRIGHTLINE')
|
||||||
|
if sep == '':
|
||||||
|
self.logError(file, unicode(
|
||||||
|
translate('SongsPlugin.PowerSongSongImport',
|
||||||
|
('Invalid PowerSong song file. Missing '
|
||||||
|
'"\x0DCOPYRIGHTLINE" string.'))))
|
||||||
|
continue
|
||||||
|
title_authors = first_part.split(u'\x06AUTHOR')
|
||||||
|
# Get the song title
|
||||||
|
self.title = title_authors[0][1:]
|
||||||
|
# Extract the author(s)
|
||||||
|
for author in title_authors[1:]:
|
||||||
|
self.parseAuthor(author[1:])
|
||||||
|
# Get copyright and CCLI number
|
||||||
|
copyright, sep, song_data = song_data.partition(
|
||||||
|
u'\x04PART')
|
||||||
|
if sep == '':
|
||||||
|
self.logError(file, unicode(
|
||||||
|
translate('SongsPlugin.PowerSongSongImport',
|
||||||
|
('No verses found. Missing '
|
||||||
|
'"\x04PART" string(s).'))))
|
||||||
|
continue
|
||||||
|
copyright, sep, ccli_no = copyright[1:].rpartition(u'CCLI ')
|
||||||
|
if copyright[0] == u'\xC2':
|
||||||
|
copyright = copyright[1:]
|
||||||
|
self.addCopyright(copyright)
|
||||||
|
if ccli_no != '':
|
||||||
|
ccli_no = ccli_no.strip()
|
||||||
|
if ccli_no.isdigit():
|
||||||
|
self.ccliNumber = ccli_no
|
||||||
|
# Get the verse(s)
|
||||||
|
verses = song_data.split(u'\x04PART')
|
||||||
|
for verse in verses:
|
||||||
|
self.addVerse(verse[1:])
|
||||||
|
if not self.finish():
|
||||||
|
self.logError(file)
|
Loading…
Reference in New Issue
Block a user