KekikStream 1.7.3__py3-none-any.whl → 1.7.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. KekikStream/Core/Extractor/ExtractorBase.py +23 -6
  2. KekikStream/Core/Plugin/PluginBase.py +29 -8
  3. KekikStream/Extractors/CloseLoad.py +2 -2
  4. KekikStream/Extractors/ContentX.py +4 -4
  5. KekikStream/Extractors/DzenRu.py +2 -2
  6. KekikStream/Extractors/ExPlay.py +2 -2
  7. KekikStream/Extractors/FirePlayer.py +1 -1
  8. KekikStream/Extractors/HDPlayerSystem.py +1 -1
  9. KekikStream/Extractors/JetTv.py +4 -5
  10. KekikStream/Extractors/MailRu.py +2 -2
  11. KekikStream/Extractors/MixPlayHD.py +2 -2
  12. KekikStream/Extractors/MixTiger.py +1 -1
  13. KekikStream/Extractors/Odnoklassniki.py +2 -2
  14. KekikStream/Extractors/PeaceMakerst.py +4 -4
  15. KekikStream/Extractors/PixelDrain.py +1 -1
  16. KekikStream/Extractors/PlayerFilmIzle.py +6 -7
  17. KekikStream/Extractors/RapidVid.py +2 -2
  18. KekikStream/Extractors/SetPlay.py +2 -2
  19. KekikStream/Extractors/SetPrime.py +1 -1
  20. KekikStream/Extractors/SibNet.py +2 -2
  21. KekikStream/Extractors/Sobreatsesuyp.py +4 -4
  22. KekikStream/Extractors/TRsTX.py +4 -4
  23. KekikStream/Extractors/TauVideo.py +2 -2
  24. KekikStream/Extractors/TurboImgz.py +2 -2
  25. KekikStream/Extractors/TurkeyPlayer.py +5 -6
  26. KekikStream/Extractors/VidHide.py +6 -7
  27. KekikStream/Extractors/VidMoly.py +4 -4
  28. KekikStream/Extractors/VidMoxy.py +2 -2
  29. KekikStream/Extractors/VidPapi.py +2 -2
  30. KekikStream/Extractors/VideoSeyred.py +3 -3
  31. KekikStream/Extractors/YildizKisaFilm.py +1 -1
  32. KekikStream/Plugins/DiziBox.py +15 -15
  33. KekikStream/Plugins/DiziPal.py +11 -11
  34. KekikStream/Plugins/DiziYou.py +4 -4
  35. KekikStream/Plugins/Dizilla.py +5 -5
  36. KekikStream/Plugins/FilmBip.py +4 -4
  37. KekikStream/Plugins/FilmMakinesi.py +3 -3
  38. KekikStream/Plugins/FilmModu.py +6 -6
  39. KekikStream/Plugins/FullHDFilm.py +7 -7
  40. KekikStream/Plugins/FullHDFilmizlesene.py +3 -3
  41. KekikStream/Plugins/HDFilmCehennemi.py +3 -0
  42. KekikStream/Plugins/JetFilmizle.py +6 -6
  43. KekikStream/Plugins/KultFilmler.py +6 -6
  44. KekikStream/Plugins/RecTV.py +6 -6
  45. KekikStream/Plugins/RoketDizi.py +6 -3
  46. KekikStream/Plugins/SelcukFlix.py +4 -4
  47. KekikStream/Plugins/SezonlukDizi.py +8 -8
  48. KekikStream/Plugins/SineWix.py +4 -4
  49. KekikStream/Plugins/Sinefy.py +6 -6
  50. KekikStream/Plugins/SinemaCX.py +9 -9
  51. KekikStream/Plugins/Sinezy.py +4 -4
  52. KekikStream/Plugins/SuperFilmGeldi.py +5 -5
  53. KekikStream/Plugins/UgurFilm.py +6 -6
  54. KekikStream/__init__.py +29 -16
  55. KekikStream/requirements.txt +2 -2
  56. {kekikstream-1.7.3.dist-info → kekikstream-1.7.6.dist-info}/METADATA +3 -2
  57. kekikstream-1.7.6.dist-info/RECORD +85 -0
  58. KekikStream/Extractors/VidStack.py +0 -75
  59. kekikstream-1.7.3.dist-info/RECORD +0 -86
  60. {kekikstream-1.7.3.dist-info → kekikstream-1.7.6.dist-info}/WHEEL +0 -0
  61. {kekikstream-1.7.3.dist-info → kekikstream-1.7.6.dist-info}/entry_points.txt +0 -0
  62. {kekikstream-1.7.3.dist-info → kekikstream-1.7.6.dist-info}/licenses/LICENSE +0 -0
  63. {kekikstream-1.7.3.dist-info → kekikstream-1.7.6.dist-info}/top_level.txt +0 -0
@@ -9,18 +9,18 @@ class VideoSeyred(ExtractorBase):
9
9
 
10
10
  async def extract(self, url, referer=None) -> ExtractResult:
11
11
  if referer:
12
- self.cffi.headers.update({"Referer": referer})
12
+ self.httpx.headers.update({"Referer": referer})
13
13
 
14
14
  video_id = url.split("embed/")[1].split("?")[0]
15
15
  if len(video_id) > 10:
16
- kontrol = await self.cffi.get(url)
16
+ kontrol = await self.httpx.get(url)
17
17
  kontrol.raise_for_status()
18
18
 
19
19
  video_id = re.search(r"playlist\/(.*)\.json", kontrol.text)[1]
20
20
 
21
21
  video_url = f"{self.main_url}/playlist/{video_id}.json"
22
22
 
23
- response = await self.cffi.get(video_url)
23
+ response = await self.httpx.get(video_url)
24
24
  response.raise_for_status()
25
25
 
26
26
  try:
@@ -16,7 +16,7 @@ class YildizKisaFilm(ExtractorBase):
16
16
 
17
17
  post_url = f"{self.main_url}/player/index.php?data={vid_id}&do=getVideo"
18
18
 
19
- response = await self.cffi.post(
19
+ response = await self.httpx.post(
20
20
  url = post_url,
21
21
  data = {"hash": vid_id, "r": ext_ref},
22
22
  headers = {
@@ -42,11 +42,11 @@ class DiziBox(PluginBase):
42
42
 
43
43
  #@kekik_cache(ttl=60*60)
44
44
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
45
- self.cffi.cookies.update({
45
+ self.httpx.cookies.update({
46
46
  "isTrustedUser" : "true",
47
47
  "dbxu" : str(time.time() * 1000).split(".")[0]
48
48
  })
49
- istek = await self.cffi.get(
49
+ istek = await self.httpx.get(
50
50
  url = f"{url.replace('SAYFA', str(page))}",
51
51
  allow_redirects = True
52
52
  )
@@ -64,11 +64,11 @@ class DiziBox(PluginBase):
64
64
 
65
65
  #@kekik_cache(ttl=60*60)
66
66
  async def search(self, query: str) -> list[SearchResult]:
67
- self.cffi.cookies.update({
67
+ self.httpx.cookies.update({
68
68
  "isTrustedUser" : "true",
69
69
  "dbxu" : str(time.time() * 1000).split(".")[0]
70
70
  })
71
- istek = await self.cffi.get(f"{self.main_url}/?s={query}")
71
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
72
72
  secici = Selector(istek.text)
73
73
 
74
74
  return [
@@ -82,7 +82,7 @@ class DiziBox(PluginBase):
82
82
 
83
83
  #@kekik_cache(ttl=60*60)
84
84
  async def load_item(self, url: str) -> SeriesInfo:
85
- istek = await self.cffi.get(url)
85
+ istek = await self.httpx.get(url)
86
86
  secici = Selector(istek.text)
87
87
 
88
88
  title = secici.css("div.tv-overview h1 a::text").get()
@@ -96,7 +96,7 @@ class DiziBox(PluginBase):
96
96
  episodes = []
97
97
  for sezon_link in secici.css("div#seasons-list a::attr(href)").getall():
98
98
  sezon_url = self.fix_url(sezon_link)
99
- sezon_istek = await self.cffi.get(sezon_url)
99
+ sezon_istek = await self.httpx.get(sezon_url)
100
100
  sezon_secici = Selector(sezon_istek.text)
101
101
 
102
102
  for bolum in sezon_secici.css("article.grid-box"):
@@ -131,8 +131,8 @@ class DiziBox(PluginBase):
131
131
  async def _iframe_decode(self, name:str, iframe_link:str, referer:str) -> list[str]:
132
132
  results = []
133
133
 
134
- self.cffi.headers.update({"Referer": referer})
135
- self.cffi.cookies.update({
134
+ self.httpx.headers.update({"Referer": referer})
135
+ self.httpx.cookies.update({
136
136
  "isTrustedUser" : "true",
137
137
  "dbxu" : str(time.time() * 1000).split(".")[0]
138
138
  })
@@ -140,12 +140,12 @@ class DiziBox(PluginBase):
140
140
  if "/player/king/king.php" in iframe_link:
141
141
  iframe_link = iframe_link.replace("king.php?v=", "king.php?wmode=opaque&v=")
142
142
 
143
- istek = await self.cffi.get(iframe_link)
143
+ istek = await self.httpx.get(iframe_link)
144
144
  secici = Selector(istek.text)
145
145
  iframe = secici.css("div#Player iframe::attr(src)").get()
146
146
 
147
- self.cffi.headers.update({"Referer": self.main_url})
148
- istek = await self.cffi.get(iframe)
147
+ self.httpx.headers.update({"Referer": self.main_url})
148
+ istek = await self.httpx.get(iframe)
149
149
 
150
150
  crypt_data = re.search(r"CryptoJS\.AES\.decrypt\(\"(.*)\",\"", istek.text)[1]
151
151
  crypt_pass = re.search(r"\",\"(.*)\"\);", istek.text)[1]
@@ -161,7 +161,7 @@ class DiziBox(PluginBase):
161
161
  while True:
162
162
  await asyncio.sleep(.3)
163
163
  with contextlib.suppress(Exception):
164
- istek = await self.cffi.get(iframe_link)
164
+ istek = await self.httpx.get(iframe_link)
165
165
 
166
166
  if atob_data := re.search(r"unescape\(\"(.*)\"\)", istek.text):
167
167
  decoded_atob = urllib.parse.unquote(atob_data[1])
@@ -180,7 +180,7 @@ class DiziBox(PluginBase):
180
180
 
181
181
  #@kekik_cache(ttl=15*60)
182
182
  async def load_links(self, url: str) -> list[dict]:
183
- istek = await self.cffi.get(url)
183
+ istek = await self.httpx.get(url)
184
184
  secici = Selector(istek.text)
185
185
 
186
186
  results = []
@@ -200,8 +200,8 @@ class DiziBox(PluginBase):
200
200
  if not alt_link:
201
201
  continue
202
202
 
203
- self.cffi.headers.update({"Referer": url})
204
- alt_istek = await self.cffi.get(alt_link)
203
+ self.httpx.headers.update({"Referer": url})
204
+ alt_istek = await self.httpx.get(alt_link)
205
205
  alt_istek.raise_for_status()
206
206
 
207
207
  alt_secici = Selector(alt_istek.text)
@@ -26,7 +26,7 @@ class DiziPal(PluginBase):
26
26
  }
27
27
 
28
28
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
29
- istek = await self.cffi.get(url)
29
+ istek = await self.httpx.get(url)
30
30
  secici = Selector(istek.text)
31
31
 
32
32
  results = []
@@ -67,12 +67,12 @@ class DiziPal(PluginBase):
67
67
  return results
68
68
 
69
69
  async def search(self, query: str) -> list[SearchResult]:
70
- self.cffi.headers.update({
70
+ self.httpx.headers.update({
71
71
  "Accept" : "application/json, text/javascript, */*; q=0.01",
72
72
  "X-Requested-With" : "XMLHttpRequest"
73
73
  })
74
74
 
75
- istek = await self.cffi.post(
75
+ istek = await self.httpx.post(
76
76
  url = f"{self.main_url}/api/search-autocomplete",
77
77
  data = {"query": query}
78
78
  )
@@ -106,12 +106,12 @@ class DiziPal(PluginBase):
106
106
 
107
107
  async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
108
108
  # Reset headers to get HTML response
109
- self.cffi.headers.update({
109
+ self.httpx.headers.update({
110
110
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
111
111
  })
112
- self.cffi.headers.pop("X-Requested-With", None)
112
+ self.httpx.headers.pop("X-Requested-With", None)
113
113
 
114
- istek = await self.cffi.get(url)
114
+ istek = await self.httpx.get(url)
115
115
  secici = Selector(text=istek.text, type="html")
116
116
 
117
117
  poster = self.fix_url(secici.css("meta[property='og:image']::attr(content)").get())
@@ -179,12 +179,12 @@ class DiziPal(PluginBase):
179
179
 
180
180
  async def load_links(self, url: str) -> list[dict]:
181
181
  # Reset headers to get HTML response
182
- self.cffi.headers.update({
182
+ self.httpx.headers.update({
183
183
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
184
184
  })
185
- self.cffi.headers.pop("X-Requested-With", None)
185
+ self.httpx.headers.pop("X-Requested-With", None)
186
186
 
187
- istek = await self.cffi.get(url)
187
+ istek = await self.httpx.get(url)
188
188
  secici = Selector(istek.text)
189
189
 
190
190
  iframe = secici.css(".series-player-container iframe::attr(src)").get()
@@ -196,8 +196,8 @@ class DiziPal(PluginBase):
196
196
 
197
197
  results = []
198
198
 
199
- self.cffi.headers.update({"Referer": f"{self.main_url}/"})
200
- i_istek = await self.cffi.get(iframe)
199
+ self.httpx.headers.update({"Referer": f"{self.main_url}/"})
200
+ i_istek = await self.httpx.get(iframe)
201
201
  i_text = i_istek.text
202
202
 
203
203
  # m3u link çıkar
@@ -31,7 +31,7 @@ class DiziYou(PluginBase):
31
31
 
32
32
  #@kekik_cache(ttl=60*60)
33
33
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
34
- istek = await self.cffi.get(f"{url.replace('SAYFA', str(page))}")
34
+ istek = await self.httpx.get(f"{url.replace('SAYFA', str(page))}")
35
35
  secici = Selector(istek.text)
36
36
 
37
37
  return [
@@ -46,7 +46,7 @@ class DiziYou(PluginBase):
46
46
 
47
47
  #@kekik_cache(ttl=60*60)
48
48
  async def search(self, query: str) -> list[SearchResult]:
49
- istek = await self.cffi.get(f"{self.main_url}/?s={query}")
49
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
50
50
  secici = Selector(istek.text)
51
51
 
52
52
  return [
@@ -60,7 +60,7 @@ class DiziYou(PluginBase):
60
60
 
61
61
  #@kekik_cache(ttl=60*60)
62
62
  async def load_item(self, url: str) -> SeriesInfo:
63
- istek = await self.cffi.get(url)
63
+ istek = await self.httpx.get(url)
64
64
  secici = Selector(istek.text)
65
65
 
66
66
  title = secici.css("h1::text").get().strip()
@@ -109,7 +109,7 @@ class DiziYou(PluginBase):
109
109
 
110
110
  #@kekik_cache(ttl=15*60)
111
111
  async def load_links(self, url: str) -> list[dict]:
112
- istek = await self.cffi.get(url)
112
+ istek = await self.httpx.get(url)
113
113
  secici = Selector(istek.text)
114
114
 
115
115
  item_title = secici.css("div.title h1::text").get()
@@ -26,7 +26,7 @@ class Dizilla(PluginBase):
26
26
 
27
27
  #@kekik_cache(ttl=60*60)
28
28
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
29
- istek = await self.cffi.get(url)
29
+ istek = await self.httpx.get(url)
30
30
  secici = Selector(istek.text)
31
31
 
32
32
  ana_sayfa = []
@@ -51,7 +51,7 @@ class Dizilla(PluginBase):
51
51
  ep_name = ep_name.replace(". Sezon", "x").replace(". Bölüm", "").replace("x ", "x")
52
52
  title = f"{name} - {ep_name}"
53
53
 
54
- ep_req = await self.cffi.get(self.fix_url(veri.css("::attr(href)").get()))
54
+ ep_req = await self.httpx.get(self.fix_url(veri.css("::attr(href)").get()))
55
55
  ep_secici = Selector(ep_req.text)
56
56
  href = self.fix_url(ep_secici.css("nav li:nth-of-type(3) a::attr(href)").get())
57
57
  poster = self.fix_url(ep_secici.css("img.imgt::attr(src)").get())
@@ -90,7 +90,7 @@ class Dizilla(PluginBase):
90
90
 
91
91
  #@kekik_cache(ttl=60*60)
92
92
  async def search(self, query: str) -> list[SearchResult]:
93
- arama_istek = await self.cffi.post(f"{self.main_url}/api/bg/searchcontent?searchterm={query}")
93
+ arama_istek = await self.httpx.post(f"{self.main_url}/api/bg/searchcontent?searchterm={query}")
94
94
  decrypted = await self.decrypt_response(arama_istek.json().get("response"))
95
95
  arama_veri = decrypted.get("result", [])
96
96
 
@@ -116,7 +116,7 @@ class Dizilla(PluginBase):
116
116
 
117
117
  #@kekik_cache(ttl=60*60)
118
118
  async def load_item(self, url: str) -> SeriesInfo:
119
- istek = await self.cffi.get(url)
119
+ istek = await self.httpx.get(url)
120
120
  secici = Selector(istek.text)
121
121
  veri = loads(secici.xpath("//script[@type='application/ld+json']/text()").getall()[-1])
122
122
 
@@ -160,7 +160,7 @@ class Dizilla(PluginBase):
160
160
 
161
161
  #@kekik_cache(ttl=15*60)
162
162
  async def load_links(self, url: str) -> list[dict]:
163
- istek = await self.cffi.get(url)
163
+ istek = await self.httpx.get(url)
164
164
  secici = Selector(istek.text)
165
165
 
166
166
  next_data = loads(secici.css("script#__NEXT_DATA__::text").get())
@@ -35,7 +35,7 @@ class FilmBip(PluginBase):
35
35
  page_url = url.replace("SAYFA", "") if page == 1 else url.replace("SAYFA", str(page))
36
36
  page_url = page_url.rstrip("/")
37
37
 
38
- istek = await self.cffi.get(page_url)
38
+ istek = await self.httpx.get(page_url)
39
39
  secici = Selector(istek.text)
40
40
 
41
41
  results = []
@@ -56,7 +56,7 @@ class FilmBip(PluginBase):
56
56
  return results
57
57
 
58
58
  async def search(self, query: str) -> list[SearchResult]:
59
- istek = await self.cffi.post(
59
+ istek = await self.httpx.post(
60
60
  url = f"{self.main_url}/search",
61
61
  headers = {
62
62
  "Accept" : "application/json, text/javascript, */*; q=0.01",
@@ -95,7 +95,7 @@ class FilmBip(PluginBase):
95
95
  return results
96
96
 
97
97
  async def load_item(self, url: str) -> MovieInfo:
98
- istek = await self.cffi.get(url)
98
+ istek = await self.httpx.get(url)
99
99
  secici = Selector(istek.text)
100
100
 
101
101
  title = secici.css("div.page-title h1::text").get()
@@ -126,7 +126,7 @@ class FilmBip(PluginBase):
126
126
  )
127
127
 
128
128
  async def load_links(self, url: str) -> list[dict]:
129
- istek = await self.cffi.get(url)
129
+ istek = await self.httpx.get(url)
130
130
  secici = Selector(istek.text)
131
131
 
132
132
  results = []
@@ -53,7 +53,7 @@ class FilmMakinesi(PluginBase):
53
53
 
54
54
  #@kekik_cache(ttl=60*60)
55
55
  async def search(self, query: str) -> list[SearchResult]:
56
- istek = await self.cffi.get(f"{self.main_url}/arama/?s={query}")
56
+ istek = await self.httpx.get(f"{self.main_url}/arama/?s={query}")
57
57
  secici = Selector(istek.text)
58
58
 
59
59
  results = []
@@ -75,7 +75,7 @@ class FilmMakinesi(PluginBase):
75
75
 
76
76
  #@kekik_cache(ttl=60*60)
77
77
  async def load_item(self, url: str) -> MovieInfo:
78
- istek = await self.cffi.get(url)
78
+ istek = await self.httpx.get(url)
79
79
  secici = Selector(istek.text)
80
80
 
81
81
  title = secici.css("h1.title::text").get().strip()
@@ -103,7 +103,7 @@ class FilmMakinesi(PluginBase):
103
103
 
104
104
  #@kekik_cache(ttl=15*60)
105
105
  async def load_links(self, url: str) -> list[dict]:
106
- istek = await self.cffi.get(url)
106
+ istek = await self.httpx.get(url)
107
107
  secici = Selector(istek.text)
108
108
 
109
109
  iframe_src = secici.css("iframe::attr(data-src)").get()
@@ -41,7 +41,7 @@ class FilmModu(PluginBase):
41
41
  }
42
42
 
43
43
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
44
- istek = await self.cffi.get(url.replace("SAYFA", str(page)))
44
+ istek = await self.httpx.get(url.replace("SAYFA", str(page)))
45
45
  secici = Selector(istek.text)
46
46
 
47
47
  return [
@@ -56,7 +56,7 @@ class FilmModu(PluginBase):
56
56
  ]
57
57
 
58
58
  async def search(self, query: str) -> list[SearchResult]:
59
- istek = await self.cffi.get(f"{self.main_url}/film-ara?term={query}")
59
+ istek = await self.httpx.get(f"{self.main_url}/film-ara?term={query}")
60
60
  secici = Selector(istek.text)
61
61
 
62
62
  return [
@@ -70,7 +70,7 @@ class FilmModu(PluginBase):
70
70
  ]
71
71
 
72
72
  async def load_item(self, url: str) -> MovieInfo:
73
- istek = await self.cffi.get(url)
73
+ istek = await self.httpx.get(url)
74
74
  secici = Selector(istek.text)
75
75
 
76
76
  org_title = secici.css("div.titles h1::text").get()
@@ -88,7 +88,7 @@ class FilmModu(PluginBase):
88
88
  )
89
89
 
90
90
  async def load_links(self, url: str) -> list[dict]:
91
- istek = await self.cffi.get(url)
91
+ istek = await self.httpx.get(url)
92
92
  secici = Selector(istek.text)
93
93
 
94
94
  results = []
@@ -100,7 +100,7 @@ class FilmModu(PluginBase):
100
100
  if alt_name == "Fragman" or not alt_link:
101
101
  continue
102
102
 
103
- alt_istek = await self.cffi.get(alt_link)
103
+ alt_istek = await self.httpx.get(alt_link)
104
104
  alt_text = alt_istek.text
105
105
 
106
106
  vid_id = re.search(r"var videoId = '(.*)'", alt_text)
@@ -109,7 +109,7 @@ class FilmModu(PluginBase):
109
109
  if not vid_id or not vid_type:
110
110
  continue
111
111
 
112
- source_istek = await self.cffi.get(
112
+ source_istek = await self.httpx.get(
113
113
  f"{self.main_url}/get-source?movie_id={vid_id[1]}&type={vid_type[1]}"
114
114
  )
115
115
  source_data = source_istek.json()
@@ -36,12 +36,12 @@ class FullHDFilm(PluginBase):
36
36
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
37
37
  page_url = url if page == 1 else f"{url}/page/{page}"
38
38
 
39
- self.cffi.headers.update({
39
+ self.httpx.headers.update({
40
40
  "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
41
41
  "Referer" : f"{self.main_url}/"
42
42
  })
43
43
 
44
- istek = await self.cffi.get(page_url)
44
+ istek = await self.httpx.get(page_url)
45
45
  secici = Selector(istek.text)
46
46
 
47
47
  return [
@@ -56,7 +56,7 @@ class FullHDFilm(PluginBase):
56
56
  ]
57
57
 
58
58
  async def search(self, query: str) -> list[SearchResult]:
59
- istek = await self.cffi.get(f"{self.main_url}/?s={query}")
59
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
60
60
  secici = Selector(istek.text)
61
61
 
62
62
  return [
@@ -70,7 +70,7 @@ class FullHDFilm(PluginBase):
70
70
  ]
71
71
 
72
72
  async def load_item(self, url: str) -> MovieInfo:
73
- istek = await self.cffi.get(url)
73
+ istek = await self.httpx.get(url)
74
74
  secici = Selector(istek.text)
75
75
 
76
76
  title = secici.css("h1::text").get()
@@ -132,12 +132,12 @@ class FullHDFilm(PluginBase):
132
132
  return None
133
133
 
134
134
  async def load_links(self, url: str) -> list[dict]:
135
- self.cffi.headers.update({
135
+ self.httpx.headers.update({
136
136
  "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
137
137
  "Referer" : self.main_url
138
138
  })
139
139
 
140
- istek = await self.cffi.get(url)
140
+ istek = await self.httpx.get(url)
141
141
  source_code = istek.text
142
142
 
143
143
  # Ana sayfadan altyazı URL'sini çek
@@ -147,7 +147,7 @@ class FullHDFilm(PluginBase):
147
147
  iframe_src = self._get_iframe(source_code)
148
148
 
149
149
  if not subtitle_url and iframe_src:
150
- iframe_istek = await self.cffi.get(iframe_src)
150
+ iframe_istek = await self.httpx.get(iframe_src)
151
151
  subtitle_url = self._extract_subtitle_url(iframe_istek.text)
152
152
 
153
153
  results = []
@@ -57,7 +57,7 @@ class FullHDFilmizlesene(PluginBase):
57
57
 
58
58
  #@kekik_cache(ttl=60*60)
59
59
  async def search(self, query: str) -> list[SearchResult]:
60
- istek = await self.cffi.get(f"{self.main_url}/arama/{query}")
60
+ istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
61
61
  secici = Selector(istek.text)
62
62
 
63
63
  results = []
@@ -79,7 +79,7 @@ class FullHDFilmizlesene(PluginBase):
79
79
 
80
80
  #@kekik_cache(ttl=60*60)
81
81
  async def load_item(self, url: str) -> MovieInfo:
82
- istek = await self.cffi.get(url)
82
+ istek = await self.httpx.get(url)
83
83
  secici = Selector(istek.text)
84
84
 
85
85
  title = secici.xpath("normalize-space(//div[@class='izle-titles'])").get().strip()
@@ -105,7 +105,7 @@ class FullHDFilmizlesene(PluginBase):
105
105
 
106
106
  #@kekik_cache(ttl=15*60)
107
107
  async def load_links(self, url: str) -> list[dict]:
108
- istek = await self.cffi.get(url)
108
+ istek = await self.httpx.get(url)
109
109
  secici = Selector(istek.text)
110
110
 
111
111
  script = secici.xpath("(//script)[1]").get()
@@ -11,6 +11,9 @@ class HDFilmCehennemi(PluginBase):
11
11
  main_url = "https://www.hdfilmcehennemi.ws"
12
12
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
13
  description = "Türkiye'nin en hızlı hd film izleme sitesi"
14
+
15
+ # Bu site domain değişikliği yapıyor ve potansiyel anti-bot koruması var
16
+ requires_cffi = True
14
17
 
15
18
  main_page = {
16
19
  f"{main_url}" : "Yeni Eklenen Filmler",
@@ -21,7 +21,7 @@ class JetFilmizle(PluginBase):
21
21
 
22
22
  #@kekik_cache(ttl=60*60)
23
23
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
24
- istek = await self.cffi.get(f"{url}{page}", allow_redirects=True)
24
+ istek = await self.httpx.get(f"{url}{page}", allow_redirects=True)
25
25
  secici = Selector(istek.text)
26
26
 
27
27
  return [
@@ -36,7 +36,7 @@ class JetFilmizle(PluginBase):
36
36
 
37
37
  #@kekik_cache(ttl=60*60)
38
38
  async def search(self, query: str) -> list[SearchResult]:
39
- istek = await self.cffi.post(
39
+ istek = await self.httpx.post(
40
40
  url = f"{self.main_url}/filmara.php",
41
41
  data = {"s": query},
42
42
  headers = {"Referer": f"{self.main_url}/"}
@@ -62,7 +62,7 @@ class JetFilmizle(PluginBase):
62
62
 
63
63
  #@kekik_cache(ttl=60*60)
64
64
  async def load_item(self, url: str) -> MovieInfo:
65
- istek = await self.cffi.get(url)
65
+ istek = await self.httpx.get(url)
66
66
  secici = Selector(istek.text)
67
67
 
68
68
  title = self.clean_title(secici.css("div.movie-exp-title::text").get())
@@ -94,7 +94,7 @@ class JetFilmizle(PluginBase):
94
94
 
95
95
  #@kekik_cache(ttl=15*60)
96
96
  async def load_links(self, url: str) -> list[dict]:
97
- istek = await self.cffi.get(url)
97
+ istek = await self.httpx.get(url)
98
98
  secici = Selector(istek.text)
99
99
 
100
100
  iframes = []
@@ -106,7 +106,7 @@ class JetFilmizle(PluginBase):
106
106
  if not part_href:
107
107
  continue
108
108
 
109
- part_istek = await self.cffi.get(part_href)
109
+ part_istek = await self.httpx.get(part_href)
110
110
  part_secici = Selector(part_istek.text)
111
111
 
112
112
  if iframe := part_secici.css("div#movie iframe::attr(data-src), div#movie iframe::attr(data), div#movie iframe::attr(src)").get():
@@ -119,7 +119,7 @@ class JetFilmizle(PluginBase):
119
119
  processed_iframes = []
120
120
  for iframe in iframes:
121
121
  if "jetv.xyz" in iframe:
122
- jetv_istek = await self.cffi.get(iframe)
122
+ jetv_istek = await self.httpx.get(iframe)
123
123
  jetv_secici = Selector(jetv_istek.text)
124
124
 
125
125
  if jetv_iframe := jetv_secici.css("iframe::attr(src)").get():
@@ -37,7 +37,7 @@ class KultFilmler(PluginBase):
37
37
  }
38
38
 
39
39
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
40
- istek = await self.cffi.get(url)
40
+ istek = await self.httpx.get(url)
41
41
  secici = Selector(istek.text)
42
42
 
43
43
  results = []
@@ -57,7 +57,7 @@ class KultFilmler(PluginBase):
57
57
  return results
58
58
 
59
59
  async def search(self, query: str) -> list[SearchResult]:
60
- istek = await self.cffi.get(f"{self.main_url}?s={query}")
60
+ istek = await self.httpx.get(f"{self.main_url}?s={query}")
61
61
  secici = Selector(istek.text)
62
62
 
63
63
  results = []
@@ -76,7 +76,7 @@ class KultFilmler(PluginBase):
76
76
  return results
77
77
 
78
78
  async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
79
- istek = await self.cffi.get(url)
79
+ istek = await self.httpx.get(url)
80
80
  secici = Selector(istek.text)
81
81
 
82
82
  title = secici.css("div.film-bilgileri img::attr(alt)").get() or secici.css("[property='og:title']::attr(content)").get()
@@ -161,7 +161,7 @@ class KultFilmler(PluginBase):
161
161
  return match[1] if match else None
162
162
 
163
163
  async def load_links(self, url: str) -> list[dict]:
164
- istek = await self.cffi.get(url)
164
+ istek = await self.httpx.get(url)
165
165
  secici = Selector(istek.text)
166
166
 
167
167
  iframes = set()
@@ -175,7 +175,7 @@ class KultFilmler(PluginBase):
175
175
  for player in secici.css("div.container#player"):
176
176
  alt_iframe = self.fix_url(player.css("iframe::attr(src)").get())
177
177
  if alt_iframe:
178
- alt_istek = await self.cffi.get(alt_iframe)
178
+ alt_istek = await self.httpx.get(alt_iframe)
179
179
  alt_frame = self._get_iframe(alt_istek.text)
180
180
  if alt_frame:
181
181
  iframes.add(alt_frame)
@@ -191,7 +191,7 @@ class KultFilmler(PluginBase):
191
191
  "User-Agent" : "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36",
192
192
  "Sec-Fetch-Dest" : "iframe"
193
193
  }
194
- iframe_istek = await self.cffi.get(iframe, headers=headers)
194
+ iframe_istek = await self.httpx.get(iframe, headers=headers)
195
195
  m3u_match = re.search(r'file:"([^"]+)"', iframe_istek.text)
196
196
 
197
197
  if m3u_match:
@@ -32,8 +32,8 @@ class RecTV(PluginBase):
32
32
 
33
33
  #@kekik_cache(ttl=60*60)
34
34
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
35
- self.cffi.headers.update({"user-agent": "okhttp/4.12.0"})
36
- istek = await self.cffi.get(f"{url.replace('SAYFA', str(int(page) - 1))}")
35
+ self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
36
+ istek = await self.httpx.get(f"{url.replace('SAYFA', str(int(page) - 1))}")
37
37
  veriler = istek.json()
38
38
 
39
39
  return [
@@ -48,8 +48,8 @@ class RecTV(PluginBase):
48
48
 
49
49
  #@kekik_cache(ttl=60*60)
50
50
  async def search(self, query: str) -> list[SearchResult]:
51
- self.cffi.headers.update({"user-agent": "okhttp/4.12.0"})
52
- istek = await self.cffi.get(f"{self.main_url}/api/search/{query}/{self.sw_key}/")
51
+ self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
52
+ istek = await self.httpx.get(f"{self.main_url}/api/search/{query}/{self.sw_key}/")
53
53
 
54
54
  kanallar = istek.json().get("channels")
55
55
  icerikler = istek.json().get("posters")
@@ -69,12 +69,12 @@ class RecTV(PluginBase):
69
69
 
70
70
  #@kekik_cache(ttl=60*60)
71
71
  async def load_item(self, url: str) -> MovieInfo:
72
- self.cffi.headers.update({"user-agent": "okhttp/4.12.0"})
72
+ self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
73
73
  veri = loads(url)
74
74
 
75
75
  match veri.get("type"):
76
76
  case "serie":
77
- dizi_istek = await self.cffi.get(f"{self.main_url}/api/season/by/serie/{veri.get('id')}/{self.sw_key}/")
77
+ dizi_istek = await self.httpx.get(f"{self.main_url}/api/season/by/serie/{veri.get('id')}/{self.sw_key}/")
78
78
  dizi_veri = dizi_istek.json()
79
79
 
80
80
  episodes = []
@@ -8,7 +8,10 @@ class RoketDizi(PluginBase):
8
8
  name = "RoketDizi"
9
9
  lang = "tr"
10
10
  main_url = "https://flatscher.net"
11
-
11
+
12
+ # Domain doğrulama ve anti-bot mekanizmaları var
13
+ requires_cffi = True
14
+
12
15
  main_page = {
13
16
  "dizi/tur/aksiyon" : "Aksiyon",
14
17
  "dizi/tur/bilim-kurgu" : "Bilim Kurgu",
@@ -24,9 +27,9 @@ class RoketDizi(PluginBase):
24
27
  full_url = f"{self.main_url}/{url}?&page={page}"
25
28
  resp = await self.cffi.get(full_url)
26
29
  sel = Selector(resp.text)
27
-
30
+
28
31
  results = []
29
-
32
+
30
33
  for item in sel.css("div.w-full.p-4 span.bg-\\[\\#232323\\]"):
31
34
  title = item.css("span.font-normal.line-clamp-1::text").get()
32
35
  href = item.css("a::attr(href)").get()