40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
from dataclasses import dataclass
|
|
from typing import Iterable
|
|
|
|
from django.utils.xmlutils import SimplerXMLGenerator
|
|
|
|
from ucast.models import Channel
|
|
|
|
|
|
@dataclass
|
|
class FeedElement:
|
|
url: str
|
|
title: str
|
|
|
|
|
|
def __add_feed_element(handler: SimplerXMLGenerator, element: FeedElement):
|
|
handler.addQuickElement(
|
|
"outline", attrs={"xmlUrl": element.url, "title": element.title}
|
|
)
|
|
|
|
|
|
def write_opml(elements: Iterable[FeedElement], outfile):
|
|
handler = SimplerXMLGenerator(outfile, "utf-8", short_empty_elements=True)
|
|
handler.startDocument()
|
|
handler.startElement("opml", {})
|
|
handler.addQuickElement("head")
|
|
handler.startElement("body", {"version": "1.0"})
|
|
|
|
for element in elements:
|
|
__add_feed_element(handler, element)
|
|
|
|
handler.endElement("body")
|
|
handler.endElement("opml")
|
|
handler.endDocument()
|
|
|
|
|
|
def write_channels_opml(channels: Iterable[Channel], site_url: str, key: str, outfile):
|
|
elements = [
|
|
FeedElement(f"{site_url}/feed/{c.slug}?key={key}", c.name) for c in channels
|
|
]
|
|
write_opml(elements, outfile)
|