|
9 | 9 |
|
10 | 10 | import feedparser # type: ignore[import] |
11 | 11 | import homeassistant.helpers.config_validation as cv |
| 12 | +import requests |
12 | 13 | import voluptuous as vol |
13 | 14 | from dateutil import parser |
14 | 15 | from feedparser import FeedParserDict |
15 | 16 | from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity |
16 | 17 | from homeassistant.const import CONF_NAME, CONF_SCAN_INTERVAL |
17 | 18 | from homeassistant.util import dt |
| 19 | +from requests_file import FileAdapter |
18 | 20 |
|
19 | 21 | if TYPE_CHECKING: |
20 | 22 | from homeassistant.core import HomeAssistant |
|
38 | 40 | DEFAULT_SCAN_INTERVAL = timedelta(hours=1) |
39 | 41 | DEFAULT_THUMBNAIL = "https://www.home-assistant.io/images/favicon-192x192-full.png" |
40 | 42 | DEFAULT_TOPN = 9999 |
| 43 | +USER_AGENT = f"Home Assistant Feed-parser Integration {__version__}" |
41 | 44 |
|
42 | 45 | PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( |
43 | 46 | { |
@@ -124,9 +127,14 @@ def __repr__(self: FeedParserSensor) -> str: |
124 | 127 | def update(self: FeedParserSensor) -> None: |
125 | 128 | """Parse the feed and update the state of the sensor.""" |
126 | 129 | _LOGGER.debug("Feed %s: Polling feed data from %s", self.name, self._feed) |
127 | | - parsed_feed: FeedParserDict = feedparser.parse(self._feed) |
128 | | - |
129 | | - if not parsed_feed: |
| 130 | + s: requests.Session = requests.Session() |
| 131 | + s.mount("file://", FileAdapter()) |
| 132 | + s.headers.update({"User-Agent": USER_AGENT}) |
| 133 | + res: requests.Response = s.get(self._feed) |
| 134 | + res.raise_for_status() |
| 135 | + parsed_feed: FeedParserDict = feedparser.parse(res.text) |
| 136 | + |
| 137 | + if not parsed_feed.entries: |
130 | 138 | self._attr_native_value = None |
131 | 139 | _LOGGER.warning("Feed %s: No data received.", self.name) |
132 | 140 | return |
|
0 commit comments