KekikStream 2.0.3__py3-none-any.whl → 2.0.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. KekikStream/Extractors/ContentX.py +13 -0
  2. KekikStream/Extractors/DonilasPlay.py +86 -0
  3. KekikStream/Extractors/Odnoklassniki.py +6 -0
  4. KekikStream/Extractors/PeaceMakerst.py +6 -0
  5. KekikStream/Extractors/RapidVid.py +6 -0
  6. KekikStream/Extractors/SetPlay.py +7 -1
  7. KekikStream/Extractors/VCTPlay.py +41 -0
  8. KekikStream/Extractors/VidMoly.py +6 -0
  9. KekikStream/Plugins/BelgeselX.py +204 -0
  10. KekikStream/Plugins/Dizilla.py +22 -14
  11. KekikStream/Plugins/FilmMakinesi.py +1 -1
  12. KekikStream/Plugins/FilmModu.py +6 -2
  13. KekikStream/Plugins/FullHDFilmizlesene.py +1 -1
  14. KekikStream/Plugins/HDFilmCehennemi.py +1 -1
  15. KekikStream/Plugins/JetFilmizle.py +1 -1
  16. KekikStream/Plugins/KultFilmler.py +1 -1
  17. KekikStream/Plugins/RoketDizi.py +17 -24
  18. KekikStream/Plugins/SelcukFlix.py +51 -52
  19. KekikStream/Plugins/SetFilmIzle.py +243 -0
  20. KekikStream/Plugins/SezonlukDizi.py +28 -7
  21. KekikStream/Plugins/Sinefy.py +11 -8
  22. KekikStream/Plugins/SinemaCX.py +3 -7
  23. KekikStream/Plugins/SuperFilmGeldi.py +1 -1
  24. KekikStream/Plugins/UgurFilm.py +1 -1
  25. {kekikstream-2.0.3.dist-info → kekikstream-2.0.5.dist-info}/METADATA +1 -1
  26. {kekikstream-2.0.3.dist-info → kekikstream-2.0.5.dist-info}/RECORD +30 -31
  27. KekikStream/Extractors/ContentX_.py +0 -40
  28. KekikStream/Extractors/Odnoklassniki_.py +0 -11
  29. KekikStream/Extractors/PeaceMakerst_.py +0 -7
  30. KekikStream/Extractors/RapidVid_.py +0 -7
  31. KekikStream/Extractors/VidMoly_.py +0 -7
  32. {kekikstream-2.0.3.dist-info → kekikstream-2.0.5.dist-info}/WHEEL +0 -0
  33. {kekikstream-2.0.3.dist-info → kekikstream-2.0.5.dist-info}/entry_points.txt +0 -0
  34. {kekikstream-2.0.3.dist-info → kekikstream-2.0.5.dist-info}/licenses/LICENSE +0 -0
  35. {kekikstream-2.0.3.dist-info → kekikstream-2.0.5.dist-info}/top_level.txt +0 -0
@@ -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 []
@@ -0,0 +1,243 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode
4
+ from parsel import Selector
5
+ import re, json
6
+
7
+ class SetFilmIzle(PluginBase):
8
+ name = "SetFilmIzle"
9
+ language = "tr"
10
+ main_url = "https://www.setfilmizle.uk"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Setfilmizle sitemizde, donma yaşamadan Türkçe dublaj ve altyazılı filmleri ile dizileri muhteşem 1080p full HD kalitesinde izleyebilirsiniz."
13
+
14
+ main_page = {
15
+ f"{main_url}/tur/aile/" : "Aile",
16
+ f"{main_url}/tur/aksiyon/" : "Aksiyon",
17
+ f"{main_url}/tur/animasyon/" : "Animasyon",
18
+ f"{main_url}/tur/belgesel/" : "Belgesel",
19
+ f"{main_url}/tur/bilim-kurgu/" : "Bilim-Kurgu",
20
+ f"{main_url}/tur/biyografi/" : "Biyografi",
21
+ f"{main_url}/tur/dini/" : "Dini",
22
+ f"{main_url}/tur/dram/" : "Dram",
23
+ f"{main_url}/tur/fantastik/" : "Fantastik",
24
+ f"{main_url}/tur/genclik/" : "Gençlik",
25
+ f"{main_url}/tur/gerilim/" : "Gerilim",
26
+ f"{main_url}/tur/gizem/" : "Gizem",
27
+ f"{main_url}/tur/komedi/" : "Komedi",
28
+ f"{main_url}/tur/korku/" : "Korku",
29
+ f"{main_url}/tur/macera/" : "Macera",
30
+ f"{main_url}/tur/romantik/" : "Romantik",
31
+ f"{main_url}/tur/savas/" : "Savaş",
32
+ f"{main_url}/tur/suc/" : "Suç",
33
+ f"{main_url}/tur/tarih/" : "Tarih",
34
+ f"{main_url}/tur/western/" : "Western"
35
+ }
36
+
37
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
38
+ istek = self.cloudscraper.get(url)
39
+ secici = Selector(istek.text)
40
+
41
+ results = []
42
+ for item in secici.css("div.items article"):
43
+ title = item.css("h2::text").get()
44
+ href = item.css("a::attr(href)").get()
45
+ poster = item.css("img::attr(data-src)").get()
46
+
47
+ if title and href:
48
+ results.append(MainPageResult(
49
+ category = category,
50
+ title = title.strip(),
51
+ url = self.fix_url(href),
52
+ poster = self.fix_url(poster) if poster else None
53
+ ))
54
+
55
+ return results
56
+
57
+ async def search(self, query: str) -> list[SearchResult]:
58
+ # Ana sayfadan nonce değerini al
59
+ main_resp = self.cloudscraper.get(self.main_url)
60
+
61
+ # Birden fazla nonce pattern dene
62
+ nonce = ""
63
+ nonce_patterns = [
64
+ r'nonces:\s*\{\s*search:\s*"([^"]+)"', # STMOVIE_AJAX.nonces.search
65
+ r'"search":\s*"([a-zA-Z0-9]+)"', # JSON format
66
+ r"nonce:\s*'([^']*)'",
67
+ r'"nonce":"([^"]+)"',
68
+ r'data-nonce="([^"]+)"',
69
+ ]
70
+ for pattern in nonce_patterns:
71
+ match = re.search(pattern, main_resp.text)
72
+ if match:
73
+ nonce = match.group(1)
74
+ break
75
+
76
+ search_resp = self.cloudscraper.post(
77
+ f"{self.main_url}/wp-admin/admin-ajax.php",
78
+ headers = {
79
+ "X-Requested-With" : "XMLHttpRequest",
80
+ "Content-Type" : "application/x-www-form-urlencoded",
81
+ "Referer" : f"{self.main_url}/"
82
+ },
83
+ data = {
84
+ "action" : "ajax_search",
85
+ "search" : query,
86
+ "original_search" : query,
87
+ "nonce" : nonce
88
+ }
89
+ )
90
+
91
+ try:
92
+ data = search_resp.json()
93
+ html = data.get("html", "")
94
+ except:
95
+ return []
96
+
97
+ secici = Selector(text=html)
98
+ results = []
99
+
100
+ for item in secici.css("div.items article"):
101
+ title = item.css("h2::text").get()
102
+ href = item.css("a::attr(href)").get()
103
+ poster = item.css("img::attr(data-src)").get()
104
+
105
+ if title and href:
106
+ results.append(SearchResult(
107
+ title = title.strip(),
108
+ url = self.fix_url(href),
109
+ poster = self.fix_url(poster) if poster else None
110
+ ))
111
+
112
+ return results
113
+
114
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
115
+ istek = await self.httpx.get(url)
116
+ secici = Selector(istek.text)
117
+
118
+ raw_title = secici.css("h1::text").get() or ""
119
+ title = re.sub(r"\s*izle.*$", "", raw_title, flags=re.IGNORECASE).strip()
120
+ poster = secici.css("div.poster img::attr(src)").get()
121
+ description = secici.css("div.wp-content p::text").get()
122
+ year = secici.css("div.extra span.C a::text").get()
123
+ if year:
124
+ year_match = re.search(r"\d{4}", year)
125
+ year = year_match.group() if year_match else None
126
+ tags = [a.css("::text").get().strip() for a in secici.css("div.sgeneros a") if a.css("::text").get()]
127
+ duration = secici.css("span.runtime::text").get()
128
+ if duration:
129
+ dur_match = re.search(r"\d+", duration)
130
+ duration = int(dur_match.group()) if dur_match else None
131
+
132
+ actors = [span.css("::text").get().strip() for span in secici.css("span.valor a > span") if span.css("::text").get()]
133
+
134
+ trailer_match = re.search(r'embed/([^?]*)\?rel', istek.text)
135
+ trailer = f"https://www.youtube.com/embed/{trailer_match.group(1)}" if trailer_match else None
136
+
137
+ # Dizi mi film mi kontrol et
138
+ is_series = "/dizi/" in url
139
+
140
+ if is_series:
141
+ year_elem = secici.css("a[href*='/yil/']::text").get()
142
+ if year_elem:
143
+ year_match = re.search(r"\d{4}", year_elem)
144
+ year = year_match.group() if year_match else year
145
+
146
+ dur_elem = secici.css("div#info span:contains('Dakika')::text").get()
147
+ if dur_elem:
148
+ dur_match = re.search(r"\d+", dur_elem)
149
+ duration = int(dur_match.group()) if dur_match else duration
150
+
151
+ episodes = []
152
+ for ep_item in secici.css("div#episodes ul.episodios li"):
153
+ ep_href = ep_item.css("h4.episodiotitle a::attr(href)").get()
154
+ ep_name = ep_item.css("h4.episodiotitle a::text").get()
155
+
156
+ if not ep_href or not ep_name:
157
+ continue
158
+
159
+ ep_detail = ep_name.strip()
160
+ season_match = re.search(r"(\d+)\.\s*Sezon", ep_detail)
161
+ episode_match = re.search(r"Sezon\s+(\d+)\.\s*Bölüm", ep_detail)
162
+
163
+ ep_season = int(season_match.group(1)) if season_match else 1
164
+ ep_episode = int(episode_match.group(1)) if episode_match else None
165
+
166
+ episodes.append(Episode(
167
+ season = ep_season,
168
+ episode = ep_episode,
169
+ title = ep_name.strip(),
170
+ url = self.fix_url(ep_href)
171
+ ))
172
+
173
+ return SeriesInfo(
174
+ url = url,
175
+ poster = self.fix_url(poster) if poster else None,
176
+ title = title,
177
+ description = description.strip() if description else None,
178
+ tags = tags,
179
+ year = year,
180
+ duration = duration,
181
+ actors = actors,
182
+ episodes = episodes
183
+ )
184
+
185
+ return MovieInfo(
186
+ url = url,
187
+ poster = self.fix_url(poster) if poster else None,
188
+ title = title,
189
+ description = description.strip() if description else None,
190
+ tags = tags,
191
+ year = year,
192
+ duration = duration,
193
+ actors = actors
194
+ )
195
+
196
+ async def load_links(self, url: str) -> list[dict]:
197
+ istek = await self.httpx.get(url)
198
+ secici = Selector(istek.text)
199
+
200
+ nonce = secici.css("div#playex::attr(data-nonce)").get() or ""
201
+
202
+ links = []
203
+ for player in secici.css("nav.player a"):
204
+ source_id = player.css("::attr(data-post-id)").get()
205
+ player_name = player.css("::attr(data-player-name)").get()
206
+ part_key = player.css("::attr(data-part-key)").get()
207
+
208
+ if not source_id or "event" in source_id or source_id == "":
209
+ continue
210
+
211
+ # Multipart form request
212
+ try:
213
+ resp = self.cloudscraper.post(
214
+ f"{self.main_url}/wp-admin/admin-ajax.php",
215
+ headers = {"Referer": url},
216
+ data = {
217
+ "action" : "get_video_url",
218
+ "nonce" : nonce,
219
+ "post_id" : source_id,
220
+ "player_name" : player_name or "",
221
+ "part_key" : part_key or ""
222
+ }
223
+ )
224
+ data = resp.json()
225
+ except:
226
+ continue
227
+
228
+ iframe_url = data.get("data", {}).get("url")
229
+ if not iframe_url:
230
+ continue
231
+
232
+ # SetPlay URL'si için part_key ekleme
233
+ if "setplay" not in iframe_url and part_key:
234
+ iframe_url = f"{iframe_url}?partKey={part_key}"
235
+
236
+ extractor = self.ex_manager.find_extractor(iframe_url)
237
+ links.append({
238
+ "url" : iframe_url,
239
+ "name" : extractor.name if extractor else player_name or "Direct Link",
240
+ "referer" : self.main_url
241
+ })
242
+
243
+ return links
@@ -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.3
3
+ Version: 2.0.5
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
@@ -17,8 +17,8 @@ KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-ao
17
17
  KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P8S0tRNhS6E,2476
18
18
  KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
19
19
  KekikStream/Extractors/CloseLoad.py,sha256=rc1lYy32ThB4ApC1hZdqVQ3cAVHvRGHOMdjomWeDgaQ,884
20
- KekikStream/Extractors/ContentX.py,sha256=u1sDdM79MNx9OdPTPcAA0OQDS7537IO8aJlffxhMi8c,2976
21
- KekikStream/Extractors/ContentX_.py,sha256=OGFRq-GVjFqz7ISL9UPLonmjzPS2ycb0En0PI7gVKtk,1016
20
+ KekikStream/Extractors/ContentX.py,sha256=TEXJppAZJLkf0x8jxaKnrCVAcabqdBFBswinpqjG_70,3513
21
+ KekikStream/Extractors/DonilasPlay.py,sha256=Lr60pEht96SMlXICYWo9J5dOwV4ty8fetBCCqJ3ARUY,3221
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
@@ -28,15 +28,12 @@ KekikStream/Extractors/MailRu.py,sha256=xQVCWwYqNoG5T43VAW1_m0v4e80FbO-1pNPKkwhT
28
28
  KekikStream/Extractors/MixPlayHD.py,sha256=POV_yq3KoZ6S6EqFsKYULEBz92NdUa2BpYKNo0eNQH8,1552
29
29
  KekikStream/Extractors/MixTiger.py,sha256=mMEYhhr5-u6GgIrLESeFTRdwDykgSXKJO4KtkMML1bw,2124
30
30
  KekikStream/Extractors/MolyStream.py,sha256=IeeBw9tJJrL5QQ-t2Yp-a-6lnDc3Y00UNiaN6m-o-7c,1160
31
- KekikStream/Extractors/Odnoklassniki.py,sha256=EQAuCdr69vN11ZBE5uThuXqlR8NVWanROWYkubo22mo,3809
32
- KekikStream/Extractors/Odnoklassniki_.py,sha256=AbcJ65Pq1zA2wQGXZNgNBToweOniFYR3jkWXFXJJpfg,316
33
- KekikStream/Extractors/PeaceMakerst.py,sha256=ZKk454eNZpeamht61UH9yMYe00_zGb3MSyujfDlbVDc,2096
34
- KekikStream/Extractors/PeaceMakerst_.py,sha256=-PdSR8yFy6MEc6EodXvHksj8O_j6Xu8yceoSjM2pGYg,246
31
+ KekikStream/Extractors/Odnoklassniki.py,sha256=YfFRCL3Ag5N4zDzK9ZLOr3HVQcsETFQpff1px02imJ0,4019
32
+ KekikStream/Extractors/PeaceMakerst.py,sha256=pEgJb3KDfEPAUjbuvrYbUlxIciKgED-Vd0arrRO3QCk,2317
35
33
  KekikStream/Extractors/PixelDrain.py,sha256=Uk2pPvtBzaKtRXu1iNO8FLHd0EAuIOIzI1H_n02tg-U,964
36
34
  KekikStream/Extractors/PlayerFilmIzle.py,sha256=vDumIya3gWN8h1to5XCzBWePa6gdNU2DVTK3OrPr04U,2425
37
- KekikStream/Extractors/RapidVid.py,sha256=TxNnLUmYaAHi-rFkoLu4eQULzkUSvQnfoEZAjyzQFns,2917
38
- KekikStream/Extractors/RapidVid_.py,sha256=siYK1oDCASzV8MhhDbGh5qlSDtZLi4EHNlO0HwdgeNU,233
39
- KekikStream/Extractors/SetPlay.py,sha256=FsbLlYFXp7_28-ta6XAoqDQAEGYTVZOZayebkY1mWe8,1906
35
+ KekikStream/Extractors/RapidVid.py,sha256=FgAZfgtnKE57KRiRIFw-6_ZES0Trp5QriNbRTfSBGQs,3139
36
+ KekikStream/Extractors/SetPlay.py,sha256=FjHYtC6xTeeikTkrW6jz0TpWz0kaoJ5qHhr_H7aThEY,2135
40
37
  KekikStream/Extractors/SetPrime.py,sha256=ob09y-Sm91YR7rIRzikhZiMHX6D4Djm5QzFTg6KbO4k,1536
41
38
  KekikStream/Extractors/SibNet.py,sha256=zJTkzlr34ufKCWzKKCgJrzhb2o-fpjTjFdi38gv6N6g,849
42
39
  KekikStream/Extractors/Sobreatsesuyp.py,sha256=qlSQHUHjTjBoY0nsuZQWAjnfswbPORkBg6rUuP7SagA,2000
@@ -44,39 +41,41 @@ KekikStream/Extractors/TRsTX.py,sha256=mbSRGnQt26a73SbqwtY9rpiYFwgRgVbvA6bkGb_Pv
44
41
  KekikStream/Extractors/TauVideo.py,sha256=2ai9BwwM6qlCgxK7E0B642LtOF5y4hEb9tQ2aDpbMtc,1112
45
42
  KekikStream/Extractors/TurboImgz.py,sha256=nnWnP1K4JZbMj6S-YuXxej31UZtF4JcboSW4n7A4A5c,824
46
43
  KekikStream/Extractors/TurkeyPlayer.py,sha256=FX_H3vzXjAD7IjK11bjJVVw_VdPQ4n6YQLfjQ6E3t7o,1247
44
+ KekikStream/Extractors/VCTPlay.py,sha256=1BCl2_vVIrwvG56LCzl2KE5g2CUaMAhzImOZMdZpZCQ,1377
47
45
  KekikStream/Extractors/VidHide.py,sha256=TVoS9CMV1WSE83vPC4FFxsNE71n-_DtVJm66_1Wt8pU,2538
48
- KekikStream/Extractors/VidMoly.py,sha256=bxzIymYHrms4gBdK2jfsoug2tjq-PuicOxeR2NjcAjw,3654
49
- KekikStream/Extractors/VidMoly_.py,sha256=737BzqogzknVhSebZgVDh70gsEgNo9s2mafySrDzr6o,219
46
+ KekikStream/Extractors/VidMoly.py,sha256=zuo3LqaDJ0Qs6H6l9z5TjosTSpsQ37KEBXQpGVO9AsI,3878
50
47
  KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0Jcek,1771
51
48
  KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
52
49
  KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
53
50
  KekikStream/Extractors/YTDLP.py,sha256=KKvvv6XiKM57NON2Vpw24O31xUKpgcovHTPYh05QHW8,6543
54
51
  KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
52
+ KekikStream/Plugins/BelgeselX.py,sha256=WdCeU_Zvsph0kHt7jAWaZ3DQ_2rxaFChmhGKPcHLJpo,8728
55
53
  KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
56
54
  KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
57
55
  KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
58
- KekikStream/Plugins/Dizilla.py,sha256=gVLborMFjYr3w_KrB53lmB1W8lTzEAySHjv4gvOZp1A,11542
56
+ KekikStream/Plugins/Dizilla.py,sha256=ssoSZgT7RWO8ENYmdNeh-4pvY84yrRWDZ-qskdo8Lmg,11852
59
57
  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
58
+ KekikStream/Plugins/FilmMakinesi.py,sha256=xKI7iw3xvmIgyI2oir3bAWXVMFbaEDo6JrqhVRPm1vE,5260
59
+ KekikStream/Plugins/FilmModu.py,sha256=0qFkpX7zuH3GCwmseoKpXLved5Yg243oJb8N7DySrCQ,6871
62
60
  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
61
+ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=8ozxyuJnivFe1Cu_Fb8HjVPH-ptKCSWawYzGFcA1B98,6160
62
+ KekikStream/Plugins/HDFilmCehennemi.py,sha256=-PV2u4ep6TvpuycaivkmaWie60k99T-rNtqfg5n7k5M,9584
63
+ KekikStream/Plugins/JetFilmizle.py,sha256=Jm2cYEgV_bRXVjrDtnLTelvyxGHVAUCZkKmP3lUkEA8,6631
64
+ KekikStream/Plugins/KultFilmler.py,sha256=fABm74yQhEUsvuWRSEK0jiy0VJflxtFZ5p65UDC_NP0,9103
67
65
  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
66
+ KekikStream/Plugins/RoketDizi.py,sha256=PY9Cf6X0I21FdMj0K48WwvwRPtznoqI3mMsctXAeLHs,8672
67
+ KekikStream/Plugins/SelcukFlix.py,sha256=rajt0BbdiJDFvihD5HmjwizNdgmOXb3BN8c4Ju7aRkc,12533
68
+ KekikStream/Plugins/SetFilmIzle.py,sha256=deHLi0PvOUOz6L7wru-t8jWCHrYJ01qfWMLAyGAzLcg,9727
69
+ KekikStream/Plugins/SezonlukDizi.py,sha256=vW-Mvk63Y9sAJmPnY1IdFwBzCMEB2tF03zwHVETZTtI,7262
71
70
  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
71
+ KekikStream/Plugins/Sinefy.py,sha256=riB2lgSSG5MkgxnVtX1OlApBcHG6vVjfiHyJ6h8_6DM,9965
72
+ KekikStream/Plugins/SinemaCX.py,sha256=dIJUOOtWSyMx7vGOE1NjrsCeW1n5DHh40--KSiW0kFA,7200
74
73
  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.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
78
- kekikstream-2.0.3.dist-info/METADATA,sha256=mqZ1dywcothkp4xs3ETtIqGfwF0TkXoedKS2ZqSqkxs,10090
79
- kekikstream-2.0.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
80
- kekikstream-2.0.3.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
81
- kekikstream-2.0.3.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
82
- kekikstream-2.0.3.dist-info/RECORD,,
74
+ KekikStream/Plugins/SuperFilmGeldi.py,sha256=4kgdWpYCLBSAn2XfL1usFG33LsTtDvo28fmDecwNA_U,5480
75
+ KekikStream/Plugins/UgurFilm.py,sha256=sQatQ2zb9NER8J52DRLI5K9EnYFv4I1ZgZ22HtauX3Q,4813
76
+ kekikstream-2.0.5.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
77
+ kekikstream-2.0.5.dist-info/METADATA,sha256=ZjBv64LipReZl9qjFkDcELL93TtS5hOVlaqkm1iGG2I,10090
78
+ kekikstream-2.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
79
+ kekikstream-2.0.5.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
80
+ kekikstream-2.0.5.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
81
+ kekikstream-2.0.5.dist-info/RECORD,,