diff options
| author | Bobby <[email protected]> | 2024-09-03 12:20:35 -0400 |
|---|---|---|
| committer | Bobby <[email protected]> | 2024-09-03 12:20:35 -0400 |
| commit | 51a27b6f400625cb0137e1394de1056ea5fb682b (patch) | |
| tree | 593b782d99784c690705eb397831a9a681d406a3 /detail | |
| parent | a9e71a492486a25ec4273716080e0ca744a36646 (diff) | |
| download | yugen-51a27b6f400625cb0137e1394de1056ea5fb682b.tar.xz yugen-51a27b6f400625cb0137e1394de1056ea5fb682b.zip | |
optimizations
Diffstat (limited to 'detail')
| -rw-r--r-- | detail/views.py | 89 |
1 files changed, 61 insertions, 28 deletions
diff --git a/detail/views.py b/detail/views.py index 9f7c280..4b247e6 100644 --- a/detail/views.py +++ b/detail/views.py @@ -2,41 +2,74 @@ import json import os from django.shortcuts import render import requests - +from functools import lru_cache from watch.utils import get_all_episode_metadata, get_from_redis_cache, store_in_redis_cache def detail(request, anime_id): - anime_data = None - anime_episodes = None - anime_episodes_metadata = None - try: - anime_data = json.loads(get_from_redis_cache(f"anime_{anime_id}_anime_data")) - except: - base_url = f"{os.getenv("CONSUMET_URL")}/meta/anilist/info/{anime_id}?provider=zoro" - response = requests.get(base_url) - anime_data = response.json() - store_in_redis_cache(f"anime_{anime_id}_anime_data", json.dumps(anime_data)) - - try: - anime_episodes = json.loads(get_from_redis_cache(f"anime_{anime_id}_anime_episodes")) - except: - z_anime_id = anime_data["episodes"][0]["id"].split("$")[0] if len(anime_data["episodes"]) > 0 else None - if z_anime_id is not None: - base_url = f"{os.getenv("ZORO_URL")}/anime/episodes/{z_anime_id}" - response = requests.get(base_url) - anime_episodes = response.json() - store_in_redis_cache(f"anime_{anime_id}_anime_episodes", json.dumps(anime_episodes)) + anime_data = get_anime_data(anime_id) + if not anime_data: + return render(request, "detail/error.html", {"error": "Anime not found"}, status=404) - if anime_episodes is not None: - anime_episodes_metadata = get_all_episode_metadata(anime_data) - # attach metadata to episodes - if anime_episodes_metadata: - for i, episode in enumerate(anime_episodes["episodes"]): - episode["metadata"] = anime_episodes_metadata[i] + anime_episodes = get_anime_episodes(anime_id) + + if anime_episodes: + attach_episode_metadata(anime_data, anime_episodes) context = { "anime": anime_data, "episodes": anime_episodes, } - return render(request, "detail/detail.html", context)
\ No newline at end of file + return render(request, "detail/detail.html", context) + +@lru_cache(maxsize=100) +def get_anime_data(anime_id): + cache_key = f"anime_{anime_id}_anime_data" + anime_data = get_from_redis_cache(cache_key) + + if not anime_data: + base_url = f"{os.getenv('CONSUMET_URL')}/meta/anilist/info/{anime_id}?provider=zoro" + try: + response = requests.get(base_url, timeout=10) + response.raise_for_status() + anime_data = response.json() + store_in_redis_cache(cache_key, json.dumps(anime_data), 86400) # Cache for 24 hours + except requests.RequestException as e: + print(f"Error fetching anime data for ID {anime_id}: {e}") + return None + else: + anime_data = json.loads(anime_data) + + return anime_data + +@lru_cache(maxsize=100) +def get_anime_episodes(anime_id): + cache_key = f"anime_{anime_id}_anime_episodes" + anime_episodes = get_from_redis_cache(cache_key) + + if not anime_episodes: + anime_data = get_anime_data(anime_id) + if not anime_data or not anime_data.get("episodes"): + return None + + z_anime_id = anime_data["episodes"][0]["id"].split("$")[0] + base_url = f"{os.getenv('ZORO_URL')}/anime/episodes/{z_anime_id}" + try: + response = requests.get(base_url, timeout=10) + response.raise_for_status() + anime_episodes = response.json() + store_in_redis_cache(cache_key, json.dumps(anime_episodes), 86400) # Cache for 24 hours + except requests.RequestException as e: + print(f"Error fetching anime episodes for ID {anime_id}: {e}") + return None + else: + anime_episodes = json.loads(anime_episodes) + + return anime_episodes + +def attach_episode_metadata(anime_data, anime_episodes): + anime_episodes_metadata = get_all_episode_metadata(anime_data) + if anime_episodes_metadata: + for i, episode in enumerate(anime_episodes.get("episodes", [])): + if i < len(anime_episodes_metadata): + episode["metadata"] = anime_episodes_metadata[i]
\ No newline at end of file |
