55
66.. _OPML: https://opml.org/spec2.opml
77
8-
98.. autofunction:: parse
109.. autofunction:: unparse
11-
12- .. autoclass:: Feed
13- :members:
14- :undoc-members:
15-
1610.. autoexception:: OPMLError
1711 :show-inheritance:
1812
19-
2013.. versionadded:: 3.23
2114
22-
2315.. todo::
2416
2517 * use text= as user_title (both directions)
3325import re
3426import xml .etree .ElementTree as etree
3527from collections .abc import Iterable
36- from dataclasses import dataclass
37- from dataclasses import KW_ONLY
3828from datetime import datetime
3929from email .utils import format_datetime
4030from typing import cast
4131from typing import IO
4232
4333import reader
44-
45-
46- @dataclass
47- class Feed :
48- """A feed in an OPML subscription list.
49-
50- Attributes are similar to those of :class:`reader.Feed`.
51-
52- """
53-
54- url : str
55- _ : KW_ONLY
56- title : str | None = None
57- link : str | None = None
58- subtitle : str | None = None
34+ from reader .types import FeedToImport
5935
6036
6137class OPMLError (reader .FeedImportError ):
6238 """An error occurred while parsing an OPML subscription list."""
6339
6440
65- def parse (file : IO [bytes ], max_depth : int = 10 ) -> list [Feed ]:
41+ def parse (file : IO [bytes ], max_depth : int = 10 ) -> list [FeedToImport ]:
6642 """Extract a list of feeds from an OPML subscription list.
6743
6844 Args:
6945 file (file): A binary file.
7046
7147 Returns:
72- list(reader.opml.Feed ): A list of feeds.
48+ list(FeedToImport ): A list of feeds.
7349
7450 Raises:
7551 OPMLError:
@@ -88,7 +64,7 @@ def parse(file: IO[bytes], max_depth: int = 10) -> list[Feed]:
8864 if root .tag .lower () != 'opml' :
8965 raise OPMLError (f"expected <opml> root tag, got: <{ root .tag } >" )
9066
91- def walk (node : etree .Element , depth : int = 1 ) -> Iterable [Feed ]:
67+ def walk (node : etree .Element , depth : int = 1 ) -> Iterable [FeedToImport ]:
9268 if depth > max_depth :
9369 raise OPMLError ("tag depth limit exceeded" )
9470
@@ -100,7 +76,7 @@ def walk(node: etree.Element, depth: int = 1) -> Iterable[Feed]:
10076
10177 if tag == 'outline' and type == 'rss' :
10278 if url := attrib .get ('xmlurl' ):
103- yield Feed (
79+ yield FeedToImport (
10480 url ,
10581 title = attrib .get ('title' , attrib .get ('text' )),
10682 link = attrib .get ('htmlurl' ),
@@ -154,7 +130,7 @@ def unparse(
154130 """Convert a list of feeds to an OPML subscription list.
155131
156132 Args:
157- feeds (list(reader. Feed)): An iterable of feeds.
133+ feeds (list(Feed)): An iterable of feeds.
158134 title (str or None): The list title.
159135 created (datetime or None): The list creation date.
160136
0 commit comments