From ab184750fc1d8c55541f9ca260ac025d5fdbb330 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 12 Jul 2024 19:35:29 +0200 Subject: [PATCH] fix: assume RaBe time for archiv requests --- README.md | 2 +- cridlib/get.py | 4 ++-- cridlib/lib.py | 6 +++--- cridlib/strategy/past.py | 9 ++++++++- tests/test_get.py | 8 ++++---- tests/test_lib.py | 8 ++++---- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 7df10db..3cb47ff 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ pip -m install rabe-cridlib >>> # parse an existing crid >>> crid = cridlib.parse("crid://rabe.ch/v1/klangbecken#t=clock=19930301T131200.00Z") >>> print(f"version: {crid.version}, show: {crid.show}, start: {crid.start}") -version: v1, show: klangbecken, start: 1993-03-01 13:12:00 +version: v1, show: klangbecken, start: 1993-03-01 12:12:00+00:00 >>> # get crid for current show >>> crid = cridlib.get() diff --git a/cridlib/get.py b/cridlib/get.py index e20d99a..c30d9c0 100644 --- a/cridlib/get.py +++ b/cridlib/get.py @@ -2,7 +2,7 @@ from __future__ import annotations -from datetime import datetime, timezone +from datetime import UTC, datetime, timezone from .lib import CRID, canonicalize_show from .strategy import future, now, past @@ -48,7 +48,7 @@ def get(timestamp: datetime | None = None, fragment: str = "") -> CRID: if _show: _show = canonicalize_show(_show) - _tscode = f"t=clock={_ts.strftime('%Y%m%dT%H%M%S.%f')[:-4]}Z" + _tscode = f"t=clock={_ts.astimezone(UTC).strftime('%Y%m%dT%H%M%S.%f')[:-4]}Z" _fragment = f"{_tscode}{'&' + fragment if fragment else ''}" return CRID(f"crid://rabe.ch/v1{'/' + _show if _show else ''}#{_fragment}") diff --git a/cridlib/lib.py b/cridlib/lib.py index 36ec55b..cfd7d67 100644 --- a/cridlib/lib.py +++ b/cridlib/lib.py @@ -2,7 +2,7 @@ from __future__ import annotations -from datetime import datetime +from datetime import UTC, datetime from pathlib import PurePath from typing import Self from urllib.parse import parse_qs @@ -104,10 +104,10 @@ def __init__(self: Self, uri: str | None = None) -> None: try: # TODO(hairmare): investigate noqa for bug # https://github.com/radiorabe/python-rabe-cridlib/issues/244 - self._start = datetime.strptime( # noqa: DTZ007 + self._start = datetime.strptime( parse_qs(parse_qs(self.fragment)["t"][0])["clock"][0], "%Y%m%dT%H%M%S.%fZ", - ) + ).astimezone(UTC) except KeyError as ex: raise CRIDMissingMediaFragmentError(self.fragment, uri) from ex except ValueError as ex: # pragma: no cover diff --git a/cridlib/strategy/past.py b/cridlib/strategy/past.py index 8d962d5..6de9330 100644 --- a/cridlib/strategy/past.py +++ b/cridlib/strategy/past.py @@ -2,9 +2,12 @@ from datetime import datetime +from pytz import timezone + from cridlib.util import get_session __ARCHIV_BROADCASTS_URL = "https://archiv.rabe.ch/api/broadcasts/" +__ARCHIV_TIMEZONE = "Europe/Zurich" def get_show(past: datetime) -> str: @@ -21,7 +24,11 @@ def get_show(past: datetime) -> str: Show name from the archive for `past`. """ - _url = f"{__ARCHIV_BROADCASTS_URL}{past.year}/{past.month:02d}/{past.day:02d}/{past.hour:02d}{past.minute:02d}{past.second:02d}" # noqa: E501 + local = past + if past.tzname != __ARCHIV_TIMEZONE: + local = past.astimezone(timezone(__ARCHIV_TIMEZONE)) + + _url = f"{__ARCHIV_BROADCASTS_URL}{local.year}/{local.month:02d}/{local.day:02d}/{local.hour:02d}{local.minute:02d}{local.second:02d}" # noqa: E501 _resp = get_session().get(_url, timeout=10) _json = _resp.json() _data = _json.get("data") diff --git a/tests/test_get.py b/tests/test_get.py index 9649c2c..aed3533 100644 --- a/tests/test_get.py +++ b/tests/test_get.py @@ -18,21 +18,21 @@ def test_get_past(archiv_mock): # noqa: ARG001 """Test meth:`get` for past shows.""" with freeze_time("1993-03-02 00:00:00 UTC"): crid = cridlib.get( - timestamp=datetime(1993, 3, 1, 13, 12, 00, tzinfo=timezone.utc), + timestamp=datetime(1993, 3, 1, 12, 12, 00, tzinfo=timezone.utc), ) assert crid.version == "v1" assert crid.show == "test" - assert str(crid) == "crid://rabe.ch/v1/test#t=clock=19930301T131200.00Z" + assert str(crid) == "crid://rabe.ch/v1/test#t=clock=19930301T121200.00Z" # show with additional local args in fragments with freeze_time("1993-03-02 00:00:00 UTC"): crid = cridlib.get( - timestamp=datetime(1993, 3, 1, 13, 12, 00, tzinfo=timezone.utc), + timestamp=datetime(1993, 3, 1, 12, 12, 00, tzinfo=timezone.utc), fragment="myid=1234", ) assert crid.version == "v1" assert crid.show == "test" - assert str(crid) == "crid://rabe.ch/v1/test#t=clock=19930301T131200.00Z&myid=1234" + assert str(crid) == "crid://rabe.ch/v1/test#t=clock=19930301T121200.00Z&myid=1234" def test_get_future(libretime_mock): # noqa: ARG001 diff --git a/tests/test_lib.py b/tests/test_lib.py index 37b6188..d78cd39 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -1,6 +1,6 @@ """Test high level cridlib API.""" -from datetime import datetime +from datetime import UTC, datetime import pytest from freezegun import freeze_time @@ -16,7 +16,7 @@ { "version": "v1", "show": "test", - "start": datetime(1993, 3, 1, 13, 12), + "start": datetime(1993, 3, 1, 12, 12, tzinfo=UTC), }, ), ( @@ -32,13 +32,13 @@ { "version": "v1", "show": None, - "start": datetime(1993, 3, 1, 13, 12), + "start": datetime(1993, 3, 1, 12, 12, tzinfo=UTC), }, ), ], ) def test_crid_roundtrip(crid_str, expected): - with freeze_time("1993-03-01 13:12"): + with freeze_time("1993-03-01 12:12 UTC"): crid = cridlib.lib.CRID(crid_str) assert str(crid) == crid_str assert crid.version == expected["version"]