]> git.scottworley.com Git - paperdoorknob/blob - paperdoorknob.py
entries() convenience method
[paperdoorknob] / paperdoorknob.py
1 # paperdoorknob: Print glowfic
2 #
3 # This program is free software: you can redistribute it and/or modify it
4 # under the terms of the GNU General Public License as published by the
5 # Free Software Foundation, version 3.
6
7
8 from argparse import ArgumentParser
9 import itertools
10 import os.path
11
12 from typing import Iterable
13
14 from bs4 import BeautifulSoup
15 from bs4.element import Tag
16 import requests
17 import requests_cache
18 from xdg_base_dirs import xdg_cache_home
19
20
21 class Post:
22 def __init__(self, html: BeautifulSoup) -> None:
23 self._html = html
24
25 def text(self) -> Tag:
26 body = self._html.body
27 assert body
28 text = body.find_next("div", class_="post-post")
29 assert isinstance(text, Tag)
30 return text
31
32 def replies(self) -> Iterable[Tag]:
33 replies = self._html.find_all("div", class_="post-reply")
34 assert all(isinstance(r, Tag) for r in replies)
35 return replies
36
37 def entries(self) -> Iterable[Tag]:
38 return itertools.chain([self.text()], self.replies())
39
40
41 def command_line_parser() -> ArgumentParser:
42 parser = ArgumentParser(prog='paperdoorknob', description='Print glowfic')
43 parser.add_argument(
44 '--cache_path',
45 metavar='PATH',
46 help='Where to keep the http cache (instead of %(default)s)',
47 default=os.path.join(xdg_cache_home(), "paperdoorknob"))
48 parser.add_argument(
49 '--timeout',
50 help='How long to wait for HTTP requests, in seconds',
51 default=30)
52 parser.add_argument('url', help='URL to retrieve')
53 return parser
54
55
56 def fetch(url: str, session: requests.Session, timeout: int) -> BeautifulSoup:
57 with session.get(url, timeout=timeout) as r:
58 r.raise_for_status()
59 return BeautifulSoup(r.text, 'html.parser')
60
61
62 def main() -> None:
63 args = command_line_parser().parse_args()
64 with requests_cache.CachedSession(args.cache_path, cache_control=True) as session:
65 html = fetch(args.url, session, args.timeout)
66 Post(html)
67
68
69 if __name__ == '__main__':
70 main()