KekikStream 1.8.1__tar.gz → 1.8.6__tar.gz

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 (95) hide show
  1. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorBase.py +2 -14
  2. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginBase.py +2 -15
  3. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/DiziBox.py +2 -7
  4. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/DiziPal.py +1 -1
  5. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/DiziYou.py +41 -16
  6. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/Dizilla.py +38 -27
  7. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FilmBip.py +1 -1
  8. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FilmMakinesi.py +1 -5
  9. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FullHDFilmizlesene.py +1 -5
  10. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/HDFilmCehennemi.py +11 -18
  11. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/JetFilmizle.py +1 -5
  12. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/RecTV.py +1 -5
  13. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/RoketDizi.py +80 -42
  14. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SelcukFlix.py +160 -67
  15. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SezonlukDizi.py +1 -5
  16. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SineWix.py +1 -5
  17. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/Sinefy.py +72 -51
  18. kekikstream-1.8.6/KekikStream/Plugins/Sinezy.py +131 -0
  19. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/UgurFilm.py +1 -5
  20. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/requirements.txt +2 -3
  21. kekikstream-1.8.6/KekikStream.egg-info/PKG-INFO +282 -0
  22. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/requires.txt +0 -1
  23. kekikstream-1.8.6/PKG-INFO +282 -0
  24. kekikstream-1.8.6/README.md +245 -0
  25. {kekikstream-1.8.1 → kekikstream-1.8.6}/setup.py +1 -2
  26. kekikstream-1.8.1/KekikStream/Plugins/Sinezy.py +0 -99
  27. kekikstream-1.8.1/KekikStream.egg-info/PKG-INFO +0 -110
  28. kekikstream-1.8.1/PKG-INFO +0 -110
  29. kekikstream-1.8.1/README.md +0 -72
  30. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/CLI/__init__.py +0 -0
  31. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/CLI/pypi_kontrol.py +0 -0
  32. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  33. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  34. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  35. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Media/MediaHandler.py +0 -0
  36. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Media/MediaManager.py +0 -0
  37. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  38. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  39. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  40. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/UI/UIManager.py +0 -0
  41. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/__init__.py +0 -0
  42. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/CloseLoad.py +0 -0
  43. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/ContentX.py +0 -0
  44. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/DzenRu.py +0 -0
  45. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/ExPlay.py +0 -0
  46. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FirePlayer.py +0 -0
  47. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FourCX.py +0 -0
  48. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FourPichive.py +0 -0
  49. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FourPlayRu.py +0 -0
  50. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  51. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/HDStreamAble.py +0 -0
  52. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Hotlinger.py +0 -0
  53. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/JetTv.py +0 -0
  54. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MailRu.py +0 -0
  55. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MixPlayHD.py +0 -0
  56. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MixTiger.py +0 -0
  57. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MolyStream.py +0 -0
  58. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  59. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  60. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/OkRuSSL.py +0 -0
  61. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  62. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Pichive.py +0 -0
  63. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PixelDrain.py +0 -0
  64. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PlayRu.py +0 -0
  65. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  66. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/RapidVid.py +0 -0
  67. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/SetPlay.py +0 -0
  68. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/SetPrime.py +0 -0
  69. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/SibNet.py +0 -0
  70. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  71. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TRsTX.py +0 -0
  72. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TauVideo.py +0 -0
  73. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TurboImgz.py +0 -0
  74. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  75. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidHide.py +0 -0
  76. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidMoly.py +0 -0
  77. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidMolyMe.py +0 -0
  78. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidMoxy.py +0 -0
  79. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidPapi.py +0 -0
  80. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VideoSeyred.py +0 -0
  81. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  82. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FilmModu.py +0 -0
  83. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FullHDFilm.py +0 -0
  84. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/KultFilmler.py +0 -0
  85. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SinemaCX.py +0 -0
  86. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  87. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/__init__.py +0 -0
  88. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/__main__.py +0 -0
  89. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/SOURCES.txt +0 -0
  90. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/dependency_links.txt +0 -0
  91. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/entry_points.txt +0 -0
  92. {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/top_level.txt +0 -0
  93. {kekikstream-1.8.1 → kekikstream-1.8.6}/LICENSE +0 -0
  94. {kekikstream-1.8.1 → kekikstream-1.8.6}/MANIFEST.in +0 -0
  95. {kekikstream-1.8.1 → kekikstream-1.8.6}/setup.cfg +0 -0
@@ -1,7 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from abc import ABC, abstractmethod
4
- from curl_cffi import AsyncSession
5
4
  from cloudscraper import CloudScraper
6
5
  from httpx import AsyncClient
7
6
  from typing import Optional
@@ -12,7 +11,6 @@ class ExtractorBase(ABC):
12
11
  # Çıkarıcının temel özellikleri
13
12
  name = "Extractor"
14
13
  main_url = ""
15
- requires_cffi = False
16
14
 
17
15
  def __init__(self):
18
16
  # cloudscraper - for bypassing Cloudflare
@@ -21,19 +19,11 @@ class ExtractorBase(ABC):
21
19
  # httpx - lightweight and safe for most HTTP requests
22
20
  self.httpx = AsyncClient(
23
21
  timeout = 3,
24
- follow_redirects = True,
22
+ follow_redirects = True
25
23
  )
26
24
  self.httpx.headers.update(self.cloudscraper.headers)
27
25
  self.httpx.cookies.update(self.cloudscraper.cookies)
28
26
 
29
- # curl_cffi - only initialize if needed for anti-bot bypass
30
- self.cffi = None
31
-
32
- if self.requires_cffi:
33
- self.cffi = AsyncSession(impersonate="firefox135")
34
- self.cffi.cookies.update(self.cloudscraper.cookies)
35
- self.cffi.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
36
-
37
27
  def can_handle_url(self, url: str) -> bool:
38
28
  # URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
39
29
  return self.main_url in url
@@ -44,10 +34,8 @@ class ExtractorBase(ABC):
44
34
  pass
45
35
 
46
36
  async def close(self):
47
- """Close both HTTP clients if they exist."""
37
+ """Close HTTP client."""
48
38
  await self.httpx.aclose()
49
- if self.cffi:
50
- await self.cffi.close()
51
39
 
52
40
  def fix_url(self, url: str) -> str:
53
41
  # Eksik URL'leri düzelt ve tam URL formatına çevir
@@ -1,7 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from abc import ABC, abstractmethod
4
- from curl_cffi import AsyncSession
5
4
  from cloudscraper import CloudScraper
6
5
  from httpx import AsyncClient
7
6
  from .PluginModels import MainPageResult, SearchResult, MovieInfo
@@ -17,8 +16,6 @@ class PluginBase(ABC):
17
16
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
18
17
  description = "No description provided."
19
18
 
20
- requires_cffi = False
21
-
22
19
  main_page = {}
23
20
 
24
21
  async def url_update(self, new_url: str):
@@ -33,19 +30,11 @@ class PluginBase(ABC):
33
30
  # httpx - lightweight and safe for most HTTP requests
34
31
  self.httpx = AsyncClient(
35
32
  timeout = 3,
36
- follow_redirects = True,
33
+ follow_redirects = True
37
34
  )
38
35
  self.httpx.headers.update(self.cloudscraper.headers)
39
36
  self.httpx.cookies.update(self.cloudscraper.cookies)
40
37
 
41
- # curl_cffi - only initialize if needed for anti-bot bypass
42
- self.cffi = None
43
-
44
- if self.requires_cffi:
45
- self.cffi = AsyncSession(impersonate="firefox135")
46
- self.cffi.cookies.update(self.cloudscraper.cookies)
47
- self.cffi.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
48
-
49
38
  self.media_handler = MediaHandler()
50
39
  self.ex_manager = ExtractorManager()
51
40
 
@@ -90,10 +79,8 @@ class PluginBase(ABC):
90
79
  pass
91
80
 
92
81
  async def close(self):
93
- """Close both HTTP clients if they exist."""
82
+ """Close HTTP client."""
94
83
  await self.httpx.aclose()
95
- if self.cffi:
96
- await self.cffi.close()
97
84
 
98
85
  def fix_url(self, url: str) -> str:
99
86
  if not url:
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
4
4
  from Kekik.Sifreleme import CryptoJS
5
5
  from parsel import Selector
6
6
  import re, urllib.parse, base64, contextlib, asyncio, time
@@ -40,7 +40,6 @@ class DiziBox(PluginBase):
40
40
  f"{main_url}/dizi-arsivi/page/SAYFA/?tur[0]=yarisma&yil&imdb" : "Yarışma"
41
41
  }
42
42
 
43
- #@kekik_cache(ttl=60*60)
44
43
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
45
44
  self.httpx.cookies.update({
46
45
  "isTrustedUser" : "true",
@@ -62,7 +61,6 @@ class DiziBox(PluginBase):
62
61
  for veri in secici.css("article.detailed-article")
63
62
  ]
64
63
 
65
- #@kekik_cache(ttl=60*60)
66
64
  async def search(self, query: str) -> list[SearchResult]:
67
65
  self.httpx.cookies.update({
68
66
  "isTrustedUser" : "true",
@@ -80,7 +78,6 @@ class DiziBox(PluginBase):
80
78
  for item in secici.css("article.detailed-article")
81
79
  ]
82
80
 
83
- #@kekik_cache(ttl=60*60)
84
81
  async def load_item(self, url: str) -> SeriesInfo:
85
82
  istek = await self.httpx.get(url)
86
83
  secici = Selector(istek.text)
@@ -127,7 +124,6 @@ class DiziBox(PluginBase):
127
124
  actors = actors,
128
125
  )
129
126
 
130
- #@kekik_cache(ttl=60*60)
131
127
  async def _iframe_decode(self, name:str, iframe_link:str, referer:str) -> list[str]:
132
128
  results = []
133
129
 
@@ -178,7 +174,6 @@ class DiziBox(PluginBase):
178
174
 
179
175
  return results
180
176
 
181
- #@kekik_cache(ttl=15*60)
182
177
  async def load_links(self, url: str) -> list[dict]:
183
178
  istek = await self.httpx.get(url)
184
179
  secici = Selector(istek.text)
@@ -214,4 +209,4 @@ class DiziBox(PluginBase):
214
209
  "name" : f"{extractor.name if extractor else alt_name}"
215
210
  })
216
211
 
217
- return results
212
+ return results
@@ -9,7 +9,7 @@ class DiziPal(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://dizipal1223.com"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
- description = "Yabancı Dizi ve Film izle."
12
+ description = "dizipal güncel, dizipal yeni ve gerçek adresi. dizipal en yeni dizi ve filmleri güvenli ve hızlı şekilde sunar."
13
13
 
14
14
  main_page = {
15
15
  f"{main_url}/diziler/son-bolumler" : "Son Bölümler",
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -29,7 +29,6 @@ class DiziYou(PluginBase):
29
29
  f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Vah%C5%9Fi+Bat%C4%B1" : "Vahşi Batı"
30
30
  }
31
31
 
32
- #@kekik_cache(ttl=60*60)
33
32
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
34
33
  istek = await self.httpx.get(f"{url.replace('SAYFA', str(page))}")
35
34
  secici = Selector(istek.text)
@@ -44,7 +43,6 @@ class DiziYou(PluginBase):
44
43
  for veri in secici.css("div.single-item")
45
44
  ]
46
45
 
47
- #@kekik_cache(ttl=60*60)
48
46
  async def search(self, query: str) -> list[SearchResult]:
49
47
  istek = await self.httpx.get(f"{self.main_url}/?s={query}")
50
48
  secici = Selector(istek.text)
@@ -53,18 +51,28 @@ class DiziYou(PluginBase):
53
51
  SearchResult(
54
52
  title = afis.css("div#categorytitle a::text").get().strip(),
55
53
  url = self.fix_url(afis.css("div#categorytitle a::attr(href)").get()),
56
- poster = self.fix_url(afis.css("img::attr(src)").get()),
54
+ poster = self.fix_url(afis.css("img::attr(src)").get() or afis.css("img::attr(data-src)").get())
57
55
  )
58
56
  for afis in secici.css("div.incontent div#list-series")
59
57
  ]
60
58
 
61
- #@kekik_cache(ttl=60*60)
62
59
  async def load_item(self, url: str) -> SeriesInfo:
63
60
  istek = await self.httpx.get(url)
64
61
  secici = Selector(istek.text)
65
62
 
66
- title = secici.css("h1::text").get().strip()
67
- poster = self.fix_url(secici.css("div.category_image img::attr(src)").get().strip())
63
+ # Title - div.title h1 içinde
64
+ title_raw = secici.css("div.title h1::text").get()
65
+ title = title_raw.strip() if title_raw else ""
66
+
67
+ # Fallback: Eğer title boşsa URL'den çıkar (telif kısıtlaması olan sayfalar için)
68
+ if not title:
69
+ # URL'den slug'ı al: https://www.diziyou.one/jasmine/ -> jasmine -> Jasmine
70
+ slug = url.rstrip('/').split('/')[-1]
71
+ title = slug.replace('-', ' ').title()
72
+
73
+ # Poster
74
+ poster_raw = secici.css("div.category_image img::attr(src)").get()
75
+ poster = self.fix_url(poster_raw) if poster_raw else ""
68
76
  year = secici.xpath("//span[contains(., 'Yapım Yılı')]/following-sibling::text()[1]").get()
69
77
  description = secici.css("div.diziyou_desc::text").get()
70
78
  if description:
@@ -75,13 +83,21 @@ class DiziYou(PluginBase):
75
83
  actors = [actor.strip() for actor in _actors.split(",")] if _actors else []
76
84
 
77
85
  episodes = []
78
- for it in secici.css("div.bolumust"):
79
- ep_name = it.css("div.baslik::text").get().strip()
80
- ep_href = it.xpath("ancestor::a/@href").get()
81
- if not ep_name or not ep_href:
86
+ # Episodes - bolumust her bölüm için bir <a> içinde
87
+ # :has() parsel'de çalışmıyor, XPath kullanıyoruz
88
+ for link in secici.xpath('//a[div[@class="bolumust"]]'):
89
+ ep_name_raw = link.css("div.baslik::text").get()
90
+ if not ep_name_raw:
91
+ continue
92
+ ep_name = ep_name_raw.strip()
93
+
94
+ ep_href = self.fix_url(link.css("::attr(href)").get())
95
+ if not ep_href:
82
96
  continue
83
97
 
84
- ep_name_clean = it.css("div.bolumismi::text").get().strip().replace("(", "").replace(")", "").strip() if it.css("div.bolumismi::text").get() else ep_name
98
+ # Bölüm ismi varsa al
99
+ ep_name_raw_clean = link.css("div.bolumismi::text").get()
100
+ ep_name_clean = ep_name_raw_clean.strip().replace("(", "").replace(")", "").strip() if ep_name_raw_clean else ep_name
85
101
 
86
102
  ep_episode = re.search(r"(\d+)\. Bölüm", ep_name)[1]
87
103
  ep_season = re.search(r"(\d+)\. Sezon", ep_name)[1]
@@ -107,14 +123,23 @@ class DiziYou(PluginBase):
107
123
  actors = actors
108
124
  )
109
125
 
110
- #@kekik_cache(ttl=15*60)
111
126
  async def load_links(self, url: str) -> list[dict]:
112
127
  istek = await self.httpx.get(url)
113
128
  secici = Selector(istek.text)
114
129
 
115
- item_title = secici.css("div.title h1::text").get()
116
- ep_name = secici.css("div#bolum-ismi::text").get().strip()
117
- item_id = secici.css("iframe#diziyouPlayer::attr(src)").get().split("/")[-1].replace(".html", "")
130
+ # Title ve episode name - None kontrolü ekle
131
+ item_title_raw = secici.css("div.title h1::text").get()
132
+ item_title = item_title_raw.strip() if item_title_raw else ""
133
+
134
+ ep_name_raw = secici.css("div#bolum-ismi::text").get()
135
+ ep_name = ep_name_raw.strip() if ep_name_raw else ""
136
+
137
+ # Player src'den item_id çıkar
138
+ player_src = secici.css("iframe#diziyouPlayer::attr(src)").get()
139
+ if not player_src:
140
+ return [] # Player bulunamadıysa boş liste döndür
141
+
142
+ item_id = player_src.split("/")[-1].replace(".html", "")
118
143
 
119
144
  subtitles = []
120
145
  stream_urls = []
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
4
4
  from parsel import Selector
5
5
  from json import loads
6
6
  from urllib.parse import urlparse, urlunparse
@@ -12,36 +12,47 @@ class Dizilla(PluginBase):
12
12
  language = "tr"
13
13
  main_url = "https://dizilla40.com"
14
14
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
15
- description = "Dizilla tüm yabancı dizileri ücretsiz olarak Türkçe Dublaj ve altyazılı seçenekleri ile 1080P kalite izleyebileceğiniz yeni nesil yabancı dizi izleme siteniz."
15
+ description = "1080p yabancı dizi izle. Türkçe altyazılı veya dublaj seçenekleriyle 1080p çözünürlükte yabancı dizilere anında ulaş. Popüler dizileri kesintisiz izle."
16
16
 
17
17
  main_page = {
18
- f"{main_url}/tum-bolumler" : "Altyazılı Bölümler",
19
- f"{main_url}/dublaj-bolumler" : "Dublaj Bölümler",
20
- f"{main_url}/dizi-turu/aile" : "Aile",
21
- f"{main_url}/dizi-turu/aksiyon" : "Aksiyon",
22
- f"{main_url}/dizi-turu/bilim-kurgu" : "Bilim Kurgu",
23
- f"{main_url}/dizi-turu/romantik" : "Romantik",
24
- f"{main_url}/dizi-turu/komedi" : "Komedi"
18
+ f"{main_url}/tum-bolumler" : "Altyazılı Bölümler",
19
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=15&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Aile",
20
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=9&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Aksiyon",
21
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=17&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Animasyon",
22
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=5&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Bilim Kurgu",
23
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=2&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Dram",
24
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=12&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Fantastik",
25
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=18&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Gerilim",
26
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=3&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Gizem",
27
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=4&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Komedi",
28
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=8&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Korku",
29
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=24&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Macera",
30
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=7&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Romantik",
31
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=26&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Savaş",
32
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=1&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Suç",
33
+ f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=11&countryIdsComma=&orderType=date_desc&languageId=-1&currentPage=SAYFA&currentPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Western",
25
34
  }
26
35
 
27
- #@kekik_cache(ttl=60*60)
28
36
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
29
- istek = await self.httpx.get(url)
30
- secici = Selector(istek.text)
31
-
32
37
  ana_sayfa = []
33
38
 
34
- if "dizi-turu" in url:
39
+ if "api/bg" in url:
40
+ istek = await self.httpx.post(url.replace("SAYFA", str(page)))
41
+ decrypted = await self.decrypt_response(istek.json().get("response"))
42
+ veriler = decrypted.get("result", [])
35
43
  ana_sayfa.extend([
36
44
  MainPageResult(
37
45
  category = category,
38
- title = veri.css("h2::text").get(),
39
- url = self.fix_url(veri.css("::attr(href)").get()),
40
- poster = self.fix_url(veri.css("img::attr(src)").get() or veri.css("img::attr(data-src)").get())
46
+ title = veri.get("original_title"),
47
+ url = self.fix_url(f"{self.main_url}/{veri.get('used_slug')}"),
48
+ poster = self.fix_url(veri.get("object_poster_url")),
41
49
  )
42
- for veri in secici.css("div.grid-cols-3 a")
50
+ for veri in veriler
43
51
  ])
44
52
  else:
53
+ istek = await self.httpx.get(url.replace("SAYFA", str(page)))
54
+ secici = Selector(istek.text)
55
+
45
56
  for veri in secici.css("div.tab-content > div.grid a"):
46
57
  name = veri.css("h2::text").get()
47
58
  ep_name = veri.xpath("normalize-space(//div[contains(@class, 'opacity-80')])").get()
@@ -88,7 +99,6 @@ class Dizilla(PluginBase):
88
99
  # JSON decode
89
100
  return loads(decrypted.decode("utf-8"))
90
101
 
91
- #@kekik_cache(ttl=60*60)
92
102
  async def search(self, query: str) -> list[SearchResult]:
93
103
  arama_istek = await self.httpx.post(f"{self.main_url}/api/bg/searchcontent?searchterm={query}")
94
104
  decrypted = await self.decrypt_response(arama_istek.json().get("response"))
@@ -103,7 +113,6 @@ class Dizilla(PluginBase):
103
113
  for veri in arama_veri
104
114
  ]
105
115
 
106
- #@kekik_cache(ttl=60*60)
107
116
  async def url_base_degis(self, eski_url:str, yeni_base:str) -> str:
108
117
  parsed_url = urlparse(eski_url)
109
118
  parsed_yeni_base = urlparse(yeni_base)
@@ -114,22 +123,25 @@ class Dizilla(PluginBase):
114
123
 
115
124
  return urlunparse(yeni_url)
116
125
 
117
- #@kekik_cache(ttl=60*60)
118
126
  async def load_item(self, url: str) -> SeriesInfo:
119
127
  istek = await self.httpx.get(url)
120
128
  secici = Selector(istek.text)
121
129
  veri = loads(secici.xpath("//script[@type='application/ld+json']/text()").getall()[-1])
122
130
 
123
- title = veri.get("name")
131
+ title = veri.get("name")
124
132
  if alt_title := veri.get("alternateName"):
125
133
  title += f" - ({alt_title})"
126
134
 
127
135
  poster = self.fix_url(veri.get("image"))
128
136
  description = veri.get("description")
129
137
  year = veri.get("datePublished").split("-")[0]
130
- tags = []
131
- rating = veri.get("aggregateRating", {}).get("ratingValue")
132
- actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
138
+
139
+ # Tags extraction from page content (h3 tag)
140
+ tags_raw = secici.css("h3.text-white.opacity-60::text").get()
141
+ tags = [t.strip() for t in tags_raw.split(",")] if tags_raw else []
142
+
143
+ rating = veri.get("aggregateRating", {}).get("ratingValue")
144
+ actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
133
145
 
134
146
  bolumler = []
135
147
  sezonlar = veri.get("containsSeason") if isinstance(veri.get("containsSeason"), list) else [veri.get("containsSeason")]
@@ -158,7 +170,6 @@ class Dizilla(PluginBase):
158
170
  actors = actors
159
171
  )
160
172
 
161
- #@kekik_cache(ttl=15*60)
162
173
  async def load_links(self, url: str) -> list[dict]:
163
174
  istek = await self.httpx.get(url)
164
175
  secici = Selector(istek.text)
@@ -181,4 +192,4 @@ class Dizilla(PluginBase):
181
192
  "name" : f"{extractor.name if extractor else 'Main Player'} | {result.get('language_name')}",
182
193
  })
183
194
 
184
- return links
195
+ return links
@@ -8,7 +8,7 @@ class FilmBip(PluginBase):
8
8
  language = "tr"
9
9
  main_url = "https://filmbip.com"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
- description = "Film izleme sitesi."
11
+ description = "FilmBip adlı film sitemizde Full HD film izle. Yerli ve yabancı filmleri Türkçe dublaj veya altyazılı şekilde 1080p yüksek kalite film izle"
12
12
 
13
13
  main_page = {
14
14
  f"{main_url}/filmler/SAYFA" : "Yeni Filmler",
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
 
6
6
  class FilmMakinesi(PluginBase):
@@ -34,7 +34,6 @@ class FilmMakinesi(PluginBase):
34
34
  f"{main_url}/tur/western-fm1/film/" : "Western"
35
35
  }
36
36
 
37
- #@kekik_cache(ttl=60*60)
38
37
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
39
38
  istek = self.cloudscraper.get(f"{url}{'' if page == 1 else f'page/{page}/'}")
40
39
  secici = Selector(istek.text)
@@ -51,7 +50,6 @@ class FilmMakinesi(PluginBase):
51
50
  for veri in veriler
52
51
  ]
53
52
 
54
- #@kekik_cache(ttl=60*60)
55
53
  async def search(self, query: str) -> list[SearchResult]:
56
54
  istek = await self.httpx.get(f"{self.main_url}/arama/?s={query}")
57
55
  secici = Selector(istek.text)
@@ -73,7 +71,6 @@ class FilmMakinesi(PluginBase):
73
71
 
74
72
  return results
75
73
 
76
- #@kekik_cache(ttl=60*60)
77
74
  async def load_item(self, url: str) -> MovieInfo:
78
75
  istek = await self.httpx.get(url)
79
76
  secici = Selector(istek.text)
@@ -101,7 +98,6 @@ class FilmMakinesi(PluginBase):
101
98
  duration = duration
102
99
  )
103
100
 
104
- #@kekik_cache(ttl=15*60)
105
101
  async def load_links(self, url: str) -> list[dict]:
106
102
  istek = await self.httpx.get(url)
107
103
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
  from Kekik.Sifreleme import StringCodec
6
6
  import json, re
@@ -40,7 +40,6 @@ class FullHDFilmizlesene(PluginBase):
40
40
  f"{main_url}/filmizle/yerli-filmler-hd-izle/" : "Yerli Filmler"
41
41
  }
42
42
 
43
- #@kekik_cache(ttl=60*60)
44
43
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
45
44
  istek = self.cloudscraper.get(f"{url}{page}")
46
45
  secici = Selector(istek.text)
@@ -55,7 +54,6 @@ class FullHDFilmizlesene(PluginBase):
55
54
  for veri in secici.css("li.film")
56
55
  ]
57
56
 
58
- #@kekik_cache(ttl=60*60)
59
57
  async def search(self, query: str) -> list[SearchResult]:
60
58
  istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
61
59
  secici = Selector(istek.text)
@@ -77,7 +75,6 @@ class FullHDFilmizlesene(PluginBase):
77
75
 
78
76
  return results
79
77
 
80
- #@kekik_cache(ttl=60*60)
81
78
  async def load_item(self, url: str) -> MovieInfo:
82
79
  istek = await self.httpx.get(url)
83
80
  secici = Selector(istek.text)
@@ -103,7 +100,6 @@ class FullHDFilmizlesene(PluginBase):
103
100
  duration = duration
104
101
  )
105
102
 
106
- #@kekik_cache(ttl=15*60)
107
103
  async def load_links(self, url: str) -> list[dict]:
108
104
  istek = await self.httpx.get(url)
109
105
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
4
4
  from parsel import Selector
5
5
  from Kekik.Sifreleme import Packer, StreamDecoder
6
6
  import random, string, re
@@ -12,8 +12,7 @@ class HDFilmCehennemi(PluginBase):
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
14
 
15
- # Bu site domain değişikliği yapıyor ve potansiyel anti-bot koruması var
16
- requires_cffi = True
15
+
17
16
 
18
17
  main_page = {
19
18
  f"{main_url}" : "Yeni Eklenen Filmler",
@@ -32,9 +31,8 @@ class HDFilmCehennemi(PluginBase):
32
31
  f"{main_url}/tur/romantik-filmleri-izle-1" : "Romantik Filmleri"
33
32
  }
34
33
 
35
- #@kekik_cache(ttl=60*60)
36
34
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
37
- istek = await self.cffi.get(f"{url}", allow_redirects=True)
35
+ istek = await self.httpx.get(f"{url}", follow_redirects=True)
38
36
  secici = Selector(istek.text)
39
37
 
40
38
  return [
@@ -47,9 +45,8 @@ class HDFilmCehennemi(PluginBase):
47
45
  for veri in secici.css("div.section-content a.poster")
48
46
  ]
49
47
 
50
- #@kekik_cache(ttl=60*60)
51
48
  async def search(self, query: str) -> list[SearchResult]:
52
- istek = await self.cffi.get(
49
+ istek = await self.httpx.get(
53
50
  url = f"{self.main_url}/search/?q={query}",
54
51
  headers = {
55
52
  "Referer" : f"{self.main_url}/",
@@ -76,9 +73,8 @@ class HDFilmCehennemi(PluginBase):
76
73
 
77
74
  return results
78
75
 
79
- #@kekik_cache(ttl=60*60)
80
76
  async def load_item(self, url: str) -> MovieInfo:
81
- istek = await self.cffi.get(url, headers = {"Referer": f"{self.main_url}/"})
77
+ istek = await self.httpx.get(url, headers = {"Referer": f"{self.main_url}/"})
82
78
  secici = Selector(istek.text)
83
79
 
84
80
  title = secici.css("h1.section-title::text").get().strip()
@@ -111,11 +107,10 @@ class HDFilmCehennemi(PluginBase):
111
107
  def generate_random_cookie(self):
112
108
  return "".join(random.choices(string.ascii_letters + string.digits, k=16))
113
109
 
114
- #@kekik_cache(ttl=15*60)
115
110
  async def cehennempass(self, video_id: str) -> list[dict]:
116
111
  results = []
117
112
 
118
- istek = await self.cffi.post(
113
+ istek = await self.httpx.post(
119
114
  url = "https://cehennempass.pw/process_quality_selection.php",
120
115
  headers = {
121
116
  "Referer" : f"https://cehennempass.pw/download/{video_id}",
@@ -132,7 +127,7 @@ class HDFilmCehennemi(PluginBase):
132
127
  "referer" : f"https://cehennempass.pw/download/{video_id}"
133
128
  })
134
129
 
135
- istek = await self.cffi.post(
130
+ istek = await self.httpx.post(
136
131
  url = "https://cehennempass.pw/process_quality_selection.php",
137
132
  headers = {
138
133
  "Referer" : f"https://cehennempass.pw/download/{video_id}",
@@ -151,10 +146,9 @@ class HDFilmCehennemi(PluginBase):
151
146
 
152
147
  return results
153
148
 
154
- #@kekik_cache(ttl=15*60)
155
149
  async def invoke_local_source(self, iframe: str, source: str, url: str):
156
- self.cffi.headers.update({"Referer": f"{self.main_url}/"})
157
- istek = await self.cffi.get(iframe)
150
+ self.httpx.headers.update({"Referer": f"{self.main_url}/"})
151
+ istek = await self.httpx.get(iframe)
158
152
 
159
153
  try:
160
154
  eval_func = re.compile(r'\s*(eval\(function[\s\S].*)\s*').findall(istek.text)[0]
@@ -182,9 +176,8 @@ class HDFilmCehennemi(PluginBase):
182
176
  "subtitles" : subtitles
183
177
  }]
184
178
 
185
- #@kekik_cache(ttl=15*60)
186
179
  async def load_links(self, url: str) -> list[dict]:
187
- istek = await self.cffi.get(url)
180
+ istek = await self.httpx.get(url)
188
181
  secici = Selector(istek.text)
189
182
 
190
183
  results = []
@@ -195,7 +188,7 @@ class HDFilmCehennemi(PluginBase):
195
188
  source = f"{link.css('::text').get().replace('(HDrip Xbet)', '').strip()} {lang_code}"
196
189
  video_id = link.css("::attr(data-video)").get()
197
190
 
198
- api_get = await self.cffi.get(
191
+ api_get = await self.httpx.get(
199
192
  url = f"{self.main_url}/video/{video_id}/",
200
193
  headers = {
201
194
  "Content-Type" : "application/json",
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
 
6
6
  class JetFilmizle(PluginBase):
@@ -19,7 +19,6 @@ class JetFilmizle(PluginBase):
19
19
  f"{main_url}/kategoriler/yesilcam-filmleri-izlee/page/" : "Yeşilçam Filmleri"
20
20
  }
21
21
 
22
- #@kekik_cache(ttl=60*60)
23
22
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
24
23
  istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
25
24
  secici = Selector(istek.text)
@@ -34,7 +33,6 @@ class JetFilmizle(PluginBase):
34
33
  for veri in secici.css("article.movie") if veri.css("h2 a::text, h3 a::text, h4 a::text, h5 a::text, h6 a::text").get()
35
34
  ]
36
35
 
37
- #@kekik_cache(ttl=60*60)
38
36
  async def search(self, query: str) -> list[SearchResult]:
39
37
  istek = await self.httpx.post(
40
38
  url = f"{self.main_url}/filmara.php",
@@ -60,7 +58,6 @@ class JetFilmizle(PluginBase):
60
58
 
61
59
  return results
62
60
 
63
- #@kekik_cache(ttl=60*60)
64
61
  async def load_item(self, url: str) -> MovieInfo:
65
62
  istek = await self.httpx.get(url)
66
63
  secici = Selector(istek.text)
@@ -92,7 +89,6 @@ class JetFilmizle(PluginBase):
92
89
  actors = actors
93
90
  )
94
91
 
95
- #@kekik_cache(ttl=15*60)
96
92
  async def load_links(self, url: str) -> list[dict]:
97
93
  istek = await self.httpx.get(url)
98
94
  secici = Selector(istek.text)