started work on OpenLyrics importer

This commit is contained in:
Andreas Preikschat 2011-01-02 17:42:09 +01:00
parent 7e5d6d4af1
commit cfb896e3b1
4 changed files with 65 additions and 55 deletions

View File

@ -73,12 +73,12 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard):
QtCore.QObject.connect(self.openLP1BrowseButton, QtCore.QObject.connect(self.openLP1BrowseButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'),
self.onOpenLP1BrowseButtonClicked) self.onOpenLP1BrowseButtonClicked)
#QtCore.QObject.connect(self.openLyricsAddButton, QtCore.QObject.connect(self.openLyricsAddButton,
# QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'),
# self.onOpenLyricsAddButtonClicked) self.onOpenLyricsAddButtonClicked)
#QtCore.QObject.connect(self.openLyricsRemoveButton, QtCore.QObject.connect(self.openLyricsRemoveButton,
# QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'),
# self.onOpenLyricsRemoveButtonClicked) self.onOpenLyricsRemoveButtonClicked)
QtCore.QObject.connect(self.openSongAddButton, QtCore.QObject.connect(self.openSongAddButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'),
self.onOpenSongAddButtonClicked) self.onOpenSongAddButtonClicked)
@ -167,16 +167,15 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard):
self.openLP1BrowseButton.setFocus() self.openLP1BrowseButton.setFocus()
return False return False
elif source_format == SongFormat.OpenLyrics: elif source_format == SongFormat.OpenLyrics:
# if self.openLyricsFileListWidget.count() == 0: if self.openLyricsFileListWidget.count() == 0:
# QtGui.QMessageBox.critical(self, QtGui.QMessageBox.critical(self,
# translate('SongsPlugin.ImportWizardForm', translate('SongsPlugin.ImportWizardForm',
# 'No OpenLyrics Files Selected'), 'No OpenLyrics Files Selected'),
# translate('SongsPlugin.ImportWizardForm', translate('SongsPlugin.ImportWizardForm',
# 'You need to add at least one OpenLyrics ' 'You need to add at least one OpenLyrics '
# 'song file to import from.')) 'song file to import from.'))
# self.openLyricsAddButton.setFocus() self.openLyricsAddButton.setFocus()
# return False return False
return False
elif source_format == SongFormat.OpenSong: elif source_format == SongFormat.OpenSong:
if self.openSongFileListWidget.count() == 0: if self.openSongFileListWidget.count() == 0:
QtGui.QMessageBox.critical(self, QtGui.QMessageBox.critical(self,
@ -337,15 +336,15 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard):
'openlp.org v1.x Databases') 'openlp.org v1.x Databases')
) )
#def onOpenLyricsAddButtonClicked(self): def onOpenLyricsAddButtonClicked(self):
# self.getFiles( self.getFiles(
# translate('SongsPlugin.ImportWizardForm', translate('SongsPlugin.ImportWizardForm',
# 'Select OpenLyrics Files'), 'Select OpenLyrics Files'),
# self.openLyricsFileListWidget self.openLyricsFileListWidget
# ) )
#def onOpenLyricsRemoveButtonClicked(self): def onOpenLyricsRemoveButtonClicked(self):
# self.removeSelectedItems(self.openLyricsFileListWidget) self.removeSelectedItems(self.openLyricsFileListWidget)
def onOpenSongAddButtonClicked(self): def onOpenSongAddButtonClicked(self):
self.getFiles( self.getFiles(
@ -435,7 +434,7 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard):
self.formatComboBox.setCurrentIndex(0) self.formatComboBox.setCurrentIndex(0)
self.openLP2FilenameEdit.setText(u'') self.openLP2FilenameEdit.setText(u'')
self.openLP1FilenameEdit.setText(u'') self.openLP1FilenameEdit.setText(u'')
#self.openLyricsFileListWidget.clear() self.openLyricsFileListWidget.clear()
self.openSongFileListWidget.clear() self.openSongFileListWidget.clear()
self.wordsOfWorshipFileListWidget.clear() self.wordsOfWorshipFileListWidget.clear()
self.ccliFileListWidget.clear() self.ccliFileListWidget.clear()

View File

@ -81,9 +81,6 @@ class Ui_SongImportWizard(object):
self.addSingleFileSelectItem(u'openLP1', None, True) self.addSingleFileSelectItem(u'openLP1', None, True)
# OpenLyrics # OpenLyrics
self.addMultiFileSelectItem(u'openLyrics', u'OpenLyrics', True) self.addMultiFileSelectItem(u'openLyrics', u'OpenLyrics', True)
# set OpenLyrics to disabled by default
self.openLyricsDisabledWidget.setVisible(True)
self.openLyricsImportWidget.setVisible(False)
# Open Song # Open Song
self.addMultiFileSelectItem(u'openSong', u'OpenSong') self.addMultiFileSelectItem(u'openSong', u'OpenSong')
# Words of Worship # Words of Worship
@ -177,10 +174,10 @@ class Ui_SongImportWizard(object):
'importer has been disabled due to a missing Python module. If ' 'importer has been disabled due to a missing Python module. If '
'you want to use this importer, you will need to install the ' 'you want to use this importer, you will need to install the '
'"python-sqlite" module.')) '"python-sqlite" module.'))
#self.openLyricsAddButton.setText( self.openLyricsAddButton.setText(
# translate('SongsPlugin.ImportWizardForm', 'Add Files...')) translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
#self.openLyricsRemoveButton.setText( self.openLyricsRemoveButton.setText(
# translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
self.openLyricsDisabledLabel.setText( self.openLyricsDisabledLabel.setText(
translate('SongsPlugin.ImportWizardForm', 'The OpenLyrics ' translate('SongsPlugin.ImportWizardForm', 'The OpenLyrics '
'importer has not yet been developed, but as you can see, we are ' 'importer has not yet been developed, but as you can see, we are '

View File

@ -26,6 +26,7 @@
from opensongimport import OpenSongImport from opensongimport import OpenSongImport
from olpimport import OpenLPSongImport from olpimport import OpenLPSongImport
from openlyricsimport import OpenLyricsImport
from wowimport import WowImport from wowimport import WowImport
from cclifileimport import CCLIFileImport from cclifileimport import CCLIFileImport
from ewimport import EasyWorshipSongImport from ewimport import EasyWorshipSongImport
@ -77,8 +78,10 @@ class SongFormat(object):
""" """
if format == SongFormat.OpenLP2: if format == SongFormat.OpenLP2:
return OpenLPSongImport return OpenLPSongImport
if format == SongFormat.OpenLP1: elif format == SongFormat.OpenLP1:
return OpenLP1SongImport return OpenLP1SongImport
elif format == SongFormat.OpenLyrics:
return OpenLyricsImport
elif format == SongFormat.OpenSong: elif format == SongFormat.OpenSong:
return OpenSongImport return OpenSongImport
elif format == SongFormat.SongsOfFellowship: elif format == SongFormat.SongsOfFellowship:
@ -93,7 +96,6 @@ class SongFormat(object):
return EasyWorshipSongImport return EasyWorshipSongImport
elif format == SongFormat.SongBeamer: elif format == SongFormat.SongBeamer:
return SongBeamerImport return SongBeamerImport
# else:
return None return None
@staticmethod @staticmethod

View File

@ -80,8 +80,8 @@ class SongXMLBuilder(object):
``content`` ``content``
The actual text of the verse to be stored. The actual text of the verse to be stored.
""" """
verse = etree.Element(u'verse', type = unicode(type), verse = etree.Element(u'verse', type=unicode(type),
label = unicode(number)) label=unicode(number))
verse.text = etree.CDATA(content) verse.text = etree.CDATA(content)
self.lyrics.append(verse) self.lyrics.append(verse)
@ -194,9 +194,7 @@ class LyricsXML(object):
text = text.replace('\r\n', '\n') text = text.replace('\r\n', '\n')
verses = text.split('\n\n') verses = text.split('\n\n')
self.languages = [{u'language': u'en', u'verses': []}] self.languages = [{u'language': u'en', u'verses': []}]
counter = 0 for counter, verse in enumerate(verses):
for verse in verses:
counter = counter + 1
self.languages[0][u'verses'].append({ self.languages[0][u'verses'].append({
u'type': u'verse', u'type': u'verse',
u'label': unicode(counter), u'label': unicode(counter),
@ -245,14 +243,16 @@ class LyricsXML(object):
class OpenLyricsParser(object): class OpenLyricsParser(object):
""" """
This class represents the converter for Song to/from OpenLyrics XML. This class represents the converter for Song to/from
`OpenLyrics <http://openlyrics.info/>`_ XML.
""" """
# TODO: complete OpenLyrics standard implementation!
def __init__(self, manager): def __init__(self, manager):
self.manager = manager self.manager = manager
def song_to_xml(self, song): def song_to_xml(self, song):
""" """
Convert the song to OpenLyrics Format Convert the song to OpenLyrics Format.
""" """
song_xml_parser = SongXMLParser(song.lyrics) song_xml_parser = SongXMLParser(song.lyrics)
verse_list = song_xml_parser.get_verses() verse_list = song_xml_parser.get_verses()
@ -286,7 +286,7 @@ class OpenLyricsParser(object):
def xml_to_song(self, xml): def xml_to_song(self, xml):
""" """
Create a Song from OpenLyrics format xml Create and save a Song from OpenLyrics format xml.
""" """
# No xml get out of here # No xml get out of here
if not xml: if not xml:
@ -299,23 +299,15 @@ class OpenLyricsParser(object):
song.copyright = unicode(properties.copyright.text) song.copyright = unicode(properties.copyright.text)
if song.copyright == u'None': if song.copyright == u'None':
song.copyright = u'' song.copyright = u''
song.verse_order = unicode(properties.verseOrder.text)
if song.verse_order == u'None':
song.verse_order = u''
song.topics = [] song.topics = []
song.book = None song.book = None
theme_name = None
try: try:
song.ccli_number = unicode(properties.ccliNo.text) song.ccli_number = unicode(properties.ccliNo.text)
except: except AttributeError:
song.ccli_number = u'' song.ccli_number = u''
try: try:
theme_name = unicode(properties.themes.theme) song.theme_name = unicode(properties.themes.theme)
except: except AttributeError:
pass
if theme_name:
song.theme_name = theme_name
else:
song.theme_name = u'' song.theme_name = u''
# Process Titles # Process Titles
for title in properties.titles.title: for title in properties.titles.title:
@ -331,6 +323,7 @@ class OpenLyricsParser(object):
# Process Lyrics # Process Lyrics
sxml = SongXMLBuilder() sxml = SongXMLBuilder()
search_text = u'' search_text = u''
song.verse_order = u''
for lyrics in song_xml.lyrics: for lyrics in song_xml.lyrics:
for verse in song_xml.lyrics.verse: for verse in song_xml.lyrics.verse:
text = u'' text = u''
@ -341,17 +334,36 @@ class OpenLyricsParser(object):
else: else:
text += u'\n' + line text += u'\n' + line
type = VerseType.expand_string(verse.attrib[u'name'][0]) type = VerseType.expand_string(verse.attrib[u'name'][0])
# Here we need to create the verse order for the case that the
# song does not have a verseOrder property.
sxml.add_verse_to_lyrics(type, verse.attrib[u'name'][1], text) sxml.add_verse_to_lyrics(type, verse.attrib[u'name'][1], text)
search_text = search_text + text search_text = search_text + text
song.search_lyrics = search_text.lower() song.search_lyrics = search_text.lower()
song.lyrics = unicode(sxml.extract_xml(), u'utf-8') song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
try:
song.verse_order = unicode(properties.verseOrder.text)
except AttributeError:
# TODO: Do not allow empty verse order.
# Do not worry!
pass
if song.verse_order == u'None':
song.verse_order = u''
# Process Comments
song.comments = u'' song.comments = u''
try:
for comment in properties.comments.comment:
if not song.comments:
song.comments = comment
else:
song.comments += u'\n' + comment
except AttributeError:
pass
song.song_number = u'' song.song_number = u''
# Process Authors # Process Authors
try: try:
for author in properties.authors.author: for author in properties.authors.author:
self._process_author(author.text, song) self._process_author(author.text, song)
except: except AttributeError:
# No Author in XML so ignore # No Author in XML so ignore
pass pass
self.manager.save_object(song) self.manager.save_object(song)
@ -396,4 +408,4 @@ class OpenLyricsParser(object):
new_author = Author.populate(first_name=name.rsplit(u' ', 1)[0], new_author = Author.populate(first_name=name.rsplit(u' ', 1)[0],
last_name=name.rsplit(u' ', 1)[1], display_name=name) last_name=name.rsplit(u' ', 1)[1], display_name=name)
self.manager.save_object(new_author) self.manager.save_object(new_author)
song.authors.append(new_author) song.authors.append(new_author)