From 365a4c62cf41a6760a3960d9cd07c755d7138b94 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Fri, 24 Jan 2014 19:43:02 +0000 Subject: [PATCH] Created GUI for mediaclip selection from DVD. --- .../media/forms/mediaclipselectordialog.py | 190 +++++++++ .../media/forms/mediaclipselectorform.py | 276 ++++++++++++++ openlp/plugins/media/lib/mediaitem.py | 8 + resources/forms/mediaclipselector.ui | 359 ++++++++++++++++++ 4 files changed, 833 insertions(+) create mode 100644 openlp/plugins/media/forms/mediaclipselectordialog.py create mode 100644 openlp/plugins/media/forms/mediaclipselectorform.py create mode 100644 resources/forms/mediaclipselector.ui diff --git a/openlp/plugins/media/forms/mediaclipselectordialog.py b/openlp/plugins/media/forms/mediaclipselectordialog.py new file mode 100644 index 000000000..a6718fbf2 --- /dev/null +++ b/openlp/plugins/media/forms/mediaclipselectordialog.py @@ -0,0 +1,190 @@ +from PyQt4 import QtCore, QtGui +from openlp.core.common import translate + +class Ui_MediaClipSelector(object): + def setupUi(self, MediaClipSelector): + MediaClipSelector.setObjectName("MediaClipSelector") + MediaClipSelector.resize(683, 739) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MediaClipSelector.sizePolicy().hasHeightForWidth()) + MediaClipSelector.setSizePolicy(sizePolicy) + MediaClipSelector.setMinimumSize(QtCore.QSize(683, 686)) + MediaClipSelector.setFocusPolicy(QtCore.Qt.NoFocus) + MediaClipSelector.setAutoFillBackground(False) + MediaClipSelector.setInputMethodHints(QtCore.Qt.ImhNone) + self.centralwidget = QtGui.QWidget(MediaClipSelector) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) + self.centralwidget.setSizePolicy(sizePolicy) + self.centralwidget.setObjectName("centralwidget") + self.gridLayout = QtGui.QGridLayout(self.centralwidget) + self.gridLayout.setObjectName("gridLayout") + self.close_pushbutton = QtGui.QPushButton(self.centralwidget) + self.close_pushbutton.setEnabled(True) + self.close_pushbutton.setObjectName("close_pushbutton") + self.gridLayout.addWidget(self.close_pushbutton, 10, 4, 1, 1) + self.pause_pushbutton = QtGui.QPushButton(self.centralwidget) + self.pause_pushbutton.setEnabled(True) + self.pause_pushbutton.setText("") + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/slides/media_playback_pause.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.pause_pushbutton.setIcon(icon) + self.pause_pushbutton.setObjectName("pause_pushbutton") + self.gridLayout.addWidget(self.pause_pushbutton, 6, 1, 1, 1) + self.play_pushbutton = QtGui.QPushButton(self.centralwidget) + self.play_pushbutton.setEnabled(True) + self.play_pushbutton.setText("") + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(":/slides/media_playback_start.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.play_pushbutton.setIcon(icon1) + self.play_pushbutton.setObjectName("play_pushbutton") + self.gridLayout.addWidget(self.play_pushbutton, 6, 0, 1, 1) + self.media_path_label = QtGui.QLabel(self.centralwidget) + self.media_path_label.setEnabled(True) + self.media_path_label.setObjectName("media_path_label") + self.gridLayout.addWidget(self.media_path_label, 0, 0, 1, 2) + self.preview_pushbutton = QtGui.QPushButton(self.centralwidget) + self.preview_pushbutton.setEnabled(True) + self.preview_pushbutton.setObjectName("preview_pushbutton") + self.gridLayout.addWidget(self.preview_pushbutton, 10, 2, 1, 1) + self.start_point_label = QtGui.QLabel(self.centralwidget) + self.start_point_label.setEnabled(True) + self.start_point_label.setObjectName("start_point_label") + self.gridLayout.addWidget(self.start_point_label, 7, 0, 1, 2) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + self.gridLayout.addItem(spacerItem, 9, 3, 1, 1) + self.start_timeedit = QtGui.QTimeEdit(self.centralwidget) + self.start_timeedit.setEnabled(True) + self.start_timeedit.setObjectName("start_timeedit") + self.gridLayout.addWidget(self.start_timeedit, 7, 2, 1, 1) + self.jump_end_pushbutton = QtGui.QPushButton(self.centralwidget) + self.jump_end_pushbutton.setEnabled(True) + self.jump_end_pushbutton.setObjectName("jump_end_pushbutton") + self.gridLayout.addWidget(self.jump_end_pushbutton, 8, 4, 1, 1) + self.subtitle_track_label = QtGui.QLabel(self.centralwidget) + self.subtitle_track_label.setEnabled(True) + self.subtitle_track_label.setObjectName("subtitle_track_label") + self.gridLayout.addWidget(self.subtitle_track_label, 4, 0, 1, 2) + self.set_end_pushbutton = QtGui.QPushButton(self.centralwidget) + self.set_end_pushbutton.setEnabled(True) + self.set_end_pushbutton.setObjectName("set_end_pushbutton") + self.gridLayout.addWidget(self.set_end_pushbutton, 8, 3, 1, 1) + self.set_start_pushbutton = QtGui.QPushButton(self.centralwidget) + self.set_start_pushbutton.setEnabled(True) + self.set_start_pushbutton.setObjectName("set_start_pushbutton") + self.gridLayout.addWidget(self.set_start_pushbutton, 7, 3, 1, 1) + self.audio_track_label = QtGui.QLabel(self.centralwidget) + self.audio_track_label.setEnabled(True) + self.audio_track_label.setObjectName("audio_track_label") + self.gridLayout.addWidget(self.audio_track_label, 3, 0, 1, 2) + self.load_disc_pushbutton = QtGui.QPushButton(self.centralwidget) + self.load_disc_pushbutton.setEnabled(True) + self.load_disc_pushbutton.setObjectName("load_disc_pushbutton") + self.gridLayout.addWidget(self.load_disc_pushbutton, 0, 4, 1, 1) + self.media_position_timeedit = QtGui.QTimeEdit(self.centralwidget) + self.media_position_timeedit.setEnabled(True) + self.media_position_timeedit.setObjectName("media_position_timeedit") + self.gridLayout.addWidget(self.media_position_timeedit, 6, 4, 1, 1) + self.end_point_label = QtGui.QLabel(self.centralwidget) + self.end_point_label.setEnabled(True) + self.end_point_label.setObjectName("end_point_label") + self.gridLayout.addWidget(self.end_point_label, 8, 0, 1, 1) + self.jump_start_pushbutton = QtGui.QPushButton(self.centralwidget) + self.jump_start_pushbutton.setEnabled(True) + self.jump_start_pushbutton.setObjectName("jump_start_pushbutton") + self.gridLayout.addWidget(self.jump_start_pushbutton, 7, 4, 1, 1) + self.end_timeedit = QtGui.QTimeEdit(self.centralwidget) + self.end_timeedit.setEnabled(True) + self.end_timeedit.setObjectName("end_timeedit") + self.gridLayout.addWidget(self.end_timeedit, 8, 2, 1, 1) + self.title_label = QtGui.QLabel(self.centralwidget) + self.title_label.setEnabled(True) + self.title_label.setObjectName("title_label") + self.gridLayout.addWidget(self.title_label, 2, 0, 1, 1) + self.save_pushbutton = QtGui.QPushButton(self.centralwidget) + self.save_pushbutton.setEnabled(True) + self.save_pushbutton.setObjectName("save_pushbutton") + self.gridLayout.addWidget(self.save_pushbutton, 10, 3, 1, 1) + self.media_path_combobox = QtGui.QComboBox(self.centralwidget) + self.media_path_combobox.setEnabled(True) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.media_path_combobox.sizePolicy().hasHeightForWidth()) + self.media_path_combobox.setSizePolicy(sizePolicy) + self.media_path_combobox.setEditable(True) + self.media_path_combobox.setObjectName("media_path_combobox") + self.gridLayout.addWidget(self.media_path_combobox, 0, 2, 1, 2) + self.position_horizontalslider = QtGui.QSlider(self.centralwidget) + self.position_horizontalslider.setEnabled(True) + self.position_horizontalslider.setTracking(False) + self.position_horizontalslider.setOrientation(QtCore.Qt.Horizontal) + self.position_horizontalslider.setInvertedAppearance(False) + self.position_horizontalslider.setObjectName("position_horizontalslider") + self.gridLayout.addWidget(self.position_horizontalslider, 6, 2, 1, 2) + self.title_combo_box = QtGui.QComboBox(self.centralwidget) + self.title_combo_box.setEnabled(True) + self.title_combo_box.setProperty("currentText", "") + self.title_combo_box.setObjectName("title_combo_box") + self.gridLayout.addWidget(self.title_combo_box, 2, 2, 1, 2) + self.audio_tracks_combobox = QtGui.QComboBox(self.centralwidget) + self.audio_tracks_combobox.setEnabled(True) + self.audio_tracks_combobox.setObjectName("audio_tracks_combobox") + self.gridLayout.addWidget(self.audio_tracks_combobox, 3, 2, 1, 2) + self.subtitle_tracks_combobox = QtGui.QComboBox(self.centralwidget) + self.subtitle_tracks_combobox.setEnabled(True) + self.subtitle_tracks_combobox.setObjectName("subtitle_tracks_combobox") + self.gridLayout.addWidget(self.subtitle_tracks_combobox, 4, 2, 1, 2) + self.media_view_frame = QtGui.QFrame(self.centralwidget) + self.media_view_frame.setMinimumSize(QtCore.QSize(665, 375)) + self.media_view_frame.setStyleSheet("background-color:black;") + self.media_view_frame.setFrameShape(QtGui.QFrame.StyledPanel) + self.media_view_frame.setFrameShadow(QtGui.QFrame.Raised) + self.media_view_frame.setObjectName("media_view_frame") + self.gridLayout.addWidget(self.media_view_frame, 5, 0, 1, 5) + #MediaClipSelector.setCentralWidget(self.centralwidget) + + self.retranslateUi(MediaClipSelector) + QtCore.QMetaObject.connectSlotsByName(MediaClipSelector) + MediaClipSelector.setTabOrder(self.media_path_combobox, self.load_disc_pushbutton) + MediaClipSelector.setTabOrder(self.load_disc_pushbutton, self.title_combo_box) + MediaClipSelector.setTabOrder(self.title_combo_box, self.audio_tracks_combobox) + MediaClipSelector.setTabOrder(self.audio_tracks_combobox, self.subtitle_tracks_combobox) + MediaClipSelector.setTabOrder(self.subtitle_tracks_combobox, self.play_pushbutton) + MediaClipSelector.setTabOrder(self.play_pushbutton, self.pause_pushbutton) + MediaClipSelector.setTabOrder(self.pause_pushbutton, self.position_horizontalslider) + MediaClipSelector.setTabOrder(self.position_horizontalslider, self.media_position_timeedit) + MediaClipSelector.setTabOrder(self.media_position_timeedit, self.start_timeedit) + MediaClipSelector.setTabOrder(self.start_timeedit, self.set_start_pushbutton) + MediaClipSelector.setTabOrder(self.set_start_pushbutton, self.jump_start_pushbutton) + MediaClipSelector.setTabOrder(self.jump_start_pushbutton, self.end_timeedit) + MediaClipSelector.setTabOrder(self.end_timeedit, self.set_end_pushbutton) + MediaClipSelector.setTabOrder(self.set_end_pushbutton, self.jump_end_pushbutton) + MediaClipSelector.setTabOrder(self.jump_end_pushbutton, self.preview_pushbutton) + MediaClipSelector.setTabOrder(self.preview_pushbutton, self.save_pushbutton) + MediaClipSelector.setTabOrder(self.save_pushbutton, self.close_pushbutton) + + def retranslateUi(self, MediaClipSelector): + MediaClipSelector.setWindowTitle(translate("MediaPlugin.MediaClipSelector", "Select media clip", None)) + self.close_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Close", None)) + self.media_path_label.setText(translate("MediaPlugin.MediaClipSelector", "Media path", None)) + self.preview_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Preview current clip", None)) + self.start_point_label.setText(translate("MediaPlugin.MediaClipSelector", "Start point", None)) + self.start_timeedit.setDisplayFormat(translate("MediaPlugin.MediaClipSelector", "HH:mm:ss.z", None)) + self.jump_end_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Jump to end point", None)) + self.subtitle_track_label.setText(translate("MediaPlugin.MediaClipSelector", "Subtitle track", None)) + self.set_end_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Set current position as end point", None)) + self.set_start_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Set current position as start point", None)) + self.audio_track_label.setText(translate("MediaPlugin.MediaClipSelector", "Audio track", None)) + self.load_disc_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Load disc", None)) + self.media_position_timeedit.setDisplayFormat(translate("MediaPlugin.MediaClipSelector", "HH:mm:ss.z", None)) + self.end_point_label.setText(translate("MediaPlugin.MediaClipSelector", "End point", None)) + self.jump_start_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Jump to start point", None)) + self.end_timeedit.setDisplayFormat(translate("MediaPlugin.MediaClipSelector", "HH:mm:ss.z", None)) + self.title_label.setText(translate("MediaPlugin.MediaClipSelector", "Title", None)) + self.save_pushbutton.setText(translate("MediaPlugin.MediaClipSelector", "Save current clip", None)) + diff --git a/openlp/plugins/media/forms/mediaclipselectorform.py b/openlp/plugins/media/forms/mediaclipselectorform.py new file mode 100644 index 000000000..6f7f22c57 --- /dev/null +++ b/openlp/plugins/media/forms/mediaclipselectorform.py @@ -0,0 +1,276 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2014 Raoul Snyman # +# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. # +# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # +# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # +# Frode Woldsund, Martin Zibricky, Patrick Zimmermann # +# --------------------------------------------------------------------------- # +# 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 +import sys +import logging +import time + +from PyQt4 import QtCore, QtGui + +from openlp.plugins.media.forms.mediaclipselectordialog import Ui_MediaClipSelector +from openlp.core.ui.media.vendor import vlc + +log = logging.getLogger(__name__) + + +class MediaClipSelectorForm(QtGui.QDialog, Ui_MediaClipSelector): + """ + Class to manage the clip selection + """ + log.info('%s MediaClipSelectorForm loaded', __name__) + + def __init__(self, media_item, parent, manager): + """ + Constructor + """ + super(MediaClipSelectorForm, self).__init__(parent) + self.media_item = media_item + self.setupUi(self) + self.playback_length = 0 + self.position_horizontalslider.setMinimum(0) + self.disable_all() + self.toggle_disable_load_media(False) + # most actions auto-connect due to the functions name, so only a few left to do + self.close_pushbutton.clicked.connect(self.reject) + #self.load_disc_pushbutton.clicked.connect(self.on_load_disc_pushbutton_clicked) + #self.pause_pushbutton.clicked.connect(self.on_pause_pushbutton_clicked) + #self.play_pushbutton.clicked.connect(self.on_play_pushbutton_clicked) + + def reject(self): + """ + Exit Dialog and do not save + """ + log.debug ('MediaClipSelectorForm.reject') + self.vlc_media_player.stop() + QtGui.QDialog.reject(self) + + def exec_(self): + self.setup_vlc() + return QtGui.QDialog.exec_(self) + + def setup_vlc(self): + self.vlc_instance = vlc.Instance() + # creating an empty vlc media player + self.vlc_media_player = self.vlc_instance.media_player_new() + # The media player has to be 'connected' to the QFrame. + # (otherwise a video would be displayed in it's own window) + # This is platform specific! + # You have to give the id of the QFrame (or similar object) + # to vlc, different platforms have different functions for this. + win_id = int(self.media_view_frame.winId()) + if sys.platform == "win32": + self.vlc_media_player.set_hwnd(win_id) + elif sys.platform == "darwin": + # We have to use 'set_nsobject' since Qt4 on OSX uses Cocoa + # framework and not the old Carbon. + self.vlc_media_player.set_nsobject(win_id) + else: + # for Linux using the X Server + self.vlc_media_player.set_xwindow(win_id) + self.vlc_media = None + # Setup timer every 100 ms to update position + self.timer = QtCore.QTimer(self) + self.timer.timeout.connect(self.update_position) + self.timer.start(100) + + @QtCore.pyqtSlot(bool) + def on_load_disc_pushbutton_clicked(self, clicked): + self.disable_all() + path = self.media_path_combobox.currentText() + if path == '': + print('no given path') + # TODO: Error message + self.toggle_disable_load_media(False) + return + self.vlc_media = self.vlc_instance.media_new_path(path) + if not self.vlc_media: + print('media player is none') + # TODO: Error message + self.toggle_disable_load_media(False) + return + # put the media in the media player + self.vlc_media_player.set_media(self.vlc_media) + self.vlc_media_player.audio_set_mute(True) + # start playback to get vlc to parse the media + if self.vlc_media_player.play() < 0: + print('play returned error') + # TODO: Error message + self.toggle_disable_load_media(False) + return + self.vlc_media_player.audio_set_mute(True) + while self.vlc_media_player.get_time() == 0: + if self.vlc_media_player.get_state() == vlc.State.Error: + print('player in error state') + self.toggle_disable_load_media(False) + return + time.sleep(0.1) + self.vlc_media_player.pause() + self.vlc_media_player.set_time(0) + # Get titles, insert in combobox + titles = self.vlc_media_player.video_get_title_description() + self.title_combo_box.clear() + for title in titles: + self.title_combo_box.addItem(title[1].decode(), title[0]) + # Main title is usually title #1 + if len(titles) > 1: + self.title_combo_box.setCurrentIndex(1) + else: + self.title_combo_box.setCurrentIndex(0) + # Enable audio track combobox if anything is in it + if len(titles) > 0: + self.title_combo_box.setDisabled(False) + self.toggle_disable_load_media(False) + + def on_pause_pushbutton_clicked(self): + self.vlc_media_player.pause() + + def on_play_pushbutton_clicked(self): + self.vlc_media_player.play() + + def on_set_start_pushbutton_clicked(self): + vlc_ms_pos = self.vlc_media_player.get_time() + time = QtCore.QTime() + new_pos_time = time.addMSecs(vlc_ms_pos) + self.start_timeedit.setTime(new_pos_time) + + def on_set_end_pushbutton_clicked(self): + vlc_ms_pos = self.vlc_media_player.get_time() + time = QtCore.QTime() + new_pos_time = time.addMSecs(vlc_ms_pos) + self.end_timeedit.setTime(new_pos_time) + + def on_jump_end_pushbutton_clicked(self): + end_time = self.end_timeedit.time() + end_time_ms = end_time.hour() * 60 * 60 * 1000 + \ + end_time.minute() * 60 * 1000 + \ + end_time.second() * 1000 + \ + end_time.msec() + self.vlc_media_player.set_time(end_time_ms) + + def on_jump_start_pushbutton_clicked(self): + start_time = self.start_timeedit.time() + start_time_ms = start_time.hour() * 60 * 60 * 1000 + \ + start_time.minute() * 60 * 1000 + \ + start_time.second() * 1000 + \ + start_time.msec() + self.vlc_media_player.set_time(start_time_ms) + + @QtCore.pyqtSlot(int) + def on_title_combo_box_currentIndexChanged(self, index): + print('in on_title_combo_box_changed, index: ', str(index)) + self.vlc_media_player.set_title(index) + self.vlc_media_player.set_time(0) + self.vlc_media_player.play() + self.vlc_media_player.audio_set_mute(True) + while self.vlc_media_player.get_time() == 0: + time.sleep(0.1) + # pause + self.vlc_media_player.pause() + self.vlc_media_player.set_time(0) + # Get audio tracks, insert in combobox + audio_tracks = self.vlc_media_player.audio_get_track_description() + self.audio_tracks_combobox.clear() + for audio_track in audio_tracks: + self.audio_tracks_combobox.addItem(audio_track[1].decode(),audio_track[0]) + # Enable audio track combobox if anything is in it + if len(audio_tracks) > 0: + self.audio_tracks_combobox.setDisabled(False) + # First track is "deactivated", so set to next if it exists + if len(audio_tracks) > 1: + self.audio_tracks_combobox.setCurrentIndex(1) + # Get subtitle tracks, insert in combobox + subtitles_tracks = self.vlc_media_player.video_get_spu_description() + self.subtitle_tracks_combobox.clear() + for subtitle_track in subtitles_tracks: + self.subtitle_tracks_combobox.addItem(subtitle_track[1].decode(), subtitle_track[0]) + # Enable subtitle track combobox is anything in it + if len(subtitles_tracks) > 0: + self.subtitle_tracks_combobox.setDisabled(False) + # First track is "deactivated", so set to next if it exists + if len(subtitles_tracks) > 1: + self.subtitle_tracks_combobox.setCurrentIndex(1) + self.vlc_media_player.audio_set_mute(False) + self.playback_length = self.vlc_media_player.get_length() + self.position_horizontalslider.setMaximum(self.playback_length) + # If a title or audio track is available the player is enabled + if self.title_combo_box.count() > 0 or len(audio_tracks) > 0: + self.toggle_disable_player(False) + + @QtCore.pyqtSlot(int) + def on_audio_tracks_combobox_currentIndexChanged(self, index): + audio_track = self.audio_tracks_combobox.itemData(index) + print('in on_audio_tracks_combobox_currentIndexChanged, index: ', str(index), ' audio_track: ', audio_track) + if audio_track and int(audio_track) > 0: + self.vlc_media_player.audio_set_track(int(audio_track)) + + @QtCore.pyqtSlot(int) + def on_subtitle_tracks_combobox_currentIndexChanged(self, index): + subtitle_track = self.subtitle_tracks_combobox.itemData(index) + print('in on_subtitle_tracks_combobox_currentIndexChanged, index: ', str(index), ' subtitle_track: ', subtitle_track) + if subtitle_track: + self.vlc_media_player.video_set_spu(int(subtitle_track)) + + def on_position_horizontalslider_sliderMoved(self, position): + self.vlc_media_player.set_time(position) + + def update_position(self): + if self.vlc_media_player: + vlc_ms_pos = self.vlc_media_player.get_time() + #print('in update_position, time: ', vlc_ms_pos) + rounded_vlc_ms_pos = int(round(vlc_ms_pos / 100.0) * 100.0) + time = QtCore.QTime() + new_pos_time = time.addMSecs(rounded_vlc_ms_pos) + self.media_position_timeedit.setTime(new_pos_time) + self.position_horizontalslider.setSliderPosition(vlc_ms_pos) + + def disable_all(self): + self.toggle_disable_load_media(True) + self.title_combo_box.setDisabled(True) + self.audio_tracks_combobox.setDisabled(True) + self.subtitle_tracks_combobox.setDisabled(True) + self.toggle_disable_player(True) + + def toggle_disable_load_media(self, action): + self.media_path_combobox.setDisabled(action) + self.load_disc_pushbutton.setDisabled(action) + + def toggle_disable_player(self, action): + self.play_pushbutton.setDisabled(action) + self.pause_pushbutton.setDisabled(action) + self.position_horizontalslider.setDisabled(action) + self.media_position_timeedit.setDisabled(action) + self.start_timeedit.setDisabled(action) + self.set_start_pushbutton.setDisabled(action) + self.jump_start_pushbutton.setDisabled(action) + self.end_timeedit.setDisabled(action) + self.set_end_pushbutton.setDisabled(action) + self.jump_end_pushbutton.setDisabled(action) + self.preview_pushbutton.setDisabled(action) + self.save_pushbutton.setDisabled(action) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index c9ba6a47d..58dec0dac 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -39,6 +39,8 @@ from openlp.core.lib.ui import critical_error_message_box, create_horizontal_adj from openlp.core.ui import DisplayController, Display, DisplayControllerType from openlp.core.ui.media import get_media_players, set_media_players from openlp.core.utils import get_locale_key +from openlp.plugins.media.forms.mediaclipselectorform import MediaClipSelectorForm + log = logging.getLogger(__name__) @@ -115,6 +117,7 @@ class MediaMediaItem(MediaManagerItem): triggers=self.onReplaceClick) self.reset_action = self.toolbar.add_toolbar_action('reset_action', icon=':/system/system_close.png', visible=False, triggers=self.onResetClick) + self.load_optical = self.toolbar.add_toolbar_action('load_optical', icon=':/songs/song_maintenance.png', triggers=self.on_load_optical) self.media_widget = QtGui.QWidget(self) self.media_widget.setObjectName('media_widget') self.display_layout = QtGui.QFormLayout(self.media_widget) @@ -215,6 +218,7 @@ class MediaMediaItem(MediaManagerItem): check_directory_exists(self.servicePath) self.load_list(Settings().value(self.settings_section + '/media files')) self.populateDisplayTypes() + self.media_clip_selector_form = MediaClipSelectorForm(self, self.main_window, None) def rebuild_players(self): """ @@ -311,3 +315,7 @@ class MediaMediaItem(MediaManagerItem): if filename.lower().find(string) > -1: results.append([file, filename]) return results + + def on_load_optical(self): + log.debug('in on_load_optical') + self.media_clip_selector_form.exec_() diff --git a/resources/forms/mediaclipselector.ui b/resources/forms/mediaclipselector.ui new file mode 100644 index 000000000..4cd8f518d --- /dev/null +++ b/resources/forms/mediaclipselector.ui @@ -0,0 +1,359 @@ + + + MediaClipSelector + + + + 0 + 0 + 683 + 739 + + + + + 0 + 0 + + + + + 683 + 686 + + + + Qt::NoFocus + + + Select media clip + + + false + + + Qt::ImhNone + + + + + 0 + 0 + + + + + + + true + + + Close + + + + + + + true + + + + + + + ../images/media_playback_pause.png../images/media_playback_pause.png + + + + + + + true + + + + + + + ../images/media_playback_start.png../images/media_playback_start.png + + + + + + + true + + + Media path + + + + + + + true + + + Preview current clip + + + + + + + true + + + Start point + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 40 + + + + + + + + true + + + HH:mm:ss.z + + + + + + + true + + + Jump to end point + + + + + + + true + + + Subtitle track + + + + + + + true + + + Set current position as end point + + + + + + + true + + + Set current position as start point + + + + + + + true + + + Audio track + + + + + + + true + + + Load disc + + + + + + + true + + + HH:mm:ss.z + + + + + + + true + + + End point + + + + + + + true + + + Jump to start point + + + + + + + true + + + HH:mm:ss.z + + + + + + + true + + + Title + + + + + + + true + + + Save current clip + + + + + + + true + + + + 0 + 0 + + + + true + + + + + + + true + + + false + + + Qt::Horizontal + + + false + + + + + + + true + + + + + + + + + + true + + + + + + + true + + + + + + + + 665 + 375 + + + + background-color:black; + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + media_path_combobox + load_disc_pushbutton + title_combo_box + audio_tracks_combobox + subtitle_tracks_combobox + play_pushbutton + pause_pushbutton + position_horizontalslider + media_position_timeedit + start_timeedit + set_start_pushbutton + jump_start_pushbutton + end_timeedit + set_end_pushbutton + jump_end_pushbutton + preview_pushbutton + save_pushbutton + close_pushbutton + + + +