From 3c8bf6c9ebf30de53dd7f13cfd3bca116c00d0a1 Mon Sep 17 00:00:00 2001 From: jo Date: Mon, 20 Feb 2023 16:00:48 +0100 Subject: [PATCH] feat(playout): add jinja2 quote filter for liquidsoap --- .../libretime_playout/liquidsoap/entrypoint.py | 2 ++ playout/libretime_playout/liquidsoap/utils.py | 15 +++++++++++++++ playout/tests/liquidsoap/utils_test.py | 15 +++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 playout/libretime_playout/liquidsoap/utils.py create mode 100644 playout/tests/liquidsoap/utils_test.py diff --git a/playout/libretime_playout/liquidsoap/entrypoint.py b/playout/libretime_playout/liquidsoap/entrypoint.py index 982fb9f79..6a3635804 100644 --- a/playout/libretime_playout/liquidsoap/entrypoint.py +++ b/playout/libretime_playout/liquidsoap/entrypoint.py @@ -6,6 +6,7 @@ from libretime_shared.config import AudioFormat, IcecastOutput, SystemOutput from ..config import Config from .models import Info, StreamPreferences +from .utils import quote here = Path(__file__).parent @@ -16,6 +17,7 @@ templates = Environment( # nosec loader=templates_loader, keep_trailing_newline=True, ) +templates.filters["quote"] = quote # Liquidsoap has 4 hardcoded output stream set of variables, so we need to # fill the missing stream outputs with placeholders so Liquidsoap does diff --git a/playout/libretime_playout/liquidsoap/utils.py b/playout/libretime_playout/liquidsoap/utils.py new file mode 100644 index 000000000..d5b96be24 --- /dev/null +++ b/playout/libretime_playout/liquidsoap/utils.py @@ -0,0 +1,15 @@ +from typing import Any + + +def quote(value: Any, double=False) -> str: + """ + Quote and escape strings quotes for liquidsoap. + + Double will escape the quotes twice, this is usually only used for the socket + communication to liquidsoap. + """ + if not isinstance(value, str): + value = str(value) + escaper = "\\\\" if double else "\\" + escaped = value.replace('"', f'{escaper}"') + return f'"{escaped}"' diff --git a/playout/tests/liquidsoap/utils_test.py b/playout/tests/liquidsoap/utils_test.py new file mode 100644 index 000000000..670693097 --- /dev/null +++ b/playout/tests/liquidsoap/utils_test.py @@ -0,0 +1,15 @@ +import pytest + +from libretime_playout.liquidsoap.utils import quote + + +@pytest.mark.parametrize( + "value, double, expected", + [ + ("something", False, '"something"'), + ('something"', False, '"something\\""'), + ('something"', True, '"something\\\\""'), + ], +) +def test_quote(value, double, expected): + assert quote(value, double) == expected