From ad0a6da0a2b7a63155e945a3ab0a9dde0c7f1188 Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Tue, 23 Jul 2019 14:49:11 -0400 Subject: [PATCH 1/9] add get_input_device_by_id method and delete useless template --- .gitignore | 1 + elemental/client.py | 10 +++++ elemental/client_test.py | 44 ++++++++++++++++++- elemental/templates/generate_preview.xml | 1 - .../test_templates/sample_single_device.xml | 12 +++++ 5 files changed, 66 insertions(+), 2 deletions(-) delete mode 100644 elemental/templates/generate_preview.xml create mode 100644 elemental/test_templates/sample_single_device.xml diff --git a/.gitignore b/.gitignore index dfe3f71..157704c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ elemental/main.py elemental/Keys.py elemental/.DS_Store elemental/templates/.DS_Store +python_elemental.egg-info venv .coverage .DS_Store diff --git a/elemental/client.py b/elemental/client.py index 558fa4c..39e0eb2 100644 --- a/elemental/client.py +++ b/elemental/client.py @@ -173,6 +173,16 @@ def get_input_devices(self): devices_info, key=lambda d: int(d["id"])) return [dict(d) for d in devices_info] + def get_input_devices_by_id(self, input_device_id): + devices_url = f'{self.server_ip}/devices/{input_device_id}' + devices_headers = self.generate_headers(devices_url) + devices = self.send_request( + http_method="GET", url=devices_url, headers=devices_headers) + print(devices.text) + device_info = xmltodict.parse(devices.text)['device'] + device_info.pop('@href') + return dict(device_info) + def generate_preview(self, source_type, input_id): url = f'{self.server_ip}/inputs/generate_preview' headers = self.generate_headers(url) diff --git a/elemental/client_test.py b/elemental/client_test.py index 952aace..e0b5718 100644 --- a/elemental/client_test.py +++ b/elemental/client_test.py @@ -279,7 +279,6 @@ def test_get_input_devices_will_get_right_devices_info(): text=file_fixture('sample_device_list.xml')) res = client.get_input_devices() - print(res) assert res == [{"id": "1", "name": None, "device_name": "HD-SDI 1", "device_number": "0", "device_type": "AJA", @@ -294,6 +293,49 @@ def test_get_input_devices_will_get_right_devices_info(): "quad": "false", "availability": True}] +def test_get_input_devices_by_id_will_call_send_request_as_expect(): + client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY) + + client.generate_headers = mock.Mock() + client.generate_headers.return_value = HEADERS + + client.send_request = mock.Mock() + client.find_devices_in_use = mock.Mock() + client.find_devices_in_use.return_value = ("HD-SDI 1",) + client.send_request.return_value = \ + mock_response(status=200, + text=file_fixture('sample_single_device.xml')) + + client.get_input_devices_by_id('2') + + client.send_request.\ + assert_called_with(http_method="GET", + url=f'{ELEMENTAL_ADDRESS}/devices/2', + headers=HEADERS) + + +def test_get_input_devices_by_id_will_get_right_devices_info(): + client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY) + + client.generate_headers = mock.Mock() + client.generate_headers.return_value = HEADERS + + client.send_request = mock.Mock() + client.find_devices_in_use = mock.Mock() + client.find_devices_in_use.return_value = ("HD-SDI 1",) + client.send_request.return_value = \ + mock_response(status=200, + text=file_fixture('sample_single_device.xml')) + + res = client.get_input_devices_by_id('2') + assert res == {"id": "2", + "name": None, "device_name": "HD-SDI 2", + "device_number": "0", "device_type": "AJA", + "description": "AJA Capture Card", + "channel": "2", "channel_type": "HD-SDI", + "quad": "false"} + + def test_get_preview_will_parse_response_json_as_expect(): client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY) diff --git a/elemental/templates/generate_preview.xml b/elemental/templates/generate_preview.xml deleted file mode 100644 index 728e118..0000000 --- a/elemental/templates/generate_preview.xml +++ /dev/null @@ -1 +0,0 @@ -input_key=0&live_event[inputs_attributes][0][source_type]=DeviceInput,2,1,AJA,HD-SDI&live_event[inputs_attributes][0][device_input_attributes][sdi_settings_attributes][input_format]=Auto&live_event[inputs_attributes][0][device_input_attributes][device_id]=10 diff --git a/elemental/test_templates/sample_single_device.xml b/elemental/test_templates/sample_single_device.xml new file mode 100644 index 0000000..08abb48 --- /dev/null +++ b/elemental/test_templates/sample_single_device.xml @@ -0,0 +1,12 @@ + + + 2 + + HD-SDI 2 + 0 + AJA + AJA Capture Card + 2 + HD-SDI + false + \ No newline at end of file From 8efc680a5716468067245ba4be4cec3cbdb842a9 Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Tue, 23 Jul 2019 15:05:24 -0400 Subject: [PATCH 2/9] fix avaliability problem --- elemental/client_test.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/elemental/client_test.py b/elemental/client_test.py index 0a134d4..7abe60e 100644 --- a/elemental/client_test.py +++ b/elemental/client_test.py @@ -333,11 +333,7 @@ def test_get_input_devices_by_id_will_get_right_devices_info(): "device_number": "0", "device_type": "AJA", "description": "AJA Capture Card", "channel": "2", "channel_type": "HD-SDI", -<<<<<<< HEAD - "quad": "false"} -======= "quad": "false", 'availability': True} ->>>>>>> c2882e5e7644518171940784ffd38f17e3f2fcdd def test_get_preview_will_parse_response_json_as_expect(): From 761d46caa54accce92782e5289f67f26017095a5 Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Wed, 24 Jul 2019 11:44:56 -0400 Subject: [PATCH 3/9] fix method name --- elemental/client.py | 2 +- elemental/client_test.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/elemental/client.py b/elemental/client.py index b04267a..82afdb5 100644 --- a/elemental/client.py +++ b/elemental/client.py @@ -173,7 +173,7 @@ def get_input_devices(self): devices_info, key=lambda d: int(d["id"])) return [dict(d) for d in devices_info] - def get_input_devices_by_id(self, input_device_id): + def get_input_device_by_id(self, input_device_id): devices_url = f'{self.server_ip}/devices/{input_device_id}' devices_headers = self.generate_headers(devices_url) devices = self.send_request( diff --git a/elemental/client_test.py b/elemental/client_test.py index 7abe60e..51af627 100644 --- a/elemental/client_test.py +++ b/elemental/client_test.py @@ -293,7 +293,7 @@ def test_get_input_devices_will_get_right_devices_info(): "quad": "false", "availability": True}] -def test_get_input_devices_by_id_will_call_send_request_as_expect(): +def test_get_input_device_by_id_will_call_send_request_as_expect(): client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY) client.generate_headers = mock.Mock() @@ -306,7 +306,7 @@ def test_get_input_devices_by_id_will_call_send_request_as_expect(): mock_response(status=200, text=file_fixture('sample_single_device.xml')) - client.get_input_devices_by_id('2') + client.get_input_device_by_id('2') client.send_request.\ assert_called_with(http_method="GET", @@ -314,7 +314,7 @@ def test_get_input_devices_by_id_will_call_send_request_as_expect(): headers=HEADERS) -def test_get_input_devices_by_id_will_get_right_devices_info(): +def test_get_input_device_by_id_will_get_right_devices_info(): client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY) client.generate_headers = mock.Mock() @@ -327,7 +327,7 @@ def test_get_input_devices_by_id_will_get_right_devices_info(): mock_response(status=200, text=file_fixture('sample_single_device.xml')) - res = client.get_input_devices_by_id('2') + res = client.get_input_device_by_id('2') assert res == {"id": "2", "name": None, "device_name": "HD-SDI 2", "device_number": "0", "device_type": "AJA", From 3329bdbfcc59d0f7444235358fe8ce728270984f Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Wed, 24 Jul 2019 15:40:43 -0400 Subject: [PATCH 4/9] fix test and lint --- elemental/client_test.py | 12 +++++++++++- elemental/templates/qvbr_mediastore.xml | 12 ++++++------ setup.py | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/elemental/client_test.py b/elemental/client_test.py index 51af627..d2387a0 100644 --- a/elemental/client_test.py +++ b/elemental/client_test.py @@ -141,7 +141,17 @@ def test_create_event_should_call_send_request_as_expect_and_return_event_id(): 'mediastore_container_backup': 'https://hu5n3jjiyi2jev.data.medias' 'tore.us-east-1.amazonaws.com/backup', - 'channel': "1", 'device_name': "0"}) + 'input_device': {'id': '1', + 'name': None, + 'device_name': 'HD-SDI 1', + 'device_number': '0', + 'device_type': 'AJA', + 'description': + 'AJA Capture Card', + 'channel': '1', + 'channel_type': 'HD-SDI', + 'quad': 'false', + 'availability': False}}) response_from_elemental_api = client.send_request.call_args_list[0][1] assert response_from_elemental_api['http_method'] == 'POST' diff --git a/elemental/templates/qvbr_mediastore.xml b/elemental/templates/qvbr_mediastore.xml index d955ea2..64c8ad5 100644 --- a/elemental/templates/qvbr_mediastore.xml +++ b/elemental/templates/qvbr_mediastore.xml @@ -18,11 +18,11 @@ embedded - AJA - {{ device_number }} - {{ channel }} - HD-SDI - HD-SDI 1 + {{ input_device["device_type"] }} + {{ input_device["device_number"] }} + {{ input_device["channel"] }} + {{ input_device["channel_type"] }} + {{ input_device["device_name"] }} Auto @@ -835,7 +835,7 @@ {{ password }} {{ username }} - {{ mediastore_container_master}} + {{ mediastore_container_master }} apple_live_group_settings diff --git a/setup.py b/setup.py index e63067f..c98f6f2 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ name='python-elemental', author='CBS Interactive', author_email='video-processing-team@cbsinteractive.com', - version='0.2', + version='0.3', include_patckage_data=True, url='https://github.com/cbsinteractive/elemental.git', license='MIT', From 63f158f15597eb544f30e3ea1bab9b809fdb0292 Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Wed, 24 Jul 2019 16:11:41 -0400 Subject: [PATCH 5/9] fix preview exception raising logic --- elemental/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elemental/client.py b/elemental/client.py index 82afdb5..1e3ad6a 100644 --- a/elemental/client.py +++ b/elemental/client.py @@ -204,7 +204,7 @@ def generate_preview(self, source_type, input_id): response_parse = ast.literal_eval(response.text) - if 'preview_image_id' not in response_parse: + if 'type' in response_parse and response_parse['type'] == 'error': raise ElementalException( f"Response: {response.status_code}\n{response.text}") else: From 925654cbd9be5a731711a4089759d46a4d618dec Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Wed, 24 Jul 2019 17:45:28 -0400 Subject: [PATCH 6/9] add data file to package --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index c98f6f2..76b0a15 100644 --- a/setup.py +++ b/setup.py @@ -14,4 +14,5 @@ long_description=open('README.md').read(), install_requires=requirements, packages=setuptools.find_packages(), + package_data={'elemental': ['templates/*']} ) From acbd9c6eb9a522274e7afe46a3b379f04f74fc79 Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Thu, 25 Jul 2019 10:49:22 -0400 Subject: [PATCH 7/9] add new param to template --- elemental/templates/qvbr_mediastore.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elemental/templates/qvbr_mediastore.xml b/elemental/templates/qvbr_mediastore.xml index 64c8ad5..91f68a2 100644 --- a/elemental/templates/qvbr_mediastore.xml +++ b/elemental/templates/qvbr_mediastore.xml @@ -1,6 +1,6 @@ - SuperBowl AVC Live (FLL - Dev) + {{channel_name}} true false From 921f8634acd5cc076b904b532b3c7dc69ac8d803 Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Mon, 29 Jul 2019 14:10:22 -0400 Subject: [PATCH 8/9] remove 'sourceType' param in 'generate_preview' method --- elemental/client.py | 4 ++-- elemental/client_test.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/elemental/client.py b/elemental/client.py index 1e3ad6a..7f74dc3 100644 --- a/elemental/client.py +++ b/elemental/client.py @@ -185,7 +185,7 @@ def get_input_device_by_id(self, input_device_id): device_info.pop('@href') return dict(device_info) - def generate_preview(self, source_type, input_id): + def generate_preview(self, input_id): url = f'{self.server_ip}/inputs/generate_preview' headers = self.generate_headers(url) @@ -195,7 +195,7 @@ def generate_preview(self, source_type, input_id): # generate body data = f"input_key=0&live_event[inputs_attributes][0][source_type]=" \ - f"{source_type}&live_event[inputs_attributes][0]" \ + f"DeviceInput&live_event[inputs_attributes][0]" \ f"[device_input_attributes][sdi_settings_attributes]" \ f"[input_format]=Auto&live_event[inputs_attributes][0]" \ f"[device_input_attributes][device_id]={input_id}" diff --git a/elemental/client_test.py b/elemental/client_test.py index d2387a0..5e430c9 100644 --- a/elemental/client_test.py +++ b/elemental/client_test.py @@ -357,7 +357,7 @@ def test_get_preview_will_parse_response_json_as_expect(): status=200, text=file_fixture( 'success_response_for_generate_preview.json')) - response = client.generate_preview('DeviceInput', '2') + response = client.generate_preview('2') assert response == { 'preview_url': f'{ELEMENTAL_ADDRESS}/' @@ -377,7 +377,7 @@ def test_get_preview_will_raise_ElementalException_if_preview_unavaliable(): "Device already in use."})) with pytest.raises(ElementalException) as exc_info: - client.generate_preview('DeviceInput', '1') + client.generate_preview('1') respond_text = json.dumps({'type': 'error', 'message': 'Input is invalid. ' From 4743264462ead888e04cc10b9c7c28f73c8c4072 Mon Sep 17 00:00:00 2001 From: Tianchen Min Date: Mon, 29 Jul 2019 14:13:28 -0400 Subject: [PATCH 9/9] update version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 76b0a15..152a003 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ name='python-elemental', author='CBS Interactive', author_email='video-processing-team@cbsinteractive.com', - version='0.3', + version='0.4', include_patckage_data=True, url='https://github.com/cbsinteractive/elemental.git', license='MIT',