diff options
| author | Bobby <[email protected]> | 2024-10-06 04:35:22 -0400 |
|---|---|---|
| committer | Bobby <[email protected]> | 2024-10-06 04:35:22 -0400 |
| commit | 76603a192c9370a171069d9b1644da3d533dfdf3 (patch) | |
| tree | d202e77de6e13e83b17824b1d1950344946330e4 /read | |
| parent | 9d9d7db0a40849f56ca7903f79157301dc68f937 (diff) | |
| download | yugen-76603a192c9370a171069d9b1644da3d533dfdf3.tar.xz yugen-76603a192c9370a171069d9b1644da3d533dfdf3.zip | |
Experimental Manga Reading interface
Diffstat (limited to 'read')
| -rw-r--r-- | read/urls.py | 9 | ||||
| -rw-r--r-- | read/utils.py | 80 | ||||
| -rw-r--r-- | read/views.py | 17 |
3 files changed, 90 insertions, 16 deletions
diff --git a/read/urls.py b/read/urls.py new file mode 100644 index 0000000..2f1f3a4 --- /dev/null +++ b/read/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from . import views + +app_name = "read" +urlpatterns = [ + path('', views.index, name='index'), + path('/<str:manga_encoded_string>', views.read, name='read'), +] diff --git a/read/utils.py b/read/utils.py index af683bb..b179b33 100644 --- a/read/utils.py +++ b/read/utils.py @@ -1,32 +1,72 @@ +import base64 import json import os import requests from watch.utils import get_from_redis_cache, store_in_redis_cache +def encode_chapter_info(provider, chapter_id): + data = json.dumps({"p": provider, "id": chapter_id}) + return base64.urlsafe_b64encode(data.encode()).rstrip(b'=').decode() + +def decode_chapter_info(encoded_info): + padding = 4 - (len(encoded_info) % 4) + encoded_info += "=" * padding + data = json.loads(base64.urlsafe_b64decode(encoded_info).decode()) + return data["p"], data["id"] + +def process_mangareader_chapters(manga_data): + manga_data["chapters"] = list(filter(lambda x: "/en/" in x["id"], manga_data["chapters"])) + for chapter in manga_data["chapters"]: + chapter["encoded_id"] = encode_chapter_info("mangareader", chapter["id"]) + return manga_data + +def process_generic_chapters(manga_data): + for chapter in manga_data["chapters"]: + chapter["encoded_id"] = encode_chapter_info("generic", chapter["id"]) + return manga_data + +def get_data_from_managareader(manga_id): + base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist-manga/info/{manga_id}?provider=mangareader" + print(f"Trying URL: {base_url}") + response = requests.get(base_url, timeout=10) + manga_data = response.json() + + if "message" in manga_data: + return None + else: + manga_data = process_mangareader_chapters(manga_data) + + return manga_data + +def get_data_from_generic(manga_id): + base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist-manga/info/{manga_id}" + print(f"Trying URL: {base_url}") + response = requests.get(base_url, timeout=10) + manga_data = response.json() + + if "message" in manga_data: + return None + else: + manga_data = process_generic_chapters(manga_data) + + return manga_data def get_manga_data(manga_id): print(f"Fetching manga data: ID={manga_id}") cache_key = f"manga_{manga_id}_manga_data" manga_data = get_from_redis_cache(cache_key) + generic_only_ids = [30013] + provider = "generic" if manga_id in generic_only_ids else "mangareader" if not manga_data: - base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist-manga/info/{manga_id}?provider=mangareader" - print(f"Trying URL: {base_url}") - response = requests.get(base_url, timeout=10) - manga_data = response.json() - - if "message" in manga_data: - base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist-manga/info/{manga_id}" - print(f"Trying URL: {base_url}") - response = requests.get(base_url, timeout=10) - manga_data = response.json() - - if "message" in manga_data: - return None - else: - manga_data["chapters"] = list(filter(lambda x: "/en/" in x["id"], manga_data["chapters"])) + manga_data = None + if provider == "mangareader": + manga_data = get_data_from_managareader(manga_id) + + if not manga_data or provider == "generic": + manga_data = get_data_from_generic(manga_id) if "status" in manga_data and manga_data["status"] == "Completed": store_in_redis_cache(cache_key, json.dumps(manga_data), 3600 * 24 * 30) @@ -36,3 +76,13 @@ def get_manga_data(manga_id): manga_data = json.loads(manga_data) return manga_data + +def get_chapter_pages(provider, chapter_id): + base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist-manga/read?chapterId={chapter_id}" + if provider == "mangareader": + base_url += "&provider=mangareader" + print(f"Trying URL: {base_url}") + + response = requests.get(base_url, timeout=10) + return response.json() if response.status_code == 200 else None + diff --git a/read/views.py b/read/views.py index 91ea44a..77be1ed 100644 --- a/read/views.py +++ b/read/views.py @@ -1,3 +1,18 @@ -from django.shortcuts import render +from django.shortcuts import redirect, render + +from read.utils import decode_chapter_info, get_chapter_pages # Create your views here. +def index(request): + return redirect("home:index") + +def read(request, manga_encoded_string): + provider, chapter_id = decode_chapter_info(manga_encoded_string) + print(f"Reading: {provider} - {chapter_id}") + pages = get_chapter_pages(provider, chapter_id) + + context = { + "pages": pages, + } + + return render(request, "read/read.html", context) |
