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
1=== modified file 'openlp/core/ui/media/mediacontroller.py'
2--- openlp/core/ui/media/mediacontroller.py 2018-02-23 15:54:25 +0000
3+++ openlp/core/ui/media/mediacontroller.py 2018-03-18 18:27:55 +0000
4@@ -459,26 +459,16 @@
5 log.debug('use %s controller' % self.current_media_players[controller.controller_type].display_name)
6 return True
7
8- def media_length(self, service_item):
9+ @staticmethod
10+ def media_length(service_item):
11 """
12- Loads and starts a media item to obtain the media length
13+ Uses Media Info to obtain the media length
14
15 :param service_item: The ServiceItem containing the details to be played.
16 """
17 media_info = MediaInfo()
18 media_info.volume = 0
19 media_info.file_info = QtCore.QFileInfo(service_item.get_frame_path())
20- # display = controller.preview_display
21- suffix = '*.%s' % media_info.file_info.suffix().lower()
22- used_players = get_media_players()[0]
23- player = self.media_players[used_players[0]]
24- if suffix not in player.video_extensions_list and suffix not in player.audio_extensions_list:
25- # Media could not be loaded correctly
26- critical_error_message_box(
27- translate('MediaPlugin.MediaItem', 'Unsupported Media File'),
28- translate('MediaPlugin.MediaItem', 'File {file_path} not supported using player {player_name}'
29- ).format(file_path=service_item.get_frame_path(), player_name=used_players[0]))
30- return False
31 media_data = MediaInfoWrapper.parse(service_item.get_frame_path())
32 # duration returns in milli seconds
33 service_item.set_media_length(media_data.tracks[0].duration)
34@@ -573,16 +563,6 @@
35 if not title:
36 continue
37 player = self.media_players[title]
38- # The system player may not return what files it can play so add it now
39- # and check whether it can play the file later
40- if title == 'system':
41- if not controller.media_info.is_background or controller.media_info.is_background and \
42- player.can_background:
43- self.resize(display, player)
44- if player.load(display):
45- self.current_media_players[controller.controller_type] = player
46- controller.media_info.media_type = MediaType.Video
47- return True
48 if suffix in player.video_extensions_list:
49 if not controller.media_info.is_background or controller.media_info.is_background and \
50 player.can_background:
51
52=== modified file 'openlp/core/ui/media/vlcplayer.py'
53--- openlp/core/ui/media/vlcplayer.py 2017-12-29 09:15:48 +0000
54+++ openlp/core/ui/media/vlcplayer.py 2018-03-18 18:27:55 +0000
55@@ -66,7 +66,15 @@
56 """
57 if 'openlp.core.ui.media.vendor.vlc' in sys.modules:
58 # If VLC has already been imported, no need to do all the stuff below again
59- return sys.modules['openlp.core.ui.media.vendor.vlc']
60+ is_vlc_available = False
61+ try:
62+ is_vlc_available = bool(sys.modules['openlp.core.ui.media.vendor.vlc'].get_default_instance())
63+ except:
64+ pass
65+ if is_vlc_available:
66+ return sys.modules['openlp.core.ui.media.vendor.vlc']
67+ else:
68+ return None
69 is_vlc_available = False
70 try:
71 if is_macosx():
72@@ -89,6 +97,7 @@
73 except (ImportError, NameError, NotImplementedError):
74 pass
75 except OSError as e:
76+ # this will get raised the first time
77 if is_win():
78 if not isinstance(e, WindowsError) and e.winerror != 126:
79 raise
80
81=== modified file 'tests/functional/openlp_core/api/endpoint/test_controller.py'
82--- tests/functional/openlp_core/api/endpoint/test_controller.py 2018-03-09 21:58:45 +0000
83+++ tests/functional/openlp_core/api/endpoint/test_controller.py 2018-03-18 18:27:55 +0000
84@@ -22,8 +22,24 @@
85 from unittest import TestCase
86 from unittest.mock import MagicMock
87
88+from PyQt5 import QtCore
89+
90 from openlp.core.common.registry import Registry
91 from openlp.core.api.endpoint.controller import controller_text, controller_direction
92+from openlp.core.display.renderer import Renderer
93+from openlp.core.display.screens import ScreenList
94+from openlp.core.lib import ServiceItem
95+
96+from tests.utils import convert_file_service_item
97+from tests.utils.constants import RESOURCE_PATH
98+
99+TEST_PATH = str(RESOURCE_PATH / 'service')
100+
101+SCREEN = {
102+ 'primary': False,
103+ 'number': 1,
104+ 'size': QtCore.QRect(0, 0, 1024, 768)
105+}
106
107
108 class TestController(TestCase):
109@@ -38,11 +54,18 @@
110 Registry.create()
111 self.registry = Registry()
112 self.mocked_live_controller = MagicMock()
113+ self.desktop = MagicMock()
114+ self.desktop.primaryScreen.return_value = SCREEN['primary']
115+ self.desktop.screenCount.return_value = SCREEN['number']
116+ self.desktop.screenGeometry.return_value = SCREEN['size']
117+ self.screens = ScreenList.create(self.desktop)
118+ renderer = Renderer()
119+ renderer.empty_height = 1000
120 Registry().register('live_controller', self.mocked_live_controller)
121
122- def test_controller_text(self):
123+ def test_controller_text_empty(self):
124 """
125- Remote API Tests : test the controller text method can be called
126+ Remote API Tests : test the controller text method can be called with empty service item
127 """
128 # GIVEN: A mocked service with a dummy service item
129 self.mocked_live_controller.service_item = MagicMock()
130@@ -53,6 +76,22 @@
131 assert isinstance(results['item'], MagicMock)
132 assert len(results['slides']) == 0
133
134+ def test_controller_text(self):
135+ """
136+ Remote API Tests : test the controller text method can be called with a real service item
137+ """
138+ # GIVEN: A mocked service with a dummy service item
139+ line = convert_file_service_item(TEST_PATH, 'serviceitem_custom_1.osj')
140+ self.mocked_live_controller.service_item = ServiceItem(None)
141+ self.mocked_live_controller.service_item.set_from_service(line)
142+ self.mocked_live_controller.service_item.render(True)
143+ # WHEN: I trigger the method
144+ ret = controller_text("SomeText")
145+ # THEN: I get a basic set of results
146+ results = ret['results']
147+ assert isinstance(ret, dict)
148+ assert len(results['slides']) == 2
149+
150 def test_controller_direction_next(self):
151 """
152 Text the live next method is triggered