KekikStream 1.8.2__py3-none-any.whl → 1.8.4__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.
@@ -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
@@ -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)
@@ -58,7 +56,6 @@ class DiziYou(PluginBase):
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)
@@ -126,7 +123,6 @@ class DiziYou(PluginBase):
126
123
  actors = actors
127
124
  )
128
125
 
129
- #@kekik_cache(ttl=15*60)
130
126
  async def load_links(self, url: str) -> list[dict]:
131
127
  istek = await self.httpx.get(url)
132
128
  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, 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,35 +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}/dizi-turu/aile" : "Aile",
20
- f"{main_url}/dizi-turu/aksiyon" : "Aksiyon",
21
- f"{main_url}/dizi-turu/bilim-kurgu" : "Bilim Kurgu",
22
- f"{main_url}/dizi-turu/romantik" : "Romantik",
23
- 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",
24
34
  }
25
35
 
26
- #@kekik_cache(ttl=60*60)
27
36
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
28
- istek = await self.httpx.get(url)
29
- secici = Selector(istek.text)
30
-
31
37
  ana_sayfa = []
32
38
 
33
- 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", [])
34
43
  ana_sayfa.extend([
35
44
  MainPageResult(
36
45
  category = category,
37
- title = veri.css("span.font-normal::text").get(),
38
- url = self.fix_url(veri.css("a::attr(href)").get()),
39
- 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")),
40
49
  )
41
- for veri in secici.css("span.watchlistitem-")
50
+ for veri in veriler
42
51
  ])
43
52
  else:
53
+ istek = await self.httpx.get(url.replace("SAYFA", str(page)))
54
+ secici = Selector(istek.text)
55
+
44
56
  for veri in secici.css("div.tab-content > div.grid a"):
45
57
  name = veri.css("h2::text").get()
46
58
  ep_name = veri.xpath("normalize-space(//div[contains(@class, 'opacity-80')])").get()
@@ -87,7 +99,6 @@ class Dizilla(PluginBase):
87
99
  # JSON decode
88
100
  return loads(decrypted.decode("utf-8"))
89
101
 
90
- #@kekik_cache(ttl=60*60)
91
102
  async def search(self, query: str) -> list[SearchResult]:
92
103
  arama_istek = await self.httpx.post(f"{self.main_url}/api/bg/searchcontent?searchterm={query}")
93
104
  decrypted = await self.decrypt_response(arama_istek.json().get("response"))
@@ -102,7 +113,6 @@ class Dizilla(PluginBase):
102
113
  for veri in arama_veri
103
114
  ]
104
115
 
105
- #@kekik_cache(ttl=60*60)
106
116
  async def url_base_degis(self, eski_url:str, yeni_base:str) -> str:
107
117
  parsed_url = urlparse(eski_url)
108
118
  parsed_yeni_base = urlparse(yeni_base)
@@ -113,13 +123,12 @@ class Dizilla(PluginBase):
113
123
 
114
124
  return urlunparse(yeni_url)
115
125
 
116
- #@kekik_cache(ttl=60*60)
117
126
  async def load_item(self, url: str) -> SeriesInfo:
118
127
  istek = await self.httpx.get(url)
119
128
  secici = Selector(istek.text)
120
129
  veri = loads(secici.xpath("//script[@type='application/ld+json']/text()").getall()[-1])
121
130
 
122
- title = veri.get("name")
131
+ title = veri.get("name")
123
132
  if alt_title := veri.get("alternateName"):
124
133
  title += f" - ({alt_title})"
125
134
 
@@ -131,8 +140,8 @@ class Dizilla(PluginBase):
131
140
  tags_raw = secici.css("h3.text-white.opacity-60::text").get()
132
141
  tags = [t.strip() for t in tags_raw.split(",")] if tags_raw else []
133
142
 
134
- rating = veri.get("aggregateRating", {}).get("ratingValue")
135
- actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
143
+ rating = veri.get("aggregateRating", {}).get("ratingValue")
144
+ actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
136
145
 
137
146
  bolumler = []
138
147
  sezonlar = veri.get("containsSeason") if isinstance(veri.get("containsSeason"), list) else [veri.get("containsSeason")]
@@ -161,7 +170,6 @@ class Dizilla(PluginBase):
161
170
  actors = actors
162
171
  )
163
172
 
164
- #@kekik_cache(ttl=15*60)
165
173
  async def load_links(self, url: str) -> list[dict]:
166
174
  istek = await self.httpx.get(url)
167
175
  secici = Selector(istek.text)
@@ -184,4 +192,4 @@ class Dizilla(PluginBase):
184
192
  "name" : f"{extractor.name if extractor else 'Main Player'} | {result.get('language_name')}",
185
193
  })
186
194
 
187
- return links
195
+ return links
@@ -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
@@ -32,7 +32,6 @@ class HDFilmCehennemi(PluginBase):
32
32
  f"{main_url}/tur/romantik-filmleri-izle-1" : "Romantik Filmleri"
33
33
  }
34
34
 
35
- #@kekik_cache(ttl=60*60)
36
35
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
37
36
  istek = await self.cffi.get(f"{url}", allow_redirects=True)
38
37
  secici = Selector(istek.text)
@@ -47,7 +46,6 @@ class HDFilmCehennemi(PluginBase):
47
46
  for veri in secici.css("div.section-content a.poster")
48
47
  ]
49
48
 
50
- #@kekik_cache(ttl=60*60)
51
49
  async def search(self, query: str) -> list[SearchResult]:
52
50
  istek = await self.cffi.get(
53
51
  url = f"{self.main_url}/search/?q={query}",
@@ -76,7 +74,6 @@ class HDFilmCehennemi(PluginBase):
76
74
 
77
75
  return results
78
76
 
79
- #@kekik_cache(ttl=60*60)
80
77
  async def load_item(self, url: str) -> MovieInfo:
81
78
  istek = await self.cffi.get(url, headers = {"Referer": f"{self.main_url}/"})
82
79
  secici = Selector(istek.text)
@@ -111,7 +108,6 @@ class HDFilmCehennemi(PluginBase):
111
108
  def generate_random_cookie(self):
112
109
  return "".join(random.choices(string.ascii_letters + string.digits, k=16))
113
110
 
114
- #@kekik_cache(ttl=15*60)
115
111
  async def cehennempass(self, video_id: str) -> list[dict]:
116
112
  results = []
117
113
 
@@ -151,7 +147,6 @@ class HDFilmCehennemi(PluginBase):
151
147
 
152
148
  return results
153
149
 
154
- #@kekik_cache(ttl=15*60)
155
150
  async def invoke_local_source(self, iframe: str, source: str, url: str):
156
151
  self.cffi.headers.update({"Referer": f"{self.main_url}/"})
157
152
  istek = await self.cffi.get(iframe)
@@ -182,7 +177,6 @@ class HDFilmCehennemi(PluginBase):
182
177
  "subtitles" : subtitles
183
178
  }]
184
179
 
185
- #@kekik_cache(ttl=15*60)
186
180
  async def load_links(self, url: str) -> list[dict]:
187
181
  istek = await self.cffi.get(url)
188
182
  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
 
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)
@@ -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, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
4
4
  from json import dumps, loads
5
5
  import re
6
6
 
@@ -30,7 +30,6 @@ class RecTV(PluginBase):
30
30
  f"{main_url}/api/movie/by/filtres/5/created/SAYFA/{sw_key}/" : "Romantik"
31
31
  }
32
32
 
33
- #@kekik_cache(ttl=60*60)
34
33
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
35
34
  self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
36
35
  istek = await self.httpx.get(f"{url.replace('SAYFA', str(int(page) - 1))}")
@@ -46,7 +45,6 @@ class RecTV(PluginBase):
46
45
  for veri in veriler
47
46
  ]
48
47
 
49
- #@kekik_cache(ttl=60*60)
50
48
  async def search(self, query: str) -> list[SearchResult]:
51
49
  self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
52
50
  istek = await self.httpx.get(f"{self.main_url}/api/search/{query}/{self.sw_key}/")
@@ -67,7 +65,6 @@ class RecTV(PluginBase):
67
65
  for veri in tum_veri
68
66
  ]
69
67
 
70
- #@kekik_cache(ttl=60*60)
71
68
  async def load_item(self, url: str) -> MovieInfo:
72
69
  self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
73
70
  veri = loads(url)
@@ -119,7 +116,6 @@ class RecTV(PluginBase):
119
116
  actors = []
120
117
  )
121
118
 
122
- #@kekik_cache(ttl=15*60)
123
119
  async def load_links(self, url: str) -> list[dict]:
124
120
  try:
125
121
  veri = loads(url)
@@ -5,109 +5,202 @@ from parsel import Selector
5
5
  import re, base64, json, urllib.parse
6
6
 
7
7
  class SelcukFlix(PluginBase):
8
- name = "SelcukFlix"
9
- main_url = "https://selcukflix.net"
10
- lang = "tr"
11
-
8
+ name = "SelcukFlix"
9
+ lang = "tr"
10
+ main_url = "https://selcukflix.net"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Selcukflix'te her türden en yeni ve en popüler dizi ve filmleri izlemenin keyfini çıkarın. Aksiyondan romantiğe, bilim kurgudan dramaya, geniş kütüphanemizde herkes için bir şey var."
13
+
12
14
  main_page = {
13
- "tum-bolumler" : "Yeni Eklenen Bölümler"
15
+ f"{main_url}/tum-bolumler" : "Yeni Eklenen Bölümler",
16
+ "" : "Yeni Diziler",
17
+ "" : "Kore Dizileri",
18
+ "" : "Yerli Diziler",
19
+ "15" : "Aile",
20
+ "17" : "Animasyon",
21
+ "9" : "Aksiyon",
22
+ "5" : "Bilim Kurgu",
23
+ "2" : "Dram",
24
+ "12" : "Fantastik",
25
+ "18" : "Gerilim",
26
+ "3" : "Gizem",
27
+ "8" : "Korku",
28
+ "4" : "Komedi",
29
+ "7" : "Romantik"
14
30
  }
15
31
 
16
32
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
17
- full_url = f"{self.main_url}/{url}"
18
- resp = await self.httpx.get(full_url)
19
- sel = Selector(resp.text)
20
-
21
33
  results = []
22
34
  if "tum-bolumler" in url:
23
- for item in sel.css("div.col-span-3 a"):
24
- name = item.css("h2::text").get()
25
- ep_info = item.css("div.opacity-80::text").get()
26
- href = item.css("::attr(href)").get()
27
- poster = item.css("div.image img::attr(src)").get()
28
-
29
- if name and href:
30
- title = f"{name} - {ep_info}" if ep_info else name
31
- final_url = self.fix_url(href)
32
- if "/dizi/" in final_url and "/sezon-" in final_url:
33
- final_url = final_url.split("/sezon-")[0]
34
-
35
+ try:
36
+ resp = await self.httpx.get(url)
37
+ sel = Selector(resp.text)
38
+
39
+ for item in sel.css("div.col-span-3 a"):
40
+ name = item.css("h2::text").get()
41
+ ep_info = item.css("div.opacity-80::text").get()
42
+ href = item.css("::attr(href)").get()
43
+ poster = item.css("div.image img::attr(src)").get()
44
+
45
+ if name and href:
46
+ title = f"{name} - {ep_info}" if ep_info else name
47
+ final_url = self.fix_url(href)
48
+
49
+ if "/dizi/" in final_url and "/sezon-" in final_url:
50
+ final_url = final_url.split("/sezon-")[0]
51
+
52
+ results.append(MainPageResult(
53
+ category = category,
54
+ title = title,
55
+ url = final_url,
56
+ poster = self.fix_url(poster)
57
+ ))
58
+ except Exception:
59
+ pass
60
+ return results
61
+
62
+ base_api = f"{self.main_url}/api/bg/findSeries"
63
+
64
+ params = {
65
+ "releaseYearStart" : "1900",
66
+ "releaseYearEnd" : "2026",
67
+ "imdbPointMin" : "1",
68
+ "imdbPointMax" : "10",
69
+ "categoryIdsComma" : "",
70
+ "countryIdsComma" : "",
71
+ "orderType" : "date_desc",
72
+ "languageId" : "-1",
73
+ "currentPage" : page,
74
+ "currentPageCount" : "24",
75
+ "queryStr" : "",
76
+ "categorySlugsComma" : "",
77
+ "countryCodesComma" : ""
78
+ }
79
+
80
+ if "Yerli Diziler" in category:
81
+ params["imdbPointMin"] = "5"
82
+ params["countryIdsComma"] = "29"
83
+ elif "Kore Dizileri" in category:
84
+ params["countryIdsComma"] = "21"
85
+ params["countryCodesComma"] = "KR"
86
+ else:
87
+ params["categoryIdsComma"] = url
88
+
89
+ full_url = f"{base_api}?{urllib.parse.urlencode(params)}"
90
+
91
+ headers = {
92
+ "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0",
93
+ "Accept" : "application/json, text/plain, */*",
94
+ "Accept-Language" : "en-US,en;q=0.5",
95
+ "X-Requested-With" : "XMLHttpRequest",
96
+ "Sec-Fetch-Site" : "same-origin",
97
+ "Sec-Fetch-Mode" : "cors",
98
+ "Sec-Fetch-Dest" : "empty",
99
+ "Referer" : f"{self.main_url}/"
100
+ }
101
+
102
+ try:
103
+ post_resp = await self.httpx.post(full_url, headers=headers)
104
+ resp_json = post_resp.json()
105
+ response_data = resp_json.get("response")
106
+
107
+ raw_data = base64.b64decode(response_data)
108
+ try:
109
+ decoded_str = raw_data.decode('utf-8')
110
+ except UnicodeDecodeError:
111
+ decoded_str = raw_data.decode('iso-8859-1').encode('utf-8').decode('utf-8')
112
+
113
+ data = json.loads(decoded_str)
114
+
115
+ for item in data.get("result", []):
116
+ title = item.get("title")
117
+ slug = item.get("slug")
118
+ poster = item.get("poster")
119
+
120
+ if poster:
121
+ poster = self.clean_image_url(poster)
122
+
123
+ if slug:
35
124
  results.append(MainPageResult(
36
- category=category,
37
- title=title,
38
- url=final_url,
39
- poster=self.fix_url(poster)
125
+ category = category,
126
+ title = title,
127
+ url = self.fix_url(slug),
128
+ poster = poster
40
129
  ))
41
-
130
+
131
+ except Exception:
132
+ pass
133
+
42
134
  return results
43
135
 
44
136
  async def search(self, query: str) -> list[SearchResult]:
45
137
  search_url = f"{self.main_url}/api/bg/searchcontent?searchterm={query}"
46
-
138
+
47
139
  headers = {
48
- "Accept": "application/json, text/plain, */*",
49
- "X-Requested-With": "XMLHttpRequest",
50
- "Referer": f"{self.main_url}/"
140
+ "Accept" : "application/json, text/plain, */*",
141
+ "X-Requested-With" : "XMLHttpRequest",
142
+ "Referer" : f"{self.main_url}/"
51
143
  }
52
-
144
+
53
145
  post_resp = await self.httpx.post(search_url, headers=headers)
54
-
146
+
55
147
  try:
56
- resp_json = post_resp.json()
148
+ resp_json = post_resp.json()
57
149
  response_data = resp_json.get("response")
58
-
59
- raw_data = base64.b64decode(response_data)
150
+ raw_data = base64.b64decode(response_data)
60
151
  try:
61
152
  decoded_str = raw_data.decode('utf-8')
62
153
  except UnicodeDecodeError:
63
154
  decoded_str = raw_data.decode('iso-8859-1').encode('utf-8').decode('utf-8')
64
-
155
+
65
156
  search_data = json.loads(decoded_str)
66
-
157
+
67
158
  results = []
68
159
  for item in search_data.get("result", []):
69
- title = item.get("title")
70
- slug = item.get("slug")
160
+ title = item.get("title")
161
+ slug = item.get("slug")
71
162
  poster = item.get("poster")
163
+
72
164
  if poster:
73
165
  poster = self.clean_image_url(poster)
74
-
166
+
75
167
  if slug and "/seri-filmler/" not in slug:
76
168
  results.append(SearchResult(
77
- title=title,
78
- url=self.fix_url(slug),
79
- poster=poster
169
+ title = title,
170
+ url = self.fix_url(slug),
171
+ poster = poster
80
172
  ))
173
+
81
174
  return results
82
-
175
+
83
176
  except Exception:
84
177
  return []
85
178
 
86
179
  async def load_item(self, url: str) -> SeriesInfo:
87
180
  resp = await self.httpx.get(url)
88
181
  sel = Selector(resp.text)
89
-
182
+
90
183
  next_data = sel.css("script#__NEXT_DATA__::text").get()
91
184
  if not next_data:
92
185
  return None
93
-
94
- data = json.loads(next_data)
95
- secure_data = data["props"]["pageProps"]["secureData"]
96
- raw_data = base64.b64decode(secure_data.replace('"', ''))
186
+
187
+ data = json.loads(next_data)
188
+ secure_data = data["props"]["pageProps"]["secureData"]
189
+ raw_data = base64.b64decode(secure_data.replace('"', ''))
97
190
  try:
98
191
  decoded_str = raw_data.decode('utf-8')
99
192
  except UnicodeDecodeError:
100
193
  decoded_str = raw_data.decode('iso-8859-1') # .encode('utf-8').decode('utf-8') implied
101
-
194
+
102
195
  content_details = json.loads(decoded_str)
103
- item = content_details.get("contentItem", {})
104
-
105
- title = item.get("original_title") or item.get("originalTitle")
106
- poster = self.clean_image_url(item.get("poster_url") or item.get("posterUrl"))
107
- description = item.get("description") or item.get("used_description")
108
- rating = str(item.get("imdb_point") or item.get("imdbPoint", ""))
109
-
110
- series_data = content_details.get("relatedData", {}).get("seriesData")
196
+ item = content_details.get("contentItem", {})
197
+
198
+ title = item.get("original_title") or item.get("originalTitle")
199
+ poster = self.clean_image_url(item.get("poster_url") or item.get("posterUrl"))
200
+ description = item.get("description") or item.get("used_description")
201
+ rating = str(item.get("imdb_point") or item.get("imdbPoint", ""))
202
+
203
+ series_data = content_details.get("relatedData", {}).get("seriesData")
111
204
  if not series_data and "RelatedResults" in content_details:
112
205
  series_data = content_details["RelatedResults"].get("getSerieSeasonAndEpisodes", {}).get("result")
113
206
  if series_data and isinstance(series_data, list):
@@ -127,19 +220,19 @@ class SelcukFlix(PluginBase):
127
220
  ep_list = season.get("episodes", [])
128
221
  for ep in ep_list:
129
222
  episodes.append(Episode(
130
- season = s_no,
223
+ season = s_no,
131
224
  episode = ep.get("episode_no") or ep.get("episodeNo"),
132
- title = ep.get("ep_text") or ep.get("epText"),
133
- url = self.fix_url(ep.get("used_slug") or ep.get("usedSlug"))
225
+ title = ep.get("ep_text") or ep.get("epText"),
226
+ url = self.fix_url(ep.get("used_slug") or ep.get("usedSlug"))
134
227
  ))
135
228
 
136
229
  return SeriesInfo(
137
- title=title,
138
- url=url,
139
- poster=poster,
140
- description=description,
141
- rating=rating,
142
- episodes=episodes
230
+ title = title,
231
+ url = url,
232
+ poster = poster,
233
+ description = description,
234
+ rating = rating,
235
+ episodes = episodes
143
236
  )
144
237
 
145
238
  async def load_links(self, url: str) -> list[dict]:
@@ -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
 
6
6
  class SezonlukDizi(PluginBase):
@@ -21,7 +21,6 @@ class SezonlukDizi(PluginBase):
21
21
  f"{main_url}/diziler.asp?siralama_tipi=id&kat=6&s=" : "Belgeseller",
22
22
  }
23
23
 
24
- #@kekik_cache(ttl=60*60)
25
24
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
26
25
  istek = await self.httpx.get(f"{url}{page}")
27
26
  secici = Selector(istek.text)
@@ -36,7 +35,6 @@ class SezonlukDizi(PluginBase):
36
35
  for veri in secici.css("div.afis a") if veri.css("div.description::text").get()
37
36
  ]
38
37
 
39
- #@kekik_cache(ttl=60*60)
40
38
  async def search(self, query: str) -> list[SearchResult]:
41
39
  istek = await self.httpx.get(f"{self.main_url}/diziler.asp?adi={query}")
42
40
  secici = Selector(istek.text)
@@ -50,7 +48,6 @@ class SezonlukDizi(PluginBase):
50
48
  for afis in secici.css("div.afis a.column")
51
49
  ]
52
50
 
53
- #@kekik_cache(ttl=60*60)
54
51
  async def load_item(self, url: str) -> SeriesInfo:
55
52
  istek = await self.httpx.get(url)
56
53
  secici = Selector(istek.text)
@@ -102,7 +99,6 @@ class SezonlukDizi(PluginBase):
102
99
  actors = actors
103
100
  )
104
101
 
105
- #@kekik_cache(ttl=15*60)
106
102
  async def load_links(self, url: str) -> list[dict]:
107
103
  istek = await self.httpx.get(url)
108
104
  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, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
4
4
  import json
5
5
 
6
6
  class SineWix(PluginBase):
@@ -35,7 +35,6 @@ class SineWix(PluginBase):
35
35
  f"{main_url}/sinewix/movies/36" : "Tarih",
36
36
  }
37
37
 
38
- #@kekik_cache(ttl=60*60)
39
38
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
40
39
  istek = await self.httpx.get(f"{url}/{page}")
41
40
  veriler = istek.json()
@@ -50,7 +49,6 @@ class SineWix(PluginBase):
50
49
  for veri in veriler.get("data")
51
50
  ]
52
51
 
53
- #@kekik_cache(ttl=60*60)
54
52
  async def search(self, query: str) -> list[SearchResult]:
55
53
  istek = await self.httpx.get(f"{self.main_url}/sinewix/search/{query}")
56
54
 
@@ -63,7 +61,6 @@ class SineWix(PluginBase):
63
61
  for veri in istek.json().get("search")
64
62
  ]
65
63
 
66
- #@kekik_cache(ttl=60*60)
67
64
  async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
68
65
  item_type = url.split("?type=")[-1].split("&id=")[0]
69
66
  item_id = url.split("&id=")[-1]
@@ -126,7 +123,6 @@ class SineWix(PluginBase):
126
123
  episodes = episodes,
127
124
  )
128
125
 
129
- #@kekik_cache(ttl=15*60)
130
126
  async def load_links(self, url: str) -> list[dict]:
131
127
  try:
132
128
  veri = json.loads(url)
@@ -5,74 +5,95 @@ from parsel import Selector
5
5
  import re, json, urllib.parse
6
6
 
7
7
  class Sinefy(PluginBase):
8
- name = "Sinefy"
9
- main_url = "https://sinefy3.com"
10
- lang = "tr"
11
-
8
+ name = "Sinefy"
9
+ language = "tr"
10
+ main_url = "https://sinefy3.com"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Yabancı film izle olarak vizyondaki en yeni yabancı filmleri türkçe dublaj ve altyazılı olarak en hızlı şekilde full hd olarak sizlere sunuyoruz."
13
+
12
14
  main_page = {
13
- "page/" : "Son Eklenenler",
14
- "en-yenifilmler" : "Yeni Filmler",
15
- "netflix-filmleri-izle" : "Netflix Filmleri",
16
- "dizi-izle/netflix" : "Netflix Dizileri"
15
+ f"{main_url}/page/" : "Son Eklenenler",
16
+ f"{main_url}/en-yenifilmler" : "Yeni Filmler",
17
+ f"{main_url}/netflix-filmleri-izle" : "Netflix Filmleri",
18
+ f"{main_url}/dizi-izle/netflix" : "Netflix Dizileri",
19
+ f"{main_url}/gozat/filmler/animasyon" : "Animasyon",
20
+ f"{main_url}/gozat/filmler/komedi" : "Komedi",
21
+ f"{main_url}/gozat/filmler/suc" : "Suç",
22
+ f"{main_url}/gozat/filmler/aile" : "Aile",
23
+ f"{main_url}/gozat/filmler/aksiyon" : "Aksiyon",
24
+ f"{main_url}/gozat/filmler/macera" : "Macera",
25
+ f"{main_url}/gozat/filmler/fantastik" : "Fantastik",
26
+ f"{main_url}/gozat/filmler/korku" : "Korku",
27
+ f"{main_url}/gozat/filmler/romantik" : "Romantik",
28
+ f"{main_url}/gozat/filmler/savas" : "Savaş",
29
+ f"{main_url}/gozat/filmler/gerilim" : "Gerilim",
30
+ f"{main_url}/gozat/filmler/bilim-kurgu" : "Bilim Kurgu",
31
+ f"{main_url}/gozat/filmler/dram" : "Dram",
32
+ f"{main_url}/gozat/filmler/gizem" : "Gizem",
33
+ f"{main_url}/gozat/filmler/western" : "Western",
34
+ f"{main_url}/gozat/filmler/ulke/turkiye" : "Türk Filmleri",
35
+ f"{main_url}/gozat/filmler/ulke/kore" : "Kore Filmleri"
17
36
  }
18
37
 
19
38
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
20
39
  if "page/" in url:
21
- full_url = f"{self.main_url}/{url}{page}"
40
+ full_url = f"{url}{page}"
22
41
  elif "en-yenifilmler" in url or "netflix" in url:
23
- full_url = f"{self.main_url}/{url}/{page}"
42
+ full_url = f"{url}/{page}"
24
43
  else:
25
- full_url = f"{self.main_url}/{url}&page={page}"
26
-
44
+ full_url = f"{url}&page={page}"
45
+
27
46
  resp = await self.httpx.get(full_url)
28
- sel = Selector(resp.text)
29
-
47
+ sel = Selector(resp.text)
48
+
30
49
  results = []
31
50
  # Kotlin: div.poster-with-subject, div.dark-segment div.poster-md.poster
32
51
  for item in sel.css("div.poster-with-subject, div.dark-segment div.poster-md.poster"):
33
- title = item.css("h2::text").get()
34
- href = item.css("a::attr(href)").get()
35
- poster= item.css("img::attr(data-srcset)").get()
52
+ title = item.css("h2::text").get()
53
+ href = item.css("a::attr(href)").get()
54
+ poster = item.css("img::attr(data-srcset)").get()
36
55
  if poster:
37
56
  poster = poster.split(",")[0].split(" ")[0]
38
-
57
+
39
58
  if title and href:
40
59
  results.append(MainPageResult(
41
- category=category,
42
- title=title,
43
- url=self.fix_url(href),
44
- poster=self.fix_url(poster)
60
+ category = category,
61
+ title = title,
62
+ url = self.fix_url(href),
63
+ poster = self.fix_url(poster)
45
64
  ))
65
+
46
66
  return results
47
67
 
48
68
  async def search(self, query: str) -> list[SearchResult]:
49
69
  # Try to get dynamic keys from main page first
50
- c_key = "ca1d4a53d0f4761a949b85e51e18f096"
70
+ c_key = "ca1d4a53d0f4761a949b85e51e18f096"
51
71
  c_value = "MTc0NzI2OTAwMDU3ZTEwYmZjMDViNWFmOWIwZDViODg0MjU4MjA1ZmYxOThmZTYwMDdjMWQzMzliNzY5NzFlZmViMzRhMGVmNjgwODU3MGIyZA=="
52
-
72
+
53
73
  try:
54
74
  resp = await self.httpx.get(self.main_url)
55
- sel = Selector(resp.text)
56
- cke = sel.css("input[name='cKey']::attr(value)").get()
75
+ sel = Selector(resp.text)
76
+ cke = sel.css("input[name='cKey']::attr(value)").get()
57
77
  cval = sel.css("input[name='cValue']::attr(value)").get()
58
78
  if cke and cval:
59
- c_key = cke
79
+ c_key = cke
60
80
  c_value = cval
81
+
61
82
  except Exception:
62
83
  pass
63
84
 
64
85
  post_url = f"{self.main_url}/bg/searchcontent"
65
86
  data = {
66
- "cKey": c_key,
67
- "cValue": c_value,
68
- "searchTerm": query
87
+ "cKey" : c_key,
88
+ "cValue" : c_value,
89
+ "searchTerm" : query
69
90
  }
70
91
 
71
92
  headers = {
72
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
73
- "Accept": "application/json, text/javascript, */*; q=0.01",
74
- "X-Requested-With": "XMLHttpRequest",
75
- "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
93
+ "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
94
+ "Accept" : "application/json, text/javascript, */*; q=0.01",
95
+ "X-Requested-With" : "XMLHttpRequest",
96
+ "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8"
76
97
  }
77
98
 
78
99
  response = await self.httpx.post(post_url, data=data, headers=headers)
@@ -179,24 +200,24 @@ class Sinefy(PluginBase):
179
200
 
180
201
  if episodes:
181
202
  return SeriesInfo(
182
- title=title,
183
- url=url,
184
- poster=self.fix_url(poster),
185
- description=description,
186
- rating=rating,
187
- tags=tags,
188
- actors=actors,
189
- episodes=episodes
203
+ title = title,
204
+ url = url,
205
+ poster = self.fix_url(poster),
206
+ description = description,
207
+ rating = rating,
208
+ tags = tags,
209
+ actors = actors,
210
+ episodes = episodes
190
211
  )
191
212
  else:
192
213
  return MovieInfo(
193
- title=title,
194
- url=url,
195
- poster=self.fix_url(poster),
196
- description=description,
197
- rating=rating,
198
- tags=tags,
199
- actors=actors
214
+ title = title,
215
+ url = url,
216
+ poster = self.fix_url(poster),
217
+ description = description,
218
+ rating = rating,
219
+ tags = tags,
220
+ actors = actors
200
221
  )
201
222
 
202
223
  async def load_links(self, url: str) -> list[dict]:
@@ -208,7 +229,7 @@ class Sinefy(PluginBase):
208
229
  iframe = self.fix_url(iframe)
209
230
  extractor = self.ex_manager.find_extractor(iframe)
210
231
  return [{
211
- "url": iframe,
212
- "name": extractor.name if extractor else "Iframe"
232
+ "url" : iframe,
233
+ "name" : extractor.name if extractor else "Iframe"
213
234
  }]
214
235
  return []
@@ -5,95 +5,127 @@ from parsel import Selector
5
5
  import re, base64
6
6
 
7
7
  class Sinezy(PluginBase):
8
- name = "Sinezy"
9
- main_url = "https://sinezy.site"
10
- lang = "tr"
11
-
8
+ name = "Sinezy"
9
+ language = "tr"
10
+ main_url = "https://sinezy.fit"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Yerli ve yabancı film izle! Türkçe Dublaj ve Alt Yazılı Seçenekleriyle full hd film izlemek için En çok tercih edilen adres!"
13
+
12
14
  main_page = {
13
- "izle/en-yeni-filmler/" : "Yeni Filmler",
14
- "izle/en-yi-filmler/" : "En İyi Filmler"
15
+ f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
16
+ f"{main_url}/izle/en-yi-filmler/" : "En İyi Filmler",
17
+ f"{main_url}/izle/aksiyon-filmleri/" : "Aksiyon ",
18
+ f"{main_url}/izle/animasyon-filmleri/" : "Animasyon",
19
+ f"{main_url}/izle/belgesel-izle/" : "Belgesel",
20
+ f"{main_url}/izle/bilim-kurgu-filmleri/" : "Bilim Kurgu ",
21
+ f"{main_url}/izle/biyografi-filmleri/" : "Biyografi ",
22
+ f"{main_url}/izle/dram-filmleri/" : "Dram",
23
+ f"{main_url}/izle/erotik-film-izle/" : "Erotik ",
24
+ f"{main_url}/izle/fantastik-filmler/" : "Fantastik",
25
+ f"{main_url}/izle/gelecek-filmler/" : "Yakında",
26
+ f"{main_url}/izle/gerilim-filmleri/" : "Gerilim ",
27
+ f"{main_url}/izle/gizem-filmleri/" : "Gizem ",
28
+ f"{main_url}/izle/komedi-filmleri/" : "Komedi ",
29
+ f"{main_url}/izle/korku-filmleri/" : "Korku ",
30
+ f"{main_url}/izle/macera-filmleri/" : "Macera ",
31
+ f"{main_url}/izle/muzikal-izle/" : "Müzikal",
32
+ f"{main_url}/izle/romantik-film/" : "Romantik ",
33
+ f"{main_url}/izle/savas-filmleri/" : "Savaş ",
34
+ f"{main_url}/izle/spor-filmleri/" : "Spor ",
35
+ f"{main_url}/izle/suc-filmleri/" : "Suç ",
36
+ f"{main_url}/izle/tarih-filmleri/" : "Tarih ",
37
+ f"{main_url}/izle/turkce-altyazili-promo/" : "Altyazılı Pro",
38
+ f"{main_url}/izle/yabanci-dizi/" : "Yabancı Dizi",
39
+ f"{main_url}/izle/en-iyi-filmler/" : "En İyi Filmler",
40
+ f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
41
+ f"{main_url}/izle/yerli-filmler/" : "Yerli Filmler",
42
+ f"{main_url}/izle/yetiskin-film/" : "Yetişkin +18",
15
43
  }
16
44
 
17
45
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
18
- full_url = f"{self.main_url}/{url}page/{page}/"
19
- resp = await self.httpx.get(full_url)
20
- sel = Selector(resp.text)
46
+ full_url = f"{url}page/{page}/"
47
+ resp = await self.httpx.get(full_url)
48
+ sel = Selector(resp.text)
21
49
 
22
50
  results = []
23
51
  for item in sel.css("div.container div.content div.movie_box.move_k"):
24
- title = item.css("a::attr(title)").get()
25
- href = item.css("a::attr(href)").get()
26
- poster= item.css("img::attr(data-src)").get()
52
+ title = item.css("a::attr(title)").get()
53
+ href = item.css("a::attr(href)").get()
54
+ poster = item.css("img::attr(data-src)").get()
27
55
 
28
56
  if title and href:
29
57
  results.append(MainPageResult(
30
- category=category,
31
- title=title,
32
- url=self.fix_url(href),
33
- poster=self.fix_url(poster)
58
+ category = category,
59
+ title = title,
60
+ url = self.fix_url(href),
61
+ poster = self.fix_url(poster)
34
62
  ))
63
+
35
64
  return results
36
65
 
37
66
  async def search(self, query: str) -> list[SearchResult]:
38
- url = f"{self.main_url}/arama/?s={query}"
67
+ url = f"{self.main_url}/arama/?s={query}"
39
68
  resp = await self.httpx.get(url)
40
- sel = Selector(resp.text)
41
-
69
+ sel = Selector(resp.text)
70
+
42
71
  results = []
43
72
  for item in sel.css("div.movie_box.move_k"):
44
- title = item.css("a::attr(title)").get()
45
- href = item.css("a::attr(href)").get()
46
- poster= item.css("img::attr(data-src)").get()
47
-
73
+ title = item.css("a::attr(title)").get()
74
+ href = item.css("a::attr(href)").get()
75
+ poster = item.css("img::attr(data-src)").get()
76
+
48
77
  if title and href:
49
78
  results.append(SearchResult(
50
- title=title,
51
- url=self.fix_url(href),
52
- poster=self.fix_url(poster)
79
+ title = title,
80
+ url = self.fix_url(href),
81
+ poster = self.fix_url(poster)
53
82
  ))
83
+
54
84
  return results
55
85
 
56
86
  async def load_item(self, url: str) -> MovieInfo:
57
87
  resp = await self.httpx.get(url)
58
88
  sel = Selector(resp.text)
59
-
89
+
60
90
  title = sel.css("div.detail::attr(title)").get()
61
91
  poster = sel.css("div.move_k img::attr(data-src)").get()
62
92
  description = sel.css("div.desc.yeniscroll p::text").get()
63
93
  rating = sel.css("span.info span.imdb::text").get()
64
-
65
- tags = sel.css("div.detail span a::text").getall()
66
- actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
67
-
94
+
95
+ tags = sel.css("div.detail span a::text").getall()
96
+ actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
97
+
68
98
  return MovieInfo(
69
- title=title,
70
- url=url,
71
- poster=self.fix_url(poster),
72
- description=description,
73
- tags=tags,
74
- rating=rating,
75
- actors=actors
99
+ title = title,
100
+ url = url,
101
+ poster = self.fix_url(poster),
102
+ description = description,
103
+ tags = tags,
104
+ rating = rating,
105
+ actors = actors
76
106
  )
77
107
 
78
108
  async def load_links(self, url: str) -> list[dict]:
79
109
  resp = await self.httpx.get(url)
80
-
110
+
81
111
  match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
82
112
  if match:
83
113
  encoded = match.group(1)
84
114
  try:
85
115
  decoded = base64.b64decode(encoded).decode('utf-8')
86
116
  iframe_match = re.search(r'src="([^"]*)"', decoded)
117
+
87
118
  if iframe_match:
88
119
  iframe = iframe_match.group(1)
89
120
  iframe = self.fix_url(iframe)
90
121
 
91
122
  extractor = self.ex_manager.find_extractor(iframe)
123
+
92
124
  return [{
93
- "url": iframe,
94
- "name": extractor.name if extractor else "Iframe"
125
+ "url" : iframe,
126
+ "name" : extractor.name if extractor else "Iframe"
95
127
  }]
96
128
  except Exception:
97
129
  pass
98
-
130
+
99
131
  return []
@@ -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 UgurFilm(PluginBase):
@@ -23,7 +23,6 @@ class UgurFilm(PluginBase):
23
23
  f"{main_url}/category/erotik/page/" : "Erotik"
24
24
  }
25
25
 
26
- #@kekik_cache(ttl=60*60)
27
26
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
28
27
  istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
29
28
  secici = Selector(istek.text)
@@ -38,7 +37,6 @@ class UgurFilm(PluginBase):
38
37
  for veri in secici.css("div.icerik div") if veri.css("span:nth-child(1)::text").get()
39
38
  ]
40
39
 
41
- #@kekik_cache(ttl=60*60)
42
40
  async def search(self, query: str) -> list[SearchResult]:
43
41
  istek = await self.httpx.get(f"{self.main_url}/?s={query}")
44
42
  secici = Selector(istek.text)
@@ -60,7 +58,6 @@ class UgurFilm(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)
@@ -82,7 +79,6 @@ class UgurFilm(PluginBase):
82
79
  actors = actors,
83
80
  )
84
81
 
85
- #@kekik_cache(ttl=15*60)
86
82
  async def load_links(self, url: str) -> list[dict]:
87
83
  istek = await self.httpx.get(url)
88
84
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 1.8.2
3
+ Version: 1.8.4
4
4
  Summary: terminal üzerinden medya içeriği aramanızı ve VLC/MPV gibi popüler medya oynatıcılar aracılığıyla doğrudan izlemenizi sağlayan modüler ve genişletilebilir bir bıdı bıdı
5
5
  Home-page: https://github.com/keyiflerolsun/KekikStream
6
6
  Author: keyiflerolsun
@@ -55,31 +55,31 @@ KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0
55
55
  KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
56
56
  KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
57
57
  KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
58
- KekikStream/Plugins/DiziBox.py,sha256=x7lChsXwaKbWeIPs9uN-jU1ZlVG73a7_1H5_emoPlUQ,10092
58
+ KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
59
59
  KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
60
- KekikStream/Plugins/DiziYou.py,sha256=Gj4PKMKHLO7yOfGt-W9XjXjGpYwnhiJGdzt0-mqMMiM,9145
61
- KekikStream/Plugins/Dizilla.py,sha256=VrpX875q5zp27w0zWgN4NE-ImpuIGAFWxzVhVITbAl0,7588
60
+ KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
61
+ KekikStream/Plugins/Dizilla.py,sha256=jDklWkUrrAGhDO9pMvgIXVcKdSHDHlguu0JgifM7Bx8,11546
62
62
  KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
63
- KekikStream/Plugins/FilmMakinesi.py,sha256=CdV4k44dw0Q4rO3x4GobSDT1KGrkgit0OfTPxZfmfJ8,5314
63
+ KekikStream/Plugins/FilmMakinesi.py,sha256=izPKGbqQuA6AmLAnFjlBoe8iwnNOrr0Pcy5L2dZfM78,5185
64
64
  KekikStream/Plugins/FilmModu.py,sha256=b27hchMoYZwG3I-kM1sveW7rHKOF5OuepdjPgKIehEM,6706
65
65
  KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
66
- KekikStream/Plugins/FullHDFilmizlesene.py,sha256=UYOMLJqbH72gkXWizNV3gWLZHATWeC6h8YaqThgGduI,6281
67
- KekikStream/Plugins/HDFilmCehennemi.py,sha256=cI8pQEPF0xo9vVI2fCPktjvCuH8N8f5lI0GwT3bwy8Y,9827
68
- KekikStream/Plugins/JetFilmizle.py,sha256=0UgHnBTkd4mMXKSLjYxAixFMGXrVa0qOLqYiLb6RKZQ,6092
66
+ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=FAacwtXo72DIl_1bHWgHPIxqmqBJAVPtNQ3yIZPYjlU,6152
67
+ KekikStream/Plugins/HDFilmCehennemi.py,sha256=iPNAdwB5P4yVG3UJOfOad9NMeO8JNhov84JoZp_nLK0,9640
68
+ KekikStream/Plugins/JetFilmizle.py,sha256=3tcx4ZT7oQs_xolhQeiqgirpWtknBjP7J7Qgy0bvIeM,5963
69
69
  KekikStream/Plugins/KultFilmler.py,sha256=VZET3RUoOVYKE-C2YbkMW8oNcxz6zE2pR7a3z-B4nD4,8987
70
- KekikStream/Plugins/RecTV.py,sha256=dJBHc0Um-hizxj__lz3To0mA7An86YpoN3hZPX4xJic,7673
70
+ KekikStream/Plugins/RecTV.py,sha256=dF3Ogf7KE_zpfLQRjVcEJQMuWtBtHo6iB73_ECQEJ58,7544
71
71
  KekikStream/Plugins/RoketDizi.py,sha256=C6ID2sfEwf0Tw8_tO-pc1nx8TB0Ii_rCVRzlHA7E-oA,8547
72
- KekikStream/Plugins/SelcukFlix.py,sha256=F3Rv2TRpfM-SZUAqjTPsQChS_Ejoh5q1Mo5fBFlsLy0,9013
73
- KekikStream/Plugins/SezonlukDizi.py,sha256=IomeNsVlji1TCimv8JwdMquKLcxZwwJQOZYzJ5v0OdE,6455
74
- KekikStream/Plugins/SineWix.py,sha256=dPFUlHece9zo57Xjttdp_w-K9J_d1_8C-U6u1twWLh8,7493
75
- KekikStream/Plugins/Sinefy.py,sha256=mRwtQYiH7I_1k4EZS0g4MhnRDEx0NXwY8sa5tI33dog,8368
72
+ KekikStream/Plugins/SelcukFlix.py,sha256=WYVtGMxngpqrXk7PX_B4ya6Pji7dOjQsXoukk30f2d0,12744
73
+ KekikStream/Plugins/SezonlukDizi.py,sha256=dT2xPPkdaYV43qsL4Le_5Yel8eoPkHtnXIOXqz-Ya-c,6326
74
+ KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
75
+ KekikStream/Plugins/Sinefy.py,sha256=YMwG7ykdjzAY_GEvV4xv9NJ6ubew7qeMLz4KkvYpaNk,9749
76
76
  KekikStream/Plugins/SinemaCX.py,sha256=DUvYa7J4a2D5ivLO_sQiaStoV5FDxmz8onJyFwAidvY,7177
77
- KekikStream/Plugins/Sinezy.py,sha256=t7InHEtKdIVyBQj8HJWwWcHhRP9AXKKXYE0O3YD8MYg,3647
77
+ KekikStream/Plugins/Sinezy.py,sha256=EttAZogKoKMP8RP_X1fSfi8vVxA2RWizwgnLkmnhERQ,5675
78
78
  KekikStream/Plugins/SuperFilmGeldi.py,sha256=Ohm21BPsJH_S1tx5i2APEgAOD25k2NiwRP7rSgAKvRs,5289
79
- KekikStream/Plugins/UgurFilm.py,sha256=BUoDQOQF6tsj2tZj06OL9ga7j_oj116p3C2GQsnMXTU,4961
80
- kekikstream-1.8.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
81
- kekikstream-1.8.2.dist-info/METADATA,sha256=nXpNw-DQqIKw6ni5DSDAtdPUR913PoRoS5h-Hi4En7I,4983
82
- kekikstream-1.8.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
83
- kekikstream-1.8.2.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
84
- kekikstream-1.8.2.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
85
- kekikstream-1.8.2.dist-info/RECORD,,
79
+ KekikStream/Plugins/UgurFilm.py,sha256=eKGzmSi8k_QbXnYPWXZRdmCxxc32zZh4rynmdxCbm1o,4832
80
+ kekikstream-1.8.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
81
+ kekikstream-1.8.4.dist-info/METADATA,sha256=dmWG5qnauBIV5QUU-wFXlsHcF35UeyN-IvIJ35H8TMQ,4983
82
+ kekikstream-1.8.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
83
+ kekikstream-1.8.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
84
+ kekikstream-1.8.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
85
+ kekikstream-1.8.4.dist-info/RECORD,,