diff --git a/openlp/core/ui/media/systemplayer.py b/openlp/core/ui/media/systemplayer.py index 897440ac9..22899ab06 100644 --- a/openlp/core/ui/media/systemplayer.py +++ b/openlp/core/ui/media/systemplayer.py @@ -29,6 +29,7 @@ """ The :mod:`~openlp.core.ui.media.systemplayer` contains the system (aka QtMultimedia) player component. """ +import functools import logging import mimetypes @@ -78,21 +79,16 @@ class SystemPlayer(MediaPlayer): mimetypes.init() media_service = self.media_player.service() log.info(media_service.__class__.__name__) - container_control = media_service.requestControl('org.qt-project.qt.mediacontainercontrol/5.0') - if container_control is not None: - supported_codecs = container_control.supportedContainers() - self.media_player.service().releaseControl(container_control) - for mime_type in supported_codecs: - # mime_type = str(mime_type) - # if mime_type.startswith('audio/'): - log.info(mime_type) - # self._add_to_list(self.audio_extensions_list, mime_type) - # video_device_info = QtMultimedia.QVideoDeviceInfo(QtMultimedia.QAudioDeviceInfo.defaultOutputDevice()) - # log.info('Supported audio codecs: %s', device_info.supportedCodecs()) - # for mime_type in device_info.supportedCodecs(): - # elif mime_type.startswith('video/'): - # self._add_to_list(self.video_extensions_list, mime_type) - self._add_to_list(self.audio_extensions_list, 'audio/pcm') + # supportedMimeTypes doesn't return anything on Linux and Windows and + # the mimetypes it returns on Mac OS X may not be playable. + # supported_codecs = self.media_player.supportedMimeTypes() + # for mime_type in supported_codecs: + # mime_type = str(mime_type) + # log.info(mime_type) + # if mime_type.startswith('audio/'): + # self._add_to_list(self.audio_extensions_list, mime_type) + # elif mime_type.startswith('video/'): + # self._add_to_list(self.video_extensions_list, mime_type) def _add_to_list(self, mime_type_list, mimetype): """ @@ -105,16 +101,6 @@ class SystemPlayer(MediaPlayer): if ext not in mime_type_list: mime_type_list.append(ext) log.info('MediaPlugin: %s extensions: %s' % (mimetype, ' '.join(extensions))) - # Add extensions for this mimetype from self.additional_extensions. - # This hack clears mimetypes' and operating system's shortcomings - # by providing possibly missing extensions. - if mimetype in list(self.additional_extensions.keys()): - for extension in self.additional_extensions[mimetype]: - ext = '*%s' % extension - if ext not in mime_type_list: - mime_type_list.append(ext) - log.info('MediaPlugin: %s additional extensions: %s' % - (mimetype, ' '.join(self.additional_extensions[mimetype]))) def setup(self, display): """ @@ -140,13 +126,17 @@ class SystemPlayer(MediaPlayer): Load a video into the display :param display: """ - log.debug('load vid in Phonon Controller') + log.debug('load vid in System Controller') controller = display.controller volume = controller.media_info.volume path = controller.media_info.file_info.absoluteFilePath() - display.media_player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(path))) - self.volume(display, volume) - return True + # Check if file is playable due to mimetype filters being nonexistent on Linux and Windows + if self.check_media(path): + display.media_player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(path))) + self.volume(display, volume) + return True + else: + return False def resize(self, display): """ @@ -256,3 +246,45 @@ class SystemPlayer(MediaPlayer): '
' + str(self.audio_extensions_list) + '
' + translate('Media.player', 'Video') + '
' + str(self.video_extensions_list) + '
') + + def check_media(self, path): + """ + Check if a file can be played + Uses a separate QMediaPlayer in a thread + + :param path: Path to file to be checked + :return: True if file can be played otherwise False + """ + thread = QtCore.QThread() + check_media_player = CheckMedia(path) + check_media_player.moveToThread(thread) + check_media_player.finished.connect(thread.quit) + thread.started.connect(check_media_player.play) + thread.start() + while thread.isRunning(): + self.application.processEvents() + return check_media_player.result + + +class CheckMedia(QtMultimedia.QMediaPlayer): + """ + Class used to check if a media file is playable + """ + finished = QtCore.pyqtSignal() + + def __init__(self, path): + super(CheckMedia, self).__init__(None, QtMultimedia.QMediaPlayer.VideoSurface) + self.result = None + + self.error.connect(functools.partial(self.signals, 'error')) + self.mediaStatusChanged.connect(functools.partial(self.signals, 'media')) + + self.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(path))) + + def signals(self, origin, status): + if origin == 'media' and status == self.BufferedMedia: + self.result = True + self.finished.emit() + elif origin == 'error' and status != self.NoError: + self.result = False + self.finished.emit()