From 936c77a7ea2968e996bc4000b544ac1e79b2f2fe Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 19 Mar 2011 15:48:26 +0000 Subject: [PATCH 1/3] Now detects non-playable media files. Unfortunately can't stop valid ones now... --- openlp/plugins/media/lib/mediaitem.py | 93 ++++++++++++++++----------- 1 file changed, 57 insertions(+), 36 deletions(-) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index e5ab6e5e0..064be1637 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. @@ -56,7 +56,7 @@ class MediaMediaItem(MediaManagerItem): self.videobackgroundReplaced) QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'stateChanged(Phonon::State, Phonon::State)'), - self.videoStart) + self.videoStateChange) def retranslateUi(self): self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') @@ -125,41 +125,65 @@ 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.mediaState = None + 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): + # 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 + 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.mediaState != mediaState: + if self.mediaState == 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)) @@ -188,11 +212,8 @@ class MediaMediaItem(MediaManagerItem): item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.listView.addItem(item_name) - def videoStart(self, newState, oldState): + def videoStateChange(self, newState, oldState): """ - Start the video at a predetermined point. + Detect change of video state """ - if newState == Phonon.PlayingState: - self.mediaState = newState - self.mediaLength = self.mediaObject.totalTime()/1000 - self.mediaObject.stop() + self.mediaState = newState From 2fa28881126d12c963bdda1b14bb931133e7216b Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 19 Mar 2011 17:26:17 +0000 Subject: [PATCH 2/3] Tidyups and fix pause problem. Still issue with media manager hanging sometimes after play starts. Perhaps missing an event? --- openlp/core/ui/maindisplay.py | 4 +++- openlp/plugins/media/lib/mediaitem.py | 18 +++++------------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 76c891636..687c3522c 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -382,7 +382,9 @@ class MainDisplay(DisplayWidget): """ 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 064be1637..6e5dc9ff1 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -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.videoStateChange) def retranslateUi(self): self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') @@ -134,7 +131,6 @@ class MediaMediaItem(MediaManagerItem): return False self.mediaObject.stop() self.mediaObject.clearQueue() - self.mediaState = None self.mediaObject.setCurrentSource(Phonon.MediaSource(filename)) if not self.mediaStateWait(Phonon.StoppedState): # Due to string freeze, borrow a message from presentations @@ -147,7 +143,9 @@ class MediaMediaItem(MediaManagerItem): # File too big for processing if os.path.getsize(filename) <= 52428800: # 50MiB self.mediaObject.play() - if not self.mediaStateWait(Phonon.PlayingState): + 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 critical_error_message_box( @@ -176,8 +174,8 @@ class MediaMediaItem(MediaManagerItem): Wait no longer than 5 seconds. """ start = datetime.now() - while self.mediaState != mediaState: - if self.mediaState == Phonon.ErrorState: + 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: @@ -211,9 +209,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 videoStateChange(self, newState, oldState): - """ - Detect change of video state - """ - self.mediaState = newState From 55d9e858403cb5df20619c60c88a9a0d185cf806 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 19 Mar 2011 22:52:56 +0000 Subject: [PATCH 3/3] tidies --- openlp/core/ui/maindisplay.py | 4 ++-- openlp/plugins/media/lib/mediaitem.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 687c3522c..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,7 +378,7 @@ 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. """ diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 6e5dc9ff1..8a1bc2b76 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -148,6 +148,7 @@ class MediaMediaItem(MediaManagerItem): == 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'),