Somewhat large overhaul to move the kiosk towards using normal python
[kiosk.git] / seattletimes_rss_renderer.py
1 #!/usr/bin/env python3
2
3 import logging
4 from typing import Dict, List
5 import xml
6
7 import generic_news_rss_renderer as gnrss
8
9
10 logger = logging.getLogger(__file__)
11
12
13 class seattletimes_rss_renderer(gnrss.generic_news_rss_renderer):
14     interesting_categories = frozenset(
15         [
16             "Nation",
17             "World",
18             "Life",
19             "Technology",
20             "Local News",
21             "Food",
22             "Drink",
23             "Today File",
24             "Seahawks",
25             "Oddities",
26             "Packfic NW",
27             "Home",
28             "Garden",
29             "Travel",
30             "Outdoors",
31         ]
32     )
33
34     def __init__(
35         self,
36         name_to_timeout_dict: Dict[str, int],
37         feed_site: str,
38         feed_uris: List[str],
39         page_title: str,
40     ):
41         super().__init__(
42             name_to_timeout_dict, feed_site, feed_uris, page_title
43         )
44
45     def get_headlines_page_prefix(self) -> str:
46         return "seattletimes-nonnews"
47
48     def get_details_page_prefix(self) -> str:
49         return "seattletimes-details-nonnews"
50
51     def should_use_https(self) -> bool:
52         return True
53
54     def item_is_interesting_for_headlines(
55         self, title: str, description: str, item: xml.etree.ElementTree.Element
56     ) -> bool:
57         if item.tag != "item":
58             logger.debug(f'{title}: item.tag ({item}) isn\'t "item"?!')
59             return False
60         if self.is_item_older_than_n_days(item, 14):
61             logger.info(f'{title}: too old to be interesting.')
62             return False
63
64         details = {}
65         for detail in list(item):
66             logger.debug(
67                 f'detail {detail.tag} => {detail.attrib} ({detail.text})'
68             )
69             if detail.text is not None:
70                 details[detail.tag] = detail.text
71         if 'category' not in details:
72             logger.debug(f'{title}: no category in details?')
73             return False
74         interesting = False
75         for x in seattletimes_rss_renderer.interesting_categories:
76             if x in details["category"]:
77                 logger.debug(
78                     f'{x} looks like a good category.'
79                 )
80                 interesting = True
81                 break
82         return interesting
83
84     def item_is_interesting_for_article(
85         self, title: str, description: str, item: xml.etree.ElementTree.Element
86     ) -> bool:
87         if self.is_item_older_than_n_days(item, 14):
88             logger.info(
89                 f'{title}: is too old to be interesting.'
90             )
91             return False
92         return len(description) >= 65
93
94
95 # Test
96 #x = seattletimes_rss_renderer({"Test", 123},
97 #                              "www.seattletimes.com",
98 #                              [ "/outdoors/feed/", '/live/feed/' ],
99 #                              "nonnews")
100 #x.periodic_render("Fetch News")
101 #x.periodic_render("Shuffle News")