Song rebuilding continues

This commit is contained in:
Tim Bentley 2010-11-28 13:39:51 +00:00
parent 1cf4914862
commit a7e8104f59
2 changed files with 97 additions and 53 deletions

View File

@ -53,6 +53,7 @@ class SongMediaItem(MediaManagerItem):
self.ListViewWithDnD_class = SongListView self.ListViewWithDnD_class = SongListView
MediaManagerItem.__init__(self, parent, self, icon) MediaManagerItem.__init__(self, parent, self, icon)
self.edit_song_form = EditSongForm(self, self.parent.manager) self.edit_song_form = EditSongForm(self, self.parent.manager)
self.openLyrics = OpenLyricsParser(self.parent.manager)
self.singleServiceItem = False self.singleServiceItem = False
self.song_maintenance_form = SongMaintenanceForm( self.song_maintenance_form = SongMaintenanceForm(
self.parent.manager, self) self.parent.manager, self)
@ -396,7 +397,7 @@ class SongMediaItem(MediaManagerItem):
] ]
service_item.data_string = {u'title':song.search_title, service_item.data_string = {u'title':song.search_title,
u'authors':author_list} u'authors':author_list}
service_item.xml_version = OpenLyricsParser().song_to_xml(song) service_item.xml_version = self.openLyrics.song_to_xml(song)
return True return True
def serviceLoad(self, item): def serviceLoad(self, item):
@ -424,12 +425,12 @@ class SongMediaItem(MediaManagerItem):
else: else:
# Authors different # Authors different
if self.addSongFromService: if self.addSongFromService:
editId = OpenLyricsParser(). \ editId = self.openLyrics. \
xmlToSong(item.xml_version) xmlToSong(item.xml_version)
else: else:
# Title does not match # Title does not match
if self.addSongFromService: if self.addSongFromService:
editId = OpenLyricsParser().xmlToSong(item.xml_version) editId = self.openLyrics.xmlToSong(item.xml_version)
# Update service with correct song id # Update service with correct song id
if editId != 0: if editId != 0:
Receiver.send_message(u'service_item_update', Receiver.send_message(u'service_item_update',

View File

@ -39,6 +39,7 @@ The basic XML is of the format::
""" """
import logging import logging
import re
from lxml import etree, objectify from lxml import etree, objectify
from openlp.plugins.songs.lib.db import Author, Song from openlp.plugins.songs.lib.db import Author, Song
@ -246,6 +247,9 @@ class OpenLyricsParser(object):
""" """
This class represents the converter for Song to/from OpenLyrics XML. This class represents the converter for Song to/from OpenLyrics XML.
""" """
def __init__(self, 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
@ -256,31 +260,87 @@ class OpenLyricsParser(object):
u'<song version="0.7" createdIn="OpenLP 2.0"/>') u'<song version="0.7" createdIn="OpenLP 2.0"/>')
properties = etree.SubElement(song_xml, u'properties') properties = etree.SubElement(song_xml, u'properties')
titles = etree.SubElement(properties, u'titles') titles = etree.SubElement(properties, u'titles')
self.add_text_to_element(u'title', titles, song.title) self._add_text_to_element(u'title', titles, song.title)
if song.alternate_title: if song.alternate_title:
self.add_text_to_element(u'title', titles, song.alternate_title) self._add_text_to_element(u'title', titles, song.alternate_title)
if song.theme_name: if song.theme_name:
themes = etree.SubElement(properties, u'themes') themes = etree.SubElement(properties, u'themes')
self.add_text_to_element(u'theme', themes, song.theme_name) self._add_text_to_element(u'theme', themes, song.theme_name)
self.add_text_to_element(u'copyright', properties, song.copyright) self._add_text_to_element(u'copyright', properties, song.copyright)
self.add_text_to_element(u'verseOrder', properties, song.verse_order) self._add_text_to_element(u'verseOrder', properties, song.verse_order)
if song.ccli_number: if song.ccli_number:
self.add_text_to_element(u'ccliNo', properties, song.ccli_number) self._add_text_to_element(u'ccliNo', properties, song.ccli_number)
authors = etree.SubElement(properties, u'authors') authors = etree.SubElement(properties, u'authors')
for author in song.authors: for author in song.authors:
self.add_text_to_element(u'author', authors, author.display_name) self._add_text_to_element(u'author', authors, author.display_name)
lyrics = etree.SubElement(song_xml, u'lyrics') lyrics = etree.SubElement(song_xml, u'lyrics')
for verse in verseList: for verse in verseList:
verseTag = u'%s%s' % ( verseTag = u'%s%s' % (
verse[0][u'type'][0].lower(), verse[0][u'label']) verse[0][u'type'][0].lower(), verse[0][u'label'])
element = self.add_text_to_element(u'verse', lyrics, None, verseTag) element = self._add_text_to_element(u'verse', lyrics, None, verseTag)
element = self.add_text_to_element(u'lines', element) element = self._add_text_to_element(u'lines', element)
for line in unicode(verse[1]).split(u'\n'): for line in unicode(verse[1]).split(u'\n'):
self.add_text_to_element(u'line', element, line) self._add_text_to_element(u'line', element, line)
self.xml_to_song(self.extract_xml(song_xml)) print self._dump_xml(song_xml)
return u'' #self.xml_to_song(self.extract_xml(song_xml)) self.xml_to_song(self._extract_xml(song_xml))
return u'' #self.xml_to_song(self._extract_xml(song_xml))
def add_text_to_element(self, tag, parent, text=None, label=None): def xml_to_song(self, xml):
"""
Create a Song from OpenLyrics format xml
"""
song = Song()
if xml[:5] == u'<?xml':
xml = xml[38:]
song_xml = objectify.fromstring(xml)
print objectify.dump(song_xml)
for properties in song_xml.properties:
song.copyright = unicode(properties.copyright.text)
song.verse_order = unicode(properties.verseOrder.text)
try:
song.ccli_number = unicode(properties.ccliNo.text)
except:
pass
try:
song.theme_name = unicode(properties.themes.theme)
except:
pass
# Process Titles
for title in properties.titles.title:
if not song.title:
song.title = "aa" + title.text
song.search_title = unicode(song.title)
else:
song.alternate_title = unicode(title.text)
song.search_title += u'@' + song.alternate_title
song.search_title = re.sub(r'[\'"`,;:(){}?]+', u'',
unicode(song.search_title)).lower()
# Process Authors
for author in properties.authors.author:
print author, author.text
#song.authors.append(self._process_author(author.text))
print "here"
# Process Lyrics
sxml = SongXMLBuilder()
search_text = u''
for lyrics in song_xml.lyrics:
for verse in song_xml.lyrics.verse:
print "verse", verse.attrib
text = u''
for line in lyrics.verse.lines.line:
line = unicode(line)
if not text:
text = line
else:
text += u'\n' + line
sxml.add_verse_to_lyrics(u'V', verse.attrib, text)
search_text = search_text + text
song.search_lyrics = search_text.lower()
song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
self.manager.save_object(song)
return 0
def _add_text_to_element(self, tag, parent, text=None, label=None):
if label: if label:
element = etree.Element(tag, name = unicode(label)) element = etree.Element(tag, name = unicode(label))
else: else:
@ -290,51 +350,34 @@ class OpenLyricsParser(object):
parent.append(element) parent.append(element)
return element return element
def xml_to_song(self, xml): def _dump_xml(self, xml):
"""
Create a Song from OpenLyrics format xml
"""
return 0
song = Song()
if xml[:5] == u'<?xml':
xml = xml[38:]
song = objectify.fromstring(xml)
print objectify.dump(song)
for properties in song.properties:
song.copyright = properties.copyright.text
song.verse_order = verseOrder.text
try:
song.ccli_number = properties.ccliNo.text
except:
pass
try:
song.theme_name = properties.themes.theme
except:
pass
for title in properties.titles.title:
if not song.title:
song.title = "aa" + title.text
else:
song.alternate_title = title.text
for author in properties.authors.author:
print author.text
for lyrics in song.lyrics:
for verse in song.lyrics.verse:
print "verse", verse.attrib
for line in lyrics.verse.lines.line:
print line
return 0
def dump_xml(self, xml):
""" """
Debugging aid to dump XML so that we can see what we have. Debugging aid to dump XML so that we can see what we have.
""" """
return etree.tostring(xml, encoding=u'UTF-8', return etree.tostring(xml, encoding=u'UTF-8',
xml_declaration=True, pretty_print=True) xml_declaration=True, pretty_print=True)
def extract_xml(self, xml): def _extract_xml(self, xml):
""" """
Extract our newly created XML song. Extract our newly created XML song.
""" """
return etree.tostring(xml, encoding=u'UTF-8', return etree.tostring(xml, encoding=u'UTF-8',
xml_declaration=True) xml_declaration=True)
def _process_author(self, name):
"""
Find or create an Author from display_name.
"""
print "name = ", name
name = unicode(name)
search_results = self.manager.get_all_objects(Author,
Author.display_name == name)
if search_results:
# should only be one! so take the first
return search_results[0]
else:
# Need a new author
new_author = Author.populate(first_name=name.rsplit(u' ', 1)[0],
last_name=name.rsplit(u' ', 1)[1], display_name=name)
self.manager.save_object(new_author)
return author