From ada2005c2ef4d892ce1e2652058e449531162000 Mon Sep 17 00:00:00 2001 From: Joakim Holm Date: Sun, 14 May 2023 17:35:25 +0200 Subject: [PATCH] Add support for marvel unlimited --- .gitignore | 1 + README.md | 1 + grawlix/sources/__init__.py | 2 ++ grawlix/sources/marvel.py | 32 ++++++++++++++++++++++++++++---- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c5aed4a..b379466 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ MANIFEST # Installer logs pip-log.txt pip-delete-this-directory.txt +cookies.txt diff --git a/README.md b/README.md index 36bc222..638229e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ grawlix currently supports downloading from the following sources: - [eReolen](https://ereolen.dk) - [Flipp](https://flipp.dk) - [Manga Plus](https://mangaplus.shueisha.co.jp) +- [Marvel Unlimited](https://marvel.com) - [Royal Road](https://www.royalroad.com) - [Saxo](https://saxo.com) - [Webtoons](https://webtoons.com) diff --git a/grawlix/sources/__init__.py b/grawlix/sources/__init__.py index cd87be7..4fa4e46 100644 --- a/grawlix/sources/__init__.py +++ b/grawlix/sources/__init__.py @@ -4,6 +4,7 @@ from .source import Source from .ereolen import Ereolen from .flipp import Flipp from .mangaplus import MangaPlus +from .marvel import Marvel from .royal_road import RoyalRoad from .saxo import Saxo from .webtoons import Webtoons @@ -54,6 +55,7 @@ def get_source_classes() -> list[type[Source]]: Ereolen, Flipp, MangaPlus, + Marvel, RoyalRoad, Saxo, Webtoons diff --git a/grawlix/sources/marvel.py b/grawlix/sources/marvel.py index a2d8779..d42910f 100644 --- a/grawlix/sources/marvel.py +++ b/grawlix/sources/marvel.py @@ -1,14 +1,18 @@ from grawlix.book import Book, Metadata, ImageList, OnlineFile, Series, Result -from grawlix.exceptions import InvalidUrl +from grawlix.exceptions import InvalidUrl, DataNotFound from .source import Source +import re + # Personal marvel ip key API_KEY = "83ac0da31d3f6801f2c73c7e07ad76e8" class Marvel(Source[str]): name: str = "Marvel" match = [ + r"https://www.marvel.com/comics/issue/\d+/.+", + r"https://read.marvel.com/#/book/\d+", r"https://www.marvel.com/comics/series/\d+/.+" ] _authentication_methods: list[str] = [ "cookies" ] @@ -17,6 +21,12 @@ class Marvel(Source[str]): async def download(self, url: str) -> Result[str]: match_index = self.get_match_index(url) if match_index == 0: + issue_id = await self._get_issue_id(url) + return await self.download_book_from_id(issue_id) + if match_index == 1: + issue_id = url.split("/")[-1] + return await self.download_book_from_id(issue_id) + if match_index == 2: return await self._download_series(url) raise InvalidUrl @@ -44,10 +54,10 @@ class Marvel(Source[str]): :param series_id: Id of comic series on marvel.com :returns: List of comic ids for marvel comics """ - response = self._client.get( + response = await self._client.get( f"https://api.marvel.com/browse/comics?byType=comic_series&isDigital=1&limit=10000&byId={series_id}", - ).json() - issue_ids = [issue["digital_id"] for issue in response["data"]["results"]] + ) + issue_ids = [issue["digital_id"] for issue in response.json()["data"]["results"]] return issue_ids @@ -66,6 +76,20 @@ class Marvel(Source[str]): ) return response.json() + async def _get_issue_id(self, url: str) -> str: + """ + Download issue id from url + + :param url: Url to issue info page + :return: Issue id + """ + response = await self._client.get(url) + search = re.search(r"digital_comic_id: \"(\d+)\"", response.text) + if not search: + raise DataNotFound + return search.group(1) + + async def download_book_from_id(self, issue_id: str) -> Book: return Book(