示例#1
0
 def _set_active_players(self):
     """
     Set the active players and available media files
     """
     saved_players = get_media_players()[0]
     for player in list(self.media_players.keys()):
         self.media_players[player].is_active = player in saved_players
示例#2
0
 def add_end_header_bar(self):
     """
     Adds buttons to the end of the header bar.
     """
     # Replace backgrounds do not work at present so remove functionality.
     self.replace_action = self.toolbar.add_toolbar_action(
         'replace_action',
         icon=':/slides/slide_blank.png',
         triggers=self.on_replace_click)
     if 'webkit' not in get_media_players()[0]:
         self.replace_action.setDisabled(True)
     self.reset_action = self.toolbar.add_toolbar_action(
         'reset_action',
         icon=':/system/system_close.png',
         visible=False,
         triggers=self.on_reset_click)
     self.media_widget = QtGui.QWidget(self)
     self.media_widget.setObjectName('media_widget')
     self.display_layout = QtGui.QFormLayout(self.media_widget)
     self.display_layout.setMargin(self.display_layout.spacing())
     self.display_layout.setObjectName('display_layout')
     self.display_type_label = QtGui.QLabel(self.media_widget)
     self.display_type_label.setObjectName('display_type_label')
     self.display_type_combo_box = create_horizontal_adjusting_combo_box(
         self.media_widget, 'display_type_combo_box')
     self.display_type_label.setBuddy(self.display_type_combo_box)
     self.display_layout.addRow(self.display_type_label,
                                self.display_type_combo_box)
     # Add the Media widget to the page layout.
     self.page_layout.addWidget(self.media_widget)
     self.display_type_combo_box.currentIndexChanged.connect(
         self.override_player_changed)
示例#3
0
    def media_length(self, service_item):
        """
        Loads and starts a media item to obtain the media length

        :param service_item: The ServiceItem containing the details to be played.
        """
        media_info = MediaInfo()
        media_info.volume = 0
        media_info.file_info = QtCore.QFileInfo(service_item.get_frame_path())
        # display = controller.preview_display
        suffix = '*.%s' % media_info.file_info.suffix().lower()
        used_players = get_media_players()[0]
        player = self.media_players[used_players[0]]
        if suffix not in player.video_extensions_list and suffix not in player.audio_extensions_list:
            # Media could not be loaded correctly
            critical_error_message_box(
                translate('MediaPlugin.MediaItem', 'Unsupported Media File'),
                translate('MediaPlugin.MediaItem',
                          'File %s not supported using player %s') %
                (service_item.get_frame_path(), used_players[0]))
            return False
        media_data = MediaInfoWrapper.parse(service_item.get_frame_path())
        # duration returns in milli seconds
        service_item.set_media_length(media_data.tracks[0].duration)
        return True
示例#4
0
 def populateDisplayTypes(self):
     """
     Load the combobox with the enabled media players,
     allowing user to select a specific player if settings allow
     """
     # block signals to avoid unnecessary overridePlayerChanged Signals
     # while combo box creation
     self.displayTypeComboBox.blockSignals(True)
     self.displayTypeComboBox.clear()
     usedPlayers, overridePlayer = get_media_players()
     mediaPlayers = self.media_controller.mediaPlayers
     currentIndex = 0
     for player in usedPlayers:
         # load the drop down selection
         self.displayTypeComboBox.addItem(mediaPlayers[player].original_name)
         if overridePlayer == player:
             currentIndex = len(self.displayTypeComboBox)
     if self.displayTypeComboBox.count() > 1:
         self.displayTypeComboBox.insertItem(0, self.automatic)
         self.displayTypeComboBox.setCurrentIndex(currentIndex)
     if overridePlayer:
         self.mediaWidget.show()
     else:
         self.mediaWidget.hide()
     self.displayTypeComboBox.blockSignals(False)
示例#5
0
 def bootstrap_initialise(self):
     """
     Check to see if we have any media Player's available.
     """
     log.debug('_check_available_media_players')
     controller_dir = os.path.join(AppLocation.get_directory(AppLocation.AppDir), 'core', 'ui', 'media')
     for filename in os.listdir(controller_dir):
         if filename.endswith('player.py') and not filename == 'mediaplayer.py':
             path = os.path.join(controller_dir, filename)
             if os.path.isfile(path):
                 module_name = 'openlp.core.ui.media.' + os.path.splitext(filename)[0]
                 log.debug('Importing controller %s', module_name)
                 try:
                     __import__(module_name, globals(), locals(), [])
                 # On some platforms importing vlc.py might cause
                 # also OSError exceptions. (e.g. Mac OS X)
                 except (ImportError, OSError):
                     log.warning('Failed to import %s on path %s', module_name, path)
     player_classes = MediaPlayer.__subclasses__()
     for player_class in player_classes:
         player = player_class(self)
         self.register_players(player)
     if not self.media_players:
         return False
     saved_players, overridden_player = get_media_players()
     invalid_media_players = \
         [media_player for media_player in saved_players if media_player not in self.media_players or
             not self.media_players[media_player].check_available()]
     if invalid_media_players:
         for invalidPlayer in invalid_media_players:
             saved_players.remove(invalidPlayer)
         set_media_players(saved_players, overridden_player)
     self._set_active_players()
     self._generate_extensions_lists()
     return True
示例#6
0
 def add_end_header_bar(self):
     """
     Adds buttons to the end of the header bar.
     """
     # Replace backgrounds do not work at present so remove functionality.
     self.replace_action = self.toolbar.add_toolbar_action('replace_action', icon=':/slides/slide_blank.png',
                                                           triggers=self.on_replace_click)
     if 'webkit' not in get_media_players()[0]:
         self.replace_action.setDisabled(True)
     self.reset_action = self.toolbar.add_toolbar_action('reset_action', icon=':/system/system_close.png',
                                                         visible=False, triggers=self.on_reset_click)
     self.media_widget = QtGui.QWidget(self)
     self.media_widget.setObjectName('media_widget')
     self.display_layout = QtGui.QFormLayout(self.media_widget)
     self.display_layout.setMargin(self.display_layout.spacing())
     self.display_layout.setObjectName('display_layout')
     self.display_type_label = QtGui.QLabel(self.media_widget)
     self.display_type_label.setObjectName('display_type_label')
     self.display_type_combo_box = create_horizontal_adjusting_combo_box(
         self.media_widget, 'display_type_combo_box')
     self.display_type_label.setBuddy(self.display_type_combo_box)
     self.display_layout.addRow(self.display_type_label, self.display_type_combo_box)
     # Add the Media widget to the page layout.
     self.page_layout.addWidget(self.media_widget)
     self.display_type_combo_box.currentIndexChanged.connect(self.override_player_changed)
示例#7
0
 def _set_active_players(self):
     """
     Set the active players and available media files
     """
     saved_players = get_media_players()[0]
     for player in list(self.media_players.keys()):
         self.media_players[player].is_active = player in saved_players
示例#8
0
 def add_start_header_bar(self):
     """
     Adds buttons to the start of the header bar.
     """
     if 'vlc' in get_media_players()[0]:
         disable_optical_button_text = False
         optical_button_text = translate('MediaPlugin.MediaItem',
                                         'Load CD/DVD')
         optical_button_tooltip = translate('MediaPlugin.MediaItem',
                                            'Load CD/DVD')
     else:
         disable_optical_button_text = True
         optical_button_text = translate('MediaPlugin.MediaItem',
                                         'Load CD/DVD')
         optical_button_tooltip = translate(
             'MediaPlugin.MediaItem',
             'CD/DVD playback is only supported if VLC is installed and enabled.'
         )
     self.load_optical = self.toolbar.add_toolbar_action(
         'load_optical',
         icon=UiIcons().optical,
         text=optical_button_text,
         tooltip=optical_button_tooltip,
         triggers=self.on_load_optical)
     if disable_optical_button_text:
         self.load_optical.setDisabled(True)
示例#9
0
    def media_setup_optical(self, filename, title, audio_track, subtitle_track,
                            start, end, display, controller):
        """
        Setup playback of optical media

        :param filename: Path of the optical device/drive.
        :param title: The main/title track to play.
        :param audio_track: The audio track to play.
        :param subtitle_track: The subtitle track to play.
        :param start: Start position in miliseconds.
        :param end: End position in miliseconds.
        :param display: The display to play the media.
        :param controller: The media contraoller.
        :return: True if setup succeded else False.
        """
        log.debug('media_setup_optical')
        if controller is None:
            controller = self.display_controllers[DisplayControllerType.Plugin]
        # stop running videos
        self.media_reset(controller)
        # Setup media info
        controller.media_info = MediaInfo()
        controller.media_info.file_info = QtCore.QFileInfo(filename)
        if audio_track == -1 and subtitle_track == -1:
            controller.media_info.media_type = MediaType.CD
        else:
            controller.media_info.media_type = MediaType.DVD
        controller.media_info.start_time = start / 1000
        controller.media_info.end_time = end / 1000
        controller.media_info.length = (end - start) / 1000
        controller.media_info.title_track = title
        controller.media_info.audio_track = audio_track
        controller.media_info.subtitle_track = subtitle_track
        # When called from mediaitem display is None
        if display is None:
            display = controller.preview_display
        # Find vlc player
        used_players = get_media_players()[0]
        vlc_player = None
        for title in used_players:
            player = self.media_players[title]
            if player.name == 'vlc':
                vlc_player = player
        if vlc_player is None:
            critical_error_message_box(
                translate('MediaPlugin.MediaItem', 'VLC player required'),
                translate(
                    'MediaPlugin.MediaItem',
                    'VLC player required for playback of optical devices'))
            return False
        vlc_player.load(display)
        self.resize(display, vlc_player)
        self.current_media_players[controller.controller_type] = vlc_player
        if audio_track == -1 and subtitle_track == -1:
            controller.media_info.media_type = MediaType.CD
        else:
            controller.media_info.media_type = MediaType.DVD
        return True
示例#10
0
    def media_setup_optical(self, filename, title, audio_track, subtitle_track, start, end, display, controller):
        """
        Setup playback of optical media

        :param filename: Path of the optical device/drive.
        :param title: The main/title track to play.
        :param audio_track: The audio track to play.
        :param subtitle_track: The subtitle track to play.
        :param start: Start position in miliseconds.
        :param end: End position in miliseconds.
        :param display: The display to play the media.
        :param controller: The media contraoller.
        :return: True if setup succeded else False.
        """
        log.debug('media_setup_optical')
        if controller is None:
            controller = self.display_controllers[DisplayControllerType.Plugin]
        # stop running videos
        self.media_reset(controller)
        # Setup media info
        controller.media_info = MediaInfo()
        controller.media_info.file_info = QtCore.QFileInfo(filename)
        if audio_track == -1 and subtitle_track == -1:
            controller.media_info.media_type = MediaType.CD
        else:
            controller.media_info.media_type = MediaType.DVD
        controller.media_info.start_time = start/1000
        controller.media_info.end_time = end/1000
        controller.media_info.length = (end - start)/1000
        controller.media_info.title_track = title
        controller.media_info.audio_track = audio_track
        controller.media_info.subtitle_track = subtitle_track
        # When called from mediaitem display is None
        if display is None:
            display = controller.preview_display
        # Find vlc player
        used_players = get_media_players()[0]
        vlc_player = None
        for title in used_players:
            player = self.media_players[title]
            if player.name == 'vlc':
                vlc_player = player
        if vlc_player is None:
            critical_error_message_box(translate('MediaPlugin.MediaItem', 'VLC player required'),
                                       translate('MediaPlugin.MediaItem',
                                                 'VLC player required for playback of optical devices'))
            return False
        vlc_player.load(display)
        self.resize(display, vlc_player)
        self.current_media_players[controller.controller_type] = vlc_player
        if audio_track == -1 and subtitle_track == -1:
            controller.media_info.media_type = MediaType.CD
        else:
            controller.media_info.media_type = MediaType.DVD
        return True
示例#11
0
    def override_player_changed(index):
        """
        The Player has been overridden

        :param index: Index
        """
        player = get_media_players()[0]
        if index == 0:
            set_media_players(player)
        else:
            set_media_players(player, player[index - 1])
示例#12
0
    def override_player_changed(self, index):
        """
        The Player has been overridden

        :param index: Index
        """
        player = get_media_players()[0]
        if index == 0:
            set_media_players(player)
        else:
            set_media_players(player, player[index - 1])
示例#13
0
 def save(self):
     """
     Save the settings
     """
     settings = Settings()
     settings.beginGroup(self.settings_section)
     settings.setValue('background color', self.background_color)
     settings.endGroup()
     old_players, override_player = get_media_players()
     if self.used_players != old_players:
         # clean old Media stuff
         set_media_players(self.used_players, override_player)
         self.settings_form.register_post_process('mediaitem_suffix_reset')
         self.settings_form.register_post_process('mediaitem_media_rebuild')
         self.settings_form.register_post_process('config_screen_changed')
示例#14
0
 def load(self):
     """
     Load the settings
     """
     if self.saved_used_players:
         self.used_players = self.saved_used_players
     self.used_players = get_media_players()[0]
     self.saved_used_players = self.used_players
     settings = Settings()
     settings.beginGroup(self.settings_section)
     self.update_player_list()
     self.background_color = settings.value('background color')
     self.initial_color = self.background_color
     settings.endGroup()
     self.background_color_button.color = self.background_color
示例#15
0
 def retranslateUi(self):
     """
     This method is called automatically to provide OpenLP with the opportunity to translate the ``MediaManagerItem``
     to another language.
     """
     self.on_new_prompt = translate('MediaPlugin.MediaItem', 'Select Media')
     self.replace_action.setText(UiStrings().ReplaceBG)
     if 'webkit' in get_media_players()[0]:
         self.replace_action.setToolTip(UiStrings().ReplaceLiveBG)
     else:
         self.replace_action.setToolTip(UiStrings().ReplaceLiveBGDisabled)
     self.reset_action.setText(UiStrings().ResetBG)
     self.reset_action.setToolTip(UiStrings().ResetLiveBG)
     self.automatic = UiStrings().Automatic
     self.display_type_label.setText(translate('MediaPlugin.MediaItem', 'Use Player:'))
示例#16
0
 def load(self):
     """
     Load the settings
     """
     if self.savedUsedPlayers:
         self.usedPlayers = self.savedUsedPlayers
     self.usedPlayers = get_media_players()[0]
     self.savedUsedPlayers = self.usedPlayers
     settings = Settings()
     settings.beginGroup(self.settingsSection)
     self.updatePlayerList()
     self.bg_color = settings.value(u'background color')
     self.initial_color = self.bg_color
     settings.endGroup()
     self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)
示例#17
0
 def load(self):
     """
     Load the settings
     """
     if self.saved_used_players:
         self.used_players = self.saved_used_players
     self.used_players = get_media_players()[0]
     self.saved_used_players = self.used_players
     settings = Settings()
     settings.beginGroup(self.settings_section)
     self.update_player_list()
     self.background_color = settings.value('background color')
     self.initial_color = self.background_color
     settings.endGroup()
     self.background_color_button.color = self.background_color
示例#18
0
 def save(self):
     """
     Save the settings
     """
     settings = Settings()
     settings.beginGroup(self.settings_section)
     settings.setValue('background color', self.background_color)
     settings.endGroup()
     old_players, override_player = get_media_players()
     if self.used_players != old_players:
         # clean old Media stuff
         set_media_players(self.used_players, override_player)
         self.settings_form.register_post_process('mediaitem_suffix_reset')
         self.settings_form.register_post_process('mediaitem_media_rebuild')
         self.settings_form.register_post_process('config_screen_changed')
示例#19
0
    def _check_file_type(self, controller, display, service_item):
        """
        Select the correct media Player type from the prioritized Player list

        :param controller: First element is the controller which should be used
        :param display: Which display to use
        :param service_item: The ServiceItem containing the details to be played.
        """
        used_players = get_media_players()[0]
        if service_item.processor and service_item.processor != UiStrings(
        ).Automatic:
            used_players = [service_item.processor.lower()]
        # If no player, we can't play
        if not used_players:
            return False
        if controller.media_info.file_info.isFile():
            suffix = '*.%s' % controller.media_info.file_info.suffix().lower()
            for title in used_players:
                if not title:
                    continue
                player = self.media_players[title]
                if suffix in player.video_extensions_list:
                    if not controller.media_info.is_background or controller.media_info.is_background and \
                            player.can_background:
                        self.resize(display, player)
                        if player.load(display):
                            self.current_media_players[
                                controller.controller_type] = player
                            controller.media_info.media_type = MediaType.Video
                            return True
                if suffix in player.audio_extensions_list:
                    if player.load(display):
                        self.current_media_players[
                            controller.controller_type] = player
                        controller.media_info.media_type = MediaType.Audio
                        return True
        else:
            for title in used_players:
                player = self.media_players[title]
                if player.can_folder:
                    self.resize(display, player)
                    if player.load(display):
                        self.current_media_players[
                            controller.controller_type] = player
                        controller.media_info.media_type = MediaType.Video
                        return True
        # no valid player found
        return False
示例#20
0
 def retranslateUi(self):
     """
     This method is called automatically to provide OpenLP with the opportunity to translate the ``MediaManagerItem``
     to another language.
     """
     self.on_new_prompt = translate('MediaPlugin.MediaItem', 'Select Media')
     self.replace_action.setText(UiStrings().ReplaceBG)
     if 'webkit' in get_media_players()[0]:
         self.replace_action.setToolTip(UiStrings().ReplaceLiveBG)
     else:
         self.replace_action.setToolTip(UiStrings().ReplaceLiveBGDisabled)
     self.reset_action.setText(UiStrings().ResetBG)
     self.reset_action.setToolTip(UiStrings().ResetLiveBG)
     self.automatic = UiStrings().Automatic
     self.display_type_label.setText(
         translate('MediaPlugin.MediaItem', 'Use Player:'))
示例#21
0
 def add_start_header_bar(self):
     """
     Adds buttons to the start of the header bar.
     """
     if 'vlc' in get_media_players()[0]:
         disable_optical_button_text = False
         optical_button_text = translate('MediaPlugin.MediaItem', 'Load CD/DVD')
         optical_button_tooltip = translate('MediaPlugin.MediaItem', 'Load CD/DVD')
     else:
         disable_optical_button_text = True
         optical_button_text = translate('MediaPlugin.MediaItem', 'Load CD/DVD')
         optical_button_tooltip = translate('MediaPlugin.MediaItem',
                                            'Load CD/DVD - only supported when VLC is installed and enabled')
     self.load_optical = self.toolbar.add_toolbar_action('load_optical', icon=OPTICAL_ICON, text=optical_button_text,
                                                         tooltip=optical_button_tooltip,
                                                         triggers=self.on_load_optical)
     if disable_optical_button_text:
         self.load_optical.setDisabled(True)
示例#22
0
 def save(self):
     """
     Save the settings
     """
     player_string_changed = False
     settings = Settings()
     settings.beginGroup(self.settingsSection)
     settings.setValue(u'background color', self.bg_color)
     settings.endGroup()
     old_players, override_player = get_media_players()
     if self.usedPlayers != old_players:
         # clean old Media stuff
         set_media_players(self.usedPlayers, override_player)
         player_string_changed = True
     if player_string_changed:
         self.service_manager.reset_supported_suffixes()
         Receiver.send_message(u'mediaitem_media_rebuild')
         Receiver.send_message(u'config_screen_changed')
示例#23
0
    def _check_file_type(self, controller, display, service_item):
        """
        Select the correct media Player type from the prioritized Player list

        :param controller: First element is the controller which should be used
        :param display: Which display to use
        :param service_item: The ServiceItem containing the details to be played.
        """
        used_players = get_media_players()[0]
        if service_item.processor and service_item.processor != UiStrings().Automatic:
            used_players = [service_item.processor.lower()]
        # If no player, we can't play
        if not used_players:
            return False
        if controller.media_info.file_info.isFile():
            suffix = '*.%s' % controller.media_info.file_info.suffix().lower()
            for title in used_players:
                if not title:
                    continue
                player = self.media_players[title]
                if suffix in player.video_extensions_list:
                    if not controller.media_info.is_background or controller.media_info.is_background and \
                            player.can_background:
                        self.resize(display, player)
                        if player.load(display):
                            self.current_media_players[controller.controller_type] = player
                            controller.media_info.media_type = MediaType.Video
                            return True
                if suffix in player.audio_extensions_list:
                    if player.load(display):
                        self.current_media_players[controller.controller_type] = player
                        controller.media_info.media_type = MediaType.Audio
                        return True
        else:
            for title in used_players:
                player = self.media_players[title]
                if player.can_folder:
                    self.resize(display, player)
                    if player.load(display):
                        self.current_media_players[controller.controller_type] = player
                        controller.media_info.media_type = MediaType.Video
                        return True
        # no valid player found
        return False
示例#24
0
    def _get_used_players(service_item):
        """
        Find the player for a given service item

        :param service_item: where the information is about the media and required player
        :return: player description
        """
        used_players = get_media_players()[0]
        # If no player, we can't play
        if not used_players:
            return False
        default_player = [used_players[0]]
        if service_item.processor and service_item.processor != UiStrings().Automatic:
            # check to see if the player is usable else use the default one.
            if service_item.processor.lower() not in used_players:
                used_players = default_player
            else:
                used_players = [service_item.processor.lower()]
        return used_players
示例#25
0
    def test_get_media_players_no_players(self):
        """
        Test that when there's no players but overridden player is set, get_media_players() returns 'auto'
        """
        def value_results(key):
            if key == 'media/override player':
                return QtCore.Qt.Checked
            else:
                return ''

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            self.assertEqual([], used_players, 'Used players should be an empty list')
            self.assertEqual('auto', overridden_player, 'Overridden player should be "auto"')
示例#26
0
    def test_get_media_players_with_valid_list(self):
        """
        Test that when get_media_players() is called the string list is interpreted correctly
        """
        def value_results(key):
            if key == 'media/players':
                return '[vlc,webkit,system]'
            else:
                return False

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            self.assertEqual(['vlc', 'webkit', 'system'], used_players, 'Used players should be correct')
            self.assertEqual('', overridden_player, 'Overridden player should be an empty string')
示例#27
0
    def test_get_media_players_no_config(self):
        """
        Test that when there's no config, get_media_players() returns an empty list of players (not a string)
        """
        def value_results(key):
            if key == 'media/players':
                return ''
            else:
                return False

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            self.assertEqual([], used_players, 'Used players should be an empty list')
            self.assertEqual('', overridden_player, 'Overridden player should be an empty string')
示例#28
0
    def test_get_media_players_with_overridden_player(self):
        """
        Test that when get_media_players() is called the overridden player is correctly set
        """
        def value_results(key):
            if key == 'media/players':
                return '[vlc,webkit,phonon]'
            else:
                return QtCore.Qt.Checked

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            self.assertEqual(['vlc', 'webkit', 'phonon'], used_players, 'Used players should be correct')
            self.assertEqual('vlc,webkit,phonon', overridden_player, 'Overridden player should be a string of players')
示例#29
0
    def test_get_media_players_no_players(self):
        """
        Test that when there's no players but overridden player is set, get_media_players() returns 'auto'
        """
        def value_results(key):
            if key == 'media/override player':
                return QtCore.Qt.Checked
            else:
                return ''

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            self.assertEqual([], used_players, 'Used players should be an empty list')
            self.assertEqual('auto', overridden_player, 'Overridden player should be "auto"')
示例#30
0
    def _get_used_players(service_item):
        """
        Find the player for a given service item

        :param service_item: where the information is about the media and required player
        :return: player description
        """
        used_players = get_media_players()[0]
        # If no player, we can't play
        if not used_players:
            return False
        default_player = [used_players[0]]
        if service_item.processor and service_item.processor != UiStrings(
        ).Automatic:
            # check to see if the player is usable else use the default one.
            if service_item.processor.lower() not in used_players:
                used_players = default_player
            else:
                used_players = [service_item.processor.lower()]
        return used_players
示例#31
0
    def test_get_media_players_with_overridden_player(self):
        """
        Test that when get_media_players() is called the overridden player is correctly set
        """
        def value_results(key):
            if key == 'media/players':
                return '[vlc,webkit,system]'
            else:
                return QtCore.Qt.Checked

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            self.assertEqual(['vlc', 'webkit', 'system'], used_players, 'Used players should be correct')
            self.assertEqual('vlc,webkit,system', overridden_player, 'Overridden player should be a string of players')
示例#32
0
    def test_get_media_players_no_config(self):
        """
        Test that when there's no config, get_media_players() returns an empty list of players (not a string)
        """
        def value_results(key):
            if key == 'media/players':
                return ''
            else:
                return False

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            self.assertEqual([], used_players, 'Used players should be an empty list')
            self.assertEqual('', overridden_player, 'Overridden player should be an empty string')
示例#33
0
    def _check_file_type(self, controller, display, serviceItem):
        """
        Select the correct media Player type from the prioritized Player list

        ``controller``
            First element is the controller which should be used

        ``serviceItem``
            The ServiceItem containing the details to be played.
        """
        usedPlayers = get_media_players()[0]
        if serviceItem.title != UiStrings().Automatic:
            usedPlayers = [serviceItem.title.lower()]
        if controller.media_info.file_info.isFile():
            suffix = u'*.%s' % controller.media_info.file_info.suffix().lower()
            for title in usedPlayers:
                player = self.mediaPlayers[title]
                if suffix in player.video_extensions_list:
                    if not controller.media_info.is_background or controller.media_info.is_background and \
                            player.canBackground:
                        self.resize(display, player)
                        if player.load(display):
                            self.currentMediaPlayer[controller.controllerType] = player
                            controller.media_info.media_type = MediaType.Video
                            return True
                if suffix in player.audio_extensions_list:
                    if player.load(display):
                        self.currentMediaPlayer[controller.controllerType] = player
                        controller.media_info.media_type = MediaType.Audio
                        return True
        else:
            for title in usedPlayers:
                player = self.mediaPlayers[title]
                if player.canFolder:
                    self.resize(display, player)
                    if player.load(display):
                        self.currentMediaPlayer[controller.controllerType] = player
                        controller.media_info.media_type = MediaType.Video
                        return True
        # no valid player found
        return False
示例#34
0
    def test_get_media_players_with_valid_list(self):
        """
        Test that when get_media_players() is called the string list is interpreted correctly
        """
        def value_results(key):
            if key == 'media/players':
                return '[vlc,webkit,system]'
            else:
                return False

        # GIVEN: A mocked out Settings() object
        with patch('openlp.core.ui.media.Settings.value') as mocked_value:
            mocked_value.side_effect = value_results

            # WHEN: get_media_players() is called
            used_players, overridden_player = get_media_players()

            # THEN: the used_players should be an empty list, and the overridden player should be an empty string
            assert ['vlc', 'webkit',
                    'system'] == used_players, 'Used players should be correct'
            assert '' == overridden_player, 'Overridden player should be an empty string'
示例#35
0
 def bootstrap_initialise(self):
     """
     Check to see if we have any media Player's available.
     """
     log.debug('_check_available_media_players')
     controller_dir = os.path.join(
         AppLocation.get_directory(AppLocation.AppDir), 'core', 'ui',
         'media')
     for filename in os.listdir(controller_dir):
         if filename.endswith(
                 'player.py') and not filename == 'mediaplayer.py':
             path = os.path.join(controller_dir, filename)
             if os.path.isfile(path):
                 module_name = 'openlp.core.ui.media.' + os.path.splitext(
                     filename)[0]
                 log.debug('Importing controller %s', module_name)
                 try:
                     __import__(module_name, globals(), locals(), [])
                 # On some platforms importing vlc.py might cause
                 # also OSError exceptions. (e.g. Mac OS X)
                 except (ImportError, OSError):
                     log.warning('Failed to import %s on path %s',
                                 module_name, path)
     player_classes = MediaPlayer.__subclasses__()
     for player_class in player_classes:
         player = player_class(self)
         self.register_players(player)
     if not self.media_players:
         return False
     saved_players, overridden_player = get_media_players()
     invalid_media_players = \
         [media_player for media_player in saved_players if media_player not in self.media_players or
             not self.media_players[media_player].check_available()]
     if invalid_media_players:
         for invalidPlayer in invalid_media_players:
             saved_players.remove(invalidPlayer)
         set_media_players(saved_players, overridden_player)
     self._set_active_players()
     self._generate_extensions_lists()
     return True
示例#36
0
    def media_length(self, service_item):
        """
        Loads and starts a media item to obtain the media length

        :param service_item: The ServiceItem containing the details to be played.
        """
        media_info = MediaInfo()
        media_info.volume = 0
        media_info.file_info = QtCore.QFileInfo(service_item.get_frame_path())
        # display = controller.preview_display
        suffix = '*.%s' % media_info.file_info.suffix().lower()
        used_players = get_media_players()[0]
        player = self.media_players[used_players[0]]
        if suffix not in player.video_extensions_list and suffix not in player.audio_extensions_list:
            # Media could not be loaded correctly
            critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported Media File'),
                                       translate('MediaPlugin.MediaItem', 'File %s not supported using player %s') %
                                       (service_item.get_frame_path(), used_players[0]))
            return False
        media_data = MediaInfoWrapper.parse(service_item.get_frame_path())
        # duration returns in milli seconds
        service_item.set_media_length(media_data.tracks[0].duration)
        return True
示例#37
0
 def populate_display_types(self):
     """
     Load the combobox with the enabled media players,  allowing user to select a specific player if settings allow.
     """
     # block signals to avoid unnecessary override_player_changed Signals while combo box creation
     self.display_type_combo_box.blockSignals(True)
     self.display_type_combo_box.clear()
     used_players, override_player = get_media_players()
     media_players = self.media_controller.media_players
     current_index = 0
     for player in used_players:
         # load the drop down selection
         self.display_type_combo_box.addItem(
             media_players[player].original_name)
         if override_player == player:
             current_index = len(self.display_type_combo_box)
     if self.display_type_combo_box.count() > 1:
         self.display_type_combo_box.insertItem(0, self.automatic)
         self.display_type_combo_box.setCurrentIndex(current_index)
     if override_player:
         self.media_widget.show()
     else:
         self.media_widget.hide()
     self.display_type_combo_box.blockSignals(False)
示例#38
0
 def bootstrap_initialise(self):
     """
     Check to see if we have any media Player's available.
     """
     controller_dir = os.path.join('core', 'ui', 'media')
     # Find all files that do not begin with '.' (lp:#1738047) and end with player.py
     glob_pattern = os.path.join(controller_dir, '[!.]*player.py')
     extension_loader(glob_pattern, ['mediaplayer.py'])
     player_classes = MediaPlayer.__subclasses__()
     for player_class in player_classes:
         self.register_players(player_class(self))
     if not self.media_players:
         return False
     saved_players, overridden_player = get_media_players()
     invalid_media_players = \
         [media_player for media_player in saved_players if media_player not in self.media_players or
             not self.media_players[media_player].check_available()]
     if invalid_media_players:
         for invalidPlayer in invalid_media_players:
             saved_players.remove(invalidPlayer)
         set_media_players(saved_players, overridden_player)
     self._set_active_players()
     self._generate_extensions_lists()
     return True
示例#39
0
 def overridePlayerChanged(self, index):
     player = get_media_players()[0]
     if index == 0:
         set_media_players(player)
     else:
         set_media_players(player, player[index-1])