From 8e853f10b1d2f4b79b7b062e624069b00678eb5b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 29 Oct 2011 10:33:48 +0100 Subject: [PATCH 01/11] Fix crash with alerts over video Change default to bottom from middle Remove unused from from previous merge Fixes: https://launchpad.net/bugs/875798, https://launchpad.net/bugs/883414 --- openlp/core/lib/htmlbuilder.py | 21 --------------------- openlp/core/ui/maindisplay.py | 6 +++--- openlp/plugins/alerts/lib/alertsmanager.py | 5 +++-- openlp/plugins/alerts/lib/alertstab.py | 2 +- 4 files changed, 7 insertions(+), 27 deletions(-) diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 863943e40..5dfe00d36 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -610,24 +610,3 @@ def build_footer_css(item, height): theme.font_footer_size, theme.font_footer_color) return lyrics_html -def build_alert_css(alertTab, width): - """ - Build the display of the footer - - ``alertTab`` - Details from the Alert tab for fonts etc - """ - style = u""" - width: %spx; - vertical-align: %s; - font-family: %s; - font-size: %spt; - color: %s; - background-color: %s; - """ - if not alertTab: - return u'' - align = VerticalType.Names[alertTab.location] - alert = style % (width, align, alertTab.font_face, alertTab.font_size, - alertTab.font_color, alertTab.bg_color) - return alert diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index aa94454b7..4077181ab 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -213,7 +213,7 @@ class MainDisplay(QtGui.QGraphicsView): self.frame.evaluateJavaScript(u'show_text("%s")' % slide.replace(u'\\', u'\\\\').replace(u'\"', u'\\\"')) - def alert(self, text): + def alert(self, text, location): """ Display an alert. @@ -241,10 +241,10 @@ class MainDisplay(QtGui.QGraphicsView): alert_height = int(height.toString()) shrinkItem.resize(self.width(), alert_height) shrinkItem.setVisible(True) - if self.alertTab.location == 1: + if location == 1: shrinkItem.move(self.screen[u'size'].left(), (self.screen[u'size'].height() - alert_height) / 2) - elif self.alertTab.location == 2: + elif location == 2: shrinkItem.move(self.screen[u'size'].left(), self.screen[u'size'].height() - alert_height) else: diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index 8e91aecf5..e73273fe7 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -85,7 +85,7 @@ class AlertsManager(QtCore.QObject): return text = self.alertList.pop(0) alertTab = self.parent().settings_tab - self.parent().liveController.display.alert(text) + self.parent().liveController.display.alert(text, alertTab.location) # Check to see if we have a timer running. if self.timer_id == 0: self.timer_id = self.startTimer(int(alertTab.timeout) * 1000) @@ -100,7 +100,8 @@ class AlertsManager(QtCore.QObject): """ log.debug(u'timer event') if event.timerId() == self.timer_id: - self.parent().liveController.display.alert(u'') + alertTab = self.parent().settings_tab + self.parent().liveController.display.alert(u'', alertTab.location) self.killTimer(self.timer_id) self.timer_id = 0 self.generateAlert() diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 8720c5111..8fd2cb3aa 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -159,7 +159,7 @@ class AlertsTab(SettingsTab): self.font_face = unicode(settings.value( u'font face', QtCore.QVariant(QtGui.QFont().family())).toString()) self.location = settings.value( - u'location', QtCore.QVariant(1)).toInt()[0] + u'location', QtCore.QVariant(2)).toInt()[0] settings.endGroup() self.fontSizeSpinBox.setValue(self.font_size) self.timeoutSpinBox.setValue(self.timeout) From ea4cb7f7edc99ad660f921d41a52f32918412208 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 29 Oct 2011 14:21:54 +0100 Subject: [PATCH 02/11] Add Class instead of magic numbers --- openlp/core/ui/__init__.py | 18 ++++++++++++++++++ openlp/core/ui/maindisplay.py | 6 +++--- openlp/plugins/alerts/lib/alertstab.py | 3 ++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 7d2dfa0ba..f5fece1f0 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -52,6 +52,24 @@ class HideMode(object): Theme = 2 Screen = 3 +class Location(object): + """ + This is an enumeration class which specifies the different modes of hiding + the display. + + ``Top`` + Place the text at the top of the screen. + + ``Middle`` + Place the text in the middle of the screen. + + ``Bottom`` + Place the text at the bottom of the screen. + """ + Top = 0 + Middle = 1 + Bottom = 2 + from firsttimeform import FirstTimeForm from firsttimelanguageform import FirstTimeLanguageForm from themelayoutform import ThemeLayoutForm diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 4077181ab..90203922f 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -37,7 +37,7 @@ from PyQt4.phonon import Phonon from openlp.core.lib import Receiver, build_html, ServiceItem, image_to_byte, \ translate, PluginManager -from openlp.core.ui import HideMode, ScreenList +from openlp.core.ui import HideMode, ScreenList, Location log = logging.getLogger(__name__) @@ -241,10 +241,10 @@ class MainDisplay(QtGui.QGraphicsView): alert_height = int(height.toString()) shrinkItem.resize(self.width(), alert_height) shrinkItem.setVisible(True) - if location == 1: + if location == Location.Middle: shrinkItem.move(self.screen[u'size'].left(), (self.screen[u'size'].height() - alert_height) / 2) - elif location == 2: + elif location == Location.Bottom: shrinkItem.move(self.screen[u'size'].left(), self.screen[u'size'].height() - alert_height) else: diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 8fd2cb3aa..10bec702d 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -28,6 +28,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate, Receiver +from openlp.core.ui import Location from openlp.core.lib.ui import UiStrings, create_valign_combo class AlertsTab(SettingsTab): @@ -159,7 +160,7 @@ class AlertsTab(SettingsTab): self.font_face = unicode(settings.value( u'font face', QtCore.QVariant(QtGui.QFont().family())).toString()) self.location = settings.value( - u'location', QtCore.QVariant(2)).toInt()[0] + u'location', QtCore.QVariant(Location.Bottom)).toInt()[0] settings.endGroup() self.fontSizeSpinBox.setValue(self.font_size) self.timeoutSpinBox.setValue(self.timeout) From c8e9496db1717692bc7ec6584f7b195f1a47919b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 29 Oct 2011 20:13:11 +0100 Subject: [PATCH 03/11] Fix up review comments --- openlp/core/ui/__init__.py | 6 +++--- openlp/core/ui/maindisplay.py | 6 +++--- openlp/plugins/alerts/lib/alertstab.py | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index f5fece1f0..6a04a080b 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -52,10 +52,10 @@ class HideMode(object): Theme = 2 Screen = 3 -class Location(object): +class AlertLocation(object): """ - This is an enumeration class which specifies the different modes of hiding - the display. + This is an enumeration class which controls where Alerts are placed on the + screen. ``Top`` Place the text at the top of the screen. diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 90203922f..0f932c2f5 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -37,7 +37,7 @@ from PyQt4.phonon import Phonon from openlp.core.lib import Receiver, build_html, ServiceItem, image_to_byte, \ translate, PluginManager -from openlp.core.ui import HideMode, ScreenList, Location +from openlp.core.ui import HideMode, ScreenList, AlertLocation log = logging.getLogger(__name__) @@ -241,10 +241,10 @@ class MainDisplay(QtGui.QGraphicsView): alert_height = int(height.toString()) shrinkItem.resize(self.width(), alert_height) shrinkItem.setVisible(True) - if location == Location.Middle: + if location == AlertLocation.Middle: shrinkItem.move(self.screen[u'size'].left(), (self.screen[u'size'].height() - alert_height) / 2) - elif location == Location.Bottom: + elif location == AlertLocation.Bottom: shrinkItem.move(self.screen[u'size'].left(), self.screen[u'size'].height() - alert_height) else: diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 10bec702d..bd879fef3 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -28,7 +28,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate, Receiver -from openlp.core.ui import Location +from openlp.core.ui import AlertLocation from openlp.core.lib.ui import UiStrings, create_valign_combo class AlertsTab(SettingsTab): @@ -160,7 +160,7 @@ class AlertsTab(SettingsTab): self.font_face = unicode(settings.value( u'font face', QtCore.QVariant(QtGui.QFont().family())).toString()) self.location = settings.value( - u'location', QtCore.QVariant(Location.Bottom)).toInt()[0] + u'location', QtCore.QVariant(AlertLocation.Bottom)).toInt()[0] settings.endGroup() self.fontSizeSpinBox.setValue(self.font_size) self.timeoutSpinBox.setValue(self.timeout) From 0ed66b6a9c488d22343c6d361b1023d712280f2d Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 30 Oct 2011 21:24:04 +0100 Subject: [PATCH 04/11] fixed alert position not being recalculated properly when changing options --- openlp/plugins/alerts/alertsplugin.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 213c6814f..493f08ba0 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -71,11 +71,24 @@ JAVASCRIPT = """ function update_css(align, font, size, color, bgcolor){ var text = document.getElementById('alert'); - text.style.verticalAlign = align; text.style.fontSize = size + "pt"; text.style.fontFamily = font; text.style.color = color; text.style.backgroundColor = bgcolor; + switch(align) + { + case 'top': + text.style.top = '0px'; + break; + case 'middle': + text.style.top = ((window.innerHeight - text.clientHeight) / 2) + + 'px'; + break; + case 'bottom': + text.style.top = (window.innerHeight - text.clientHeight) + + 'px'; + break; + } } """ CSS = """ From 15e19f9700f57e4ee4dc01b1f8e5dd5b11426839 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 30 Oct 2011 22:38:02 +0100 Subject: [PATCH 05/11] fixed rename errors --- openlp/plugins/songs/lib/oooimport.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 4a97e43b0..f817bfb45 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -65,7 +65,7 @@ class OooImport(SongImport): if not isinstance(self.importSource, list): return try: - self.start_ooo() + self.startOoo() except NoConnectException as exc: self.logError( self.importSource[0], @@ -145,7 +145,7 @@ class OooImport(SongImport): process.waitForStarted() self.processStarted = True except: - log.exception("start_ooo_process failed") + log.exception("startOooProcess failed") def openOooFile(self, filepath): """ @@ -171,7 +171,7 @@ class OooImport(SongImport): self.importWizard.incrementProgressBar( u'Processing file ' + filepath, 0) except AttributeError: - log.exception("open_ooo_file failed: %s", url) + log.exception("openOooFile failed: %s", url) return def closeOooFile(self): From d1030a7c2d34ddac2e41fbfb0a4d87141849eff9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 31 Oct 2011 08:08:51 +0100 Subject: [PATCH 06/11] Corrected comment --- openlp/core/ui/maindisplay.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index a0b6675a4..fcbfc9108 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -51,7 +51,7 @@ class MainDisplay(QtGui.QGraphicsView): def __init__(self, parent, imageManager, live): if live: QtGui.QGraphicsView.__init__(self) - # Do not overwrite the parent() method. + # Overwrite the parent() method. self.parent = lambda: parent else: QtGui.QGraphicsView.__init__(self, parent) From e402b72d58437c7962769501784c1e8532ed9596 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 31 Oct 2011 15:11:54 +0100 Subject: [PATCH 07/11] - fixed bug #872975 (Importing from v1 fails with error about missing 'settings' table) Fixes: https://launchpad.net/bugs/872975 --- openlp/plugins/songs/lib/olp1import.py | 39 ++++++++++++++++---------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 72bd5f952..44a621304 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -81,27 +81,31 @@ class OpenLP1SongImport(SongImport): # 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\'') - new_db = len(cursor.fetchall()) > 0 + db_has_tracks = len(cursor.fetchall()) > 0 + cursor.execute(u'SELECT name FROM sqlite_master ' + u'WHERE type = \'table\' AND name = \'settings\'') + db_has_themes = len(cursor.fetchall()) > 0 # "cache" our list of authors. cursor.execute(u'-- types int, unicode') cursor.execute(u'SELECT authorid, authorname FROM authors') authors = cursor.fetchall() - if new_db: + if db_has_tracks: # "cache" our list of tracks. cursor.execute(u'-- types int, unicode') cursor.execute(u'SELECT trackid, fulltrackname FROM tracks') tracks = cursor.fetchall() - # "cache" our list of themes. - cursor.execute(u'-- types int, unicode') - cursor.execute(u'SELECT settingsid, settingsname FROM settings') - themes = {} - for theme_id, theme_name in cursor.fetchall(): - if theme_name in self.availableThemes: - themes[theme_id] = theme_name + if db_has_themes: + # "cache" our list of themes. + themes = {} + cursor.execute(u'-- types int, unicode') + cursor.execute(u'SELECT settingsid, settingsname FROM settings') + for theme_id, theme_name in cursor.fetchall(): + if theme_name in self.availableThemes: + themes[theme_id] = theme_name # Import the songs. - cursor.execute(u'-- types int, unicode, unicode, unicode, int') - cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, ' - u'copyrightinfo, settingsid FROM songs') + cursor.execute(u'-- types int, unicode, unicode, unicode') + cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS ' \ + u'lyrics, copyrightinfo FROM songs') songs = cursor.fetchall() self.importWizard.progressBar.setMaximum(len(songs)) for song in songs: @@ -112,8 +116,13 @@ class OpenLP1SongImport(SongImport): self.title = song[1] lyrics = song[2].replace(u'\r\n', u'\n') self.addCopyright(song[3]) - if themes.has_key(song[4]): - self.themeName = themes[song[4]] + if db_has_themes: + cursor.execute(u'-- types int') + cursor.execute( + u'SELECT settingsid FROM songs WHERE songid = %s' % song_id) + theme_id = cursor.fetchone()[0] + if themes.has_key(theme_id): + self.themeName = themes[theme_id] verses = lyrics.split(u'\n\n') for verse in verses: if verse.strip(): @@ -131,7 +140,7 @@ class OpenLP1SongImport(SongImport): break if self.stopImportFlag: break - if new_db: + if db_has_tracks: cursor.execute(u'-- types int, int') cursor.execute(u'SELECT trackid, listindex ' u'FROM songtracks ' From dad7e86f0608db74e30b76985392fae3ec906c52 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 31 Oct 2011 15:18:22 +0100 Subject: [PATCH 08/11] added/fixed comments --- openlp/plugins/songs/lib/olp1import.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 44a621304..fa43d94cf 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -78,10 +78,11 @@ class OpenLP1SongImport(SongImport): connection = sqlite.connect(self.importSource, mode=0444, encoding=(encoding, 'replace')) cursor = connection.cursor() - # Determine if we're using a new or an old DB. + # Determine if the db supports linking audio to songs. cursor.execute(u'SELECT name FROM sqlite_master ' u'WHERE type = \'table\' AND name = \'tracks\'') db_has_tracks = len(cursor.fetchall()) > 0 + # Determine if the db contains theme information. cursor.execute(u'SELECT name FROM sqlite_master ' u'WHERE type = \'table\' AND name = \'settings\'') db_has_themes = len(cursor.fetchall()) > 0 From 14527bf3570383fea03df0308f21aefca943c075 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 31 Oct 2011 18:20:10 +0000 Subject: [PATCH 09/11] Fix my stupidity --- openlp/core/ui/maindisplay.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 5c46bd831..01d356674 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -171,7 +171,7 @@ class MainDisplay(QtGui.QGraphicsView): serviceItem = ServiceItem() serviceItem.bg_image_bytes = image_to_byte(self.initialFrame) self.webView.setHtml(build_html(serviceItem, self.screen, - self.isLive, None, self.plugins)) + self.isLive, None, plugins=self.plugins)) self.__hideMouse() # To display or not to display? if not self.screen[u'primary']: From e3cfffb7b9591c143e0fd809ba4ac368b3e12275 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Mon, 31 Oct 2011 15:21:30 -0400 Subject: [PATCH 10/11] Modified inno setup script to remove the 'support' directory (created when OpenLP is executed) during un-install --- resources/windows/OpenLP-2.0.iss | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/resources/windows/OpenLP-2.0.iss b/resources/windows/OpenLP-2.0.iss index 119b73900..9805787e5 100644 --- a/resources/windows/OpenLP-2.0.iss +++ b/resources/windows/OpenLP-2.0.iss @@ -67,7 +67,7 @@ Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription Source: ..\..\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs ; DLL used to check if the target program is running at install time Source: psvince.dll; flags: dontcopy -; psvince is installed in {app} folder, so it will be loaded at +; psvince is installed in {app} folder, so it will be loaded at ; uninstall time to check if the target program is running Source: psvince.dll; DestDir: {app} @@ -84,10 +84,16 @@ Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filenam Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent [Registry] -Root: HKCR; Subkey: ".osz"; ValueType: string; ValueName: ""; ValueData: "OpenLP"; Flags: uninsdeletevalue -Root: HKCR; Subkey: "OpenLP"; ValueType: string; ValueName: ""; ValueData: "OpenLP Service"; Flags: uninsdeletekey -Root: HKCR; Subkey: "OpenLP\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\OpenLP.exe,0" -Root: HKCR; Subkey: "OpenLP\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\OpenLP.exe"" ""%1""" +Root: HKCR; Subkey: .osz; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue +Root: HKCR; Subkey: OpenLP; ValueType: string; ValueName: ; ValueData: OpenLP Service; Flags: uninsdeletekey +Root: HKCR; Subkey: OpenLP\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\OpenLP.exe,0 +Root: HKCR; Subkey: OpenLP\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\OpenLP.exe"" ""%1""" + +[UninstallDelete] +; Remove support directory created when program is run: +Type: filesandordirs; Name: {app}\support +; Remove program directory if empty: +Name: {app}; Type: dirifempty [Code] // Function to call psvince.dll at install time @@ -173,4 +179,6 @@ begin Result := false; end; end; -end; \ No newline at end of file +// Unload psvince.dll, otherwise it is not deleted + UnloadDLL(ExpandConstant('{app}\psvince.dll')); +end; From 1bf1ffc848cef246bbee123c41059cc3b21e0f3e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 1 Nov 2011 18:32:31 +0100 Subject: [PATCH 11/11] fixed bug 884826 Fixes: https://launchpad.net/bugs/884826 --- openlp/plugins/songs/lib/mediaitem.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index d98a55c00..29f5d6a18 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -419,8 +419,7 @@ class SongMediaItem(MediaManagerItem): item_id = (self.editItem.data(QtCore.Qt.UserRole)).toInt()[0] old_song = self.plugin.manager.get_object(Song, item_id) song_xml = self.openLyrics.song_to_xml(old_song) - new_song_id = self.openLyrics.xml_to_song(song_xml) - new_song = self.plugin.manager.get_object(Song, new_song_id) + new_song = self.openLyrics.xml_to_song(song_xml) new_song.title = u'%s <%s>' % (new_song.title, translate('SongsPlugin.MediaItem', 'copy', 'For song cloning'))