2 Commits

Author SHA1 Message Date
Aron BenDaniel 0e106e6da6 Update copyright year to 2026 2026-01-08 01:12:06 +05:30
Aron BenDaniel 68eb4a22b7 fix(api): Restructure archive parsing to iterate through archive items 2026-01-07 00:48:15 +05:30
6 changed files with 40 additions and 24 deletions
+9 -10
View File
@@ -1,11 +1,10 @@
**/__pycache__/
**/*.ipynb
**/build/
.idea/
.vscode/
**/.venv/
**/.env
**/.env_template
**/*.log
**/*.md
__pycache__
*ipynb
build
.idea
.vscode
.venv
.env
*log
*.md
src/api/uv.lock
+9 -6
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine
FROM node:20
WORKDIR /build
COPY src/frontend/package*.json .
@@ -13,12 +13,15 @@ FROM python:3.13-slim
WORKDIR /app
RUN apt update && \
apt install -y git build-essential python3.13-dev libglib2.0-0 libpango-1.0-0 libpangoft2-1.0-0 && \
apt clean && \
rm -rf /var/lib/apt/lists/*
COPY --from=nobodyxu/apt-fast:latest-debian-buster-slim /usr/local/ /usr/local/
RUN apt update
RUN apt install -y aria2
RUN apt-fast install -y git build-essential python3.13-dev libgobject-2.0 libpango-1.0 libpangoft2-1.0
# aiohttp-client-cache depends on multipart, which requires python3.13-dev to build successfully on 3.13
# weasyprint depends on libgoject, libpango, and libpangoft2
RUN rm -rf /var/lib/apt/lists/*
# https://github.com/TheOnlyWayUp/WattpadDownloader/pull/82#discussion_r2470358950
@@ -29,7 +32,7 @@ WORKDIR /app
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
COPY src/api/pyproject.toml /app
RUN uv sync && uv cache clean
RUN uv sync
COPY src/api/ /app
COPY --from=0 /build/build /app/src/build
+1 -1
View File
@@ -53,5 +53,5 @@ My thanks to [aerkalov/ebooklib](https://github.com/aerkalov/ebooklib) for a fas
---
<div align="center">
<p>TheOnlyWayUp © 2025</p>
<p>TheOnlyWayUp © 2026</p>
</div>
+19 -5
View File
@@ -174,12 +174,26 @@ async def handle_download(
story_zip = await fetch_story_content_zip(story_id, cookies)
archive = ZipFile(story_zip, "r")
part_trees: list[BeautifulSoup] = [
clean_tree(
part["title"], part["id"], archive.read(str(part["id"])).decode("utf-8")
# Transform part metadata into an easily-indexable dictionary
part_id_title_dictionary = {
str(part["id"]): part["title"] for part in metadata["parts"]
}
part_trees: list[BeautifulSoup] = []
for id in archive.namelist():
if (
id not in part_id_title_dictionary
): # If a part is deleted and the old story_zip is cached, this is needed to avoid a KeyError exception
continue
part_trees.append(
clean_tree(
part_id_title_dictionary[id],
id,
archive.read(id).decode("utf-8"),
)
)
for part in metadata["parts"]
]
images = (
[await fetch_tree_images(tree) for tree in part_trees]
+1 -1
View File
@@ -19,7 +19,7 @@
href="https://github.com/TheOnlyWayUp"
class="underline"
target="_blank">TheOnlyWayUp</a
> © 2025
> © 2026
</p>
</aside>
</footer>
+1 -1
View File
@@ -44,7 +44,7 @@
>
</div>
<p>
Copyright © 2025 - All rights reserved by <a
Copyright © 2026 - All rights reserved by <a
href="https://rambhat.la"
class="link"
target="_blank"