KekikStream 2.0.2__py3-none-any.whl → 2.0.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.
@@ -2,7 +2,6 @@
2
2
 
3
3
  from KekikStream.Extractors.ContentX import ContentX
4
4
 
5
- # DPlayer82 Family - https://dplayer82.site subdomains
6
5
  class SNDPlayer(ContentX):
7
6
  name = "SNDPlayer"
8
7
  main_url = "https://sn.dplayer82.site"
@@ -15,26 +14,42 @@ class ORGDPlayer(ContentX):
15
14
  name = "ORGDPlayer"
16
15
  main_url = "https://org.dplayer82.site"
17
16
 
18
- # Hotlinger
17
+ class SNDPlayer74(ContentX):
18
+ name = "SNDPlayer74"
19
+ main_url = "https://sn.dplayer74.site"
20
+
19
21
  class Hotlinger(ContentX):
20
22
  name = "Hotlinger"
21
23
  main_url = "https://hotlinger.com"
22
24
 
23
- # Pichive Family
25
+ class SNHotlinger(ContentX):
26
+ name = "SNHotlinger"
27
+ main_url = "https://sn.hotlinger.com"
28
+
29
+ class PlayRu(ContentX):
30
+ name = "PlayRu"
31
+ main_url = "https://playru.net"
32
+
33
+ class FourPlayRu(ContentX):
34
+ name = "FourPlayRu"
35
+ main_url = "https://four.playru.net"
36
+
24
37
  class Pichive(ContentX):
25
38
  name = "Pichive"
39
+ main_url = "https://pichive.online"
40
+
41
+ class PichiveMe(ContentX):
42
+ name = "PichiveMe"
26
43
  main_url = "https://pichive.me"
27
44
 
28
- class FourPichive(ContentX):
45
+ class FourPichiveOnline(ContentX):
46
+ name = "FourPichiveOnline"
47
+ main_url = "https://four.pichive.online"
48
+
49
+ class FourPichiveMe(ContentX):
29
50
  name = "FourPichive"
30
51
  main_url = "https://four.pichive.me"
31
52
 
32
- # PlayRu Family
33
- class FourPlayRu(ContentX):
34
- name = "FourPlayRu"
35
- main_url = "https://four.playru.net"
36
-
37
- # CX Family
38
53
  class FourCX(ContentX):
39
54
  name = "FourCX"
40
55
  main_url = "https://four.contentx.me"
@@ -78,40 +78,40 @@ class YTDLP(ExtractorBase):
78
78
  return True
79
79
 
80
80
  # SLOW PATH: Diğer siteler için yt-dlp'nin native kontrolü
81
- try:
82
- # stderr'ı geçici olarak kapat (hata mesajlarını gizle)
83
- old_stderr = sys.stderr
84
- sys.stderr = open(os.devnull, "w")
85
-
86
- try:
87
- ydl_opts = {
88
- "simulate" : True, # Download yok, sadece tespit
89
- "quiet" : True, # Log kirliliği yok
90
- "no_warnings" : True, # Uyarı mesajları yok
91
- "extract_flat" : True, # Minimal işlem
92
- "no_check_certificates" : True,
93
- "ignoreerrors" : True, # Hataları yoksay
94
- "socket_timeout" : 3,
95
- "retries" : 1
96
- }
97
-
98
- with yt_dlp.YoutubeDL(ydl_opts) as ydl:
99
- # URL'yi işleyebiliyor mu kontrol et
100
- info = ydl.extract_info(url, download=False, process=False)
101
-
102
- # Generic extractor ise atla
103
- if info and info.get("extractor_key") != "Generic":
104
- return True
105
-
106
- return False
107
- finally:
108
- # stderr'ı geri yükle
109
- sys.stderr.close()
110
- sys.stderr = old_stderr
111
-
112
- except Exception:
81
+ # try:
82
+ # # stderr'ı geçici olarak kapat (hata mesajlarını gizle)
83
+ # old_stderr = sys.stderr
84
+ # sys.stderr = open(os.devnull, "w")
85
+
86
+ # try:
87
+ # ydl_opts = {
88
+ # "simulate" : True, # Download yok, sadece tespit
89
+ # "quiet" : True, # Log kirliliği yok
90
+ # "no_warnings" : True, # Uyarı mesajları yok
91
+ # "extract_flat" : True, # Minimal işlem
92
+ # "no_check_certificates" : True,
93
+ # "ignoreerrors" : True, # Hataları yoksay
94
+ # "socket_timeout" : 3,
95
+ # "retries" : 1
96
+ # }
97
+
98
+ # with yt_dlp.YoutubeDL(ydl_opts) as ydl:
99
+ # # URL'yi işleyebiliyor mu kontrol et
100
+ # info = ydl.extract_info(url, download=False, process=False)
101
+
102
+ # # Generic extractor ise atla
103
+ # if info and info.get("extractor_key") != "Generic":
104
+ # return True
105
+
106
+ # return False
107
+ # finally:
108
+ # # stderr'ı geri yükle
109
+ # sys.stderr.close()
110
+ # sys.stderr = old_stderr
111
+
112
+ # except Exception:
113
113
  # yt-dlp işleyemezse False döndür
114
- return False
114
+ return False
115
115
 
116
116
  async def extract(self, url: str, referer: str | None = None) -> ExtractResult:
117
117
  ydl_opts = {
@@ -179,17 +179,25 @@ class Dizilla(PluginBase):
179
179
  decrypted = await self.decrypt_response(secure_data)
180
180
  results = decrypted.get("RelatedResults", {}).get("getEpisodeSources", {}).get("result", [])
181
181
 
182
- links = []
183
- for result in results:
184
- iframe_src = Selector(result.get("source_content")).css("iframe::attr(src)").get()
185
- iframe_url = self.fix_url(iframe_src)
186
- if not iframe_url:
187
- continue
188
-
189
- extractor = self.ex_manager.find_extractor(iframe_url)
190
- links.append({
191
- "url" : iframe_url,
192
- "name" : f"{extractor.name if extractor else 'Main Player'} | {result.get('language_name')}",
193
- })
194
-
195
- return links
182
+ if not results:
183
+ return []
184
+
185
+ # Get first source (matching Kotlin)
186
+ first_result = results[0]
187
+ source_content = first_result.get("source_content", "")
188
+
189
+ # Clean the source_content string (matching Kotlin: .replace("\"", "").replace("\\", ""))
190
+ cleaned_source = source_content.replace('"', '').replace('\\', '')
191
+
192
+ # Parse cleaned HTML
193
+ iframe_src = Selector(cleaned_source).css("iframe::attr(src)").get()
194
+ iframe_url = self.fix_url(iframe_src)
195
+
196
+ if not iframe_url:
197
+ return []
198
+
199
+ extractor = self.ex_manager.find_extractor(iframe_url)
200
+ return [{
201
+ "url" : iframe_url,
202
+ "name" : f"{extractor.name if extractor else 'Main Player'} | {first_result.get('language_name', 'Unknown')}",
203
+ }]
@@ -8,7 +8,7 @@ class FilmMakinesi(PluginBase):
8
8
  language = "tr"
9
9
  main_url = "https://filmmakinesi.to"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
- description = "Film Makinesi, en yeni ve en güncel filmleri sitemizde full HD kalite farkı ile izleyebilirsiniz. HD film izle denildiğinde akla gelen en kaliteli film izleme sitesi."
11
+ description = "Film Makinesi ile en yeni ve güncel filmleri Full HD kalite farkı ile izleyebilirsiniz. Film izle denildiğinde akla gelen en kaliteli film sitesi."
12
12
 
13
13
  main_page = {
14
14
  f"{main_url}/filmler-1/" : "Son Filmler",
@@ -9,7 +9,7 @@ class FilmModu(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://www.filmmodu.ws"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
- description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
12
+ description = "Film modun geldiyse yüksek kalitede yeni filmleri izle, 1080p izleyebileceğiniz reklamsız tek film sitesi."
13
13
 
14
14
  main_page = {
15
15
  f"{main_url}/hd-film-kategori/4k-film-izle?page=SAYFA" : "4K",
@@ -91,9 +91,13 @@ class FilmModu(PluginBase):
91
91
  istek = await self.httpx.get(url)
92
92
  secici = Selector(istek.text)
93
93
 
94
+ alternates = secici.css("div.alternates a")
95
+ if not alternates:
96
+ return [] # No alternates available
97
+
94
98
  results = []
95
99
 
96
- for alternatif in secici.css("div.alternates a"):
100
+ for alternatif in alternates:
97
101
  alt_link = self.fix_url(alternatif.css("::attr(href)").get())
98
102
  alt_name = alternatif.css("::text").get()
99
103
 
@@ -10,7 +10,7 @@ class FullHDFilmizlesene(PluginBase):
10
10
  language = "tr"
11
11
  main_url = "https://www.fullhdfilmizlesene.tv"
12
12
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
- description = "Sinema zevkini evinize kadar getirdik. Türkiye'nin lider Film sitesinde, en yeni filmleri Full HD izleyin."
13
+ description = "Türkiye'nin ilk ve lider HD film izleme platformu, kaliteli ve sorunsuz hizmetiyle sinema keyfini zirveye taşır."
14
14
 
15
15
  main_page = {
16
16
  f"{main_url}/en-cok-izlenen-hd-filmler/" : "En Çok izlenen Filmler",
@@ -10,7 +10,7 @@ class HDFilmCehennemi(PluginBase):
10
10
  language = "tr"
11
11
  main_url = "https://www.hdfilmcehennemi.ws"
12
12
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
- description = "Türkiye'nin en hızlı hd film izleme sitesi"
13
+ description = "Türkiye'nin en hızlı hd film izleme sitesi. Tek ve gerçek hdfilmcehennemi sitesi."
14
14
 
15
15
 
16
16
 
@@ -8,7 +8,7 @@ class JetFilmizle(PluginBase):
8
8
  language = "tr"
9
9
  main_url = "https://jetfilmizle.website"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
- description = "Binlerce Film İzleme Seçeneğiyle En İyi Film İzleme Sitesi"
11
+ description = "Film izle, Yerli, Yabancı film izle, Türkçe dublaj, alt yazılı seçenekleriyle ödül almış filmleri Full HD kalitesiyle ve jetfilmizle hızıyla donmadan ücretsizce izleyebilirsiniz."
12
12
 
13
13
  main_page = {
14
14
  f"{main_url}/page/" : "Son Filmler",
@@ -9,7 +9,7 @@ class KultFilmler(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://kultfilmler.net"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
- description = "Kült film ve dizi izleme sitesi."
12
+ description = "Kült Filmler özenle en iyi filmleri derler ve iyi bir altyazılı film izleme deneyimi sunmayı amaçlar. Reklamsız 1080P Altyazılı Film izle..."
13
13
 
14
14
  main_page = {
15
15
  f"{main_url}/category/aile-filmleri-izle" : "Aile",
@@ -7,7 +7,7 @@ import re
7
7
  class RecTV(PluginBase):
8
8
  name = "RecTV"
9
9
  language = "tr"
10
- main_url = "https://m.prectv60.lol"
10
+ main_url = "https://m.prectv50.sbs"
11
11
  favicon = "https://rectvapk.cc/wp-content/uploads/2023/02/Rec-TV.webp"
12
12
  description = "RecTv APK, Türkiye’deki en popüler Çevrimiçi Medya Akış platformlarından biridir. Filmlerin, Canlı Sporların, Web Dizilerinin ve çok daha fazlasının keyfini ücretsiz çıkarın."
13
13
 
@@ -185,6 +185,7 @@ class RoketDizi(PluginBase):
185
185
  # secureData içindeki RelatedResults -> getEpisodeSources -> result dizisini al
186
186
  sources = decoded_json.get("RelatedResults", {}).get("getEpisodeSources", {}).get("result", [])
187
187
 
188
+ seen_urls = set()
188
189
  results = []
189
190
  for source in sources:
190
191
  source_content = source.get("source_content", "")
@@ -195,35 +196,27 @@ class RoketDizi(PluginBase):
195
196
  continue
196
197
 
197
198
  iframe_url = iframe_match.group(1)
198
- if "http" not in iframe_url:
199
- if iframe_url.startswith("//"):
200
- iframe_url = "https:" + iframe_url
201
- else:
202
- iframe_url = "https://" + iframe_url
199
+
200
+ # Fix URL protocol
201
+ if not iframe_url.startswith("http"):
202
+ if iframe_url.startswith("//"):
203
+ iframe_url = "https:" + iframe_url
204
+ else:
205
+ iframe_url = "https://" + iframe_url
206
+
207
+ iframe_url = self.fix_url(iframe_url)
208
+
209
+ # Deduplicate
210
+ if iframe_url in seen_urls:
211
+ continue
212
+ seen_urls.add(iframe_url)
203
213
 
204
214
  # Check extractor
205
215
  extractor = self.ex_manager.find_extractor(iframe_url)
206
- ext_name = extractor.name if extractor else ""
207
-
208
- # Metadata'dan bilgileri al
209
- source_name = source.get("source_name", "")
210
- language_name = source.get("language_name", "")
211
- quality_name = source.get("quality_name", "")
212
-
213
- # İsmi oluştur
214
- name_parts = []
215
- if source_name:
216
- name_parts.append(source_name)
217
- if ext_name:
218
- name_parts.append(ext_name)
219
- if language_name:
220
- name_parts.append(language_name)
221
- if quality_name:
222
- name_parts.append(quality_name)
223
-
216
+
224
217
  results.append({
225
218
  "url" : iframe_url,
226
- "name" : " | ".join(name_parts)
219
+ "name" : extractor.name if extractor else "Player"
227
220
  })
228
221
 
229
222
  return results
@@ -9,7 +9,7 @@ class SelcukFlix(PluginBase):
9
9
  lang = "tr"
10
10
  main_url = "https://selcukflix.net"
11
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."
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
13
 
14
14
  main_page = {
15
15
  f"{main_url}/tum-bolumler" : "Yeni Eklenen Bölümler",
@@ -240,60 +240,59 @@ class SelcukFlix(PluginBase):
240
240
  sel = Selector(resp.text)
241
241
 
242
242
  next_data = sel.css("script#__NEXT_DATA__::text").get()
243
- if not next_data: return []
243
+ if not next_data:
244
+ return []
244
245
 
245
246
  try:
246
- data = json.loads(next_data)
247
- secure_data = data["props"]["pageProps"]["secureData"]
248
- raw_data = base64.b64decode(secure_data.replace('"', ''))
249
- try:
250
- decoded_str = raw_data.decode('utf-8')
251
- except UnicodeDecodeError:
252
- decoded_str = raw_data.decode('iso-8859-1')
247
+ data = json.loads(next_data)
248
+ secure_data = data["props"]["pageProps"]["secureData"]
249
+ raw_data = base64.b64decode(secure_data.replace('"', ''))
250
+
251
+ # Try UTF-8 first, fallback to ISO-8859-1 (matching Kotlin)
252
+ try:
253
+ decoded_str = raw_data.decode('utf-8')
254
+ except UnicodeDecodeError:
255
+ decoded_str = raw_data.decode('iso-8859-1')
253
256
 
254
- content_details = json.loads(decoded_str)
255
- related_data = content_details.get("relatedData", {})
256
-
257
- source_content = None
258
-
259
- # Check if Series (episode) or Movie
260
- if "/dizi/" in url:
261
- if related_data.get("episodeSources", {}).get("state"):
262
- res = related_data["episodeSources"].get("result", [])
263
- if res:
264
- source_content = res[0].get("sourceContent")
265
- else:
266
- # Movie
267
- if related_data.get("movieParts", {}).get("state"):
268
- # Looking for first part source
269
- movie_parts = related_data["movieParts"].get("result", [])
270
- if movie_parts:
271
- first_part_id = movie_parts[0].get("id")
272
- # RelatedResults -> getMoviePartSourcesById_ID
273
- rr = content_details.get("RelatedResults", {})
274
- key = f"getMoviePartSourcesById_{first_part_id}"
275
- if key in rr:
276
- res = rr[key].get("result", [])
277
- if res:
278
- source_content = res[0].get("source_content")
279
-
280
- results = []
281
- if source_content:
282
- iframe_sel = Selector(source_content)
283
- iframe_src = iframe_sel.css("iframe::attr(src)").get()
284
- if iframe_src:
285
- iframe_src = self.fix_url(iframe_src)
286
- # Domain replace
287
- if "sn.dplayer74.site" in iframe_src:
288
- iframe_src = iframe_src.replace("sn.dplayer74.site", "sn.hotlinger.com")
289
-
290
- extractor = self.ex_manager.find_extractor(iframe_src)
291
- results.append({
292
- "url": iframe_src,
293
- "name": extractor.name if extractor else "Iframe"
294
- })
295
-
296
- return results
257
+ content_details = json.loads(decoded_str)
258
+ related_data = content_details.get("relatedData", {})
259
+
260
+ source_content = None
261
+
262
+ # Check if Series (episode) or Movie
263
+ if "/dizi/" in url:
264
+ if related_data.get("episodeSources", {}).get("state"):
265
+ res = related_data["episodeSources"].get("result", [])
266
+ if res:
267
+ source_content = res[0].get("sourceContent")
268
+ else:
269
+ # Movie
270
+ if related_data.get("movieParts", {}).get("state"):
271
+ movie_parts = related_data["movieParts"].get("result", [])
272
+ if movie_parts:
273
+ first_part_id = movie_parts[0].get("id")
274
+ # RelatedResults -> getMoviePartSourcesById_ID
275
+ rr = content_details.get("RelatedResults", {})
276
+ key = f"getMoviePartSourcesById_{first_part_id}"
277
+ if key in rr:
278
+ res = rr[key].get("result", [])
279
+ if res:
280
+ source_content = res[0].get("source_content")
281
+
282
+ if source_content:
283
+ iframe_sel = Selector(source_content)
284
+ iframe_src = iframe_sel.css("iframe::attr(src)").get()
285
+ if iframe_src:
286
+ iframe_src = self.fix_url(iframe_src)
287
+ extractor = self.ex_manager.find_extractor(iframe_src)
288
+
289
+ if extractor: # Only return if extractor found
290
+ return [{
291
+ "url" : iframe_src,
292
+ "name" : extractor.name
293
+ }]
294
+
295
+ return []
297
296
 
298
297
  except Exception:
299
298
  return []
@@ -2,6 +2,7 @@
2
2
 
3
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
4
4
  from parsel import Selector
5
+ import re
5
6
 
6
7
  class SezonlukDizi(PluginBase):
7
8
  name = "SezonlukDizi"
@@ -99,6 +100,20 @@ class SezonlukDizi(PluginBase):
99
100
  actors = actors
100
101
  )
101
102
 
103
+ async def get_asp_data(self) -> tuple[str, str]:
104
+ """Fetch dynamic ASP version numbers from site.min.js"""
105
+ try:
106
+ js_content = await self.httpx.get(f"{self.main_url}/js/site.min.js")
107
+ alternatif_match = re.search(r'dataAlternatif(.*?)\.asp', js_content.text)
108
+ embed_match = re.search(r'dataEmbed(.*?)\.asp', js_content.text)
109
+
110
+ alternatif_ver = alternatif_match.group(1) if alternatif_match else "22"
111
+ embed_ver = embed_match.group(1) if embed_match else "22"
112
+
113
+ return (alternatif_ver, embed_ver)
114
+ except Exception:
115
+ return ("22", "22") # Fallback to default versions
116
+
102
117
  async def load_links(self, url: str) -> list[dict]:
103
118
  istek = await self.httpx.get(url)
104
119
  secici = Selector(istek.text)
@@ -107,10 +122,13 @@ class SezonlukDizi(PluginBase):
107
122
  if not bid:
108
123
  return []
109
124
 
125
+ # Get dynamic ASP versions
126
+ alternatif_ver, embed_ver = await self.get_asp_data()
127
+
110
128
  results = []
111
129
  for dil, label in [("1", "Altyazı"), ("0", "Dublaj")]:
112
130
  dil_istek = await self.httpx.post(
113
- url = f"{self.main_url}/ajax/dataAlternatif22.asp",
131
+ url = f"{self.main_url}/ajax/dataAlternatif{alternatif_ver}.asp",
114
132
  headers = {"X-Requested-With": "XMLHttpRequest"},
115
133
  data = {"bid": bid, "dil": dil},
116
134
  )
@@ -123,7 +141,7 @@ class SezonlukDizi(PluginBase):
123
141
  if dil_json.get("status") == "success":
124
142
  for idx, veri in enumerate(dil_json.get("data", [])):
125
143
  veri_response = await self.httpx.post(
126
- url = f"{self.main_url}/ajax/dataEmbed22.asp",
144
+ url = f"{self.main_url}/ajax/dataEmbed{embed_ver}.asp",
127
145
  headers = {"X-Requested-With": "XMLHttpRequest"},
128
146
  data = {"id": veri.get("id")},
129
147
  )
@@ -133,10 +151,13 @@ class SezonlukDizi(PluginBase):
133
151
  if "link.asp" in iframe:
134
152
  continue
135
153
 
136
- extractor = self.ex_manager.find_extractor(self.fix_url(iframe))
137
- results.append({
138
- "url" : self.fix_url(iframe),
139
- "name" : f"{extractor.name if extractor else f'{label} - Player {idx + 1}'}"
140
- })
154
+ iframe_url = self.fix_url(iframe)
155
+ extractor = self.ex_manager.find_extractor(iframe_url)
156
+
157
+ if extractor: # Only add if extractor found
158
+ results.append({
159
+ "url" : iframe_url,
160
+ "name" : f"{extractor.name} | {label}"
161
+ })
141
162
 
142
163
  return results
@@ -228,11 +228,14 @@ class Sinefy(PluginBase):
228
228
  sel = Selector(resp.text)
229
229
 
230
230
  iframe = sel.css("iframe::attr(src)").get()
231
- if iframe:
232
- iframe = self.fix_url(iframe)
233
- extractor = self.ex_manager.find_extractor(iframe)
234
- return [{
235
- "url" : iframe,
236
- "name" : extractor.name if extractor else "Iframe"
237
- }]
238
- return []
231
+ if not iframe:
232
+ return []
233
+
234
+ iframe_url = self.fix_url(iframe)
235
+
236
+ # Always return iframe (matching Kotlin - no extractor check)
237
+ # loadExtractor in Kotlin handles extraction internally
238
+ return [{
239
+ "url" : iframe_url,
240
+ "name" : "Sinefy Player"
241
+ }]
@@ -9,7 +9,7 @@ class SinemaCX(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://www.sinema.fit"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
- description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
12
+ description = "Türkiye'nin en iyi film platformu Sinema.cc! 2026'nın en yeni ve popüler yabancı yapımları, Türkçe dublaj ve altyazılı HD kalitede, reklamsız ve ücretsiz olarak seni bekliyor. Şimdi izle!"
13
13
 
14
14
  main_page = {
15
15
  f"{main_url}/page/SAYFA" : "Son Eklenen Filmler",
@@ -139,12 +139,8 @@ class SinemaCX(PluginBase):
139
139
  else:
140
140
  # Extractor'a yönlendir
141
141
  extractor = self.ex_manager.find_extractor(iframe)
142
- results.append({
143
- "name" : f"{extractor.name if extractor else self.name}",
144
- "url" : iframe,
145
- "referer" : f"{self.main_url}/",
146
- "subtitles" : subtitles
147
- })
142
+ data = await extractor.extract(iframe, referer=f"{self.main_url}/")
143
+ results.append(data.to_dict())
148
144
 
149
145
  return results
150
146
 
@@ -9,7 +9,7 @@ class SuperFilmGeldi(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://www.superfilmgeldi13.art"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
- description = "Ücretsiz film izleme sitesi."
12
+ description = "Hd film izliyerek arkadaşlarınızla ve sevdiklerinizle iyi bir vakit geçirmek istiyorsanız açın bir film eğlenmeye bakın. Bilim kurgu filmleri, aşk drama vahşet aşk romantik sıradışı korku filmlerini izle."
13
13
 
14
14
  main_page = {
15
15
  f"{main_url}/page/SAYFA" : "Son Eklenenler",
@@ -8,7 +8,7 @@ class UgurFilm(PluginBase):
8
8
  language = "tr"
9
9
  main_url = "https://ugurfilm3.xyz"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
- description = "Yabancı film izle, Türkçe dublaj ve Türkçe altyazılı film seçenekleriyle 720p ve 1080p HD kalitesinde film izle - Uğur Film full hd film izle."
11
+ description = "Uğur Film ile film izle! En yeni ve güncel filmleri, Türk yerli filmleri Full HD 1080p kalitede Türkçe Altyazılı olarak izle."
12
12
 
13
13
  main_page = {
14
14
  f"{main_url}/turkce-altyazili-filmler/page/" : "Türkçe Altyazılı Filmler",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.0.2
3
+ Version: 2.0.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
@@ -18,7 +18,7 @@ KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P
18
18
  KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
19
19
  KekikStream/Extractors/CloseLoad.py,sha256=rc1lYy32ThB4ApC1hZdqVQ3cAVHvRGHOMdjomWeDgaQ,884
20
20
  KekikStream/Extractors/ContentX.py,sha256=u1sDdM79MNx9OdPTPcAA0OQDS7537IO8aJlffxhMi8c,2976
21
- KekikStream/Extractors/ContentX_.py,sha256=OGFRq-GVjFqz7ISL9UPLonmjzPS2ycb0En0PI7gVKtk,1016
21
+ KekikStream/Extractors/ContentX_.py,sha256=2JjSm6mNFNwvJA68HH-YYDg-m_Cx7nNx1SgGcqKZCUk,1405
22
22
  KekikStream/Extractors/DzenRu.py,sha256=X0Rhm1-W4YjQwVrJs8YFqVcCxMaZi8rsKiLhK_ZsYlU,1185
23
23
  KekikStream/Extractors/ExPlay.py,sha256=EJNVKAbaIxlbOsCx7J9aLfNHKOFoqSLZZUw7W4QYeH0,1827
24
24
  KekikStream/Extractors/FirePlayer.py,sha256=HlJjFgii0fGZK7cgwpoZAIoajabl7IQX6ZrAQT1fBIw,2188
@@ -50,33 +50,33 @@ KekikStream/Extractors/VidMoly_.py,sha256=737BzqogzknVhSebZgVDh70gsEgNo9s2mafySr
50
50
  KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0Jcek,1771
51
51
  KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
52
52
  KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
53
- KekikStream/Extractors/YTDLP.py,sha256=F3QM3tobZd_BFcrO4Wz-BEozjSidmJA9RyWH9CnNBnk,6493
53
+ KekikStream/Extractors/YTDLP.py,sha256=KKvvv6XiKM57NON2Vpw24O31xUKpgcovHTPYh05QHW8,6543
54
54
  KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
55
55
  KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
56
56
  KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
57
57
  KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
58
- KekikStream/Plugins/Dizilla.py,sha256=gVLborMFjYr3w_KrB53lmB1W8lTzEAySHjv4gvOZp1A,11542
58
+ KekikStream/Plugins/Dizilla.py,sha256=ssoSZgT7RWO8ENYmdNeh-4pvY84yrRWDZ-qskdo8Lmg,11852
59
59
  KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
60
- KekikStream/Plugins/FilmMakinesi.py,sha256=lYys9qyoIxDFBWaf7TIv9NrdmtGu_GLU1VJWGp6xL9A,5280
61
- KekikStream/Plugins/FilmModu.py,sha256=b27hchMoYZwG3I-kM1sveW7rHKOF5OuepdjPgKIehEM,6706
60
+ KekikStream/Plugins/FilmMakinesi.py,sha256=xKI7iw3xvmIgyI2oir3bAWXVMFbaEDo6JrqhVRPm1vE,5260
61
+ KekikStream/Plugins/FilmModu.py,sha256=0qFkpX7zuH3GCwmseoKpXLved5Yg243oJb8N7DySrCQ,6871
62
62
  KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
63
- KekikStream/Plugins/FullHDFilmizlesene.py,sha256=FAacwtXo72DIl_1bHWgHPIxqmqBJAVPtNQ3yIZPYjlU,6152
64
- KekikStream/Plugins/HDFilmCehennemi.py,sha256=D2VvgNvCcHfjkitzSfA19OFp-mI0sgUm6OSVej0ZgTY,9544
65
- KekikStream/Plugins/JetFilmizle.py,sha256=GU47RGHzVmnJxdHDD1zWQDu2qCCWQ3vFOs_eRR_YY14,6503
66
- KekikStream/Plugins/KultFilmler.py,sha256=VZET3RUoOVYKE-C2YbkMW8oNcxz6zE2pR7a3z-B4nD4,8987
67
- KekikStream/Plugins/RecTV.py,sha256=dF3Ogf7KE_zpfLQRjVcEJQMuWtBtHo6iB73_ECQEJ58,7544
68
- KekikStream/Plugins/RoketDizi.py,sha256=h0g0Wi72TG4et7TS7ANro9LLlCiR_W0CJdkWCUzprE8,9027
69
- KekikStream/Plugins/SelcukFlix.py,sha256=WYVtGMxngpqrXk7PX_B4ya6Pji7dOjQsXoukk30f2d0,12744
70
- KekikStream/Plugins/SezonlukDizi.py,sha256=dT2xPPkdaYV43qsL4Le_5Yel8eoPkHtnXIOXqz-Ya-c,6326
63
+ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=8ozxyuJnivFe1Cu_Fb8HjVPH-ptKCSWawYzGFcA1B98,6160
64
+ KekikStream/Plugins/HDFilmCehennemi.py,sha256=-PV2u4ep6TvpuycaivkmaWie60k99T-rNtqfg5n7k5M,9584
65
+ KekikStream/Plugins/JetFilmizle.py,sha256=Jm2cYEgV_bRXVjrDtnLTelvyxGHVAUCZkKmP3lUkEA8,6631
66
+ KekikStream/Plugins/KultFilmler.py,sha256=fABm74yQhEUsvuWRSEK0jiy0VJflxtFZ5p65UDC_NP0,9103
67
+ KekikStream/Plugins/RecTV.py,sha256=hsOmH4xharsscSnJMGZfvAxSJ37akfUPl1RlO0te1jA,7544
68
+ KekikStream/Plugins/RoketDizi.py,sha256=PY9Cf6X0I21FdMj0K48WwvwRPtznoqI3mMsctXAeLHs,8672
69
+ KekikStream/Plugins/SelcukFlix.py,sha256=rajt0BbdiJDFvihD5HmjwizNdgmOXb3BN8c4Ju7aRkc,12533
70
+ KekikStream/Plugins/SezonlukDizi.py,sha256=vW-Mvk63Y9sAJmPnY1IdFwBzCMEB2tF03zwHVETZTtI,7262
71
71
  KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
72
- KekikStream/Plugins/Sinefy.py,sha256=jeziEG92EyePCejTdeKkNtMxg0-nkhrofazwNX12Y7c,9902
73
- KekikStream/Plugins/SinemaCX.py,sha256=dEoZJJLnTgayBeCbGoR1qSUjrnTeRx5ZLck_dSPDL4c,7177
72
+ KekikStream/Plugins/Sinefy.py,sha256=riB2lgSSG5MkgxnVtX1OlApBcHG6vVjfiHyJ6h8_6DM,9965
73
+ KekikStream/Plugins/SinemaCX.py,sha256=dIJUOOtWSyMx7vGOE1NjrsCeW1n5DHh40--KSiW0kFA,7200
74
74
  KekikStream/Plugins/Sinezy.py,sha256=gdszlee5QpUka0qMzGMbBoXwJCtZbe5hlA5o9FJQI1o,6226
75
- KekikStream/Plugins/SuperFilmGeldi.py,sha256=Ohm21BPsJH_S1tx5i2APEgAOD25k2NiwRP7rSgAKvRs,5289
76
- KekikStream/Plugins/UgurFilm.py,sha256=eKGzmSi8k_QbXnYPWXZRdmCxxc32zZh4rynmdxCbm1o,4832
77
- kekikstream-2.0.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
78
- kekikstream-2.0.2.dist-info/METADATA,sha256=l-84GB-DwSCR5euQv5kh0YhzP-BTvnj4gL2Z3e50ssk,10090
79
- kekikstream-2.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
80
- kekikstream-2.0.2.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
81
- kekikstream-2.0.2.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
82
- kekikstream-2.0.2.dist-info/RECORD,,
75
+ KekikStream/Plugins/SuperFilmGeldi.py,sha256=4kgdWpYCLBSAn2XfL1usFG33LsTtDvo28fmDecwNA_U,5480
76
+ KekikStream/Plugins/UgurFilm.py,sha256=sQatQ2zb9NER8J52DRLI5K9EnYFv4I1ZgZ22HtauX3Q,4813
77
+ kekikstream-2.0.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
78
+ kekikstream-2.0.4.dist-info/METADATA,sha256=irIRhTOfz2XbPRVYyIlgpxioS8Dq1urrnsLFyLcBsSQ,10090
79
+ kekikstream-2.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
80
+ kekikstream-2.0.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
81
+ kekikstream-2.0.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
82
+ kekikstream-2.0.4.dist-info/RECORD,,