KekikStream 2.4.9__py3-none-any.whl → 2.5.0__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.

Potentially problematic release.


This version of KekikStream might be problematic. Click here for more details.

@@ -1,7 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, MovieInfo, Episode, ExtractResult, HTMLHelper
4
- import json, asyncio, time
4
+ import asyncio, time, json
5
5
 
6
6
  class YabanciDizi(PluginBase):
7
7
  name = "YabanciDizi"
@@ -19,17 +19,17 @@ class YabanciDizi(PluginBase):
19
19
  }
20
20
 
21
21
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
22
- full_url = url if page == 1 else f"{url}/{page}"
23
-
24
- resp = await self.httpx.get(full_url, headers={"Referer": f"{self.main_url}/"})
25
- sel = HTMLHelper(resp.text)
22
+ istek = await self.httpx.get(
23
+ url = url if page == 1 else f"{url}/{page}",
24
+ headers = {"Referer": f"{self.main_url}/"}
25
+ )
26
+ secici = HTMLHelper(istek.text)
26
27
 
27
28
  results = []
28
- for item in sel.select("li.mb-lg, li.segment-poster"):
29
- title = sel.select_text("h2", item)
30
- href = sel.select_attr("a", "href", item)
31
- poster = sel.select_attr("img", "src", item)
32
- score = sel.select_text("span.rating", item)
29
+ for item in secici.select("li.mb-lg, li.segment-poster"):
30
+ title = secici.select_text("h2", item)
31
+ href = secici.select_attr("a", "href", item)
32
+ poster = secici.select_attr("img", "src", item)
33
33
 
34
34
  if title and href:
35
35
  results.append(MainPageResult(
@@ -42,29 +42,27 @@ class YabanciDizi(PluginBase):
42
42
  return results
43
43
 
44
44
  async def search(self, query: str) -> list[SearchResult]:
45
- search_url = f"{self.main_url}/search?qr={query}"
46
-
47
- headers = {
48
- "X-Requested-With" : "XMLHttpRequest",
49
- "Referer" : f"{self.main_url}/"
50
- }
51
-
52
- resp = await self.httpx.post(search_url, headers=headers)
45
+ istek = await self.httpx.post(
46
+ url = f"{self.main_url}/search?qr={query}",
47
+ headers = {
48
+ "X-Requested-With" : "XMLHttpRequest",
49
+ "Referer" : f"{self.main_url}/"
50
+ }
51
+ )
53
52
 
54
53
  try:
55
- raw = resp.json()
56
- # Kotlin mapping: JsonResponse -> Data -> ResultItem
54
+ raw = istek.json()
57
55
  res_array = raw.get("data", {}).get("result", [])
58
-
56
+
59
57
  results = []
60
58
  for item in res_array:
61
59
  title = item.get("s_name")
62
60
  image = item.get("s_image")
63
61
  slug = item.get("s_link")
64
62
  s_type = item.get("s_type") # 0: dizi, 1: film
65
-
63
+
66
64
  poster = f"{self.main_url}/uploads/series/{image}" if image else None
67
-
65
+
68
66
  if s_type == "1":
69
67
  href = f"{self.main_url}/film/{slug}"
70
68
  else:
@@ -81,18 +79,18 @@ class YabanciDizi(PluginBase):
81
79
  return []
82
80
 
83
81
  async def load_item(self, url: str) -> SeriesInfo | MovieInfo:
84
- resp = await self.httpx.get(url, follow_redirects=True)
85
- sel = HTMLHelper(resp.text)
86
-
87
- title = (sel.select_attr("meta[property='og:title']", "content") or "").split("|")[0].strip() or sel.select_text("h1")
88
- poster = sel.select_poster("meta[property='og:image']")
89
- description = sel.select_text("p#tv-series-desc")
90
- year = sel.extract_year("td div.truncate")
91
- tags = sel.meta_list("Türü", container_selector="div.item")
92
- rating = sel.meta_value("IMDb Puanı", container_selector="div.item")
93
- duration = int(sel.regex_first(r"(\d+)", sel.meta_value("Süre", container_selector="div.item")) or 0)
94
- actors = sel.meta_list("Oyuncular", container_selector="div.item") or sel.select_texts("div#common-cast-list div.item h5")
95
-
82
+ istek = await self.httpx.get(url, follow_redirects=True)
83
+ secici = HTMLHelper(istek.text)
84
+
85
+ title = (secici.select_attr("meta[property='og:title']", "content") or "").split("|")[0].strip() or secici.select_text("h1")
86
+ poster = secici.select_poster("meta[property='og:image']")
87
+ description = secici.select_text("p#tv-series-desc")
88
+ year = secici.extract_year("td div.truncate")
89
+ tags = secici.meta_list("Türü", container_selector="div.item")
90
+ rating = secici.meta_value("IMDb Puanı", container_selector="div.item")
91
+ duration = int(secici.regex_first(r"(\d+)", secici.meta_value("Süre", container_selector="div.item")) or 0)
92
+ actors = secici.meta_list("Oyuncular", container_selector="div.item") or secici.select_texts("div#common-cast-list div.item h5")
93
+
96
94
  common_info = {
97
95
  "url" : url,
98
96
  "poster" : self.fix_url(poster),
@@ -107,15 +105,20 @@ class YabanciDizi(PluginBase):
107
105
 
108
106
  if "/film/" in url:
109
107
  return MovieInfo(**common_info)
110
-
108
+
111
109
  episodes = []
112
- for bolum in sel.select("div.episodes-list div.ui td:has(h6)"):
113
- link = sel.select_first("a", bolum)
110
+ for bolum in secici.select("div.episodes-list div.ui td:has(h6)"):
111
+ link = secici.select_first("a", bolum)
114
112
  if link:
115
113
  href = link.attrs.get("href")
116
- name = sel.select_text("h6", bolum) or link.text(strip=True)
117
- s, e = sel.extract_season_episode(href)
118
- episodes.append(Episode(season=s or 1, episode=e or 1, title=name, url=self.fix_url(href)))
114
+ name = secici.select_text("h6", bolum) or link.text(strip=True)
115
+ s, e = secici.extract_season_episode(href)
116
+ episodes.append(Episode(
117
+ season = s or 1,
118
+ episode = e or 1,
119
+ title = name,
120
+ url = self.fix_url(href)
121
+ ))
119
122
 
120
123
  if episodes and (episodes[0].episode or 0) > (episodes[-1].episode or 0):
121
124
  episodes.reverse()
@@ -123,109 +126,125 @@ class YabanciDizi(PluginBase):
123
126
  return SeriesInfo(**common_info, episodes=episodes)
124
127
 
125
128
  async def load_links(self, url: str) -> list[ExtractResult]:
126
- # Use cloudscraper to bypass Cloudflare
127
- resp = self.cloudscraper.get(url, headers={"Referer": f"{self.main_url}/"})
128
- sel = HTMLHelper(resp.text)
129
-
129
+ loop = asyncio.get_event_loop()
130
+
131
+ # 1. Ana sayfayı çek
132
+ istek = await loop.run_in_executor(None, lambda: self.cloudscraper.get(url, headers={"Referer": f"{self.main_url}/"}))
133
+ secici = HTMLHelper(istek.text)
134
+
130
135
  results = []
131
-
132
- # Method 1: alternatives-for-this (include active too)
133
- for alt in sel.select("div.alternatives-for-this div.item"):
134
- data_hash = alt.attrs.get("data-hash")
135
- data_link = alt.attrs.get("data-link")
136
- q_type = alt.attrs.get("data-querytype")
137
-
138
- if not data_hash or not data_link: continue
139
-
136
+ timestamp_ms = int(time.time() * 1000) - 50000
137
+
138
+ # 2. Dil Tablarını Bul
139
+ tabs = secici.select("div#series-tabs a")
140
+
141
+ async def process_tab(tab_el):
142
+ data_eid = tab_el.attrs.get("data-eid")
143
+ data_type = tab_el.attrs.get("data-type") # 1: Altyazı, 2: Dublaj
144
+ if not data_eid or not data_type:
145
+ return []
146
+
147
+ dil_adi = "Dublaj" if data_type == "2" else "Altyazı"
148
+
140
149
  try:
141
- post_resp = self.cloudscraper.post(
142
- f"{self.main_url}/ajax/service",
143
- data = {
144
- "link" : data_link,
145
- "hash" : data_hash,
146
- "querytype" : q_type,
147
- "type" : "videoGet"
148
- },
150
+ post_resp = await loop.run_in_executor(None, lambda: self.cloudscraper.post(
151
+ url = f"{self.main_url}/ajax/service",
149
152
  headers = {
150
153
  "X-Requested-With" : "XMLHttpRequest",
151
- "Referer" : f"{self.main_url}/"
152
- },
153
- cookies = {"udys": "1760709729873", "level": "1"}
154
- )
155
-
156
- service_data = post_resp.json()
157
- api_iframe = service_data.get("api_iframe")
158
- if api_iframe:
159
- extract_res = await self._fetch_and_extract(api_iframe, prefix="Alt")
160
- if extract_res:
161
- results.extend(extract_res if isinstance(extract_res, list) else [extract_res])
162
- except Exception:
163
- continue
164
-
165
- # Method 2: pointing[data-eid]
166
- for id_el in sel.select("a.ui.pointing[data-eid]"):
167
- dil = id_el.text(strip=True)
168
- v_lang = "tr" if "Dublaj" in dil else "en"
169
- data_eid = id_el.attrs.get("data-eid")
170
-
171
- try:
172
- post_resp = self.cloudscraper.post(
173
- f"{self.main_url}/ajax/service",
174
- data = {
175
- "e_id" : data_eid,
176
- "v_lang" : v_lang,
177
- "type" : "get_whatwehave"
154
+ "Referer" : url
178
155
  },
179
- headers = {
180
- "X-Requested-With" : "XMLHttpRequest",
181
- "Referer" : f"{self.main_url}/"
156
+ data = {
157
+ "lang" : data_type,
158
+ "episode" : data_eid,
159
+ "type" : "langTab"
182
160
  },
183
- cookies = {"udys": "1760709729873", "level": "1"}
184
- )
185
-
186
- service_data = post_resp.json()
187
- api_iframe = service_data.get("api_iframe")
188
- if api_iframe:
189
- extract_res = await self._fetch_and_extract(api_iframe, prefix=dil)
190
- if extract_res:
191
- results.extend(extract_res if isinstance(extract_res, list) else [extract_res])
192
- except Exception:
193
- continue
161
+ cookies = {"udys": str(timestamp_ms)}
162
+ ))
194
163
 
195
- return results
164
+ res_json = post_resp.json()
165
+ if not res_json.get("data"): return []
166
+
167
+ res_sel = HTMLHelper(res_json["data"])
168
+ sources = []
169
+
170
+ for item in res_sel.select("div.item"):
171
+ name = item.text(strip=True)
172
+ data_link = item.attrs.get("data-link")
173
+ if not data_link: continue
174
+
175
+ # Link normalizasyonu
176
+ safe_link = data_link.replace("/", "_").replace("+", "-")
177
+
178
+ # API Endpoint belirleme
179
+ api_path = None
180
+ if "VidMoly" in name:
181
+ api_path = "moly"
182
+ elif "Okru" in name:
183
+ api_path = "ruplay"
184
+ elif "Mac" in name:
185
+ api_path = "drive"
186
+
187
+ if api_path:
188
+ sources.append({
189
+ "name" : name,
190
+ "api_url" : f"{self.main_url}/api/{api_path}/{safe_link}",
191
+ "dil" : dil_adi
192
+ })
193
+
194
+ tab_results = []
195
+ for src in sources:
196
+ try:
197
+ # API sayfasını çekip içindeki iframe'i bulalım
198
+ api_resp = await loop.run_in_executor(None, lambda: self.cloudscraper.get(
199
+ src["api_url"],
200
+ headers={"Referer": f"{self.main_url}/"},
201
+ cookies={"udys": str(timestamp_ms)}
202
+ ))
203
+
204
+ api_sel = HTMLHelper(api_resp.text)
205
+ iframe = api_sel.select_attr("iframe", "src")
206
+
207
+ if not iframe and "drive" in src["api_url"]:
208
+ t_sec = int(time.time())
209
+ drives_url = f"{src['api_url'].replace('/api/drive/', '/api/drives/')}?t={t_sec}"
210
+ api_resp = await loop.run_in_executor(None, lambda: self.cloudscraper.get(
211
+ drives_url,
212
+ headers={"Referer": src["api_url"]},
213
+ cookies={"udys": str(timestamp_ms)}
214
+ ))
215
+ api_sel = HTMLHelper(api_resp.text)
216
+ iframe = api_sel.select_attr("iframe", "src")
217
+
218
+ if iframe:
219
+ prefix = f"{src['dil']} | {src['name']}"
220
+ extracted = await self.extract(self.fix_url(iframe), prefix=prefix)
221
+ if extracted:
222
+ tab_results.extend(extracted if isinstance(extracted, list) else [extracted])
223
+ except Exception:
224
+ continue
225
+ return tab_results
196
226
 
197
- def _fetch_and_extract_sync(self, iframe_url, prefix=""):
198
- """Synchronous helper for _fetch_and_extract using cloudscraper."""
199
- # Initial fetch
200
- resp = self.cloudscraper.get(
201
- iframe_url,
202
- headers = {"Referer": f"{self.main_url}/"},
203
- cookies = {"udys": "1760709729873", "level": "1"}
204
- )
205
-
206
- # Handle "Lütfen bekleyiniz" check from Kotlin
207
- if "Lütfen bekleyiniz" in resp.text:
208
- import time as time_module
209
- time_module.sleep(1)
210
- timestamp = int(time_module.time())
211
- # Retry with t=timestamp as in Kotlin
212
- sep = "&" if "?" in iframe_url else "?"
213
- resp = self.cloudscraper.get(
214
- f"{iframe_url}{sep}t={timestamp}",
215
- headers = {"Referer": f"{self.main_url}/"},
216
- cookies = resp.cookies # Use cookies from first response
217
- )
218
-
219
- sel = HTMLHelper(resp.text)
220
- final_iframe = sel.select_attr("iframe", "src")
221
-
222
- return final_iframe
223
-
224
- async def _fetch_and_extract(self, iframe_url, prefix=""):
225
- final_iframe = self._fetch_and_extract_sync(iframe_url, prefix)
226
-
227
- if final_iframe:
228
- final_url = self.fix_url(final_iframe)
229
- return await self.extract(final_url, referer=f"{self.main_url}/", prefix=prefix)
230
-
231
- return None
227
+ except Exception:
228
+ return []
229
+
230
+ if tabs:
231
+ results_groups = await asyncio.gather(*(process_tab(tab) for tab in tabs))
232
+ for group in results_groups:
233
+ results.extend(group)
234
+ else:
235
+ # Tab yoksa mevcut sayfada iframe ara
236
+ iframe = secici.select_attr("iframe", "src")
237
+ if iframe:
238
+ extracted = await self.extract(self.fix_url(iframe), name_override="Main")
239
+ if extracted:
240
+ results.extend(extracted if isinstance(extracted, list) else [extracted])
241
+
242
+ # Duplicate kontrolü
243
+ unique_results = []
244
+ seen = set()
245
+ for res in results:
246
+ if res.url and res.url not in seen:
247
+ unique_results.append(res)
248
+ seen.add(res.url)
249
+
250
+ return unique_results
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.4.9
3
+ Version: 2.5.0
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
@@ -12,17 +12,18 @@ KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6
12
12
  KekikStream/Core/Extractor/YTDLPCache.py,sha256=sRg5kwFxkRXA_8iRwsV29E51g9qQJvg8dWUnzfr7EwA,984
13
13
  KekikStream/Core/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
14
14
  KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
15
- KekikStream/Core/Plugin/PluginBase.py,sha256=7CjtXAdIJfOmBDgbpK0rLEng65kerOAfAxuVmZEs4Yo,7069
15
+ KekikStream/Core/Plugin/PluginBase.py,sha256=t6zaDlwDfnevIu-NLUgmQkBnw0mcRisb3jnUWlcv5tU,7335
16
16
  KekikStream/Core/Plugin/PluginLoader.py,sha256=6LE5id0571bB-gJZxaLfd973XcG6oaGeMhLVcYYY7kw,3768
17
17
  KekikStream/Core/Plugin/PluginManager.py,sha256=6a0Q2mHtzIpx1ttdSTsVHg2HfLJIO0r_iHjK3Kui1Rw,939
18
18
  KekikStream/Core/Plugin/PluginModels.py,sha256=7g1uHjJstfnrdTabDgyrBnu1ojIQ025hsmw85cDXFS8,2353
19
19
  KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
20
+ KekikStream/Extractors/Abstream.py,sha256=Xz2Ok84BJU5YRhQZjIM0rJA8GFju2BQimV8mHLXq3vc,905
20
21
  KekikStream/Extractors/CloseLoad.py,sha256=eoXr9Dxgfy3BUdQpXrvS69bqCFBmag95cmJLGhsHslE,1922
21
22
  KekikStream/Extractors/ContentX.py,sha256=832xDeKoudQYJBRxJntOuJ0G8xYFVq2vHhycdnzcMeg,2539
22
23
  KekikStream/Extractors/DonilasPlay.py,sha256=yIh6ZOVjXzHKc_Zi8j0Cpr4vWibwkSeoZxeFfU8IfmQ,1844
23
24
  KekikStream/Extractors/DzenRu.py,sha256=tUrQexHkclw9EdoFD_ACejW-QwlOnTDFTxA0v-1jIVU,932
24
25
  KekikStream/Extractors/ExPlay.py,sha256=hrG31pRFD5s_0wNls0fF8AdMn6ve5OD-mOAV32_1H2I,1324
25
- KekikStream/Extractors/Filemoon.py,sha256=y3VQpTVR2o4PGbRfLEXOlxQ0NM-JblaMUpoFhpka5iI,2263
26
+ KekikStream/Extractors/Filemoon.py,sha256=bdPKk58_HXgRL_ysNcpuESXrijTxKMETyBnXdmR0b_0,2289
26
27
  KekikStream/Extractors/HDMomPlayer.py,sha256=ui8aH9sc3NDlN2uKlhJiySUHA__mpSSvAPHRzde6F2k,1177
27
28
  KekikStream/Extractors/HDPlayerSystem.py,sha256=hoPN7fqVRBK97BnQ7vF_5TlEO28BD3DrsngDW48rw5E,936
28
29
  KekikStream/Extractors/HotStream.py,sha256=37H9pK4HSEqGR6QKgxz887JCBXfXB1NXDpBGuhvPmXo,1078
@@ -76,23 +77,23 @@ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=dJ1xo1D3ujPCQE6PewpqdvSMKlBbifA
76
77
  KekikStream/Plugins/HDFilm.py,sha256=m6tjV1O1l5U_jqkGKizi62GOdSMd5osyOS2_9jehS-w,10754
77
78
  KekikStream/Plugins/HDFilmCehennemi.py,sha256=h3FTKN-psrzvN0Juw8Am83MV8QL9aX-RSWhYqXRQU-E,17368
78
79
  KekikStream/Plugins/JetFilmizle.py,sha256=YyZmOWoh_SFGRARrKioq8fhv8VgzTiURFypJMoW8nzU,10279
79
- KekikStream/Plugins/KultFilmler.py,sha256=iHk3X8CwNxHRgGFZRK6BDqvZLs0p9GK5oi8IAm6w3Lw,8441
80
- KekikStream/Plugins/RecTV.py,sha256=MRoP8KQF2V9kVlRNTQkRz9YFkBmMy3_skiNE47-RAlk,7151
81
- KekikStream/Plugins/RoketDizi.py,sha256=2OIDct56NgmQJyv0gIi9ZprpxSL3u41ZdEst5q1mhq4,9222
80
+ KekikStream/Plugins/KultFilmler.py,sha256=D5aAFrv0ACtSBinwHTfNvP1Jp0W8W7-mwUsju_YPilk,10841
81
+ KekikStream/Plugins/RecTV.py,sha256=6rYxZV6J84rr2CZKTmP_0raYVp4pa5EMXQD6mMbZHbE,7315
82
+ KekikStream/Plugins/RoketDizi.py,sha256=TnupXb3cRJMDJAA7hclOPwECgOt5mOJx1hYEL_oK6rk,8488
82
83
  KekikStream/Plugins/SelcukFlix.py,sha256=8jr-HxAIXVILMUykPJRC7yD9AT1q0JU-vBwoYGxkFiM,14484
83
- KekikStream/Plugins/SetFilmIzle.py,sha256=5sEE1PagUFEqNo5McLrii7bgb9lcxRp6Wu8UXeOhe-Y,9073
84
- KekikStream/Plugins/SezonlukDizi.py,sha256=Q2I_LKEeSIFl1mdWvC3q3cyqpL7W4vAF-N7MxzgDYcw,8428
84
+ KekikStream/Plugins/SetFilmIzle.py,sha256=qplMZlKzSm8ln14pP_EuDNkctk9HJSDEbi_gNWP5PMc,10127
85
+ KekikStream/Plugins/SezonlukDizi.py,sha256=JcXx9O8qHCf9ZAlCA1qV3ef9n9hXfV2q12b8XjRkS64,9390
85
86
  KekikStream/Plugins/SineWix.py,sha256=z0r90lggAugEWE1g9vg8gZsInBObUZPnVFQwq7GYmJs,7052
86
- KekikStream/Plugins/Sinefy.py,sha256=EtdRXbCzLBmi1C64ZJMQu9nxfzNdW-nvHdO9MjwqoRM,8504
87
- KekikStream/Plugins/SinemaCX.py,sha256=VPaBPIBxk9m4QdOMUV8S_vlJSTQUdvXa5Rtz63vjarA,7536
88
- KekikStream/Plugins/Sinezy.py,sha256=I3DO0NytJz-7F2_0JZpmNLflvo3vunb4SLZBy2DadMg,5712
89
- KekikStream/Plugins/SuperFilmGeldi.py,sha256=jJKBrLPI4rXI8n55lIdZOTyzNccPAEEIkmTrQtTKPhY,6303
90
- KekikStream/Plugins/UgurFilm.py,sha256=NO6c1hHlylCfoP8fM-aVsxpBIyTAyu4uBHVM8CjybuI,5037
91
- KekikStream/Plugins/Watch32.py,sha256=NeESk1unb5SYs6kwkb3dDymv2yYOkRU2QJCPI9izXKk,7915
92
- KekikStream/Plugins/YabanciDizi.py,sha256=m4I8OM7Br_RRUSY0RAMpqcZ-_BwyjKXWHQuF_jS4EnE,9876
93
- kekikstream-2.4.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
94
- kekikstream-2.4.9.dist-info/METADATA,sha256=AuylDm8bUfwDBeEQ4CBg0hi6csQXcMrS1dvytuP-Qr0,10745
95
- kekikstream-2.4.9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
- kekikstream-2.4.9.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
97
- kekikstream-2.4.9.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
98
- kekikstream-2.4.9.dist-info/RECORD,,
87
+ KekikStream/Plugins/Sinefy.py,sha256=tRfXKeDkIiKrrl9mWQ8WGQV1r0MNFblE9Q9NNBm5wKQ,12514
88
+ KekikStream/Plugins/SinemaCX.py,sha256=DRHD3bZXeIwm6TGsGQZyky0m61L77vy7LLIGch56eoA,10844
89
+ KekikStream/Plugins/Sinezy.py,sha256=2vTRsCUFXSJgKZJbXxDoGRJ8_i4ZZptuPTjeQ4EiZWk,5733
90
+ KekikStream/Plugins/SuperFilmGeldi.py,sha256=hXhYYuQkVbYJ07P8y5QjY5iR3rVgUfAWc_MkOWtsXdM,6306
91
+ KekikStream/Plugins/UgurFilm.py,sha256=2U3-rC9JzwDoF1c8t3VyE3jMcz-SB51uxFX-8DqrQ7M,6778
92
+ KekikStream/Plugins/Watch32.py,sha256=wAw-glE9bQNsyfzhv1zlFIjYAhSvK58mUri-XGytuHs,7318
93
+ KekikStream/Plugins/YabanciDizi.py,sha256=aqdPLQ3Oajs32JNkgIPeqHuYgcM8K2jGHT0Ikw8Q6jY,10582
94
+ kekikstream-2.5.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
95
+ kekikstream-2.5.0.dist-info/METADATA,sha256=b2aOr4KjuY8SlMbdZoIHGFzdSHiAKc72llc6a_R2Oi8,10745
96
+ kekikstream-2.5.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
97
+ kekikstream-2.5.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
98
+ kekikstream-2.5.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
99
+ kekikstream-2.5.0.dist-info/RECORD,,