Make onlinefiles support cookies

This commit is contained in:
Joakim Holm 2023-06-01 22:32:04 +02:00
parent 2faa4b747b
commit dade9db6da
3 changed files with 15 additions and 7 deletions

View File

@ -1,6 +1,6 @@
from grawlix import Encryption
from dataclasses import dataclass, field
from typing import Optional, Union, TypeVar, Generic
from typing import Optional, Union, TypeVar, Generic, Any
@dataclass(slots=True)
class Metadata:
@ -30,6 +30,7 @@ class OnlineFile:
extension: str
encryption: Optional[Encryption] = None
headers: Optional[dict[str, str]] = None
cookies: Optional[Any] = None # TODO Change type
@dataclass(slots=True)
class OfflineFile:
@ -63,8 +64,8 @@ class HtmlFile:
@dataclass(slots=True)
class HtmlFiles:
cover: OnlineFile
htmlfiles: list[HtmlFile]
cover: Optional[OnlineFile] = None
BookData = Union[
SingleFile,

View File

@ -27,9 +27,9 @@ class Epub(OutputFormat):
file_count = len(html.htmlfiles) + 1 # Html files + cover
async def download_cover(cover_file: OnlineFile):
cover_filename = f"cover.{html.cover.extension}"
cover_filename = f"cover.{cover_file.extension}"
epub_cover = epub.EpubCover(file_name = cover_filename)
epub_cover.content = await self._download_file(html.cover)
epub_cover.content = await self._download_file(cover_file)
output.add_item(epub_cover)
epub_cover_page = epub.EpubCoverHtml(image_name = cover_filename)
if update:
@ -38,7 +38,12 @@ class Epub(OutputFormat):
async def download_file(index: int, file: HtmlFile):
response = await self._client.get(file.file.url, follow_redirects=True)
response = await self._client.get(
file.file.url,
headers = file.file.headers,
cookies = file.file.cookies,
follow_redirects=True
)
soup = BeautifulSoup(response.text, "lxml")
selected_element = soup.find(attrs=file.selector)
epub_file = epub.EpubHtml(
@ -55,7 +60,9 @@ class Epub(OutputFormat):
download_file(index, file)
for index, file in enumerate(html.htmlfiles)
]
epub_files = await asyncio.gather(download_cover(html.cover), *tasks)
if html.cover:
tasks.append(download_cover(html.cover))
epub_files = await asyncio.gather(*tasks)
# Add files to epub
for epub_file in epub_files:

View File

@ -59,7 +59,7 @@ class OutputFormat:
:returns: Content of downloaded file
"""
content = b""
async with self._client.stream("GET", file.url, headers = file.headers, follow_redirects=True) as request:
async with self._client.stream("GET", file.url, headers = file.headers, cookies = file.cookies, follow_redirects=True) as request:
total_filesize = int(request.headers["Content-length"])
async for chunk in request.aiter_bytes():
content += chunk