diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/awb_oldenburg_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/awb_oldenburg_de.py index 1f8a5766..be1c644d 100755 --- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/awb_oldenburg_de.py +++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/awb_oldenburg_de.py @@ -1,16 +1,19 @@ -import urllib - +import logging import requests +import urllib +from bs4 import BeautifulSoup +from datetime import date from waste_collection_schedule import Collection # type: ignore[attr-defined] from waste_collection_schedule.service.ICS import ICS TITLE = "AWB Oldenburg" DESCRIPTION = "Source for 'Abfallwirtschaftsbetrieb Stadt Oldenburg (Oldb)'." -URL = "https://services.oldenburg.de/index.php" +URL = "https://www.oldenburg.de/startseite/leben-umwelt/awb/abfall-a-z/abfuhrkalender.html" TEST_CASES = { "Polizeiinspektion Oldenburg": {"street": "Friedhofsweg", "house_number": 30} } +_LOGGER = logging.getLogger(__name__) class Source: def __init__(self, street, house_number): @@ -20,18 +23,27 @@ class Source: def fetch(self): + street_idx = self.get_street_idx(self._street) + if street_idx == -1: + _LOGGER.error("Error: Street not found..") + return [] + year = date.today().year + args = { - "id": 430, - "tx_citkoabfall_abfallkalender[strasse]": str(self._street).encode("utf-8"), - "tx_citkoabfall_abfallkalender[hausnummer]": str(self._house_number).encode( + "tx_collectioncalendar_abfuhrkalender[action]": "exportIcs", + "tx_collectioncalendar_abfuhrkalender[controller]": "Frontend\Export", + "tx_collectioncalendar_abfuhrkalender[houseNumber]": str(self._house_number).encode( "utf-8" ), - "tx_citkoabfall_abfallkalender[abfallarten][0]": 61, - "tx_citkoabfall_abfallkalender[abfallarten][1]": 60, - "tx_citkoabfall_abfallkalender[abfallarten][2]": 59, - "tx_citkoabfall_abfallkalender[abfallarten][3]": 58, - "tx_citkoabfall_abfallkalender[action]": "ics", - "tx_citkoabfall_abfallkalender[controller]": "FrontendIcs", + "tx_collectioncalendar_abfuhrkalender[street]": str(street_idx).encode( + "utf-8" + ), + "tx_collectioncalendar_abfuhrkalender[wasteTypes][1]": 1, + "tx_collectioncalendar_abfuhrkalender[wasteTypes][2]": 2, + "tx_collectioncalendar_abfuhrkalender[wasteTypes][3]": 3, + "tx_collectioncalendar_abfuhrkalender[wasteTypes][4]": 4, + "tx_collectioncalendar_abfuhrkalender[wasteTypes][5]": 5, + "tx_collectioncalendar_abfuhrkalender[year]": year } # use '%20' instead of '+' in URL @@ -47,3 +59,29 @@ class Source: for d in dates: entries.append(Collection(d[0], d[1])) return entries + + def get_street_mapping(self): # thanks @dt215git (https://github.com/mampfes/hacs_waste_collection_schedule/issues/539#issuecomment-1371413297) + s = requests.Session() + r = s.get(URL) + + soup = BeautifulSoup(r.text, "html.parser") + items = soup.find_all("option") + items = items[2:] # first two values are not street addresses so remove them + + streets = [] + ids = [] + for item in items: + streets.append(item.text) # street name + ids.append(item.attrs["value"]) # dropdown value + mapping = {k:v for (k,v) in zip(streets, ids)} + + return mapping + + def get_street_idx(self, street): + mapping = self.get_street_mapping() + + for _street, idx in mapping.items(): + if _street == street: + return idx + + return -1 diff --git a/doc/source/awb_oldenburg_de.md b/doc/source/awb_oldenburg_de.md index cd5f3bc9..05759f81 100644 --- a/doc/source/awb_oldenburg_de.md +++ b/doc/source/awb_oldenburg_de.md @@ -1,6 +1,6 @@ # Abfallwirtschaftsbetrieb Stadt Oldenburg (Oldb) -Support for schedules provided by [services.oldenburg.de](https://services.oldenburg.de/index.php?id=430). +Support for schedules provided by [www.oldenburg.de](https://www.oldenburg.de/startseite/leben-umwelt/awb/abfall-a-z/abfuhrkalender.html). ## Configuration via configuration.yaml