1+ import urllib
2+
3+ import requests
4+
5+
6+ class BookStack :
7+ def __init__ (self , base_url , token_id = None , token_secret = None ):
8+ self .api_base_url = self ._create_api_base_url (base_url )
9+ self .token_id = None
10+ self .token_secret = None
11+
12+ self ._session = BaseURLSession (self .api_base_url )
13+ self ._session .auth = Auth (token_id , token_secret )
14+
15+ self .endpoint_paths = {
16+ 'docs' : 'docs.json/' ,
17+ 'books' : 'books/' ,
18+ 'shelves' : 'shelves/' ,
19+ 'export_text' : 'export/plaintext' ,
20+ 'export_html' : 'export/html'
21+ }
22+
23+ @staticmethod
24+ def _create_api_base_url (base_url ):
25+ parsed_url = urllib .parse .urlparse (base_url )
26+ if 'api' in str (parsed_url .path ):
27+ parsed_url = parsed_url
28+ else :
29+ parsed_url = parsed_url ._replace (** {'path' : 'api/' })
30+
31+ return parsed_url .geturl ()
32+
33+ def get_docs (self ):
34+ return self ._session .get (self .endpoint_paths ['docs' ]).json ()
35+
36+ def get_books (self ):
37+ return self ._session .get (self .endpoint_paths ['books' ]).json ()
38+
39+ def read_book (self , book_id ):
40+ return self ._session .get (
41+ urllib .parse .urljoin (
42+ self .endpoint_paths ['books' ],
43+ str (book_id )
44+ )
45+ ).json ()
46+
47+ def export_text (self , book_id ):
48+ return self ._session .get (
49+ urllib .parse .urljoin (
50+ self .endpoint_paths ['books' ],
51+ f"{ book_id } /{ self .endpoint_paths ['export_text' ]} "
52+ )
53+ ).text
54+
55+ def export_html (self , book_id ):
56+ return self ._session .get (
57+ urllib .parse .urljoin (
58+ self .endpoint_paths ['books' ],
59+ f"{ book_id } /{ self .endpoint_paths ['export_html' ]} "
60+ )
61+ ).text
62+
63+
64+ class BaseURLSession (requests .Session ):
65+ def __init__ (self , base_url , * args , ** kwargs ):
66+ super ().__init__ (* args , ** kwargs )
67+ self .base_url = base_url
68+
69+ def get (self , url_path , * args , ** kwargs ):
70+ url = urllib .parse .urljoin (self .base_url , url_path )
71+ return super ().get (url , * args , ** kwargs )
72+
73+
74+ class Auth (requests .auth .AuthBase ):
75+ def __init__ (self ,
76+ token_id ,
77+ token_secret ,
78+ header_key = 'Authorization'
79+ ):
80+ self .header_key = header_key
81+ self .token_id = token_id
82+ self .token_secret = token_secret
83+
84+ def __call__ (self , r ):
85+ r .headers [self .header_key ] = f'Token { self .token_id } :{ self .token_secret } '
86+
87+ return r
0 commit comments