diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 76c891636..6b61a539d 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -110,7 +110,7 @@ class MainDisplay(DisplayWidget): Phonon.createPath(self.mediaObject, self.audio) QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'stateChanged(Phonon::State, Phonon::State)'), - self.videoStart) + self.videoState) QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'finished()'), self.videoFinished) @@ -378,11 +378,13 @@ class MainDisplay(DisplayWidget): Receiver.send_message(u'maindisplay_active') return self.preview() - def videoStart(self, newState, oldState): + def videoState(self, newState, oldState): """ Start the video at a predetermined point. """ - if newState == Phonon.PlayingState: + if newState == Phonon.PlayingState \ + and oldState != Phonon.PausedState \ + and self.serviceItem.start_time > 0: # set start time in milliseconds self.mediaObject.seek(self.serviceItem.start_time * 1000) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index e5ab6e5e0..8a1bc2b76 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -36,7 +36,7 @@ from openlp.core.lib.ui import UiStrings, critical_error_message_box from PyQt4.phonon import Phonon log = logging.getLogger(__name__) - + class MediaMediaItem(MediaManagerItem): """ This is the custom media manager item for Media Slides. @@ -54,9 +54,6 @@ class MediaMediaItem(MediaManagerItem): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'video_background_replaced'), self.videobackgroundReplaced) - QtCore.QObject.connect(self.mediaObject, - QtCore.SIGNAL(u'stateChanged(Phonon::State, Phonon::State)'), - self.videoStart) def retranslateUi(self): self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') @@ -125,41 +122,67 @@ class MediaMediaItem(MediaManagerItem): if item is None: return False filename = unicode(item.data(QtCore.Qt.UserRole).toString()) - if os.path.exists(filename): - self.mediaState = None - self.mediaObject.stop() - self.mediaObject.clearQueue() - self.mediaObject.setCurrentSource(Phonon.MediaSource(filename)) - self.mediaObject.play() - service_item.title = unicode(self.plugin.nameStrings[u'singular']) - service_item.add_capability(ItemCapabilities.RequiresMedia) - # force a nonexistent theme - service_item.theme = -1 - frame = u':/media/image_clapperboard.png' - (path, name) = os.path.split(filename) - file_size = os.path.getsize(filename) - # File too big for processing - if file_size <= 52428800: # 50MiB - start = datetime.now() - while not self.mediaState: - Receiver.send_message(u'openlp_process_events') - tme = datetime.now() - start - if tme.seconds > 5: - break - if self.mediaState: - service_item.media_length = self.mediaLength - service_item.add_capability( - ItemCapabilities.AllowsVariableStartTime) - service_item.add_from_command(path, name, frame) - return True - else: + if not os.path.exists(filename): # File is no longer present critical_error_message_box( translate('MediaPlugin.MediaItem', 'Missing Media File'), unicode(translate('MediaPlugin.MediaItem', 'The file %s no longer exists.')) % filename) return False + self.mediaObject.stop() + self.mediaObject.clearQueue() + self.mediaObject.setCurrentSource(Phonon.MediaSource(filename)) + if not self.mediaStateWait(Phonon.StoppedState): + # Due to string freeze, borrow a message from presentations + # This will be corrected in 1.9.6 + critical_error_message_box( + translate('PresentationPlugin.MediaItem', 'Unsupported File'), + unicode(translate('PresentationPlugin.MediaItem', + 'Unsupported File'))) + return False + # File too big for processing + if os.path.getsize(filename) <= 52428800: # 50MiB + self.mediaObject.play() + if not self.mediaStateWait(Phonon.PlayingState) \ + or self.mediaObject.currentSource().type() \ + == Phonon.MediaSource.Invalid: + # Due to string freeze, borrow a message from presentations + # This will be corrected in 1.9.6 + self.mediaObject.stop() + critical_error_message_box( + translate('PresentationPlugin.MediaItem', + 'Unsupported File'), + unicode(translate('PresentationPlugin.MediaItem', + 'Unsupported File'))) + return False + self.mediaLength = self.mediaObject.totalTime() / 1000 + self.mediaObject.stop() + service_item.media_length = self.mediaLength + service_item.add_capability( + ItemCapabilities.AllowsVariableStartTime) + service_item.title = unicode(self.plugin.nameStrings[u'singular']) + service_item.add_capability(ItemCapabilities.RequiresMedia) + # force a non-existent theme + service_item.theme = -1 + frame = u':/media/image_clapperboard.png' + (path, name) = os.path.split(filename) + service_item.add_from_command(path, name, frame) + return True + def mediaStateWait(self, mediaState): + """ + Wait for the video to change its state + Wait no longer than 5 seconds. + """ + start = datetime.now() + while self.mediaObject.state() != mediaState: + if self.mediaObject.state() == Phonon.ErrorState: + return False + Receiver.send_message(u'openlp_process_events') + if (datetime.now() - start).seconds > 5: + return False + return True + def initialise(self): self.listView.clear() self.listView.setIconSize(QtCore.QSize(88, 50)) @@ -187,12 +210,3 @@ class MediaMediaItem(MediaManagerItem): item_name.setIcon(build_icon(img)) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.listView.addItem(item_name) - - def videoStart(self, newState, oldState): - """ - Start the video at a predetermined point. - """ - if newState == Phonon.PlayingState: - self.mediaState = newState - self.mediaLength = self.mediaObject.totalTime()/1000 - self.mediaObject.stop()