KekikStream 2.0.9__py3-none-any.whl → 2.1.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.
Files changed (35) hide show
  1. KekikStream/Core/Extractor/ExtractorBase.py +7 -2
  2. KekikStream/Core/Plugin/PluginBase.py +50 -1
  3. KekikStream/Extractors/ContentX.py +6 -2
  4. KekikStream/Extractors/MixTiger.py +5 -5
  5. KekikStream/Extractors/SetPlay.py +6 -3
  6. KekikStream/Plugins/BelgeselX.py +0 -8
  7. KekikStream/Plugins/DiziBox.py +6 -10
  8. KekikStream/Plugins/DiziPal.py +4 -15
  9. KekikStream/Plugins/DiziYou.py +2 -10
  10. KekikStream/Plugins/Dizilla.py +2 -5
  11. KekikStream/Plugins/FilmBip.py +3 -6
  12. KekikStream/Plugins/FilmMakinesi.py +28 -18
  13. KekikStream/Plugins/FilmModu.py +1 -9
  14. KekikStream/Plugins/FullHDFilm.py +4 -7
  15. KekikStream/Plugins/FullHDFilmizlesene.py +3 -5
  16. KekikStream/Plugins/HDFilmCehennemi.py +7 -46
  17. KekikStream/Plugins/JetFilmizle.py +6 -10
  18. KekikStream/Plugins/KultFilmler.py +4 -7
  19. KekikStream/Plugins/RecTV.py +2 -10
  20. KekikStream/Plugins/RoketDizi.py +4 -7
  21. KekikStream/Plugins/SelcukFlix.py +3 -7
  22. KekikStream/Plugins/SetFilmIzle.py +3 -10
  23. KekikStream/Plugins/SezonlukDizi.py +3 -7
  24. KekikStream/Plugins/SineWix.py +1 -9
  25. KekikStream/Plugins/SinemaCX.py +4 -12
  26. KekikStream/Plugins/Sinezy.py +3 -6
  27. KekikStream/Plugins/SuperFilmGeldi.py +4 -12
  28. KekikStream/Plugins/UgurFilm.py +4 -6
  29. KekikStream/__init__.py +2 -21
  30. {kekikstream-2.0.9.dist-info → kekikstream-2.1.4.dist-info}/METADATA +1 -1
  31. {kekikstream-2.0.9.dist-info → kekikstream-2.1.4.dist-info}/RECORD +35 -35
  32. {kekikstream-2.0.9.dist-info → kekikstream-2.1.4.dist-info}/WHEEL +0 -0
  33. {kekikstream-2.0.9.dist-info → kekikstream-2.1.4.dist-info}/entry_points.txt +0 -0
  34. {kekikstream-2.0.9.dist-info → kekikstream-2.1.4.dist-info}/licenses/LICENSE +0 -0
  35. {kekikstream-2.0.9.dist-info → kekikstream-2.1.4.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@ from cloudscraper import CloudScraper
5
5
  from httpx import AsyncClient
6
6
  from typing import Optional
7
7
  from .ExtractorModels import ExtractResult
8
- from urllib.parse import urljoin
8
+ from urllib.parse import urljoin, urlparse
9
9
 
10
10
  class ExtractorBase(ABC):
11
11
  # Çıkarıcının temel özellikleri
@@ -29,6 +29,11 @@ class ExtractorBase(ABC):
29
29
  # URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
30
30
  return self.main_url in url
31
31
 
32
+ def get_base_url(self, url: str) -> str:
33
+ """URL'den base URL'i çıkar (scheme + netloc)"""
34
+ parsed = urlparse(url)
35
+ return f"{parsed.scheme}://{parsed.netloc}"
36
+
32
37
  @abstractmethod
33
38
  async def extract(self, url: str, referer: Optional[str] = None) -> ExtractResult:
34
39
  # Alt sınıflar tarafından uygulanacak medya çıkarma fonksiyonu
@@ -46,4 +51,4 @@ class ExtractorBase(ABC):
46
51
  if url.startswith("http") or url.startswith("{\""):
47
52
  return url
48
53
 
49
- return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
54
+ return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
@@ -1,11 +1,13 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
+ from ...CLI import konsol
3
4
  from abc import ABC, abstractmethod
4
5
  from cloudscraper import CloudScraper
5
6
  from httpx import AsyncClient
6
7
  from .PluginModels import MainPageResult, SearchResult, MovieInfo
7
8
  from ..Media.MediaHandler import MediaHandler
8
9
  from ..Extractor.ExtractorManager import ExtractorManager
10
+ from ..Extractor.ExtractorModels import ExtractResult
9
11
  from urllib.parse import urljoin
10
12
  import re
11
13
 
@@ -95,6 +97,41 @@ class PluginBase(ABC):
95
97
 
96
98
  return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
97
99
 
100
+ async def extract(self, url: str, referer: str = None, prefix: str | None = None) -> dict | None:
101
+ """
102
+ Extractor ile video URL'sini çıkarır.
103
+
104
+ Args:
105
+ url: Iframe veya video URL'si
106
+ referer: Referer header (varsayılan: plugin main_url)
107
+ prefix: İsmin başına eklenecek opsiyonel etiket (örn: "Türkçe Dublaj")
108
+
109
+ Returns:
110
+ dict: Extractor sonucu (name prefix ile birleştirilmiş) veya None
111
+
112
+ Extractor bulunamadığında veya hata oluştuğunda uyarı verir.
113
+ """
114
+ if referer is None:
115
+ referer = f"{self.main_url}/"
116
+
117
+ extractor = self.ex_manager.find_extractor(url)
118
+ if not extractor:
119
+ konsol.log(f"[magenta][?] {self.name} » Extractor bulunamadı: {url}")
120
+ return None
121
+
122
+ try:
123
+ data = await extractor.extract(url, referer=referer)
124
+ result = data.dict()
125
+
126
+ # prefix varsa name'e ekle
127
+ if prefix and result.get("name"):
128
+ result["name"] = f"{prefix} | {result['name']}"
129
+
130
+ return result
131
+ except Exception as hata:
132
+ konsol.log(f"[red][!] {self.name} » Extractor hatası ({extractor.name}): {hata}")
133
+ return None
134
+
98
135
  @staticmethod
99
136
  def clean_title(title: str) -> str:
100
137
  suffixes = [
@@ -119,4 +156,16 @@ class PluginBase(ABC):
119
156
  for suffix in suffixes:
120
157
  cleaned_title = re.sub(f"{re.escape(suffix)}.*$", "", cleaned_title, flags=re.IGNORECASE).strip()
121
158
 
122
- return cleaned_title
159
+ return cleaned_title
160
+
161
+ async def play(self, **kwargs):
162
+ """
163
+ Varsayılan oynatma metodu.
164
+ Tüm pluginlerde ortak kullanılır.
165
+ """
166
+ extract_result = ExtractResult(**kwargs)
167
+ self.media_handler.title = kwargs.get("name")
168
+ if self.name not in self.media_handler.title:
169
+ self.media_handler.title = f"{self.name} | {self.media_handler.title}"
170
+
171
+ self.media_handler.play_media(extract_result)
@@ -24,6 +24,9 @@ class ContentX(ExtractorBase):
24
24
  if referer:
25
25
  self.httpx.headers.update({"Referer": referer})
26
26
 
27
+ # Dinamik base URL kullan
28
+ base_url = self.get_base_url(url)
29
+
27
30
  istek = await self.httpx.get(url)
28
31
  istek.raise_for_status()
29
32
  i_source = istek.text
@@ -52,7 +55,8 @@ class ContentX(ExtractorBase):
52
55
  )
53
56
  )
54
57
 
55
- vid_source_request = await self.httpx.get(f"{self.main_url}/source2.php?v={i_extract_value}", headers={"Referer": referer or self.main_url})
58
+ # base_url kullan (contentx.me yerine)
59
+ vid_source_request = await self.httpx.get(f"{base_url}/source2.php?v={i_extract_value}", headers={"Referer": referer or base_url})
56
60
  vid_source_request.raise_for_status()
57
61
 
58
62
  vid_source = vid_source_request.text
@@ -72,7 +76,7 @@ class ContentX(ExtractorBase):
72
76
 
73
77
  if i_dublaj := re.search(r',\"([^"]+)\",\"Türkçe"', i_source):
74
78
  dublaj_value = i_dublaj[1]
75
- dublaj_source_request = await self.httpx.get(f"{self.main_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or self.main_url})
79
+ dublaj_source_request = await self.httpx.get(f"{base_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or base_url})
76
80
  dublaj_source_request.raise_for_status()
77
81
 
78
82
  dublaj_source = dublaj_source_request.text
@@ -37,16 +37,15 @@ class MixTiger(ExtractorBase):
37
37
  if not m3u_link:
38
38
  raise ValueError("Video URL not found in response")
39
39
 
40
- # Recursive extraction check
40
+ # Recursive extraction check - başka extractor kullanılabilir mi?
41
41
  try:
42
42
  from KekikStream.Core.Extractor.ExtractorManager import ExtractorManager
43
- # Import inside method to avoid circular dependency
44
43
  manager = ExtractorManager()
45
44
  if nested_extractor := manager.find_extractor(m3u_link):
46
- # Use recursive extraction
47
- return await nested_extractor.extract(m3u_link, referer=final_referer)
45
+ # Nested extractor ile çıkar
46
+ return await nested_extractor.extract(m3u_link, referer=ext_ref)
48
47
  except Exception:
49
- # If recursion fails, fallback to standard result
48
+ # Recursive extraction başarısız olursa standart sonucu döndür
50
49
  pass
51
50
 
52
51
  return ExtractResult(
@@ -55,3 +54,4 @@ class MixTiger(ExtractorBase):
55
54
  referer = None if "disk.yandex" in m3u_link else ext_ref,
56
55
  subtitles = []
57
56
  )
57
+
@@ -1,6 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import ExtractorBase, ExtractResult
4
+ from urllib.parse import urlparse, parse_qs
4
5
  import re
5
6
 
6
7
  class SetPlay(ExtractorBase):
@@ -19,6 +20,9 @@ class SetPlay(ExtractorBase):
19
20
  if referer:
20
21
  self.httpx.headers.update({"Referer": referer})
21
22
 
23
+ # Dinamik base URL kullan
24
+ base_url = self.get_base_url(url)
25
+
22
26
  istek = await self.httpx.get(url)
23
27
  istek.raise_for_status()
24
28
 
@@ -39,7 +43,6 @@ class SetPlay(ExtractorBase):
39
43
  title_base = title_match[1].split(".")[-1] if title_match else "Unknown"
40
44
 
41
45
  # partKey logic
42
- from urllib.parse import urlparse, parse_qs
43
46
  parsed = urlparse(url)
44
47
  params = parse_qs(parsed.query)
45
48
  part_key = params.get("partKey", [""])[0]
@@ -52,8 +55,8 @@ class SetPlay(ExtractorBase):
52
55
  else:
53
56
  name_suffix = title_base
54
57
 
55
- # M3U8 link oluştur
56
- m3u_link = f"{self.main_url}{video_url}?s={video_server}"
58
+ # M3U8 link oluştur - base_url kullan (main_url yerine)
59
+ m3u_link = f"{base_url}{video_url}?s={video_server}"
57
60
 
58
61
  return ExtractResult(
59
62
  name = f"{self.name} - {name_suffix}",
@@ -194,11 +194,3 @@ class BelgeselX(PluginBase):
194
194
  })
195
195
 
196
196
  return links
197
-
198
- async def play(self, **kwargs):
199
- extract_result = ExtractResult(**kwargs)
200
- self.media_handler.title = kwargs.get("name")
201
- if self.name not in self.media_handler.title:
202
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
203
-
204
- self.media_handler.play_media(extract_result)
@@ -182,11 +182,9 @@ class DiziBox(PluginBase):
182
182
  if main_iframe := secici.css("div#video-area iframe::attr(src)").get():
183
183
  if decoded := await self._iframe_decode(self.name, main_iframe, url):
184
184
  for iframe in decoded:
185
- extractor = self.ex_manager.find_extractor(iframe)
186
- results.append({
187
- "url" : iframe,
188
- "name" : f"{extractor.name if extractor else 'Main Player'}"
189
- })
185
+ data = await self.extract(iframe)
186
+ if data:
187
+ results.append(data)
190
188
 
191
189
  for alternatif in secici.css("div.video-toolbar option[value]"):
192
190
  alt_name = alternatif.css("::text").get()
@@ -203,10 +201,8 @@ class DiziBox(PluginBase):
203
201
  if alt_iframe := alt_secici.css("div#video-area iframe::attr(src)").get():
204
202
  if decoded := await self._iframe_decode(alt_name, alt_iframe, url):
205
203
  for iframe in decoded:
206
- extractor = self.ex_manager.find_extractor(iframe)
207
- results.append({
208
- "url" : iframe,
209
- "name" : f"{extractor.name if extractor else alt_name}"
210
- })
204
+ data = await self.extract(iframe, prefix=alt_name)
205
+ if data:
206
+ results.append(data)
211
207
 
212
208
  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 PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, Subtitle
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -228,19 +228,8 @@ class DiziPal(PluginBase):
228
228
  })
229
229
  else:
230
230
  # Extractor'a yönlendir
231
- extractor = self.ex_manager.find_extractor(iframe)
232
- results.append({
233
- "name" : f"{extractor.name if extractor else self.name}",
234
- "url" : iframe,
235
- "referer" : f"{self.main_url}/",
236
- })
231
+ data = await self.extract(iframe)
232
+ if data:
233
+ results.append(data)
237
234
 
238
235
  return results
239
-
240
- async def play(self, **kwargs):
241
- extract_result = ExtractResult(**kwargs)
242
- self.media_handler.title = kwargs.get("name")
243
- if self.name not in self.media_handler.title:
244
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
245
-
246
- self.media_handler.play_media(extract_result)
@@ -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 PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -186,12 +186,4 @@ class DiziYou(PluginBase):
186
186
  "subtitles" : subtitles
187
187
  })
188
188
 
189
- return results
190
-
191
- async def play(self, **kwargs):
192
- extract_result = ExtractResult(**kwargs)
193
- self.media_handler.title = kwargs.get("name")
194
- if self.name not in self.media_handler.title:
195
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
196
-
197
- self.media_handler.play_media(extract_result)
189
+ return results
@@ -196,8 +196,5 @@ class Dizilla(PluginBase):
196
196
  if not iframe_url:
197
197
  return []
198
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
- }]
199
+ data = await self.extract(iframe_url, prefix=first_result.get('language_name', 'Unknown'))
200
+ return [data] if data else []
@@ -135,11 +135,8 @@ class FilmBip(PluginBase):
135
135
  iframe = self.fix_url(player.css("iframe::attr(src)").get())
136
136
 
137
137
  if iframe:
138
- extractor = self.ex_manager.find_extractor(iframe)
139
- results.append({
140
- "name" : extractor.name if extractor else "Player",
141
- "url" : iframe,
142
- "referer" : f"{self.main_url}/"
143
- })
138
+ data = await self.extract(iframe)
139
+ if data:
140
+ results.append(data)
144
141
 
145
142
  return results
@@ -75,18 +75,22 @@ class FilmMakinesi(PluginBase):
75
75
  istek = await self.httpx.get(url)
76
76
  secici = Selector(istek.text)
77
77
 
78
- title = secici.css("h1.title::text").get().strip()
79
- poster = secici.css("img.cover-img::attr(src)").get().strip()
80
- description = secici.css("div.info-description p::text").get().strip()
78
+ title = secici.css("h1.title::text").get()
79
+ title = title.strip() if title else ""
80
+ poster = secici.css("img.cover-img::attr(src)").get()
81
+ poster = poster.strip() if poster else ""
82
+ description = secici.css("div.info-description p::text").get()
83
+ description = description.strip() if description else ""
81
84
  rating = secici.css("div.score::text").get()
82
85
  if rating:
83
86
  rating = rating.strip().split()[0]
84
- year = secici.css("span.date a::text").get().strip()
87
+ year = secici.css("span.date a::text").get()
88
+ year = year.strip() if year else ""
85
89
  actors = secici.css("div.cast-name::text").getall()
86
90
  tags = secici.css("div.genre a::text").getall()
87
91
  duration = secici.css("div.time::text").get()
88
92
  if duration:
89
- duration = duration.split()[1].strip()
93
+ duration = duration.split()[1].strip() if len(duration.split()) > 1 else ""
90
94
 
91
95
  return MovieInfo(
92
96
  url = url,
@@ -104,18 +108,24 @@ class FilmMakinesi(PluginBase):
104
108
  istek = await self.httpx.get(url)
105
109
  secici = Selector(istek.text)
106
110
 
107
- iframe_src = secici.css("iframe::attr(data-src)").get()
111
+ response = []
108
112
 
109
- all_links = [iframe_src] if iframe_src else []
113
+ # Video parts linklerini ve etiketlerini al
110
114
  for link in secici.css("div.video-parts a[data-video_url]"):
111
- all_links.append(link.attrib.get("data-video_url"))
112
-
113
- response = []
114
- for idx, link in enumerate(all_links):
115
- extractor = self.ex_manager.find_extractor(link)
116
- response.append({
117
- "url" : link,
118
- "name" : f"{extractor.name if extractor else f'Player {idx + 1}'}",
119
- })
120
-
121
- return response
115
+ video_url = link.attrib.get("data-video_url")
116
+ label = link.css("::text").get() or ""
117
+ label = label.strip()
118
+
119
+ data = await self.extract(video_url, prefix=label.split()[0] if label else None)
120
+ if data:
121
+ response.append(data)
122
+
123
+ # Eğer video-parts yoksa iframe kullan
124
+ if not response:
125
+ iframe_src = secici.css("iframe::attr(data-src)").get()
126
+ if iframe_src:
127
+ data = await self.extract(iframe_src)
128
+ if data:
129
+ response.append(data)
130
+
131
+ return response
@@ -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 PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -132,11 +132,3 @@ class FilmModu(PluginBase):
132
132
  })
133
133
 
134
134
  return results
135
-
136
- async def play(self, **kwargs):
137
- extract_result = ExtractResult(**kwargs)
138
- self.media_handler.title = kwargs.get("name")
139
- if self.name not in self.media_handler.title:
140
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
141
-
142
- self.media_handler.play_media(extract_result)
@@ -153,12 +153,9 @@ class FullHDFilm(PluginBase):
153
153
  results = []
154
154
 
155
155
  if iframe_src:
156
- extractor = self.ex_manager.find_extractor(iframe_src)
157
- results.append({
158
- "name" : extractor.name if extractor else "FullHDFilm Player",
159
- "url" : iframe_src,
160
- "referer" : self.main_url,
161
- "subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
162
- })
156
+ data = await self.extract(iframe_src)
157
+ if data:
158
+ data["subtitles"] = [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
159
+ results.append(data)
163
160
 
164
161
  return results
@@ -119,10 +119,8 @@ class FullHDFilmizlesene(PluginBase):
119
119
  response = []
120
120
  for link in link_list:
121
121
  link = f"https:{link}" if link.startswith("//") else link
122
- extractor = self.ex_manager.find_extractor(link)
123
- response.append({
124
- "url" : link,
125
- "name" : extractor.name if extractor else "Direct Link"
126
- })
122
+ data = await self.extract(link)
123
+ if data:
124
+ response.append(data)
127
125
 
128
126
  return response
@@ -1,9 +1,9 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle
4
4
  from parsel import Selector
5
5
  from Kekik.Sifreleme import Packer, StreamDecoder
6
- import random, string, re, base64
6
+ import random, string, re
7
7
 
8
8
  class HDFilmCehennemi(PluginBase):
9
9
  name = "HDFilmCehennemi"
@@ -11,8 +11,6 @@ class HDFilmCehennemi(PluginBase):
11
11
  main_url = "https://www.hdfilmcehennemi.ws"
12
12
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
13
  description = "Türkiye'nin en hızlı hd film izleme sitesi. Tek ve gerçek hdfilmcehennemi sitesi."
14
-
15
-
16
14
 
17
15
  main_page = {
18
16
  f"{main_url}" : "Yeni Eklenen Filmler",
@@ -146,35 +144,6 @@ class HDFilmCehennemi(PluginBase):
146
144
 
147
145
  return results
148
146
 
149
- def hdch_decode(self, value_parts: list[str]) -> str:
150
- """
151
- HDFilmCehennemi için özel decoder.
152
- JavaScript sırası: join -> reverse -> atob -> atob -> shift_back
153
- """
154
- try:
155
- # 1. Parçaları birleştir
156
- joined = ''.join(value_parts)
157
-
158
- # 2. Ters çevir (REV)
159
- result = StreamDecoder._reverse(joined)
160
-
161
- # 3. İlk base64 decode (B64D)
162
- result = StreamDecoder._base64_decode(result)
163
- if result is None:
164
- return ""
165
-
166
- # 4. İkinci base64 decode (B64D) - JavaScript'te iki kez atob yapılıyor!
167
- result = StreamDecoder._base64_decode(result)
168
- if result is None:
169
- return ""
170
-
171
- # 5. Shift back (SHF)
172
- result = StreamDecoder._shift_back(result)
173
-
174
- return result
175
- except Exception:
176
- return ""
177
-
178
147
  def extract_hdch_url(self, unpacked: str) -> str:
179
148
  """HDFilmCehennemi unpacked script'ten video URL'sini çıkar"""
180
149
  # 1) Decode fonksiyonunun adını bul: function <NAME>(value_parts)
@@ -189,16 +158,16 @@ class HDFilmCehennemi(PluginBase):
189
158
  match_call = array_call_regex.search(unpacked)
190
159
  if not match_call:
191
160
  return ""
192
-
161
+
193
162
  array_body = match_call.group(1)
194
-
163
+
195
164
  # 3) Array içindeki string parçalarını topla
196
165
  parts = re.findall(r'["\']([^"\']+)["\']', array_body)
197
166
  if not parts:
198
167
  return ""
199
-
168
+
200
169
  # 4) Özel decoder ile çöz
201
- return self.hdch_decode(parts)
170
+ return StreamDecoder._brute_force(parts)
202
171
 
203
172
  async def invoke_local_source(self, iframe: str, source: str, url: str):
204
173
  self.httpx.headers.update({
@@ -285,12 +254,4 @@ class HDFilmCehennemi(PluginBase):
285
254
  for video_data in video_data_list:
286
255
  results.append(video_data)
287
256
 
288
- return results
289
-
290
- async def play(self, **kwargs):
291
- extract_result = ExtractResult(**kwargs)
292
- self.media_handler.title = kwargs.get("name")
293
- if self.name not in self.media_handler.title:
294
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
295
-
296
- self.media_handler.play_media(extract_result)
257
+ return results
@@ -110,11 +110,9 @@ class JetFilmizle(PluginBase):
110
110
 
111
111
  if src and src != "about:blank":
112
112
  iframe_url = self.fix_url(src)
113
- extractor = self.ex_manager.find_extractor(iframe_url)
114
- results.append({
115
- "url": iframe_url,
116
- "name": extractor.name if extractor else "Ana Player"
117
- })
113
+ data = await self.extract(iframe_url)
114
+ if data:
115
+ results.append(data)
118
116
 
119
117
  # 2) Sayfa numaralarından linkleri topla (Fragman hariç)
120
118
  page_links = []
@@ -138,11 +136,9 @@ class JetFilmizle(PluginBase):
138
136
 
139
137
  if src and src != "about:blank":
140
138
  iframe_url = self.fix_url(src)
141
- extractor = self.ex_manager.find_extractor(iframe_url)
142
- results.append({
143
- "url": iframe_url,
144
- "name": f"{extractor.name if extractor else 'Player'} | {isim}"
145
- })
139
+ data = await self.extract(iframe_url, prefix=isim)
140
+ if data:
141
+ results.append(data)
146
142
  except Exception:
147
143
  continue
148
144
 
@@ -208,12 +208,9 @@ class KultFilmler(PluginBase):
208
208
  if subtitle_url:
209
209
  subtitles.append(Subtitle(name="Türkçe", url=subtitle_url))
210
210
 
211
- extractor = self.ex_manager.find_extractor(iframe)
212
- results.append({
213
- "name" : extractor.name if extractor else "Player",
214
- "url" : iframe,
215
- "referer" : f"{self.main_url}/",
216
- "subtitles" : subtitles
217
- })
211
+ data = await self.extract(iframe)
212
+ if data:
213
+ data["subtitles"] = subtitles
214
+ results.append(data)
218
215
 
219
216
  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 PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo
4
4
  from json import dumps, loads
5
5
  import re
6
6
 
@@ -147,12 +147,4 @@ class RecTV(PluginBase):
147
147
  "referer" : "https://twitter.com/"
148
148
  })
149
149
 
150
- return results
151
-
152
- async def play(self, **kwargs):
153
- extract_result = ExtractResult(**kwargs)
154
- self.media_handler.title = kwargs.get("name")
155
- if self.name not in self.media_handler.title:
156
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
157
-
158
- self.media_handler.play_media(extract_result)
150
+ return results
@@ -211,13 +211,10 @@ class RoketDizi(PluginBase):
211
211
  continue
212
212
  seen_urls.add(iframe_url)
213
213
 
214
- # Check extractor
215
- extractor = self.ex_manager.find_extractor(iframe_url)
216
-
217
- results.append({
218
- "url" : iframe_url,
219
- "name" : extractor.name if extractor else "Player"
220
- })
214
+ # Extract with helper
215
+ data = await self.extract(iframe_url)
216
+ if data:
217
+ results.append(data)
221
218
 
222
219
  return results
223
220
 
@@ -284,13 +284,9 @@ class SelcukFlix(PluginBase):
284
284
  iframe_src = iframe_sel.css("iframe::attr(src)").get()
285
285
  if iframe_src:
286
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
- }]
287
+ data = await self.extract(iframe_src)
288
+ if data:
289
+ return [data]
294
290
 
295
291
  return []
296
292
 
@@ -245,15 +245,8 @@ class SetFilmIzle(PluginBase):
245
245
  if not label and part_key:
246
246
  label = part_key.replace("_", " ").title()
247
247
 
248
- extractor = self.ex_manager.find_extractor(iframe_url)
249
- name = extractor.name if extractor else player_name or "Direct Link"
250
- if label:
251
- name = f"{name} | {label}"
252
-
253
- links.append({
254
- "url" : iframe_url,
255
- "name" : name,
256
- "referer" : self.main_url
257
- })
248
+ data = await self.extract(iframe_url, prefix=label if label else None)
249
+ if data:
250
+ links.append(data)
258
251
 
259
252
  return links
@@ -152,12 +152,8 @@ class SezonlukDizi(PluginBase):
152
152
  continue
153
153
 
154
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
- })
155
+ data = await self.extract(iframe_url, prefix=label)
156
+ if data:
157
+ results.append(data)
162
158
 
163
159
  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 PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo
4
4
  import json
5
5
 
6
6
  class SineWix(PluginBase):
@@ -156,11 +156,3 @@ class SineWix(PluginBase):
156
156
  })
157
157
 
158
158
  return results
159
-
160
- async def play(self, **kwargs):
161
- extract_result = ExtractResult(**kwargs)
162
- self.media_handler.title = kwargs.get("name")
163
- if self.name not in self.media_handler.title:
164
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
165
-
166
- self.media_handler.play_media(extract_result)
@@ -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 PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -138,16 +138,8 @@ class SinemaCX(PluginBase):
138
138
  })
139
139
  else:
140
140
  # Extractor'a yönlendir
141
- extractor = self.ex_manager.find_extractor(iframe)
142
- data = await extractor.extract(iframe, referer=f"{self.main_url}/")
143
- results.append(data.dict())
141
+ data = await self.extract(iframe)
142
+ if data:
143
+ results.append(data)
144
144
 
145
145
  return results
146
-
147
- async def play(self, **kwargs):
148
- extract_result = ExtractResult(**kwargs)
149
- self.media_handler.title = kwargs.get("name")
150
- if self.name not in self.media_handler.title:
151
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
152
-
153
- self.media_handler.play_media(extract_result)
@@ -134,12 +134,9 @@ class Sinezy(PluginBase):
134
134
  iframe = iframe_match.group(1)
135
135
  iframe = self.fix_url(iframe)
136
136
 
137
- extractor = self.ex_manager.find_extractor(iframe)
138
-
139
- return [{
140
- "url" : iframe,
141
- "name" : extractor.name if extractor else "Iframe"
142
- }]
137
+ data = await self.extract(iframe)
138
+ if data:
139
+ return [data]
143
140
  except Exception:
144
141
  pass
145
142
 
@@ -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 PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -112,16 +112,8 @@ class SuperFilmGeldi(PluginBase):
112
112
  })
113
113
  else:
114
114
  # Extractor'a yönlendir
115
- extractor = self.ex_manager.find_extractor(iframe)
116
- data = await extractor.extract(iframe, referer=f"{self.main_url}/")
117
- results.append(data.dict())
115
+ data = await self.extract(iframe)
116
+ if data:
117
+ results.append(data)
118
118
 
119
119
  return results
120
-
121
- async def play(self, **kwargs):
122
- extract_result = ExtractResult(**kwargs)
123
- self.media_handler.title = kwargs.get("name")
124
- if self.name not in self.media_handler.title:
125
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
126
-
127
- self.media_handler.play_media(extract_result)
@@ -84,7 +84,7 @@ class UgurFilm(PluginBase):
84
84
  secici = Selector(istek.text)
85
85
  results = []
86
86
 
87
- for idx, part_link in enumerate(secici.css("li.parttab a::attr(href)").getall()):
87
+ for part_link in secici.css("li.parttab a::attr(href)").getall():
88
88
  sub_response = await self.httpx.get(part_link)
89
89
  sub_selector = Selector(sub_response.text)
90
90
 
@@ -100,10 +100,8 @@ class UgurFilm(PluginBase):
100
100
  data = post_data
101
101
  )
102
102
  iframe = self.fix_url(player_response.json().get("iframe"))
103
- extractor = self.ex_manager.find_extractor(iframe)
104
- results.append({
105
- "url" : iframe,
106
- "name" : f"{extractor.name if extractor else f'Part {idx + 1}'}"
107
- })
103
+ data = await self.extract(iframe)
104
+ if data:
105
+ results.append(data)
108
106
 
109
107
  return results
KekikStream/__init__.py CHANGED
@@ -232,27 +232,8 @@ class KekikStream:
232
232
  konsol.print("[bold red]Bağlantı bulunamadı![/bold red]")
233
233
  return await self.handle_no_results()
234
234
 
235
- # Direkt oynatma varsa
236
- if hasattr(self.current_plugin, "play"):
237
- return await self.play_direct(links)
238
-
239
- # Extractor ile oynat
240
- url_list = [link["url"] for link in links]
241
- mapping = self.extractor.map_links_to_extractors(url_list)
242
-
243
- if not mapping:
244
- konsol.print("[bold red]Extractor bulunamadı![/bold red]")
245
- return await self.handle_no_results()
246
-
247
- choice = await self.ui.select_from_list("Ne yapmak istersiniz?", ["İzle", "Tüm Eklentilerde Ara", "Ana Menü"])
248
-
249
- match choice:
250
- case "İzle":
251
- await self.play_with_extractor(links, mapping)
252
- case "Tüm Eklentilerde Ara":
253
- await self.search_all_plugins()
254
- case "Ana Menü":
255
- await self.start()
235
+ # Direkt oynatma - tüm pluginlerde artık play metodu var (PluginBase'den miras)
236
+ return await self.play_direct(links)
256
237
 
257
238
  async def play_direct(self, links: list[dict]):
258
239
  """Plugin'in kendi metoduyla oynat"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.0.9
3
+ Version: 2.1.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
@@ -1,23 +1,23 @@
1
- KekikStream/__init__.py,sha256=JcSKsLRyJM5ZPNHq4DLSaj4FzOjxSp8M8JuM3YN8Ye4,13456
1
+ KekikStream/__init__.py,sha256=7WBVAkCpUNvxYgRjDiy3sCdug7efWL7yg_SDdwsB9K4,12775
2
2
  KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
3
3
  KekikStream/requirements.txt,sha256=0fO-7byqgLMr4NyJO7fQBFOnLv0zcAeqk7tLhHXqonk,76
4
4
  KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
5
5
  KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElcii8,1487
6
6
  KekikStream/Core/__init__.py,sha256=Ise27_Hqe1YeqTcSNnf3HqynhbySEVC-pNP2uKa2GOo,771
7
- KekikStream/Core/Extractor/ExtractorBase.py,sha256=_9l0VIZpFHBdzVLI_hp1RQRf4CmsxrTt-FIKEaF1Z04,1824
7
+ KekikStream/Core/Extractor/ExtractorBase.py,sha256=CAdeel6zGlj_RHD0lwjyNW5hAaivo1XyAZbnmiVDaZo,2023
8
8
  KekikStream/Core/Extractor/ExtractorLoader.py,sha256=GPGCmgFpDBywR8CsNw43-ddseZhSKTjAUETp1Ohbi6E,4796
9
9
  KekikStream/Core/Extractor/ExtractorManager.py,sha256=VYkj4CCE5Puqsr6PCeN8i_OS0hfYKI4NScj98BLO39o,2644
10
10
  KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6XBOc0HS0tXGDwajI,445
11
11
  KekikStream/Core/Extractor/YTDLPCache.py,sha256=sRg5kwFxkRXA_8iRwsV29E51g9qQJvg8dWUnzfr7EwA,984
12
12
  KekikStream/Core/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
13
13
  KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
14
- KekikStream/Core/Plugin/PluginBase.py,sha256=xR1J6unUDpUNe_fHRtZSryEbAPdf-qdT3LpMsjT_kBk,4126
14
+ KekikStream/Core/Plugin/PluginBase.py,sha256=OYmYtIlyIVq8nPXqEi7i3zBG4pren10ZoyZ-LnWb8e8,5969
15
15
  KekikStream/Core/Plugin/PluginLoader.py,sha256=GcDqN1u3nJeoGKH_oDFHCpwteJlLCxHNbmPrC5L-hZE,3692
16
16
  KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
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=TEXJppAZJLkf0x8jxaKnrCVAcabqdBFBswinpqjG_70,3513
20
+ KekikStream/Extractors/ContentX.py,sha256=x0j67e1OAw4L1m7ejUTyiIxqr1EhvpjaA_0U-s4IQ-I,3617
21
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
@@ -25,14 +25,14 @@ KekikStream/Extractors/HDPlayerSystem.py,sha256=EgnFzx5Q4PkuwAtuff5SYU9k59B-CyOd
25
25
  KekikStream/Extractors/JetTv.py,sha256=aA3WeOvR-tszac-WSwunZZb1NRy25TQH8vxY3TDscRI,1596
26
26
  KekikStream/Extractors/MailRu.py,sha256=xQVCWwYqNoG5T43VAW1_m0v4e80FbO-1pNPKkwhTccU,1218
27
27
  KekikStream/Extractors/MixPlayHD.py,sha256=POV_yq3KoZ6S6EqFsKYULEBz92NdUa2BpYKNo0eNQH8,1552
28
- KekikStream/Extractors/MixTiger.py,sha256=mMEYhhr5-u6GgIrLESeFTRdwDykgSXKJO4KtkMML1bw,2124
28
+ KekikStream/Extractors/MixTiger.py,sha256=4VbOYgE4s5H-BGVvJI0AI57M-WBWqnek_LGfCFHAucw,2116
29
29
  KekikStream/Extractors/MolyStream.py,sha256=IeeBw9tJJrL5QQ-t2Yp-a-6lnDc3Y00UNiaN6m-o-7c,1160
30
30
  KekikStream/Extractors/Odnoklassniki.py,sha256=YfFRCL3Ag5N4zDzK9ZLOr3HVQcsETFQpff1px02imJ0,4019
31
31
  KekikStream/Extractors/PeaceMakerst.py,sha256=pEgJb3KDfEPAUjbuvrYbUlxIciKgED-Vd0arrRO3QCk,2317
32
32
  KekikStream/Extractors/PixelDrain.py,sha256=Uk2pPvtBzaKtRXu1iNO8FLHd0EAuIOIzI1H_n02tg-U,964
33
33
  KekikStream/Extractors/PlayerFilmIzle.py,sha256=kH-O_RtQvG4iRLGKi-sFn1ST14DrxxoAa5iRT2PsdXc,2503
34
34
  KekikStream/Extractors/RapidVid.py,sha256=FgAZfgtnKE57KRiRIFw-6_ZES0Trp5QriNbRTfSBGQs,3139
35
- KekikStream/Extractors/SetPlay.py,sha256=FjHYtC6xTeeikTkrW6jz0TpWz0kaoJ5qHhr_H7aThEY,2135
35
+ KekikStream/Extractors/SetPlay.py,sha256=6XuNXoNFM1h3KOCkTxeZmcAl8QTdqzVN_pp_dEIKF8A,2235
36
36
  KekikStream/Extractors/SetPrime.py,sha256=ob09y-Sm91YR7rIRzikhZiMHX6D4Djm5QzFTg6KbO4k,1536
37
37
  KekikStream/Extractors/SibNet.py,sha256=zJTkzlr34ufKCWzKKCgJrzhb2o-fpjTjFdi38gv6N6g,849
38
38
  KekikStream/Extractors/Sobreatsesuyp.py,sha256=qlSQHUHjTjBoY0nsuZQWAjnfswbPORkBg6rUuP7SagA,2000
@@ -48,33 +48,33 @@ KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ3
48
48
  KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
49
49
  KekikStream/Extractors/YTDLP.py,sha256=Hy8loCSFSquu2zaL3INord-Jm6T8CM6K2-VcDA2K79g,7390
50
50
  KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
51
- KekikStream/Plugins/BelgeselX.py,sha256=WdCeU_Zvsph0kHt7jAWaZ3DQ_2rxaFChmhGKPcHLJpo,8728
52
- KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
53
- KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
54
- KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
55
- KekikStream/Plugins/Dizilla.py,sha256=ssoSZgT7RWO8ENYmdNeh-4pvY84yrRWDZ-qskdo8Lmg,11852
56
- KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
57
- KekikStream/Plugins/FilmMakinesi.py,sha256=xKI7iw3xvmIgyI2oir3bAWXVMFbaEDo6JrqhVRPm1vE,5260
58
- KekikStream/Plugins/FilmModu.py,sha256=0qFkpX7zuH3GCwmseoKpXLved5Yg243oJb8N7DySrCQ,6871
59
- KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
60
- KekikStream/Plugins/FullHDFilmizlesene.py,sha256=8ozxyuJnivFe1Cu_Fb8HjVPH-ptKCSWawYzGFcA1B98,6160
61
- KekikStream/Plugins/HDFilmCehennemi.py,sha256=dwTEb2i7BxHE3Iy60A8WOVl4Rtm2DvS0FfTUQ3Vu3IA,12409
62
- KekikStream/Plugins/JetFilmizle.py,sha256=Jm2cYEgV_bRXVjrDtnLTelvyxGHVAUCZkKmP3lUkEA8,6631
63
- KekikStream/Plugins/KultFilmler.py,sha256=fABm74yQhEUsvuWRSEK0jiy0VJflxtFZ5p65UDC_NP0,9103
64
- KekikStream/Plugins/RecTV.py,sha256=dF3Ogf7KE_zpfLQRjVcEJQMuWtBtHo6iB73_ECQEJ58,7544
65
- KekikStream/Plugins/RoketDizi.py,sha256=PY9Cf6X0I21FdMj0K48WwvwRPtznoqI3mMsctXAeLHs,8672
66
- KekikStream/Plugins/SelcukFlix.py,sha256=rajt0BbdiJDFvihD5HmjwizNdgmOXb3BN8c4Ju7aRkc,12533
67
- KekikStream/Plugins/SetFilmIzle.py,sha256=buz8B8MOTPw-TMV8U-k4IG3PUEFFKtOXb0fV7VZlwMA,10224
68
- KekikStream/Plugins/SezonlukDizi.py,sha256=vW-Mvk63Y9sAJmPnY1IdFwBzCMEB2tF03zwHVETZTtI,7262
69
- KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
51
+ KekikStream/Plugins/BelgeselX.py,sha256=qVYZpmadbVImCAlBNwkak7ShHVECFgO3cr5VcPGnq6Y,8396
52
+ KekikStream/Plugins/DiziBox.py,sha256=7WxUhyr-RwDpgYS3SnlwgN_TQnSPSZ-lZ5xW-mPbCek,9691
53
+ KekikStream/Plugins/DiziPal.py,sha256=hCjf1as54Bc6aC3UV9P0T4yIbOFOP6jHIAoIgRMPbJQ,9686
54
+ KekikStream/Plugins/DiziYou.py,sha256=XTTShRhlDjTNeqgc28HF-FN9Y7tGUBzHZU0KuFgwvYA,8669
55
+ KekikStream/Plugins/Dizilla.py,sha256=OzZJuFDJK6q6szIcAFM-s3H1HNdUuTaK8VWVGhnONBs,11741
56
+ KekikStream/Plugins/FilmBip.py,sha256=bgdUJWW6f_DoaKxJPES0tJJRauy2PVpw4jsg2zAjbcI,6012
57
+ KekikStream/Plugins/FilmMakinesi.py,sha256=PS2bST0IuzYSbE1D87KTeazZmWvLp7JC_gIC1lPkf6Y,5684
58
+ KekikStream/Plugins/FilmModu.py,sha256=ux5FACwmkuNQxx3rXQEeX-bWSXC4L7CfFxBZOhPuPFc,6524
59
+ KekikStream/Plugins/FullHDFilm.py,sha256=lYcGpes7HJYFHoKn_Ntk3gUL6bdm8MzDLAv0ns6S1YM,6837
60
+ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=nimV_mSaPYYxG4_d-gnW2Bh4EKMM6hGh0Ev8RbJVs-8,6054
61
+ KekikStream/Plugins/HDFilmCehennemi.py,sha256=LqTlqXdQkhcAME7XYcFW8HAvPxK2nSilXKkyVElsgcg,11060
62
+ KekikStream/Plugins/JetFilmizle.py,sha256=4gbvLgnjdzWr6f10jKYQAC4W5NEJCEOKxJnVQH36QTY,6386
63
+ KekikStream/Plugins/KultFilmler.py,sha256=H_U2uil9Z-aw10tZuSUB0dmMtQJrnckodGRhaA6t6gg,8944
64
+ KekikStream/Plugins/RecTV.py,sha256=tzIVjBP4YKL4dBvjRNIuECrAfNw6F892Fw0pXvLutoU,7187
65
+ KekikStream/Plugins/RoketDizi.py,sha256=hiqeFeARK9Gs2Ar933vVtCndrMXCqAkLIallxHsVw18,8544
66
+ KekikStream/Plugins/SelcukFlix.py,sha256=8OnYtiQro4VBd1f9UKfdpWG96vdUhOafn2wwD2vEkhY,12351
67
+ KekikStream/Plugins/SetFilmIzle.py,sha256=X31Xk1wTQgRDqFdyD9ZDQwa3LCr1dZ7aGpGfB8TDkDg,9991
68
+ KekikStream/Plugins/SezonlukDizi.py,sha256=alCeuvS0X-9-3nejHkaAJPE-9WgCUX7Ly93WaW03BZE,7047
69
+ KekikStream/Plugins/SineWix.py,sha256=3c1N5-2PshwnNZTE--SEzI77Yh_d30iCUZMYoT0tftA,7007
70
70
  KekikStream/Plugins/Sinefy.py,sha256=riB2lgSSG5MkgxnVtX1OlApBcHG6vVjfiHyJ6h8_6DM,9965
71
- KekikStream/Plugins/SinemaCX.py,sha256=-mcZe9Lh93hz5PZdbV2ASlT0O_t4KNMyZxA1q82rbmk,7197
72
- KekikStream/Plugins/Sinezy.py,sha256=gdszlee5QpUka0qMzGMbBoXwJCtZbe5hlA5o9FJQI1o,6226
73
- KekikStream/Plugins/SuperFilmGeldi.py,sha256=HmY37Onn8VLggT7NaMnvpYv863zrk8eQnPGpfK2HrEk,5788
74
- KekikStream/Plugins/UgurFilm.py,sha256=sQatQ2zb9NER8J52DRLI5K9EnYFv4I1ZgZ22HtauX3Q,4813
75
- kekikstream-2.0.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
76
- kekikstream-2.0.9.dist-info/METADATA,sha256=UolpHMnBAebdvrjAnG9Zpn5uYT572fftvtH4qBpPz2Q,10090
77
- kekikstream-2.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
78
- kekikstream-2.0.9.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
79
- kekikstream-2.0.9.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
80
- kekikstream-2.0.9.dist-info/RECORD,,
71
+ KekikStream/Plugins/SinemaCX.py,sha256=jrE7gkvJgPKjk8XymztyxYErZtPVF9onW48E22Us9pA,6766
72
+ KekikStream/Plugins/Sinezy.py,sha256=_iituEi6A7b-Y-wGcTkFknwFus-oAvZje2XKayzCZHY,6104
73
+ KekikStream/Plugins/SuperFilmGeldi.py,sha256=O3f8jwnX-ihF49kmZ7g6IKU2HZLmLf_RCucplDSglN4,5347
74
+ KekikStream/Plugins/UgurFilm.py,sha256=9vulu0uP0dWVVhWzDf-C7RQN_dLKB2AOJ2NoxU-YMlA,4672
75
+ kekikstream-2.1.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
76
+ kekikstream-2.1.4.dist-info/METADATA,sha256=3LauBNlXQmhyqEjU0AY9i9fxsEHs2PBl7LiY5G8TsiQ,10090
77
+ kekikstream-2.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
78
+ kekikstream-2.1.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
79
+ kekikstream-2.1.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
80
+ kekikstream-2.1.4.dist-info/RECORD,,