From 75bf19e6c2d704e99619d82db6036741484923c8 Mon Sep 17 00:00:00 2001 From: Archon Studio Date: Sat, 18 Jan 2025 20:38:58 +0100 Subject: [PATCH 1/3] New Source: Add script to fetch from pup_si API --- .../source/pup_si.py | 89 +++++++++++++++++++ doc/source/pup_si.md | 36 ++++++++ 2 files changed, 125 insertions(+) create mode 100644 custom_components/waste_collection_schedule/waste_collection_schedule/source/pup_si.py create mode 100644 doc/source/pup_si.md diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/pup_si.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/pup_si.py new file mode 100644 index 000000000..24d69adce --- /dev/null +++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/pup_si.py @@ -0,0 +1,89 @@ +import requests +from bs4 import BeautifulSoup +from datetime import datetime +from waste_collection_schedule import Collection # type: ignore[attr-defined] + +TITLE = "PUP Saubermacher" +DESCRIPTION = "Source for PUP Saubermacher." +URL = "https://www.pup-saubermacher.si/" +TEST_CASES = { + "Sostanj 1": {"place_id": 412177}, + "Sostanj 2": {"place_id": 100911}, +} + +BIN_TYPES = { + "M": "Mešani (črn)", + "B": "Biološki (rjav)", + "E": "Embalaža (rumeni)", +} +ICON_MAP = { + "M": "mdi:trash-can", + "B": "mdi:leaf", + "E": "mdi:recycle", +} + +BASE_URL = "https://www.pup-saubermacher.si/php/dobi_tabelo.php" + + +class Source: + def __init__(self, place_id: int): + self._place_id: int = place_id + + def fetch(self) -> list[Collection]: + args = { + "q": self._place_id, + } + response = requests.get(BASE_URL, params=args) + response.encoding = 'utf-8' + response.raise_for_status() + + content = BeautifulSoup(response.text, "html.parser") + + if response.text == "null" or not content.find_all("ul"): + raise Exception("Invalid place id") + + entries = [] + data = self.parse_to_obj(content) + + for item in data: + type_char = self.get_type(item["title"]) + + for date_info in item["dates"]: + date = self.get_date(date_info) + + if date is not None: + entries.append(Collection(date, BIN_TYPES[type_char], ICON_MAP[type_char])) + + return entries + + def parse_to_obj(self, content): + # Find all tags and their following