eggplants/pixiv-bulk-downloader

View on GitHub
pixiv_bulk_downloader/bookmarks.py

Summary

Maintainability
A
25 mins
Test Coverage
from __future__ import annotations

from pathlib import Path
from typing import TYPE_CHECKING, Any

from .base import PixivBaseDownloader

if TYPE_CHECKING:
    from pixivpy3.utils import JsonDict

    from .pixiv_types import IllustInfo


class PixivBookmarksDownloader(PixivBaseDownloader):
    def get_all_bookmarked_works(self) -> None:
        print("[+]: Fetching information of bookmarked works...")
        bookmarked_data = self.retrieve_bookmarks()
        print("\n[+]: Downloading bookmarked works...")
        self.download(bookmarked_data, Path(self.save_dir) / "bookmarks")

    def retrieve_bookmarks(self) -> list[IllustInfo]:
        urls: list[IllustInfo] = []
        next_qs: dict[str, Any] | None = {}
        target_id = self.login_info["response"]["user"]["id"]
        total = self.aapi.user_detail(self.aapi.user_id)["profile"][
            "total_illust_bookmarks_public"
        ]
        d_width = len(str(total))
        urls_len = 0
        while next_qs is not None:
            if "user_id" not in next_qs:
                res_json: JsonDict = self.aapi.user_bookmarks_illust(target_id)
            else:
                res_json = self.aapi.user_bookmarks_illust(**next_qs)
            for idx, illust in enumerate(res_json["illusts"]):
                print(
                    f"\033[K[+]: [%0{d_width}d/%0{d_width}d]: %s (id: %d)"
                    % (urls_len + idx + 1, total, illust.title, illust.id),
                    end="\r",
                    flush=True,
                )
                urls.append(
                    {
                        "id": illust.id,
                        "title": illust.title,
                        "link": self.ext_links(illust),
                    },
                )
            next_qs = self.aapi.parse_qs(res_json["next_url"])
            urls_len = len(urls)
            self.rand_sleep(0.5)
        return urls