prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  [Bug]: ART Trier Germany collecting no more Data
  ### I Have A Problem With:
  
  A specific source
  
  ### What's Your Problem
  
  ART Trier Germany collecting no more Data. It worked till yesterday. I think they have a new homepage.
  The Calender is now empty, only one Entry on February 26th: A.R.T. Wichtiger Hinweis!
  The link (https://www.art-trier.de/cms/abfuhrtermine-1002.html) in the Description for ART Trier doesn't work anymore. Get a 404 Error Page.
  
  Ver. 1.45.1
  
  ### Source (if relevant)
  
  art_trier_de
  
  ### Logs
  
  ```Shell
  no relevant logs
  ```
  
  
  ### Relevant Configuration
  
  ```YAML
  - name: art_trier_de
        args:
          district: "Fellerich"
          zip_code: "54456"
  ```
  
  
  ### Checklist Source Error
  
  - [ ] Use the example parameters for your source (often available in the documentation) (don't forget to restart Home Assistant after changing the configuration)
  - [X] Checked that the website of your service provider is still working
  - [ ] Tested my attributes on the service provider website (if possible)
  - [X] I have tested with the latest version of the integration (master) (for HACS in the 3 dot menu of the integration click on "Redownload" and choose master as version)
  
  ### Checklist Sensor Error
  
  - [X] Checked in the Home Assistant Calendar tab if the event names match the types names (if types argument is used)
  
  ### Required
  
  - [X] I have searched past (closed AND opened) issues to see if this bug has already been reported, and it hasn't been.
  - [X] I understand that people give their precious time for free, and thus I've done my very best to make this problem as easy as possible to investigate.
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py`
  Content:
  ```
  1 import contextlib
  2 from datetime import datetime
  3 from typing import Optional
  4 from urllib.parse import quote
  5 
  6 import requests
  7 from waste_collection_schedule import Collection  # type: ignore[attr-defined]
  8 from waste_collection_schedule.service.ICS import ICS
  9 
  10 TITLE = "ART Trier"
  11 DESCRIPTION = "Source for waste collection of ART Trier."
  12 URL = "https://www.art-trier.de"
  13 TEST_CASES = {
  14     "Trier": {
  15         "zip_code": "54296",
  16         "district": "Stadt Trier, Universitätsring",
  17     },  # # https://www.art-trier.de/ics-feed/54296_trier_universitaetsring_1-1800.ics
  18     "Schweich": {
  19         "zip_code": "54338",
  20         "district": "Schweich (inkl. Issel)",
  21     },  # https://www.art-trier.de/ics-feed/54338_schweich_inkl_issel_1-1800.ics
  22     "Dreis": {
  23         "zip_code": "54518",
  24         "district": "Dreis",
  25     },  # https://www.art-trier.de/ics-feed/54518_dreis_1-1800.ics
  26     "Wittlich Marktplatz": {
  27         "zip_code": "54516",
  28         "district": "Wittlich, Marktplatz",
  29     },  # https://www.art-trier.de/ics-feed/54516_wittlich_marktplatz_1-1800.ics
  30     "Wittlich Wengerohr": {
  31         "zip_code": "54516",
  32         "district": "Wittlich-Wengerohr",
  33     },  # https://www.art-trier.de/ics-feed/54516_wittlich%2Dwengerohr_1-1800.ics
  34 }
  35 
  36 API_URL = "https://www.art-trier.de/ics-feed"
  37 REMINDER_DAY = (
  38     "0"  # The calendar event should be on the same day as the waste collection
  39 )
  40 REMINDER_TIME = "0600"  # The calendar event should start on any hour of the correct day, so this does not matter much
  41 ICON_MAP = {
  42     "Altpapier": "mdi:package-variant",
  43     "Restmüll": "mdi:trash-can",
  44     "Gelber Sack": "mdi:recycle",
  45 }
  46 SPECIAL_CHARS = str.maketrans(
  47     {
  48         " ": "_",
  49         "ä": "ae",
  50         "ü": "ue",
  51         "ö": "oe",
  52         "ß": "ss",
  53         "(": None,
  54         ")": None,
  55         ",": None,
  56         ".": None,
  57     }
  58 )
  59 
  60 
  61 class Source:
  62     def __init__(self, district: str, zip_code: str):
  63         self._district = quote(
  64             district.lower().removeprefix("stadt ").translate(SPECIAL_CHARS).strip()
  65         )
  66         self._zip_code = zip_code
  67         self._ics = ICS(regex=r"^A.R.T. Abfuhrtermin: (.*)", split_at=r" & ")
  68 
  69     def fetch(self):
  70         url = f"{API_URL}/{self._zip_code}_{self._district}_{REMINDER_DAY}-{REMINDER_TIME}.ics"
  71 
  72         res = requests.get(url)
  73         res.raise_for_status()
  74 
  75         schedule = self._ics.convert(res.text)
  76 
  77         return [
  78             Collection(date=entry[0], t=entry[1], icon=ICON_MAP.get(entry[1]))
  79             for entry in schedule
  80         ]
  81
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py
  --- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py
  +++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py
  @@ -1,13 +1,11 @@
  -import contextlib
  -from datetime import datetime
  -from typing import Optional
  +import logging
   from urllib.parse import quote
   
   import requests
   from waste_collection_schedule import Collection  # type: ignore[attr-defined]
   from waste_collection_schedule.service.ICS import ICS
   
  -TITLE = "ART Trier"
  +TITLE = "ART Trier (Depreciated)"
   DESCRIPTION = "Source for waste collection of ART Trier."
   URL = "https://www.art-trier.de"
   TEST_CASES = {
  @@ -56,6 +54,7 @@
           ".": None,
       }
   )
  +LOGGER = logging.getLogger(__name__)
   
   
   class Source:
  @@ -67,7 +66,11 @@
           self._ics = ICS(regex=r"^A.R.T. Abfuhrtermin: (.*)", split_at=r" & ")
   
       def fetch(self):
  -        url = f"{API_URL}/{self._zip_code}_{self._district}_{REMINDER_DAY}-{REMINDER_TIME}.ics"
  +        LOGGER.warning(
  +            "The ART Trier source is deprecated and might not work with all addresses anymore."
  +            " Please use the ICS instead: https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/ics/art_trier_de.md"
  +        )
  +        url = f"{API_URL}/{self._zip_code}:{self._district}::@{REMINDER_DAY}-{REMINDER_TIME}.ics"
   
           res = requests.get(url)
           res.raise_for_status()
  
verification_info: {"golden_diff": "diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py\n--- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py\n+++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py\n@@ -1,13 +1,11 @@\n-import contextlib\n-from datetime import datetime\n-from typing import Optional\n+import logging\n from urllib.parse import quote\n \n import requests\n from waste_collection_schedule import Collection  # type: ignore[attr-defined]\n from waste_collection_schedule.service.ICS import ICS\n \n-TITLE = \"ART Trier\"\n+TITLE = \"ART Trier (Depreciated)\"\n DESCRIPTION = \"Source for waste collection of ART Trier.\"\n URL = \"https://www.art-trier.de\"\n TEST_CASES = {\n@@ -56,6 +54,7 @@\n         \".\": None,\n     }\n )\n+LOGGER = logging.getLogger(__name__)\n \n \n class Source:\n@@ -67,7 +66,11 @@\n         self._ics = ICS(regex=r\"^A.R.T. Abfuhrtermin: (.*)\", split_at=r\" & \")\n \n     def fetch(self):\n-        url = f\"{API_URL}/{self._zip_code}_{self._district}_{REMINDER_DAY}-{REMINDER_TIME}.ics\"\n+        LOGGER.warning(\n+            \"The ART Trier source is deprecated and might not work with all addresses anymore.\"\n+            \" Please use the ICS instead: https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/ics/art_trier_de.md\"\n+        )\n+        url = f\"{API_URL}/{self._zip_code}:{self._district}::@{REMINDER_DAY}-{REMINDER_TIME}.ics\"\n \n         res = requests.get(url)\n         res.raise_for_status()\n", "issue": "[Bug]: ART Trier Germany collecting no more Data\n### I Have A Problem With:\n\nA specific source\n\n### What's Your Problem\n\nART Trier Germany collecting no more Data. It worked till yesterday. I think they have a new homepage.\r\nThe Calender is now empty, only one Entry on February 26th: A.R.T. Wichtiger Hinweis!\r\nThe link (https://www.art-trier.de/cms/abfuhrtermine-1002.html) in the Description for ART Trier doesn't work anymore. Get a 404 Error Page.\r\n\r\nVer. 1.45.1\n\n### Source (if relevant)\n\nart_trier_de\n\n### Logs\n\n```Shell\nno relevant logs\n```\n\n\n### Relevant Configuration\n\n```YAML\n- name: art_trier_de\r\n      args:\r\n        district: \"Fellerich\"\r\n        zip_code: \"54456\"\n```\n\n\n### Checklist Source Error\n\n- [ ] Use the example parameters for your source (often available in the documentation) (don't forget to restart Home Assistant after changing the configuration)\n- [X] Checked that the website of your service provider is still working\n- [ ] Tested my attributes on the service provider website (if possible)\n- [X] I have tested with the latest version of the integration (master) (for HACS in the 3 dot menu of the integration click on \"Redownload\" and choose master as version)\n\n### Checklist Sensor Error\n\n- [X] Checked in the Home Assistant Calendar tab if the event names match the types names (if types argument is used)\n\n### Required\n\n- [X] I have searched past (closed AND opened) issues to see if this bug has already been reported, and it hasn't been.\n- [X] I understand that people give their precious time for free, and thus I've done my very best to make this problem as easy as possible to investigate.\n", "before_files": [{"content": "import contextlib\nfrom datetime import datetime\nfrom typing import Optional\nfrom urllib.parse import quote\n\nimport requests\nfrom waste_collection_schedule import Collection  # type: ignore[attr-defined]\nfrom waste_collection_schedule.service.ICS import ICS\n\nTITLE = \"ART Trier\"\nDESCRIPTION = \"Source for waste collection of ART Trier.\"\nURL = \"https://www.art-trier.de\"\nTEST_CASES = {\n    \"Trier\": {\n        \"zip_code\": \"54296\",\n        \"district\": \"Stadt Trier, Universit\u00e4tsring\",\n    },  # # https://www.art-trier.de/ics-feed/54296_trier_universitaetsring_1-1800.ics\n    \"Schweich\": {\n        \"zip_code\": \"54338\",\n        \"district\": \"Schweich (inkl. Issel)\",\n    },  # https://www.art-trier.de/ics-feed/54338_schweich_inkl_issel_1-1800.ics\n    \"Dreis\": {\n        \"zip_code\": \"54518\",\n        \"district\": \"Dreis\",\n    },  # https://www.art-trier.de/ics-feed/54518_dreis_1-1800.ics\n    \"Wittlich Marktplatz\": {\n        \"zip_code\": \"54516\",\n        \"district\": \"Wittlich, Marktplatz\",\n    },  # https://www.art-trier.de/ics-feed/54516_wittlich_marktplatz_1-1800.ics\n    \"Wittlich Wengerohr\": {\n        \"zip_code\": \"54516\",\n        \"district\": \"Wittlich-Wengerohr\",\n    },  # https://www.art-trier.de/ics-feed/54516_wittlich%2Dwengerohr_1-1800.ics\n}\n\nAPI_URL = \"https://www.art-trier.de/ics-feed\"\nREMINDER_DAY = (\n    \"0\"  # The calendar event should be on the same day as the waste collection\n)\nREMINDER_TIME = \"0600\"  # The calendar event should start on any hour of the correct day, so this does not matter much\nICON_MAP = {\n    \"Altpapier\": \"mdi:package-variant\",\n    \"Restm\u00fcll\": \"mdi:trash-can\",\n    \"Gelber Sack\": \"mdi:recycle\",\n}\nSPECIAL_CHARS = str.maketrans(\n    {\n        \" \": \"_\",\n        \"\u00e4\": \"ae\",\n        \"\u00fc\": \"ue\",\n        \"\u00f6\": \"oe\",\n        \"\u00df\": \"ss\",\n        \"(\": None,\n        \")\": None,\n        \",\": None,\n        \".\": None,\n    }\n)\n\n\nclass Source:\n    def __init__(self, district: str, zip_code: str):\n        self._district = quote(\n            district.lower().removeprefix(\"stadt \").translate(SPECIAL_CHARS).strip()\n        )\n        self._zip_code = zip_code\n        self._ics = ICS(regex=r\"^A.R.T. Abfuhrtermin: (.*)\", split_at=r\" & \")\n\n    def fetch(self):\n        url = f\"{API_URL}/{self._zip_code}_{self._district}_{REMINDER_DAY}-{REMINDER_TIME}.ics\"\n\n        res = requests.get(url)\n        res.raise_for_status()\n\n        schedule = self._ics.convert(res.text)\n\n        return [\n            Collection(date=entry[0], t=entry[1], icon=ICON_MAP.get(entry[1]))\n            for entry in schedule\n        ]\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py"}], "after_files": [{"content": "import logging\nfrom urllib.parse import quote\n\nimport requests\nfrom waste_collection_schedule import Collection  # type: ignore[attr-defined]\nfrom waste_collection_schedule.service.ICS import ICS\n\nTITLE = \"ART Trier (Depreciated)\"\nDESCRIPTION = \"Source for waste collection of ART Trier.\"\nURL = \"https://www.art-trier.de\"\nTEST_CASES = {\n    \"Trier\": {\n        \"zip_code\": \"54296\",\n        \"district\": \"Stadt Trier, Universit\u00e4tsring\",\n    },  # # https://www.art-trier.de/ics-feed/54296_trier_universitaetsring_1-1800.ics\n    \"Schweich\": {\n        \"zip_code\": \"54338\",\n        \"district\": \"Schweich (inkl. Issel)\",\n    },  # https://www.art-trier.de/ics-feed/54338_schweich_inkl_issel_1-1800.ics\n    \"Dreis\": {\n        \"zip_code\": \"54518\",\n        \"district\": \"Dreis\",\n    },  # https://www.art-trier.de/ics-feed/54518_dreis_1-1800.ics\n    \"Wittlich Marktplatz\": {\n        \"zip_code\": \"54516\",\n        \"district\": \"Wittlich, Marktplatz\",\n    },  # https://www.art-trier.de/ics-feed/54516_wittlich_marktplatz_1-1800.ics\n    \"Wittlich Wengerohr\": {\n        \"zip_code\": \"54516\",\n        \"district\": \"Wittlich-Wengerohr\",\n    },  # https://www.art-trier.de/ics-feed/54516_wittlich%2Dwengerohr_1-1800.ics\n}\n\nAPI_URL = \"https://www.art-trier.de/ics-feed\"\nREMINDER_DAY = (\n    \"0\"  # The calendar event should be on the same day as the waste collection\n)\nREMINDER_TIME = \"0600\"  # The calendar event should start on any hour of the correct day, so this does not matter much\nICON_MAP = {\n    \"Altpapier\": \"mdi:package-variant\",\n    \"Restm\u00fcll\": \"mdi:trash-can\",\n    \"Gelber Sack\": \"mdi:recycle\",\n}\nSPECIAL_CHARS = str.maketrans(\n    {\n        \" \": \"_\",\n        \"\u00e4\": \"ae\",\n        \"\u00fc\": \"ue\",\n        \"\u00f6\": \"oe\",\n        \"\u00df\": \"ss\",\n        \"(\": None,\n        \")\": None,\n        \",\": None,\n        \".\": None,\n    }\n)\nLOGGER = logging.getLogger(__name__)\n\n\nclass Source:\n    def __init__(self, district: str, zip_code: str):\n        self._district = quote(\n            district.lower().removeprefix(\"stadt \").translate(SPECIAL_CHARS).strip()\n        )\n        self._zip_code = zip_code\n        self._ics = ICS(regex=r\"^A.R.T. Abfuhrtermin: (.*)\", split_at=r\" & \")\n\n    def fetch(self):\n        LOGGER.warning(\n            \"The ART Trier source is deprecated and might not work with all addresses anymore.\"\n            \" Please use the ICS instead: https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/ics/art_trier_de.md\"\n        )\n        url = f\"{API_URL}/{self._zip_code}:{self._district}::@{REMINDER_DAY}-{REMINDER_TIME}.ics\"\n\n        res = requests.get(url)\n        res.raise_for_status()\n\n        schedule = self._ics.convert(res.text)\n\n        return [\n            Collection(date=entry[0], t=entry[1], icon=ICON_MAP.get(entry[1]))\n            for entry in schedule\n        ]\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/art_trier_de.py"}]}