From 5e8ff0214e9817932b362b0c530aa55b2151659c Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Tue, 30 Jun 2009 21:35:53 +0100 Subject: [PATCH] Video items have a preview shown --- openlp/core/lib/listwithpreviews.py | 16 ++++--- openlp/core/lib/mediamanageritem.py | 9 +++- openlp/plugins/media/lib/mediaitem.py | 49 +++++++++++++++++-- openlp/plugins/media/mediaplugin.py | 2 +- openlp/plugins/media/video_render.py | 69 --------------------------- 5 files changed, 64 insertions(+), 81 deletions(-) delete mode 100644 openlp/plugins/media/video_render.py diff --git a/openlp/core/lib/listwithpreviews.py b/openlp/core/lib/listwithpreviews.py index dce892c31..1ccb8165f 100644 --- a/openlp/core/lib/listwithpreviews.py +++ b/openlp/core/lib/listwithpreviews.py @@ -35,14 +35,18 @@ class ListWithPreviews(QtCore.QAbstractListModel): self.items = [] self.rowheight = 50 self.maximagewidth = self.rowheight * 16 / 9.0; - if new_preview_function is not None: - self.make_preview=new_preview_function - else: - self.make_preview=self.preview_function + self.preview_function = new_preview_function - def preview_function(self, filename): + def make_preview(self, filename): if os.path.exists(filename): - preview = QtGui.QImage(filename) + if self.preview_function is not None: + preview=self.preview_function(filename) + else: + preview = QtGui.QImage(filename) + else: + preview = None + + if preview is not None: w = self.maximagewidth; h = self.rowheight preview = preview.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 792c529ee..486a601cb 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -18,7 +18,7 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ import types - +import os from PyQt4 import QtCore, QtGui from openlp.core.lib.toolbar import * from openlp.core.lib import translate @@ -123,6 +123,8 @@ class MediaManagerItem(QtGui.QWidget): # each plugin needs to inherit a class from this and pass that *class* (not an instance) to here # via the ListViewWithDnD_class member # self.ServiceItemIconName - string referring to an icon file or a resource icon + # self.PreviewFunction - a function which returns a QImage to represent the item (a preview usually) - no scaling required - that's done later + # If this fn is not defined, a default will be used (treat the filename as an image) # The assumption is that given that at least two plugins are of the form # "text with an icon" then all this will help @@ -168,7 +170,10 @@ class MediaManagerItem(QtGui.QWidget): #Add the List widget self.ListView = self.ListViewWithDnD_class() self.ListView.uniformItemSizes = True - self.ListData = ListWithPreviews() + try: + self.ListData = ListWithPreviews(self.PreviewFunction) + except AttributeError: + self.ListData = ListWithPreviews(None) self.ListView.setModel(self.ListData) self.ListView.setGeometry(QtCore.QRect(10, 100, 256, 591)) self.ListView.setSpacing(1) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 2d5bec6ea..d9f4c43d4 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -19,7 +19,13 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ import logging import os - +import tempfile +try: + import gst +except: + log = logging.getLogger(u'MediaMediaItemSetup') + log.warning(u'Can\'t generate Vidoe previews - import gst failed'); + from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, translate @@ -51,8 +57,45 @@ class MediaMediaItem(MediaManagerItem): # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = MediaListView self.ServiceItemIconName = u':/media/media_image.png' + self.PreviewFunction = self.video_get_preview MediaManagerItem.__init__(self, parent, icon, title) + def video_get_preview(self, filename): + + """Gets a preview of the first frame of a video file using + GSTREAMER (non-portable??? - Can't figure out how to do with + Phonon - returns a QImage""" + + try: + # Define your pipeline, just as you would at the command prompt. + # This is much easier than trying to create and link each gstreamer element in Python. + # This is great for pipelines that end with a filesink (i.e. there is no audible or visual output) + log.info ("Video preview %s"%( filename)) + outfile=tempfile.NamedTemporaryFile(suffix='.png') + cmd=u'filesrc location="%s" ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location="%s"'% (filename, outfile.name) + pipe = gst.parse_launch(cmd) + # Get a reference to the pipeline's bus + bus = pipe.get_bus() + + # Set the pipeline's state to PLAYING + pipe.set_state(gst.STATE_PLAYING) + + # Listen to the pipeline's bus indefinitely until we receive a EOS (end of stream) message. + # This is a super important step, or the pipeline might not work as expected. For example, + # in my example pipeline above, the pngenc will not export an actual image unless you have + # this line of code. It just exports a 0 byte png file. So... don't forget this step. + bus.poll(gst.MESSAGE_EOS, -1) + img=QtGui.QImage(outfile.name) + outfile.close() +# os.unlink(outfile.name) + pipe.set_state(gst.STATE_NULL) + return img + except: + log.info("Can't generate video preview for some reason"); + import sys + print sys.exc_info() + return QtGui.QImage() + def generateSlideData(self, service_item): indexes = self.ListView.selectedIndexes() @@ -66,9 +109,9 @@ class MediaMediaItem(MediaManagerItem): def onPreviewClick(self): log.debug(u'Media Preview Button pressed') - items = self.MediaListView.selectedIndexes() + items = self.ListView.selectedIndexes() for item in items: - text = self.MediaListData.getValue(item) + text = self.ListData.getValue(item) print text def onMediaLiveClick(self): diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 7c79c4bd7..322938ee6 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -22,7 +22,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab from openlp.plugins.media.lib import MediaTab,MediaMediaItem - +from video_preview import video_get_preview class MediaPlugin(Plugin): def __init__(self, plugin_helpers): diff --git a/openlp/plugins/media/video_render.py b/openlp/plugins/media/video_render.py deleted file mode 100644 index 4b261ffc1..000000000 --- a/openlp/plugins/media/video_render.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 -""" -OpenLP - Open Source Lyrics Projection -Copyright (c) 2008 Raoul Snyman -Portions copyright (c) 2008 Martin Thompson, Tim Bentley, - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA -""" -import os -from PyQt4 import QtCore, QtGui - -# xxx this needs a try, except once we've decided what to do if it fails -from PyQt4.phonon import Phonon - -# from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab -# from openlp.plugins.media.lib import MediaTab,MediaMediaItem - -"""Renders a video to some surface or other """ - -class w(QtGui.QMainWindow): - def __init__(self, parent=None): - super(QtGui.QMainWindow, self).__init__(parent) - self.resize(640,480) - self.setWindowTitle(u'simple media player') - self.show() - -if __name__==u'__main__': - app = QtGui.QApplication([]) -# widget = QtGui.QWidget() -# widget.resize(320, 240) -# widget.setWindowTitle(u'simple') -# widget.show() -# QCore.QCoreApplication.setApplicationName(u'OpenLP') - mainwindow=w() - widget=QtGui.QWidget(mainwindow) - mainwindow.setCentralWidget(widget) - widget.setLayout(QtGui.QVBoxLayout(widget)) -# videofile=u'r-128.rm' - videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg' - source=Phonon.MediaSource(videofile) - - media=Phonon.MediaObject(widget) - media.setCurrentSource(source) - - video=Phonon.VideoWidget(widget) - audio=Phonon.AudioOutput(Phonon.MusicCategory) -# controller=Phonon.MediaController(media) - Phonon.createPath(media, video); - Phonon.createPath(media, audio); -# player=Phonon.VideoPlayer(Phonon.VideoCategory, widget) - slider=Phonon.SeekSlider(media, mainwindow) - widget.layout().addWidget(slider) - widget.layout().addWidget(video) - slider.show() - - video.show() - media.play() - app.exec_()