Fixes bug #635330 and attempts to fix bug #635338

bzr-revno: 1028
This commit is contained in:
Raoul Snyman 2010-09-12 22:25:08 +02:00
commit 826e366880

View File

@ -28,6 +28,7 @@ The :mod:`olp1import` module provides the functionality for importing
openlp.org 1.x song databases into the current installation database. openlp.org 1.x song databases into the current installation database.
""" """
import logging import logging
import chardet
try: try:
import sqlite import sqlite
except: except:
@ -56,6 +57,21 @@ class OpenLP1SongImport(SongImport):
SongImport.__init__(self, manager) SongImport.__init__(self, manager)
self.import_source = kwargs[u'filename'] self.import_source = kwargs[u'filename']
def decode_string(self, raw):
"""
Use chardet to detect the encoding of the raw string, and convert it
to unicode.
``raw``
The raw bytestring to decode.
"""
detection = chardet.detect(raw)
if detection[u'confidence'] < 0.8:
codec = u'windows-1252'
else:
codec = detection[u'encoding']
return unicode(raw, codec)
def do_import(self): def do_import(self):
""" """
Run the import for an openlp.org 1.x song database. Run the import for an openlp.org 1.x song database.
@ -63,6 +79,11 @@ class OpenLP1SongImport(SongImport):
# Connect to the database # Connect to the database
connection = sqlite.connect(self.import_source) connection = sqlite.connect(self.import_source)
cursor = connection.cursor() cursor = connection.cursor()
# Determine if we're using a new or an old DB
cursor.execute(u'SELECT name FROM sqlite_master '
u'WHERE type = \'table\' AND name = \'tracks\'')
table_list = cursor.fetchall()
new_db = len(table_list) > 0
# Count the number of records we need to import, for the progress bar # Count the number of records we need to import, for the progress bar
cursor.execute(u'SELECT COUNT(songid) FROM songs') cursor.execute(u'SELECT COUNT(songid) FROM songs')
count = int(cursor.fetchone()[0]) count = int(cursor.fetchone()[0])
@ -71,9 +92,10 @@ class OpenLP1SongImport(SongImport):
# "cache" our list of authors # "cache" our list of authors
cursor.execute(u'SELECT authorid, authorname FROM authors') cursor.execute(u'SELECT authorid, authorname FROM authors')
authors = cursor.fetchall() authors = cursor.fetchall()
# "cache" our list of tracks if new_db:
cursor.execute(u'SELECT trackid, fulltrackname FROM tracks') # "cache" our list of tracks
tracks = cursor.fetchall() cursor.execute(u'SELECT trackid, fulltrackname FROM tracks')
tracks = cursor.fetchall()
# Import the songs # Import the songs
cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, ' cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, '
u'copyrightinfo FROM songs') u'copyrightinfo FROM songs')
@ -84,9 +106,9 @@ class OpenLP1SongImport(SongImport):
success = False success = False
break break
song_id = song[0] song_id = song[0]
title = unicode(song[1], u'cp1252') title = self.decode_string(song[1])
lyrics = unicode(song[2], u'cp1252').replace(u'\r', u'') lyrics = self.decode_string(song[2]).replace(u'\r', u'')
copyright = unicode(song[3], u'cp1252') copyright = self.decode_string(song[3])
self.import_wizard.incrementProgressBar( self.import_wizard.incrementProgressBar(
unicode(translate('SongsPlugin.ImportWizardForm', unicode(translate('SongsPlugin.ImportWizardForm',
'Importing "%s"...')) % title) 'Importing "%s"...')) % title)
@ -102,15 +124,12 @@ class OpenLP1SongImport(SongImport):
break break
for author in authors: for author in authors:
if author[0] == author_id[0]: if author[0] == author_id[0]:
self.parse_author(unicode(author[1], u'cp1252')) self.parse_author(self.decode_string(author[1]))
break break
if self.stop_import_flag: if self.stop_import_flag:
success = False success = False
break break
cursor.execute(u'SELECT name FROM sqlite_master ' if new_db:
u'WHERE type = \'table\' AND name = \'tracks\'')
table_list = cursor.fetchall()
if len(table_list) > 0:
cursor.execute(u'SELECT trackid FROM songtracks ' cursor.execute(u'SELECT trackid FROM songtracks '
u'WHERE songid = %s ORDER BY listindex' % song_id) u'WHERE songid = %s ORDER BY listindex' % song_id)
track_ids = cursor.fetchall() track_ids = cursor.fetchall()
@ -120,10 +139,11 @@ class OpenLP1SongImport(SongImport):
break break
for track in tracks: for track in tracks:
if track[0] == track_id[0]: if track[0] == track_id[0]:
self.add_media_file(unicode(track[1], u'cp1252')) self.add_media_file(self.decode_string(track[1]))
break break
if self.stop_import_flag: if self.stop_import_flag:
success = False success = False
break break
self.finish() self.finish()
return success return success