aboutsummaryrefslogtreecommitdiff
path: root/read
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-10-06 04:35:22 -0400
committerBobby <[email protected]>2024-10-06 04:35:22 -0400
commit76603a192c9370a171069d9b1644da3d533dfdf3 (patch)
treed202e77de6e13e83b17824b1d1950344946330e4 /read
parent9d9d7db0a40849f56ca7903f79157301dc68f937 (diff)
downloadyugen-76603a192c9370a171069d9b1644da3d533dfdf3.tar.xz
yugen-76603a192c9370a171069d9b1644da3d533dfdf3.zip
Experimental Manga Reading interface
Diffstat (limited to 'read')
-rw-r--r--read/urls.py9
-rw-r--r--read/utils.py80
-rw-r--r--read/views.py17
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)