]> git.scottworley.com Git - paperdoorknob/blob - paperdoorknob.py
fb2df1f1cc1c7443bc6e07018bad7148eb12a5c6
[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 for eb in self._html.find_all("div", class_="post-edit-box"):
25 eb.decompose()
26 for footer in self._html.find_all("div", class_="post-footer"):
27 footer.decompose()
28
29 def text(self) -> Tag:
30 body = self._html.body
31 assert body
32 text = body.find_next("div", class_="post-post")
33 assert isinstance(text, Tag)
34 return text
35
36 def replies(self) -> Iterable[Tag]:
37 replies = self._html.find_all("div", class_="post-reply")
38 assert all(isinstance(r, Tag) for r in replies)
39 return replies
40
41 def entries(self) -> Iterable[Tag]:
42 return itertools.chain([self.text()], self.replies())
43
44
45 def command_line_parser() -> ArgumentParser:
46 parser = ArgumentParser(prog='paperdoorknob', description='Print glowfic')
47 parser.add_argument(
48 '--cache_path',
49 metavar='PATH',
50 help='Where to keep the http cache (instead of %(default)s)',
51 default=os.path.join(xdg_cache_home(), "paperdoorknob"))
52 parser.add_argument(
53 '--timeout',
54 help='How long to wait for HTTP requests, in seconds',
55 default=30)
56 parser.add_argument('url', help='URL to retrieve')
57 return parser
58
59
60 def fetch(url: str, session: requests.Session, timeout: int) -> BeautifulSoup:
61 with session.get(url, timeout=timeout) as r:
62 r.raise_for_status()
63 return BeautifulSoup(r.text, 'html.parser')
64
65
66 def main() -> None:
67 args = command_line_parser().parse_args()
68 with requests_cache.CachedSession(args.cache_path, cache_control=True) as session:
69 html = fetch(args.url, session, args.timeout)
70 Post(html)
71
72
73 if __name__ == '__main__':
74 main()