Skip to content

Commit 30fa985

Browse files
committed
feat(animepahe): refactor API calls to use query parameters and improve stream retrieval logic
1 parent 000bae9 commit 30fa985

File tree

2 files changed

+73
-66
lines changed

2 files changed

+73
-66
lines changed

fastanime/libs/anime_provider/animepahe/api.py

Lines changed: 68 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import logging
22
import random
3-
import re
43
import time
54
from typing import TYPE_CHECKING
65

@@ -15,17 +14,16 @@
1514
from .constants import (
1615
ANIMEPAHE_BASE,
1716
ANIMEPAHE_ENDPOINT,
17+
JUICY_STREAM_REGEX,
1818
REQUEST_HEADERS,
1919
SERVER_HEADERS,
2020
)
2121
from .extractors import process_animepahe_embed_page
2222

2323
if TYPE_CHECKING:
2424
from .types import AnimePaheAnimePage, AnimePaheSearchPage, AnimePaheSearchResult
25-
JUICY_STREAM_REGEX = re.compile(r"source='(.*)';")
26-
logger = logging.getLogger(__name__)
2725

28-
KWIK_RE = re.compile(r"Player\|(.+?)'")
26+
logger = logging.getLogger(__name__)
2927

3028

3129
class AnimePahe(AnimeProvider):
@@ -35,9 +33,8 @@ class AnimePahe(AnimeProvider):
3533

3634
@debug_provider
3735
def search_for_anime(self, search_keywords: str, *args, **kwargs):
38-
url = f"{ANIMEPAHE_ENDPOINT}m=search&q={search_keywords}"
3936
response = self.session.get(
40-
url,
37+
ANIMEPAHE_ENDPOINT, params={"m": "search", "q": search_keywords}
4138
)
4239
response.raise_for_status()
4340
data: "AnimePaheSearchPage" = response.json()
@@ -76,12 +73,10 @@ def _pages_loader(
7673
self,
7774
data,
7875
session_id,
79-
url,
76+
params,
8077
page,
8178
):
82-
response = self.session.get(
83-
url,
84-
)
79+
response = self.session.get(ANIMEPAHE_ENDPOINT, params=params)
8580
response.raise_for_status()
8681
if not data:
8782
data.update(response.json())
@@ -102,12 +97,16 @@ def _pages_loader(
10297
)
10398
)
10499
page += 1
105-
url = f"{ANIMEPAHE_ENDPOINT}m=release&id={session_id}&sort=episode_asc&page={page}"
106100
self._pages_loader(
107101
data,
108102
session_id,
109-
url,
110-
page,
103+
params={
104+
"m": "release",
105+
"page": page,
106+
"id": session_id,
107+
"sort": "episode_asc",
108+
},
109+
page=page,
111110
)
112111
return data
113112

@@ -118,13 +117,16 @@ def get_anime(self, session_id: str, *args):
118117
anime_result: "AnimePaheSearchResult" = d
119118
data: "AnimePaheAnimePage" = {} # pyright:ignore
120119

121-
url = f"{ANIMEPAHE_ENDPOINT}m=release&id={session_id}&sort=episode_asc&page={page}"
122-
123120
data = self._pages_loader(
124121
data,
125122
session_id,
126-
url,
127-
page,
123+
params={
124+
"m": "release",
125+
"id": session_id,
126+
"sort": "episode_asc",
127+
"page": page,
128+
},
129+
page=page,
128130
)
129131

130132
if not data:
@@ -159,42 +161,52 @@ def get_anime(self, session_id: str, *args):
159161
}
160162

161163
@debug_provider
162-
def _get_streams(self, res_dict, streams, translation_type):
163-
embed_url = res_dict["data-src"]
164-
data_audio = "dub" if res_dict["data-audio"] == "eng" else "sub"
165-
# filter streams by translation_type
166-
if data_audio != translation_type:
167-
return
168-
169-
if not embed_url:
170-
logger.warning(
171-
"[ANIMEPAHE-WARN]: embed url not found please report to the developers"
164+
def _get_server(self, episode, res_dicts, anime_title, translation_type):
165+
# get all links
166+
streams = {
167+
"server": "kwik",
168+
"links": [],
169+
"episode_title": f"{episode['title'] or anime_title}; Episode {episode['episode']}",
170+
"subtitles": [],
171+
"headers": {},
172+
}
173+
for res_dict in res_dicts:
174+
# get embed url
175+
embed_url = res_dict["data-src"]
176+
data_audio = "dub" if res_dict["data-audio"] == "eng" else "sub"
177+
# filter streams by translation_type
178+
if data_audio != translation_type:
179+
continue
180+
181+
if not embed_url:
182+
logger.warning(
183+
"[ANIMEPAHE-WARN]: embed url not found please report to the developers"
184+
)
185+
continue
186+
# get embed page
187+
embed_response = self.session.get(
188+
embed_url, headers={"User-Agent": self.USER_AGENT, **SERVER_HEADERS}
189+
)
190+
embed_response.raise_for_status()
191+
embed_page = embed_response.text
192+
193+
decoded_js = process_animepahe_embed_page(embed_page)
194+
if not decoded_js:
195+
logger.error("[ANIMEPAHE-ERROR]: failed to decode embed page")
196+
continue
197+
juicy_stream = JUICY_STREAM_REGEX.search(decoded_js)
198+
if not juicy_stream:
199+
logger.error("[ANIMEPAHE-ERROR]: failed to find juicy stream")
200+
continue
201+
juicy_stream = juicy_stream.group(1)
202+
# add the link
203+
streams["links"].append(
204+
{
205+
"quality": res_dict["data-resolution"],
206+
"translation_type": data_audio,
207+
"link": juicy_stream,
208+
}
172209
)
173-
return
174-
# get embed page
175-
embed_response = self.session.get(
176-
embed_url, headers={"User-Agent": self.USER_AGENT, **SERVER_HEADERS}
177-
)
178-
embed_response.raise_for_status()
179-
embed_page = embed_response.text
180-
181-
decoded_js = process_animepahe_embed_page(embed_page)
182-
if not decoded_js:
183-
logger.error("[ANIMEPAHE-ERROR]: failed to decode embed page")
184-
return
185-
juicy_stream = JUICY_STREAM_REGEX.search(decoded_js)
186-
if not juicy_stream:
187-
logger.error("[ANIMEPAHE-ERROR]: failed to find juicy stream")
188-
return
189-
juicy_stream = juicy_stream.group(1)
190-
# add the link
191-
streams["links"].append(
192-
{
193-
"quality": res_dict["data-resolution"],
194-
"translation_type": data_audio,
195-
"link": juicy_stream,
196-
}
197-
)
198210
return streams
199211

200212
@debug_provider
@@ -239,19 +251,10 @@ def get_episode_streams(
239251
# data-audio
240252
# data-resolution
241253
res_dicts = [extract_attributes(item) for item in resolutionMenuItems]
242-
243-
# get all links
244-
streams = {
245-
"server": "kwik",
246-
"links": [],
247-
"episode_title": f"{episode['title'] or anime_title}; Episode {episode['episode']}",
248-
"subtitles": [],
249-
"headers": {},
250-
}
251-
for res_dict in res_dicts:
252-
# get embed url
253-
if _streams := self._get_streams(res_dict, streams, translation_type):
254-
yield _streams
254+
if _server := self._get_server(
255+
episode, res_dicts, anime_title, translation_type
256+
):
257+
yield _server
255258

256259

257260
if __name__ == "__main__":

fastanime/libs/anime_provider/animepahe/constants.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import re
2+
13
ANIMEPAHE = "animepahe.ru"
24
ANIMEPAHE_BASE = f"https://{ANIMEPAHE}"
3-
ANIMEPAHE_ENDPOINT = f"{ANIMEPAHE_BASE}/api?"
5+
ANIMEPAHE_ENDPOINT = f"{ANIMEPAHE_BASE}/api"
46

57
SERVERS_AVAILABLE = ["kwik"]
68
REQUEST_HEADERS = {
@@ -31,3 +33,5 @@
3133
"Priority": "u=4",
3234
"TE": "trailers",
3335
}
36+
JUICY_STREAM_REGEX = re.compile(r"source='(.*)';")
37+
KWIK_RE = re.compile(r"Player\|(.+?)'")

0 commit comments

Comments
 (0)