1
1
import logging
2
2
import random
3
- import re
4
3
import time
5
4
from typing import TYPE_CHECKING
6
5
15
14
from .constants import (
16
15
ANIMEPAHE_BASE ,
17
16
ANIMEPAHE_ENDPOINT ,
17
+ JUICY_STREAM_REGEX ,
18
18
REQUEST_HEADERS ,
19
19
SERVER_HEADERS ,
20
20
)
21
21
from .extractors import process_animepahe_embed_page
22
22
23
23
if TYPE_CHECKING :
24
24
from .types import AnimePaheAnimePage , AnimePaheSearchPage , AnimePaheSearchResult
25
- JUICY_STREAM_REGEX = re .compile (r"source='(.*)';" )
26
- logger = logging .getLogger (__name__ )
27
25
28
- KWIK_RE = re . compile ( r"Player\|(.+?)'" )
26
+ logger = logging . getLogger ( __name__ )
29
27
30
28
31
29
class AnimePahe (AnimeProvider ):
@@ -35,9 +33,8 @@ class AnimePahe(AnimeProvider):
35
33
36
34
@debug_provider
37
35
def search_for_anime (self , search_keywords : str , * args , ** kwargs ):
38
- url = f"{ ANIMEPAHE_ENDPOINT } m=search&q={ search_keywords } "
39
36
response = self .session .get (
40
- url ,
37
+ ANIMEPAHE_ENDPOINT , params = { "m" : "search" , "q" : search_keywords }
41
38
)
42
39
response .raise_for_status ()
43
40
data : "AnimePaheSearchPage" = response .json ()
@@ -76,12 +73,10 @@ def _pages_loader(
76
73
self ,
77
74
data ,
78
75
session_id ,
79
- url ,
76
+ params ,
80
77
page ,
81
78
):
82
- response = self .session .get (
83
- url ,
84
- )
79
+ response = self .session .get (ANIMEPAHE_ENDPOINT , params = params )
85
80
response .raise_for_status ()
86
81
if not data :
87
82
data .update (response .json ())
@@ -102,12 +97,16 @@ def _pages_loader(
102
97
)
103
98
)
104
99
page += 1
105
- url = f"{ ANIMEPAHE_ENDPOINT } m=release&id={ session_id } &sort=episode_asc&page={ page } "
106
100
self ._pages_loader (
107
101
data ,
108
102
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 ,
111
110
)
112
111
return data
113
112
@@ -118,13 +117,16 @@ def get_anime(self, session_id: str, *args):
118
117
anime_result : "AnimePaheSearchResult" = d
119
118
data : "AnimePaheAnimePage" = {} # pyright:ignore
120
119
121
- url = f"{ ANIMEPAHE_ENDPOINT } m=release&id={ session_id } &sort=episode_asc&page={ page } "
122
-
123
120
data = self ._pages_loader (
124
121
data ,
125
122
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 ,
128
130
)
129
131
130
132
if not data :
@@ -159,42 +161,52 @@ def get_anime(self, session_id: str, *args):
159
161
}
160
162
161
163
@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
+ }
172
209
)
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
- )
198
210
return streams
199
211
200
212
@debug_provider
@@ -239,19 +251,10 @@ def get_episode_streams(
239
251
# data-audio
240
252
# data-resolution
241
253
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
255
258
256
259
257
260
if __name__ == "__main__" :
0 commit comments