1 from logging
import warning
3 from typing
import Optional
, List
, Union
4 from requests
import Response
7 from lxml
.html
import HtmlElement
9 from manga_py
.http
import Http
10 from manga_py
.http
.flare_solver
import Http
as FS_Http
11 from .params
import ProviderParams
14 CF_PROXY_RE
= re
.compile(r
'(https?://[^/]+)')
17 class Base(ProviderParams
):
24 _use_flare_solver
= False
25 __flare_solver_http
= None
26 _flare_solver_url
= None
42 'destination': 'Manga',
44 'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0',
46 self
._image
_params
= {
48 # 'crop': (left, upper, right, lower)
52 self
._http
_kwargs
= {}
54 def _archive_type(self
) -> str:
56 if self
._params
['cbz']:
61 return self
._params
['url']
63 def _build_http_params(self
, params
):
66 params
.setdefault('allow_webp', not self
._params
.get('no_webp', False))
67 params
.setdefault('referer', self
._storage
.get('referer', self
.domain
))
68 params
.setdefault('user_agent', self
._get
_user
_agent
())
69 params
.setdefault('proxies', self
._storage
.get('proxies', None))
70 params
.setdefault('cookies', self
._storage
.get('cookies', None))
71 params
.setdefault('kwargs', self
._http
_kwargs
)
74 def normalize_uri(self
, uri
, referer
=None):
75 return self
.http_normal().normalize_uri(uri
=uri
, referer
=referer
)
77 def http(self
, new
=False, params
=None) -> Union
[FS_Http
, Http
]:
78 if self
._use
_flare
_solver
:
79 return self
.flare_solver_http(new
, params
)
81 return self
.http_normal(new
, params
)
83 def flare_solver_http(self
, new
=False, params
=None) -> FS_Http
:
84 allow_webp
= True == (params
or {}).get('no_webp', False)
87 headers
['Accept'] = Http
.webp_header
88 if self
.__flare
_solver
_http
is None:
89 self
.__flare
_solver
_http
= FS_Http(self
._flare
_solver
_url
, self
._get
_user
_agent
())
90 self
.__flare
_solver
_http
.create_session()
92 http
= FS_Http(self
._flare
_solver
_url
, self
._get
_user
_agent
())
95 return self
.__flare
_solver
_http
97 def http_normal(self
, new
=False, params
=None) -> Http
:
98 http_params
= self
._build
_http
_params
(params
)
100 http
= Http(**http_params
)
103 if self
.__http
is None:
104 self
.__http
= Http(**http_params
)
108 def http_get(self
, url
: str, headers
: dict = None, cookies
: dict = None):
110 with http
.get(url
=url
, headers
=headers
, cookies
=cookies
) as resp
:
111 if type(http
) == Http
:
114 content
= resp
.json().get('solution', {}).get('response', b
'')
116 return content
.decode()
117 except AttributeError:
120 def http_post(self
, url
: str, headers
: dict = None, cookies
: dict = None, data
=()):
122 with http
.post(url
=url
, headers
=headers
, cookies
=cookies
, data
=data
) as resp
:
123 if type(http
) == Http
:
126 return resp
.json().get('solution', {}).get('response', b
'').decode()
128 def _get_user_agent(self
):
129 return self
._params
.get('user_agent', None)
132 def __normalize_chapters(cls
, n
, element
):
133 if isinstance(element
, HtmlElement
):
134 return n(element
.get('href'))
135 if isinstance(element
, str):
139 def _prepare_chapters(self
, chapters
):
140 n
= self
.normalize_uri
142 if chapters
and len(chapters
):
144 url
= self
.__normalize
_chapters
(n
, i
)
147 warning('Chapters list empty. Check %s' % self
.get_url())
150 def book_meta(self
) -> dict:
153 def _image_name(self
, idx
, filename
):
154 fn
, extension
= path
.splitext(filename
)
155 _path
= '{:0>3}_{}'.format(idx
, fn
)
156 if self
._params
['rename_pages']:
157 _path
= '{:0>3}'.format(idx
)
158 return _path
+ extension
160 def chapter_for_json(self
) -> str:
163 def put_info_json(self
, meta
):
164 # manga_name, url, directory
167 def _fill_arguments(self
, arguments
: List
[str]):
175 if self
.__arguments
is None:
176 self
.__arguments
= {}
178 for arg
in arguments
:
179 key
, value
= arg
.split('=', 1) # type: str, str
181 self
.__arguments
[key
] = value
183 def arg(self
, key
: str) -> Optional
[str]:
184 if self
.__arguments
is None:
186 return self
.__arguments
.get(key
)
188 def allow_auto_change_url(self
):
191 def cookies(self
, response
: Response
) -> dict:
192 if self
._use
_flare
_solver
:
193 return response
.json().get('solution', {}).get('cookies')
194 return response
.cookies
.__dict
__
197 def cf_proxy(self
) -> Optional
[str]:
198 cf
= self
._params
.get('cf_proxy')
200 cf
= CF_PROXY_RE
.search(cf
)
201 return cf
.group(1) if cf
else None
204 if self
.__flare
_solver
_http
is not None:
205 self
.flare_solver_http().destroy_session()