diff --git a/example/art_remove_mats.py b/example/art_remove_mats.py new file mode 100644 index 0000000..12f8e12 --- /dev/null +++ b/example/art_remove_mats.py @@ -0,0 +1,43 @@ +import logging +import sys + +sys.path.append("../") + +from samsungtvws import SamsungTVWS # noqa: E402 + +# Increase debug level +logging.basicConfig(level=logging.INFO) + +# Normal constructor +tv = SamsungTVWS("192.168.xxx.xxx") + +# Set all mats to this type +target_matte_type = "none" + +# Is art mode supported? +if not tv.art().supported(): + logging.error("Art mode not supported") + sys.exit(1) + +# List available mats for displaying art +matte_types = [ + matte_type for elem in tv.art().get_matte_list() for matte_type in elem.values() +] + +if target_matte_type not in matte_types: + logging.error( + "Invalid matte type: {}. Supported matte types are: {}".format( + target_matte_type, matte_types + ) + ) + sys.exit(1) + +# List the art available on the device +available_art = tv.art().available() + +for art in available_art: + if art["matte_id"] != target_matte_type: + logging.info( + "Setting matte to {} for {}".format(target_matte_type, art["content_id"]) + ) + tv.art().change_matte(art["content_id"], target_matte_type) diff --git a/samsungtvws/art.py b/samsungtvws/art.py index bded67a..8d0f7f9 100644 --- a/samsungtvws/art.py +++ b/samsungtvws/art.py @@ -338,3 +338,22 @@ def set_photo_filter(self, content_id, filter_id): "filter_id": filter_id, } ) + + def get_matte_list(self): + response = self._send_art_request( + {"request": "get_matte_list"}, + wait_for_event=D2D_SERVICE_MESSAGE_EVENT, + ) + assert response + data = json.loads(response["data"]) + + return json.loads(data["matte_type_list"]) + + def change_matte(self, content_id, matte_id): + self._send_art_request( + { + "request": "change_matte", + "content_id": content_id, + "matte_id": matte_id, + } + ) diff --git a/tests/test_art.py b/tests/test_art.py index 22fc8f5..7cd6305 100644 --- a/tests/test_art.py +++ b/tests/test_art.py @@ -92,3 +92,21 @@ def test_set_available(connection: Mock) -> None: connection.send.assert_called_once_with( '{"method": "ms.channel.emit", "params": {"event": "art_app_request", "to": "host", "data": "{\\"request\\": \\"get_content_list\\", \\"category\\": null, \\"id\\": \\"07e72228-7110-4655-aaa6-d81b5188c219\\"}"}}' ) + + +def test_change_matte(connection: Mock) -> None: + with patch( + "samsungtvws.art.uuid.uuid4", + return_value="07e72228-7110-4655-aaa6-d81b5188c219", + ): + connection.recv.side_effect = [ + MS_CHANNEL_CONNECT_SAMPLE, + MS_CHANNEL_READY_SAMPLE, + D2D_SERVICE_MESSAGE_AVAILABLE_SAMPLE, + ] + tv_art = SamsungTVArt("127.0.0.1") + tv_art.change_matte("test", "none") + + connection.send.assert_called_once_with( + '{"method": "ms.channel.emit", "params": {"event": "art_app_request", "to": "host", "data": "{\\"request\\": \\"change_matte\\", \\"content_id\\": \\"test\\", \\"matte_id\\": \\"none\\", \\"id\\": \\"07e72228-7110-4655-aaa6-d81b5188c219\\"}"}}' + )