1
mirror of https://github.com/home-assistant/core synced 2024-08-02 23:40:32 +02:00
ha-core/homeassistant/components/rss_feed_template/__init__.py
2022-02-19 13:26:42 -06:00

112 lines
3.6 KiB
Python

"""Support to export sensor values via RSS feed."""
from html import escape
from aiohttp import web
import voluptuous as vol
from homeassistant.components.http import HomeAssistantView
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.typing import ConfigType
CONTENT_TYPE_XML = "text/xml"
DOMAIN = "rss_feed_template"
CONFIG_SCHEMA = vol.Schema(
{
DOMAIN: vol.Schema(
{
cv.match_all: vol.Schema(
{
vol.Optional("requires_api_password", default=True): cv.boolean,
vol.Optional("title"): cv.template,
vol.Required("items"): vol.All(
cv.ensure_list,
[
{
vol.Optional("title"): cv.template,
vol.Optional("description"): cv.template,
}
],
),
}
)
}
)
},
extra=vol.ALLOW_EXTRA,
)
def setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the RSS feed template component."""
for (feeduri, feedconfig) in config[DOMAIN].items():
url = f"/api/rss_template/{feeduri}"
requires_auth = feedconfig.get("requires_api_password")
if (title := feedconfig.get("title")) is not None:
title.hass = hass
items = feedconfig.get("items")
for item in items:
if "title" in item:
item["title"].hass = hass
if "description" in item:
item["description"].hass = hass
rss_view = RssView(url, requires_auth, title, items)
hass.http.register_view(rss_view)
return True
class RssView(HomeAssistantView):
"""Export states and other values as RSS."""
requires_auth = True
url = None
name = "rss_template"
_title = None
_items = None
def __init__(self, url, requires_auth, title, items):
"""Initialize the rss view."""
self.url = url
self.requires_auth = requires_auth
self._title = title
self._items = items
async def get(self, request, entity_id=None):
"""Generate the RSS view XML."""
response = '<?xml version="1.0" encoding="utf-8"?>\n\n'
response += '<rss version="2.0">\n'
response += " <channel>\n"
if self._title is not None:
response += " <title>%s</title>\n" % escape(
self._title.async_render(parse_result=False)
)
else:
response += " <title>Home Assistant</title>\n"
response += " <link>https://www.home-assistant.io/integrations/rss_feed_template/</link>\n"
response += " <description>Home automation feed</description>\n"
for item in self._items:
response += " <item>\n"
if "title" in item:
response += " <title>"
response += escape(item["title"].async_render(parse_result=False))
response += "</title>\n"
if "description" in item:
response += " <description>"
response += escape(item["description"].async_render(parse_result=False))
response += "</description>\n"
response += " </item>\n"
response += " </channel>\n"
response += "</rss>\n"
return web.Response(body=response, content_type=CONTENT_TYPE_XML)