Finally done the openlp.org 1.x song importer.

This commit is contained in:
Raoul Snyman 2010-09-06 22:33:28 +02:00
parent 5e61bf938e
commit f82513f11d
3 changed files with 76 additions and 41 deletions

View File

@ -58,40 +58,56 @@ class OpenLP1SongImport(SongImport):
"""
Run the import for an openlp.org 1.x song database.
"""
# Connect to the database
connection = sqlite.connect(self.import_source)
cursor = connection.cursor()
cursor.execute(u'SELECT COUNT(authorid) FROM authors')
count = int(cursor.fetchone()[0])
# Count the number of records we need to import, for the progress bar
cursor.execute(u'SELECT COUNT(songid) FROM songs')
count = int(cursor.fetchone()[0])
success = True
self.import_wizard.importProgressBar.setMaximum(count)
old_cursor.execute(u'SELECT authorid AS id, authorname AS displayname FROM authors')
rows = old_cursor.fetchall()
if not debug and verbose:
print 'done.'
author_map = {}
for row in rows:
display_name = unicode(row[1], u'cp1252')
names = display_name.split(u' ')
first_name = names[0]
last_name = u' '.join(names[1:])
if last_name is None:
last_name = u''
sql_insert = u'INSERT INTO authors '\
'(id, first_name, last_name, display_name) '\
'VALUES (NULL, ?, ?, ?)'
sql_params = (first_name, last_name, display_name)
if debug:
print '...', display_sql(sql_insert, sql_params)
elif verbose:
print '... importing "%s"' % display_name
new_cursor.execute(sql_insert, sql_params)
author_map[row[0]] = new_cursor.lastrowid
if debug:
print ' >>> authors.authorid =', row[0], 'authors.id =', author_map[row[0]]
cursor.execute(u'SELECT songid AS id, songtitle AS title, '
u'lyrics || \'\' AS lyrics, copyrightinfo AS copyright FROM songs')
rows = cursor.fetchall()
# Import the songs
cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, '
u'copyrightinfo FROM songs')
songs = cursor.fetchall()
for song in songs:
self.set_defaults()
if self.stop_import_flag:
success = False
break
song_id = song[0]
title = unicode(song[1], u'cp1252')
lyrics = unicode(song[2], u'cp1252')
copyright = unicode(song[3], u'cp1252')
self.import_wizard.incrementProgressBar(
unicode(translate('SongsPlugin.ImportWizardForm',
'Importing %s...')) % title)
self.title = title
self.process_song_text(lyrics)
self.add_copyright(copyright)
cursor.execute(u'SELECT displayname FROM authors a '
u'JOIN songauthors sa ON a.authorid = sa.authorid '
u'WHERE sa.songid = %s' % song_id)
authors = cursor.fetchall()
for author in authors:
if self.stop_import_flag:
success = False
break
self.parse_author(unicode(author[0], u'cp1252'))
if self.stop_import_flag:
success = False
break
cursor.execute(u'SELECT fulltrackname FROM tracks t '
u'JOIN songtracks st ON t.trackid = st.trackid '
u'WHERE st.songid = %s ORDER BY st.listindex' % song_id)
tracks = cursor.fetchall()
for track in tracks:
if self.stop_import_flag:
success = False
break
self.add_media_file(unicode(track[0], u'cp1252'))
if self.stop_import_flag:
success = False
break
self.finish()
return success

View File

@ -116,10 +116,11 @@ class OpenSongImport(SongImport):
opensong files. If `self.commit` is set False, the import will not be
committed to the database (useful for test scripts).
"""
success = False
success = True
self.import_wizard.importProgressBar.setMaximum(len(self.filenames))
for filename in self.filenames:
if self.stop_import_flag:
success = False
break
ext = os.path.splitext(filename)[1]
if ext.lower() == u'.zip':
@ -130,24 +131,28 @@ class OpenSongImport(SongImport):
len(z.infolist()))
for song in z.infolist():
if self.stop_import_flag:
success = False
break
parts = os.path.split(song.filename)
if parts[-1] == u'':
#No final part => directory
continue
self.import_wizard.incrementProgressBar(u'Importing %s...' \
% parts[-1])
self.import_wizard.incrementProgressBar(
unicode(translate('SongsPlugin.ImportWizardForm',
'Importing %s...')) % parts[-1])
songfile = z.open(song)
self.do_import_file(songfile)
if self.commit:
self.finish()
self.set_defaults()
if self.stop_import_flag:
success = False
break
else:
log.info('Direct import %s', filename)
self.import_wizard.incrementProgressBar(u'Importing %s...' \
% os.path.split(filename)[-1])
self.import_wizard.incrementProgressBar(
unicode(translate('SongsPlugin.ImportWizardForm',
'Importing %s...')) % os.path.split(filename)[-1])
file = open(filename)
self.do_import_file(file)
if self.commit:
@ -155,7 +160,7 @@ class OpenSongImport(SongImport):
self.set_defaults()
if not self.commit:
self.finish()
return success
def do_import_file(self, file):
"""

View File

@ -30,7 +30,7 @@ from PyQt4 import QtCore
from openlp.core.lib import Receiver, translate
from openlp.plugins.songs.lib import VerseType
from openlp.plugins.songs.lib.db import Song, Author, Topic, Book
from openlp.plugins.songs.lib.db import Song, Author, Topic, Book, MediaFile
from openlp.plugins.songs.lib.xml import SongXMLBuilder
log = logging.getLogger(__name__)
@ -66,6 +66,7 @@ class SongImport(QtCore.QObject):
self.ccli_number = u''
self.authors = []
self.topics = []
self.media_files = []
self.song_book_name = u''
self.song_book_pub = u''
self.verse_order_list = []
@ -184,6 +185,14 @@ class SongImport(QtCore.QObject):
return
self.authors.append(author)
def add_media_file(self, filename):
"""
Add a media file to the list
"""
if filename in self.media_files:
return
self.media_files.append(filename)
def add_verse(self, verse, versetag=None):
"""
Add a verse. This is the whole verse, lines split by \n
@ -279,11 +288,16 @@ class SongImport(QtCore.QObject):
for authortext in self.authors:
author = self.manager.get_object_filtered(Author,
Author.display_name == authortext)
if author is None:
if not author:
author = Author.populate(display_name = authortext,
last_name=authortext.split(u' ')[-1],
first_name=u' '.join(authortext.split(u' ')[:-1]))
song.authors.append(author)
for filename in self.media_files:
media_file = self.manager.get_object_filtered(MediaFile,
MediaFile.file_name == filename)
if not media_file:
song.media_files.append(MediaFile.populate(file_name=filename))
if self.song_book_name:
song_book = self.manager.get_object_filtered(Book,
Book.name == self.song_book_name)