Merge lp:~trb143/openlp/media2018a into lp:openlp

Proposed by Tim Bentley
Status: Merged
Merged at revision: 2815
Proposed branch: lp:~trb143/openlp/media2018a
Merge into: lp:openlp
Diff against target: 152 lines (+54/-26)
3 files modified
openlp/core/ui/media/mediacontroller.py (+3/-23)
openlp/core/ui/media/vlcplayer.py (+10/-1)
tests/functional/openlp_core/api/endpoint/test_controller.py (+41/-2)
To merge this branch: bzr merge lp:~trb143/openlp/media2018a
Reviewer Review Type Date Requested Status
Tomas Groth Approve
Review via email: mp+341592@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Tomas Groth (tomasgroth) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'openlp/core/ui/media/mediacontroller.py'
--- openlp/core/ui/media/mediacontroller.py 2018-02-23 15:54:25 +0000
+++ openlp/core/ui/media/mediacontroller.py 2018-03-18 18:27:55 +0000
@@ -459,26 +459,16 @@
459 log.debug('use %s controller' % self.current_media_players[controller.controller_type].display_name)459 log.debug('use %s controller' % self.current_media_players[controller.controller_type].display_name)
460 return True460 return True
461461
462 def media_length(self, service_item):462 @staticmethod
463 def media_length(service_item):
463 """464 """
464 Loads and starts a media item to obtain the media length465 Uses Media Info to obtain the media length
465466
466 :param service_item: The ServiceItem containing the details to be played.467 :param service_item: The ServiceItem containing the details to be played.
467 """468 """
468 media_info = MediaInfo()469 media_info = MediaInfo()
469 media_info.volume = 0470 media_info.volume = 0
470 media_info.file_info = QtCore.QFileInfo(service_item.get_frame_path())471 media_info.file_info = QtCore.QFileInfo(service_item.get_frame_path())
471 # display = controller.preview_display
472 suffix = '*.%s' % media_info.file_info.suffix().lower()
473 used_players = get_media_players()[0]
474 player = self.media_players[used_players[0]]
475 if suffix not in player.video_extensions_list and suffix not in player.audio_extensions_list:
476 # Media could not be loaded correctly
477 critical_error_message_box(
478 translate('MediaPlugin.MediaItem', 'Unsupported Media File'),
479 translate('MediaPlugin.MediaItem', 'File {file_path} not supported using player {player_name}'
480 ).format(file_path=service_item.get_frame_path(), player_name=used_players[0]))
481 return False
482 media_data = MediaInfoWrapper.parse(service_item.get_frame_path())472 media_data = MediaInfoWrapper.parse(service_item.get_frame_path())
483 # duration returns in milli seconds473 # duration returns in milli seconds
484 service_item.set_media_length(media_data.tracks[0].duration)474 service_item.set_media_length(media_data.tracks[0].duration)
@@ -573,16 +563,6 @@
573 if not title:563 if not title:
574 continue564 continue
575 player = self.media_players[title]565 player = self.media_players[title]
576 # The system player may not return what files it can play so add it now
577 # and check whether it can play the file later
578 if title == 'system':
579 if not controller.media_info.is_background or controller.media_info.is_background and \
580 player.can_background:
581 self.resize(display, player)
582 if player.load(display):
583 self.current_media_players[controller.controller_type] = player
584 controller.media_info.media_type = MediaType.Video
585 return True
586 if suffix in player.video_extensions_list:566 if suffix in player.video_extensions_list:
587 if not controller.media_info.is_background or controller.media_info.is_background and \567 if not controller.media_info.is_background or controller.media_info.is_background and \
588 player.can_background:568 player.can_background:
589569
=== modified file 'openlp/core/ui/media/vlcplayer.py'
--- openlp/core/ui/media/vlcplayer.py 2017-12-29 09:15:48 +0000
+++ openlp/core/ui/media/vlcplayer.py 2018-03-18 18:27:55 +0000
@@ -66,7 +66,15 @@
66 """66 """
67 if 'openlp.core.ui.media.vendor.vlc' in sys.modules:67 if 'openlp.core.ui.media.vendor.vlc' in sys.modules:
68 # If VLC has already been imported, no need to do all the stuff below again68 # If VLC has already been imported, no need to do all the stuff below again
69 return sys.modules['openlp.core.ui.media.vendor.vlc']69 is_vlc_available = False
70 try:
71 is_vlc_available = bool(sys.modules['openlp.core.ui.media.vendor.vlc'].get_default_instance())
72 except:
73 pass
74 if is_vlc_available:
75 return sys.modules['openlp.core.ui.media.vendor.vlc']
76 else:
77 return None
70 is_vlc_available = False78 is_vlc_available = False
71 try:79 try:
72 if is_macosx():80 if is_macosx():
@@ -89,6 +97,7 @@
89 except (ImportError, NameError, NotImplementedError):97 except (ImportError, NameError, NotImplementedError):
90 pass98 pass
91 except OSError as e:99 except OSError as e:
100 # this will get raised the first time
92 if is_win():101 if is_win():
93 if not isinstance(e, WindowsError) and e.winerror != 126:102 if not isinstance(e, WindowsError) and e.winerror != 126:
94 raise103 raise
95104
=== modified file 'tests/functional/openlp_core/api/endpoint/test_controller.py'
--- tests/functional/openlp_core/api/endpoint/test_controller.py 2018-03-09 21:58:45 +0000
+++ tests/functional/openlp_core/api/endpoint/test_controller.py 2018-03-18 18:27:55 +0000
@@ -22,8 +22,24 @@
22from unittest import TestCase22from unittest import TestCase
23from unittest.mock import MagicMock23from unittest.mock import MagicMock
2424
25from PyQt5 import QtCore
26
25from openlp.core.common.registry import Registry27from openlp.core.common.registry import Registry
26from openlp.core.api.endpoint.controller import controller_text, controller_direction28from openlp.core.api.endpoint.controller import controller_text, controller_direction
29from openlp.core.display.renderer import Renderer
30from openlp.core.display.screens import ScreenList
31from openlp.core.lib import ServiceItem
32
33from tests.utils import convert_file_service_item
34from tests.utils.constants import RESOURCE_PATH
35
36TEST_PATH = str(RESOURCE_PATH / 'service')
37
38SCREEN = {
39 'primary': False,
40 'number': 1,
41 'size': QtCore.QRect(0, 0, 1024, 768)
42}
2743
2844
29class TestController(TestCase):45class TestController(TestCase):
@@ -38,11 +54,18 @@
38 Registry.create()54 Registry.create()
39 self.registry = Registry()55 self.registry = Registry()
40 self.mocked_live_controller = MagicMock()56 self.mocked_live_controller = MagicMock()
57 self.desktop = MagicMock()
58 self.desktop.primaryScreen.return_value = SCREEN['primary']
59 self.desktop.screenCount.return_value = SCREEN['number']
60 self.desktop.screenGeometry.return_value = SCREEN['size']
61 self.screens = ScreenList.create(self.desktop)
62 renderer = Renderer()
63 renderer.empty_height = 1000
41 Registry().register('live_controller', self.mocked_live_controller)64 Registry().register('live_controller', self.mocked_live_controller)
4265
43 def test_controller_text(self):66 def test_controller_text_empty(self):
44 """67 """
45 Remote API Tests : test the controller text method can be called68 Remote API Tests : test the controller text method can be called with empty service item
46 """69 """
47 # GIVEN: A mocked service with a dummy service item70 # GIVEN: A mocked service with a dummy service item
48 self.mocked_live_controller.service_item = MagicMock()71 self.mocked_live_controller.service_item = MagicMock()
@@ -53,6 +76,22 @@
53 assert isinstance(results['item'], MagicMock)76 assert isinstance(results['item'], MagicMock)
54 assert len(results['slides']) == 077 assert len(results['slides']) == 0
5578
79 def test_controller_text(self):
80 """
81 Remote API Tests : test the controller text method can be called with a real service item
82 """
83 # GIVEN: A mocked service with a dummy service item
84 line = convert_file_service_item(TEST_PATH, 'serviceitem_custom_1.osj')
85 self.mocked_live_controller.service_item = ServiceItem(None)
86 self.mocked_live_controller.service_item.set_from_service(line)
87 self.mocked_live_controller.service_item.render(True)
88 # WHEN: I trigger the method
89 ret = controller_text("SomeText")
90 # THEN: I get a basic set of results
91 results = ret['results']
92 assert isinstance(ret, dict)
93 assert len(results['slides']) == 2
94
56 def test_controller_direction_next(self):95 def test_controller_direction_next(self):
57 """96 """
58 Text the live next method is triggered97 Text the live next method is triggered