From 1600e002cb464a1bea429ca3965c81481d0b0495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Mon, 5 Mar 2012 23:09:31 +0200 Subject: [PATCH 01/12] Make media backend names translatable. Fixes: https://launchpad.net/bugs/903683 --- openlp/core/ui/media/phononplayer.py | 3 ++- openlp/core/ui/media/vlcplayer.py | 3 ++- openlp/core/ui/media/webkitplayer.py | 2 ++ openlp/plugins/media/lib/mediatab.py | 15 ++++++++------- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index 5a9a5f67d..5ba17f72a 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -31,7 +31,7 @@ from datetime import datetime from PyQt4.phonon import Phonon -from openlp.core.lib import Receiver +from openlp.core.lib import Receiver, Translate from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState @@ -63,6 +63,7 @@ class PhononPlayer(MediaPlayer): def __init__(self, parent): MediaPlayer.__init__(self, parent, u'phonon') + self.display_name = translate('MediaPlugin.MediaTab', 'Phonon') self.parent = parent self.additional_extensions = ADDITIONAL_EXT mimetypes.init() diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 2adf0a2d1..6b404cfde 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -43,7 +43,7 @@ except OSError, e: raise from PyQt4 import QtCore, QtGui -from openlp.core.lib import Receiver +from openlp.core.lib import Receiver, translate from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState @@ -89,6 +89,7 @@ class VlcPlayer(MediaPlayer): def __init__(self, parent): MediaPlayer.__init__(self, parent, u'vlc') + self.display_name = translate('MediaPlugin.MediaTab', 'VLC') self.parent = parent self.canFolder = True self.audio_extensions_list = AUDIO_EXT diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index abb5355d0..7420b8bf1 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -27,6 +27,7 @@ import logging +from openlp.core.lib import translate from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState @@ -260,6 +261,7 @@ class WebkitPlayer(MediaPlayer): def __init__(self, parent): MediaPlayer.__init__(self, parent, u'webkit') + self.display_name = translate('MediaPlugin.MediaTab', 'WebKit') self.parent = parent self.canBackground = True self.audio_extensions_list = AUDIO_EXT diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index aed6b96cc..4dbefbffd 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -117,11 +117,11 @@ class MediaTab(SettingsTab): player = self.mediaPlayers[key] checkbox = self.playerCheckBoxes[player.name] if player.available: - checkbox.setText(player.name) + checkbox.setText(player.display_name) else: checkbox.setText( unicode(translate('MediaPlugin.MediaTab', - '%s (unavailable)')) % player.name) + '%s (unavailable)')) % player.display_name) self.playerOrderGroupBox.setTitle( translate('MediaPlugin.MediaTab', 'Player Order')) self.orderingDownButton.setText( @@ -134,7 +134,10 @@ class MediaTab(SettingsTab): 'Allow media player to be overriden')) def onPlayerCheckBoxChanged(self, check_state): - player = self.sender().text() + display_name = self.sender().text() + for key in self.mediaPlayers: + if self.mediaPlayers[key].display_name == display_name: + player = key if check_state == QtCore.Qt.Checked: if player not in self.usedPlayers: self.usedPlayers.append(player) @@ -152,7 +155,8 @@ class MediaTab(SettingsTab): self.playerCheckBoxes[u'%s' % player].setEnabled(False) else: self.playerCheckBoxes[u'%s' % player].setEnabled(True) - self.playerOrderlistWidget.addItem(player) + self.playerOrderlistWidget.addItem( + self.mediaPlayers[unicode(player)].display_name) def onOrderingUpButtonPressed(self): currentRow = self.playerOrderlistWidget.currentRow() @@ -171,9 +175,6 @@ class MediaTab(SettingsTab): self.usedPlayers.move(currentRow, currentRow + 1) def load(self): - if self.savedUsedPlayers: - self.usedPlayers = self.savedUsedPlayers - self.savedUsedPlayers = None self.usedPlayers = QtCore.QSettings().value( self.settingsSection + u'/players', QtCore.QVariant(u'webkit')).toString().split(u',') From e0766fa0181fb89ab090bdf77952d1892af51777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 6 Mar 2012 20:42:59 +0200 Subject: [PATCH 02/12] Extended QCheckBox class to contan an extra data bit so we don't rely on translations to be different. --- openlp/plugins/media/lib/mediatab.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 4dbefbffd..2c5755593 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -30,6 +30,14 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate, Receiver from openlp.core.lib.ui import UiStrings +class MediaQCheckBox(QtGui.QCheckBox): + """ + MediaQCheckBox adds an extra property, playerName to the QCheckBox class. + """ + def setPlayerName(self, name): + self.playerName = name + + class MediaTab(SettingsTab): """ MediaTab is the Media settings tab in the settings dialog. @@ -49,7 +57,7 @@ class MediaTab(SettingsTab): self.playerCheckBoxes = {} for key, player in self.mediaPlayers.iteritems(): player = self.mediaPlayers[key] - checkbox = QtGui.QCheckBox(self.mediaPlayerGroupBox) + checkbox = MediaQCheckBox(self.mediaPlayerGroupBox) checkbox.setEnabled(player.available) checkbox.setObjectName(player.name + u'CheckBox') self.playerCheckBoxes[player.name] = checkbox @@ -116,6 +124,7 @@ class MediaTab(SettingsTab): for key in self.mediaPlayers: player = self.mediaPlayers[key] checkbox = self.playerCheckBoxes[player.name] + checkbox.setPlayerName(key) if player.available: checkbox.setText(player.display_name) else: @@ -134,10 +143,7 @@ class MediaTab(SettingsTab): 'Allow media player to be overriden')) def onPlayerCheckBoxChanged(self, check_state): - display_name = self.sender().text() - for key in self.mediaPlayers: - if self.mediaPlayers[key].display_name == display_name: - player = key + player = self.sender().playerName if check_state == QtCore.Qt.Checked: if player not in self.usedPlayers: self.usedPlayers.append(player) From 17233f2d900d57344d7a1732a867615199be7d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 6 Mar 2012 20:46:08 +0200 Subject: [PATCH 03/12] Use another alias for the same content. --- openlp/plugins/media/lib/mediatab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 2c5755593..41dc1ea40 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -124,7 +124,7 @@ class MediaTab(SettingsTab): for key in self.mediaPlayers: player = self.mediaPlayers[key] checkbox = self.playerCheckBoxes[player.name] - checkbox.setPlayerName(key) + checkbox.setPlayerName(player.name) if player.available: checkbox.setText(player.display_name) else: From 67cd90d5bfcb905c27fff1438f37f157c782fb5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Fri, 9 Mar 2012 08:09:19 +0200 Subject: [PATCH 04/12] Don't translate player names. Added some keyboard shortcuts. --- openlp/core/ui/media/phononplayer.py | 3 ++- openlp/core/ui/media/vlcplayer.py | 3 ++- openlp/core/ui/media/webkitplayer.py | 3 ++- openlp/plugins/media/lib/mediatab.py | 10 +++++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index 5ba17f72a..98cc598f7 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -63,7 +63,8 @@ class PhononPlayer(MediaPlayer): def __init__(self, parent): MediaPlayer.__init__(self, parent, u'phonon') - self.display_name = translate('MediaPlugin.MediaTab', 'Phonon') + self.original_name = u'Phonon' + self.display_name = u'&Phonon' self.parent = parent self.additional_extensions = ADDITIONAL_EXT mimetypes.init() diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 6b404cfde..6bbcff2a5 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -89,7 +89,8 @@ class VlcPlayer(MediaPlayer): def __init__(self, parent): MediaPlayer.__init__(self, parent, u'vlc') - self.display_name = translate('MediaPlugin.MediaTab', 'VLC') + self.original_name = u'VLC' + self.display_name = u'&VLC' self.parent = parent self.canFolder = True self.audio_extensions_list = AUDIO_EXT diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index 7420b8bf1..86e96bf67 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -261,7 +261,8 @@ class WebkitPlayer(MediaPlayer): def __init__(self, parent): MediaPlayer.__init__(self, parent, u'webkit') - self.display_name = translate('MediaPlugin.MediaTab', 'WebKit') + self.original_name = u'WebKit' + self.display_name = u'&WebKit' self.parent = parent self.canBackground = True self.audio_extensions_list = AUDIO_EXT diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 41dc1ea40..fe76dc4ce 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -132,15 +132,15 @@ class MediaTab(SettingsTab): unicode(translate('MediaPlugin.MediaTab', '%s (unavailable)')) % player.display_name) self.playerOrderGroupBox.setTitle( - translate('MediaPlugin.MediaTab', 'Player Order')) + translate('MediaPlugin.MediaTab', 'Player O&rder')) self.orderingDownButton.setText( - translate('MediaPlugin.MediaTab', 'Down')) + translate('MediaPlugin.MediaTab', '&Down')) self.orderingUpButton.setText( - translate('MediaPlugin.MediaTab', 'Up')) + translate('MediaPlugin.MediaTab', '&Up')) self.advancedGroupBox.setTitle(UiStrings().Advanced) self.overridePlayerCheckBox.setText( translate('MediaPlugin.MediaTab', - 'Allow media player to be overriden')) + '&Allow media player to be overriden')) def onPlayerCheckBoxChanged(self, check_state): player = self.sender().playerName @@ -162,7 +162,7 @@ class MediaTab(SettingsTab): else: self.playerCheckBoxes[u'%s' % player].setEnabled(True) self.playerOrderlistWidget.addItem( - self.mediaPlayers[unicode(player)].display_name) + self.mediaPlayers[unicode(player)].original_name) def onOrderingUpButtonPressed(self): currentRow = self.playerOrderlistWidget.currentRow() From f188e213913bc851137f00d3609aa8c0a9858b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Mon, 12 Mar 2012 10:17:20 +0200 Subject: [PATCH 05/12] Fix mediaPlayer override ComboBox items case. --- openlp/core/ui/media/mediacontroller.py | 7 ++++--- openlp/core/ui/media/phononplayer.py | 2 +- openlp/core/ui/media/vlcplayer.py | 2 +- openlp/core/ui/media/webkitplayer.py | 1 - openlp/plugins/media/lib/mediaitem.py | 10 ++++++---- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 3beffbf36..ef15f0721 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -578,12 +578,13 @@ class MediaController(object): video_list.append(item) return video_list - def override_player(self, override_player): + def override_player(self, override_player_index): playerSettings = str(QtCore.QSettings().value(u'media/players', QtCore.QVariant(u'webkit')).toString()) usedPlayers = playerSettings.split(u',') - if override_player in usedPlayers: - self.overridenPlayer = override_player + if override_player_index >= 0 and \ + override_player_index < len(usedPlayers): + self.overridenPlayer = usedPlayers[override_player_index] else: self.overridenPlayer = '' diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index 98cc598f7..ea4d16260 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -31,7 +31,7 @@ from datetime import datetime from PyQt4.phonon import Phonon -from openlp.core.lib import Receiver, Translate +from openlp.core.lib import Receiver from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 6bbcff2a5..da43c9839 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -43,7 +43,7 @@ except OSError, e: raise from PyQt4 import QtCore, QtGui -from openlp.core.lib import Receiver, translate +from openlp.core.lib import Receiver from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index 86e96bf67..2c2619dbd 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -27,7 +27,6 @@ import logging -from openlp.core.lib import translate from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 111a86209..eaf6f0edc 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -104,7 +104,7 @@ class MediaMediaItem(MediaManagerItem): self.automatic = translate('MediaPlugin.MediaItem', 'Automatic') self.displayTypeLabel.setText( - translate('MediaPlugin.MediaItem', 'Use Player:')) + translate('MediaPlugin.MediaItem', 'Use &Player:')) def requiredIcons(self): MediaManagerItem.requiredIcons(self) @@ -142,8 +142,8 @@ class MediaMediaItem(MediaManagerItem): self.overridePlayerChanged) def overridePlayerChanged(self, index): - Receiver.send_message(u'media_override_player', \ - u'%s' % self.displayTypeComboBox.currentText()) + # index - 1, because the first item is "Automatic". + Receiver.send_message(u'media_override_player', index - 1) def onResetClick(self): """ @@ -249,8 +249,10 @@ class MediaMediaItem(MediaManagerItem): playerSettings = str(QtCore.QSettings().value(u'media/players', QtCore.QVariant(u'webkit')).toString()) usedPlayers = playerSettings.split(u',') - for title in usedPlayers: + mediaPlayers = self.plugin.mediaController.mediaPlayers + for player in usedPlayers: # load the drop down selection + title = mediaPlayers[player].original_name self.displayTypeComboBox.addItem(title) if self.displayTypeComboBox.count() > 1: self.displayTypeComboBox.insertItem(0, self.automatic) From 83341b704c8d27aed54431d91ff867429fbbd6c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Mon, 12 Mar 2012 12:53:17 +0200 Subject: [PATCH 06/12] Revert string changes. --- openlp/plugins/media/lib/mediaitem.py | 5 ++--- openlp/plugins/media/lib/mediatab.py | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 1d995d84a..d0aec2691 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -104,7 +104,7 @@ class MediaMediaItem(MediaManagerItem): self.automatic = translate('MediaPlugin.MediaItem', 'Automatic') self.displayTypeLabel.setText( - translate('MediaPlugin.MediaItem', 'Use &Player:')) + translate('MediaPlugin.MediaItem', 'Use Player:')) def requiredIcons(self): MediaManagerItem.requiredIcons(self) @@ -252,8 +252,7 @@ class MediaMediaItem(MediaManagerItem): mediaPlayers = self.plugin.mediaController.mediaPlayers for player in usedPlayers: # load the drop down selection - title = mediaPlayers[player].original_name - self.displayTypeComboBox.addItem(title) + self.displayTypeComboBox.addItem(mediaPlayers[player].original_name) if self.displayTypeComboBox.count() > 1: self.displayTypeComboBox.insertItem(0, self.automatic) self.displayTypeComboBox.setCurrentIndex(0) diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index f245229c4..a93dcf5a9 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -125,11 +125,11 @@ class MediaTab(SettingsTab): unicode(translate('MediaPlugin.MediaTab', '%s (unavailable)')) % player.display_name) self.playerOrderGroupBox.setTitle( - translate('MediaPlugin.MediaTab', 'Player O&rder')) + translate('MediaPlugin.MediaTab', 'Player Order')) self.advancedGroupBox.setTitle(UiStrings().Advanced) self.overridePlayerCheckBox.setText( translate('MediaPlugin.MediaTab', - '&Allow media player to be overridden')) + 'Allow media player to be overridden')) def onPlayerCheckBoxChanged(self, check_state): player = self.sender().playerName From ccba9e7df53e6e26da8c6a01d39ed0981a9a5645 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 12 Mar 2012 23:05:39 +0200 Subject: [PATCH 07/12] Fixed bug #888815 where the files were not being loaded into the audio player because their paths were not absolute. Now when the files are loaded from the saved service file, the paths recreated properly. Fixes: https://launchpad.net/bugs/888815 --- openlp/core/lib/serviceitem.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 9878e1f24..42e140381 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -325,7 +325,10 @@ class ServiceItem(object): if u'media_length' in header: self.media_length = header[u'media_length'] if u'background_audio' in header: - self.background_audio = header[u'background_audio'] + self.background_audio = [] + for filename in header[u'background_audio']: + # Give them real file paths + self.background_audio.append(os.path.join(path, filename)) self.theme_overwritten = header.get(u'theme_overwritten', False) if self.service_item_type == ServiceItemType.Text: for slide in serviceitem[u'serviceitem'][u'data']: From 09e7e16b126376b13fde5598e1450de79b25191b Mon Sep 17 00:00:00 2001 From: rimach Date: Tue, 13 Mar 2012 20:54:16 +0100 Subject: [PATCH 08/12] fix issue, that video slider doesnt go back at video end --- openlp/core/ui/media/mediacontroller.py | 10 ++++++++++ openlp/core/ui/media/phononplayer.py | 5 ++++- openlp/core/ui/media/vlcplayer.py | 6 ++++-- openlp/core/ui/media/webkitplayer.py | 12 +++++++++--- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 2fd5528ca..ac210792a 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -57,10 +57,16 @@ class MediaController(object): # Signals QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.video_state) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'playbackPlay'), self.video_play) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_playback_play'), self.video_play) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'playbackPause'), self.video_pause) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_playback_pause'), self.video_pause) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'playbackStop'), self.video_stop) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_playback_stop'), self.video_stop) QtCore.QObject.connect(Receiver.get_receiver(), @@ -160,6 +166,9 @@ class MediaController(object): if self.curDisplayMediaPlayer[display] \ .state == MediaState.Playing: return + # no players are active anymore + for display in self.curDisplayMediaPlayer.keys(): + display.controller.seekSlider.setSliderPosition(0) self.timer.stop() def get_media_display_css(self): @@ -451,6 +460,7 @@ class MediaController(object): display.frame.evaluateJavaScript(u'show_blank("black");') self.curDisplayMediaPlayer[display].stop(display) self.curDisplayMediaPlayer[display].set_visible(display, False) + controller.seekSlider.setSliderPosition(0) def video_volume(self, msg): """ diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index ea4d16260..c366fe339 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -57,7 +57,7 @@ ADDITIONAL_EXT = { class PhononPlayer(MediaPlayer): """ - A specialised version of the MediaPlayer class, which provides a Phonon + A specialised version of the MediaPlayer class, which provides a Phonon display. """ @@ -192,6 +192,9 @@ class PhononPlayer(MediaPlayer): display.phononWidget.setVisible(status) def update_ui(self, display): + if display.mediaObject.state() == Phonon.PausedState and \ + self.state != MediaState.Paused: + self.stop(display) controller = display.controller if controller.media_info.end_time > 0: if display.mediaObject.currentTime() > \ diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 406db33b1..70a5c1cb5 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -83,7 +83,7 @@ VIDEO_EXT = [ class VlcPlayer(MediaPlayer): """ - A specialised version of the MediaPlayer class, which provides a QtWebKit + A specialised version of the MediaPlayer class, which provides a VLC display. """ @@ -122,7 +122,7 @@ class VlcPlayer(MediaPlayer): display.vlcMediaPlayer.set_hwnd(int(display.vlcWidget.winId())) elif sys.platform == "darwin": # for MacOS display.vlcMediaPlayer.set_agl(int(display.vlcWidget.winId())) - else: + else: # for Linux using the X Server display.vlcMediaPlayer.set_xwindow(int(display.vlcWidget.winId())) self.hasOwnWidget = True @@ -210,6 +210,8 @@ class VlcPlayer(MediaPlayer): display.vlcWidget.setVisible(status) def update_ui(self, display): + if display.vlcMedia.get_state() == vlc.State.Ended: + self.stop(display) controller = display.controller if controller.media_info.end_time > 0: if display.vlcMediaPlayer.get_time() > \ diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index da8d52625..e3713d7ae 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -126,7 +126,7 @@ VIDEO_JS = u""" vid.src = ''; vid2.src = ''; break; - case 'length': + case 'length': return vid.duration; case 'currentTime': return vid.currentTime; @@ -134,6 +134,8 @@ VIDEO_JS = u""" // doesnt work currently vid.currentTime = varVal; break; + case 'isEnded': + return vid.ended; case 'setVisible': vid.style.visibility = varVal; break; @@ -211,6 +213,8 @@ FLASH_JS = u""" case 'seek': // flashMovie.GotoFrame(varVal); break; + case 'isEnded': + return false;//TODO check flash end case 'setVisible': text.style.visibility = varVal; break; @@ -254,7 +258,7 @@ AUDIO_EXT = [ class WebkitPlayer(MediaPlayer): """ - A specialised version of the MediaPlayer class, which provides a QtWebKit + A specialised version of the MediaPlayer class, which provides a QtWebKit display. """ @@ -356,7 +360,6 @@ class WebkitPlayer(MediaPlayer): display.frame.evaluateJavaScript(u'show_flash("stop");') else: display.frame.evaluateJavaScript(u'show_video("stop");') - controller.seekSlider.setSliderPosition(0) self.state = MediaState.Stopped def volume(self, display, vol): @@ -408,6 +411,9 @@ class WebkitPlayer(MediaPlayer): length = display.frame.evaluateJavaScript( \ u'show_flash("length");').toInt()[0] else: + if display.frame.evaluateJavaScript( \ + u'show_video("isEnded");').toString() == 'true': + self.stop(display) (currentTime, ok) = display.frame.evaluateJavaScript( \ u'show_video("currentTime");').toFloat() # check if conversion was ok and value is not 'NaN' From b092f1960638ac2684e15899bfeb0ea8421086a3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 15 Mar 2012 06:15:21 +0000 Subject: [PATCH 09/12] Fix remote Search displaying errors on UI --- openlp/core/lib/mediamanageritem.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 6 ++++-- openlp/plugins/custom/lib/mediaitem.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 2 +- openlp/plugins/presentations/lib/mediaitem.py | 2 +- openlp/plugins/remotes/lib/httpserver.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 2 +- 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index cb77f45ad..d597fcc66 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -641,7 +641,7 @@ class MediaManagerItem(QtGui.QWidget): if item: self.autoSelectId = item.data(QtCore.Qt.UserRole).toInt()[0] - def search(self, string): + def search(self, string, showError=True): """ Performs a plugin specific search for items containing ``string`` """ diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 245d31a80..223229fd6 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -1013,6 +1013,7 @@ class BibleMediaItem(MediaManagerItem): The verse number (int). """ verse_separator = get_reference_separator(u'sep_v_display') + if not self.settings.show_new_chapters or old_chapter != chapter: verse_text = unicode(chapter) + verse_separator + unicode(verse) else: verse_text = unicode(verse) @@ -1024,12 +1025,13 @@ class BibleMediaItem(MediaManagerItem): return u'{su}[%s]{/su}' % verse_text return u'{su}%s{/su}' % verse_text - def search(self, string): + def search(self, string, showError): """ Search for some Bible verses (by reference). """ bible = unicode(self.quickVersionComboBox.currentText()) - search_results = self.plugin.manager.get_verses(bible, string, False) + search_results = self.plugin.manager.get_verses(bible, string, False, + showError) if search_results: versetext = u' '.join([verse.text for verse in search_results]) return [[string, versetext]] diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 443c95f56..cbb5a9fc4 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -267,7 +267,7 @@ class CustomMediaItem(MediaManagerItem): self.searchTextEdit.clear() self.onSearchTextButtonClick() - def search(self, string): + def search(self, string, showError): search_results = self.manager.get_all_objects(CustomSlide, or_(func.lower(CustomSlide.title).like(u'%' + string.lower() + u'%'), diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 80d6360a8..75ace5d6f 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -234,7 +234,7 @@ class ImageMediaItem(MediaManagerItem): 'There was a problem replacing your background, ' 'the image file "%s" no longer exists.')) % filename) - def search(self, string): + def search(self, string, showError): files = SettingsManager.load_list(self.settingsSection, u'images') results = [] string = string.lower() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index d0aec2691..60518a09e 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -310,7 +310,7 @@ class MediaMediaItem(MediaManagerItem): media = filter(lambda x: os.path.splitext(x)[1] in ext, media) return media - def search(self, string): + def search(self, string, showError): files = SettingsManager.load_list(self.settingsSection, u'media') results = [] string = string.lower() diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 03fdadb1b..3f9c81fc7 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -322,7 +322,7 @@ class PresentationMediaItem(MediaManagerItem): return controller return None - def search(self, string): + def search(self, string, showError): files = SettingsManager.load_list( self.settingsSection, u'presentations') results = [] diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index bdef88720..8daa1c7b0 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -522,7 +522,7 @@ class HttpConnection(object): plugin = self.parent.plugin.pluginManager.get_plugin_by_name(type) if plugin.status == PluginStatus.Active and \ plugin.mediaItem and plugin.mediaItem.hasSearch: - results = plugin.mediaItem.search(text) + results = plugin.mediaItem.search(text, False) else: results = [] return HttpResponse( diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 34a54dee4..8ad9b33ab 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -586,7 +586,7 @@ class SongMediaItem(MediaManagerItem): Receiver.send_message(u'service_item_update', u'%s:%s:%s' % (editId, item._uuid, temporary)) - def search(self, string): + def search(self, string, showError): """ Search for some songs """ From b29f10da0b7d5e59b1e34e3885106ec29748c1ca Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 15 Mar 2012 16:57:23 +0000 Subject: [PATCH 10/12] Remove file --- .idea/inspectionProfiles/profiles_settings.xml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index c60c33bb4..000000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file From a16fbda8d3c4710ccdf6e9b167bfab6e68c4934d Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 15 Mar 2012 22:38:03 +0000 Subject: [PATCH 11/12] Handle more songselect formats --- openlp/plugins/songs/lib/cclifileimport.py | 23 ++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index 448e4bc37..6b99f9a16 100644 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -159,6 +159,12 @@ class CCLIFileImport(SongImport): song_author = u'' song_topics = u'' for line in textList: + if line.startswith(u'[S '): + ccli, line = line.split(u']', 1) + if ccli.startswith(u'[S A'): + self.ccliNumber = ccli[4:].strip() + else: + self.ccliNumber = ccli[3:].strip() if line.startswith(u'Title='): self.title = line[6:].strip() elif line.startswith(u'Author='): @@ -166,9 +172,7 @@ class CCLIFileImport(SongImport): elif line.startswith(u'Copyright='): self.copyright = line[10:].strip() elif line.startswith(u'Themes='): - song_topics = line[7:].strip() - elif line.startswith(u'[S A'): - self.ccliNumber = line[4:-3].strip() + song_topics = line[7:].strip().replace(u' | ', u'/t') elif line.startswith(u'Fields='): # Fields contain single line indicating verse, chorus, etc, # /t delimited, same as with words field. store seperately @@ -193,6 +197,7 @@ class CCLIFileImport(SongImport): check_first_verse_line = True verse_text = unicode(words_list[counter]) verse_text = verse_text.replace(u'/n', u'\n') + verse_text = verse_text.replace(u' | ', u'\n') verse_lines = verse_text.split(u'\n', 1) if check_first_verse_line: if verse_lines[0].startswith(u'(PRE-CHORUS'): @@ -243,7 +248,7 @@ class CCLIFileImport(SongImport): Song CCLI number # e.g. CCLI Number (e.g.CCLI-Liednummer: 2672885) - Song copyright + Song copyright (if it begins ©, otherwise after authors) # e.g. © 1999 Integrity's Hosanna! Music | LenSongs Publishing Song authors # e.g. Lenny LeBlanc | Paul Baloche Licencing info @@ -322,11 +327,17 @@ class CCLIFileImport(SongImport): #line_number=2, copyright if line_number == 2: line_number += 1 - self.copyright = clean_line + if clean_line.startswith(u'©'): + self.copyright = clean_line + else: + song_author = clean_line #n=3, authors elif line_number == 3: line_number += 1 - song_author = clean_line + if song_author: + self.copyright = clean_line + else: + song_author = clean_line #line_number=4, comments lines before last line elif line_number == 4 and not clean_line.startswith(u'CCL'): self.comments += clean_line From 7464d0f9fc00c6f99f9b7399abb1126a56c1495b Mon Sep 17 00:00:00 2001 From: rimach Date: Fri, 16 Mar 2012 22:09:27 +0100 Subject: [PATCH 12/12] correct pause check, correct signal names --- openlp/core/ui/media/mediacontroller.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index ac210792a..228809042 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -59,20 +59,14 @@ class MediaController(object): QtCore.SIGNAL("timeout()"), self.video_state) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPlay'), self.video_play) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_playback_play'), self.video_play) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPause'), self.video_pause) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_playback_pause'), self.video_pause) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackStop'), self.video_stop) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_playback_stop'), self.video_stop) + QtCore.SIGNAL(u'seekSlider'), self.video_seek) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'seek_slider'), self.video_seek) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'volume_slider'), self.video_volume) + QtCore.SIGNAL(u'volumeSlider'), self.video_volume) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_hide'), self.video_hide) QtCore.QObject.connect(Receiver.get_receiver(), @@ -168,7 +162,9 @@ class MediaController(object): return # no players are active anymore for display in self.curDisplayMediaPlayer.keys(): - display.controller.seekSlider.setSliderPosition(0) + if self.curDisplayMediaPlayer[display] \ + .state != MediaState.Paused: + display.controller.seekSlider.setSliderPosition(0) self.timer.stop() def get_media_display_css(self):