aboutsummaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-12-21 13:22:03 -0500
committerBobby <[email protected]>2024-12-21 13:22:03 -0500
commit96f26bf37e72dd64fff10708fffe168a6ee10e18 (patch)
tree7465824b569b0e124eb4e095d3171da68ad90865 /apps
parentb453706835fcb5fe960375c7101074f3bb9c1c7a (diff)
downloadthatcomputerscientist-96f26bf37e72dd64fff10708fffe168a6ee10e18.tar.xz
thatcomputerscientist-96f26bf37e72dd64fff10708fffe168a6ee10e18.zip
proteccc stream
Diffstat (limited to 'apps')
-rw-r--r--apps/anime/views.py153
1 files changed, 71 insertions, 82 deletions
diff --git a/apps/anime/views.py b/apps/anime/views.py
index 6b976391..c8a15b92 100644
--- a/apps/anime/views.py
+++ b/apps/anime/views.py
@@ -2,7 +2,9 @@ import os
from django.urls import reverse
import requests
from django.shortcuts import redirect, render
-
+from django.views.decorators.cache import cache_page
+from functools import wraps
+from django.core.cache import cache
from thatcomputerscientist.utils import i18npatterns
genres = [
@@ -37,30 +39,29 @@ sortings = [
]
ANIME_PROVIDER_MAP = {}
+CONSUMET_BASE_URL = os.getenv("CONSUMET_URL")
def get_anime(anime_id, dub=False):
- if anime_id in ANIME_PROVIDER_MAP:
- provider = ANIME_PROVIDER_MAP[anime_id]
- else:
- provider = "zoro"
-
- dub = "true" if dub else "false"
- base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist/info/{anime_id}"
- params = {"provider": provider, "dub": dub}
+ provider = ANIME_PROVIDER_MAP.get(anime_id, "zoro")
+ params = {"dub": "true"} if dub else {}
+ params.update({"provider": provider} if provider == "zoro" else {})
- response = requests.get(base_url, params=params)
+ response = requests.get(
+ f"{CONSUMET_BASE_URL}/meta/anilist/info/{anime_id}", params=params
+ )
data = response.json()
+
if (
- (not data.get("episodes") or len(data.get("episodes")) == 0)
+ not data.get("episodes")
and provider == "zoro"
and data.get("status") != "Not yet aired"
):
ANIME_PROVIDER_MAP[anime_id] = "gogoanime"
- return get_anime(anime_id)
- else:
- ANIME_PROVIDER_MAP[anime_id] = provider
- return data
+ return get_anime(anime_id, dub)
+
+ ANIME_PROVIDER_MAP[anime_id] = provider
+ return data
def sort_mapper(sort_by, order):
@@ -77,14 +78,7 @@ def sort_mapper(sort_by, order):
if sort_by not in sort_mappings or order not in ["asc", "desc"]:
return None
- sort_value = sort_mappings[sort_by]
- order_suffix = "" if order == "asc" else "_DESC"
-
- return f"{sort_value}{order_suffix}"
-
-
-def bracketed_string(string):
- return f'["{string}"]'
+ return f"{sort_mappings[sort_by]}{'_DESC' if order == 'desc' else ''}"
def anime_results(
@@ -97,37 +91,46 @@ def anime_results(
"finished",
"hiatus",
]
+ params = {
+ "page": page,
+ "perPage": per_page,
+ "type": "ANIME",
+ **({"query": query} if query else {}),
+ **({"sort": f'["{sort_mapper(sort, order)}"]'} if sort and order else {}),
+ **({"genres": f'["{genre}"]'} if genre else {}),
+ **({"status": status.upper()} if status in supported_status else {}),
+ }
- if status and status not in supported_status:
- status = ""
+ response = requests.get(
+ f"{CONSUMET_BASE_URL}/meta/anilist/advanced-search", params=params
+ )
+ return response.json()
- base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist/advanced-search"
- params = {"page": page, "perPage": per_page, "type": "ANIME"}
- if query:
- params["query"] = query
+def cache_anime_page(timeout=60 * 15):
+ def decorator(view_func):
+ @wraps(view_func)
+ def _wrapped_view(request, anime_id, e=None, *args, **kwargs):
+ cache_key = f"anime_page:{anime_id}:ep{e}:dub{request.COOKIES.get('anime_dub', False)}"
+ cached_response = cache.get(cache_key)
- if sort and order:
- sort_value = sort_mapper(sort, order)
- if sort_value:
- params["sort"] = bracketed_string(sort_value)
+ if cached_response:
+ return cached_response
- if genre:
- params["genres"] = bracketed_string(genre)
+ response = view_func(request, anime_id, e, *args, **kwargs)
+ if response.status_code == 200:
+ cache.set(cache_key, response, timeout)
+ return response
- if status:
- params["status"] = status.upper()
+ return _wrapped_view
- response = requests.get(base_url, params=params)
- return response.json()
+ return decorator
+@cache_page(60 * 15)
def home(request):
- META = {
- "title": "Anime: Home",
- }
LANGUAGE_CODE = i18npatterns(request.LANGUAGE_CODE)
- request.meta.update(META)
+ request.meta.update({"title": "Anime: Home"})
context = {
"genres": genres,
@@ -139,72 +142,58 @@ def home(request):
sort="popularity", status="releasing", per_page=8
),
}
-
return render(request, f"{LANGUAGE_CODE}/anime/home.html", context)
def search(request):
- # Get search parameters
query = request.GET.get("q", "")
- genre = request.GET.get("genre", "")
- sort = request.GET.get("sort", "popularity")
- order = request.GET.get("order", "desc")
- page = int(request.GET.get("page", 1))
-
- META = {
- "title": f"Anime: Search",
- }
- if query:
- META["title"] = f"Anime: Search Results for {query}"
LANGUAGE_CODE = i18npatterns(request.LANGUAGE_CODE)
- request.meta.update(META)
+ request.meta.update(
+ {"title": f"Anime: Search Results for {query}" if query else "Anime: Search"}
+ )
- # Get search results
search_results = anime_results(
- query=query, genre=genre, sort=sort, order=order, page=page, per_page=32
+ query=query,
+ genre=request.GET.get("genre", ""),
+ sort=request.GET.get("sort", "popularity"),
+ order=request.GET.get("order", "desc"),
+ page=int(request.GET.get("page", 1)),
+ per_page=32,
)
context = {
"genres": genres,
"sortings": sortings,
"search_results": search_results,
- "current_page": page,
+ "current_page": int(request.GET.get("page", 1)),
"total_pages": search_results.get("totalPages", 1),
"total_results": search_results.get("totalResults", 0),
}
-
return render(request, f"{LANGUAGE_CODE}/anime/search.html", context)
+@cache_anime_page(timeout=60 * 15)
def anime(request, anime_id, e=None):
- dub = request.COOKIES.get("anime_dub", False)
- anime_data = get_anime(anime_id, dub)
-
- if len(anime_data.get("episodes")) > 0:
- episode_numbers = [
- int(episode.get("number")) for episode in anime_data.get("episodes")
- ]
+ anime_data = get_anime(anime_id, request.COOKIES.get("anime_dub", False))
+ episode_numbers = [
+ int(episode.get("number")) for episode in anime_data.get("episodes", [])
+ ]
+ if episode_numbers:
if not e:
- e = episode_numbers[0]
return redirect(
- reverse("anime:anime", kwargs={"anime_id": anime_id, "e": e})
+ reverse(
+ "anime:anime",
+ kwargs={"anime_id": anime_id, "e": episode_numbers[0]},
+ )
)
-
- e = int(e)
- if e not in episode_numbers:
+ if int(e) not in episode_numbers:
return redirect(
reverse("anime:anime", kwargs={"anime_id": anime_id, "e": 1})
)
- META = {
- "title": f"Anime: {anime_data.get('title').get('romaji')}",
- }
LANGUAGE_CODE = i18npatterns(request.LANGUAGE_CODE)
- request.meta.update(META)
-
- context = {
- "anime": anime_data,
- }
-
- return render(request, f"{LANGUAGE_CODE}/anime/anime.html", context)
+ request.meta.update(
+ {"title": f"Anime: {anime_data.get('title', {}).get('romaji')}"}
+ )
+ return render(request, f"{LANGUAGE_CODE}/anime/anime.html", {"anime": anime_data})