From f82513f11d77aebb97e3530eadf663f6e1897b66 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 6 Sep 2010 22:33:28 +0200 Subject: [PATCH] Finally done the openlp.org 1.x song importer. --- openlp/plugins/songs/lib/olp1import.py | 80 +++++++++++++--------- openlp/plugins/songs/lib/opensongimport.py | 17 +++-- openlp/plugins/songs/lib/songimport.py | 20 +++++- 3 files changed, 76 insertions(+), 41 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index ae386335a..ab3e0d720 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -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 diff --git a/openlp/plugins/songs/lib/opensongimport.py b/openlp/plugins/songs/lib/opensongimport.py index 5666fe0eb..f6048d566 100644 --- a/openlp/plugins/songs/lib/opensongimport.py +++ b/openlp/plugins/songs/lib/opensongimport.py @@ -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): """ diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 17000a2ba..ea763c1ee 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -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 = [] @@ -76,7 +77,7 @@ class SongImport(QtCore.QObject): 'SongsPlugin.SongImport', 'copyright')) self.copyright_symbol = unicode(translate( 'SongsPlugin.SongImport', '\xa9')) - + def stop_import(self): """ Sets the flag for importers to stop their import @@ -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)