aboutsummaryrefslogtreecommitdiff
path: root/read/utils.py
blob: 7abb8a5b03c1bc96c7e320d439569f25307fb4c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import json
import os
import requests
from functools import lru_cache
from watch.utils import get_from_redis_cache, store_in_redis_cache

@lru_cache(maxsize=128)
def get_manga_info(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_title = manga_data["title"]["english"]
        if not manga_title:
            manga_title = manga_data["title"]["romaji"]
        mangadex_id = fetch_mangadex_id(manga_title)
        print(f"Mangadex ID: {mangadex_id}")
        if mangadex_id:
            manga_data["mangadex_id"] = mangadex_id
            manga_data["chapters"] = fetch_mangadex_chapters(mangadex_id)
        else:
            manga_data["mangadex_id"] = None
    
    return manga_data

@lru_cache(maxsize=128)
def fetch_mangadex_id(title):
    url = "https://api.mangadex.org/manga"
    params = {
        "title": title,
        "limit": 1,
        "order[relevance]": "desc",
        "includes[]": ["cover_art"],
        "contentRating[]": ["safe", "suggestive", "erotica", "pornographic"],
        "hasAvailableChapters": "true"
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        if data["data"]:
            return data["data"][0]["id"]
    print(response.json())
    return None

@lru_cache(maxsize=128)
def fetch_mangadex_chapters(mangadex_id):
    url = f"https://api.mangadex.org/manga/{mangadex_id}/feed"
    params = {
        "translatedLanguage[]": ["en"],
        "order[chapter]": "asc",
        "limit": 500,
        "offset": 0
    }
    all_chapters = []
    total = float('inf')

    while len(all_chapters) < total:
        response = requests.get(url, params=params)
        if response.status_code != 200:
            print(f"Error fetching chapters: {response.status_code}")
            print(response.json())
            return None

        data = response.json()
        total = data['total']
        all_chapters.extend(data['data'])
        params['offset'] += params['limit']

        if len(data['data']) < params['limit']:
            break

    filtered_chapters = []
    seen_chapters = set()

    for chapter in all_chapters:
        if chapter["type"] == "chapter":
            attributes = chapter["attributes"]
            chapter_number = attributes.get("chapter")
            pages = attributes.get("pages", 0)

            if pages == 0:
                continue

            seen_chapters.add(chapter_number)
            filtered_chapters.append(chapter)

    return filtered_chapters

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)

    if not manga_data:
        manga_data = get_manga_info(manga_id)
        
        if manga_data and "status" in manga_data and manga_data["status"] == "Completed":
            store_in_redis_cache(cache_key, json.dumps(manga_data), 3600 * 24 * 30)
        elif manga_data:
            store_in_redis_cache(cache_key, json.dumps(manga_data), 3600 * 24)
    else:
        manga_data = json.loads(manga_data)

    return manga_data

@lru_cache(maxsize=128)
def get_chapter_pages(chapter_id):
    url = f"https://api.mangadex.org/at-home/server/{chapter_id}"
    response = requests.get(url)
    if response.status_code != 200:
        print(f"Failed to fetch data for chapter {chapter_id}")
        return None

    chapter_data = response.json()
    base_url = chapter_data['baseUrl']
    chapter_hash = chapter_data['chapter']['hash']
    data = chapter_data['chapter']['data']

    return [{"page": i + 1, "img": f"{base_url}/data/{chapter_hash}/{page}"} for i, page in enumerate(data)]