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()

```

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()

{"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"}]}