KekikStream 2.2.6__tar.gz → 2.2.8__tar.gz

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 (89) hide show
  1. kekikstream-2.2.8/KekikStream/Extractors/CloseLoad.py +77 -0
  2. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/Dizilla.py +1 -1
  3. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/HDFilmCehennemi.py +31 -35
  4. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/PKG-INFO +37 -30
  5. {kekikstream-2.2.6 → kekikstream-2.2.8}/PKG-INFO +37 -30
  6. {kekikstream-2.2.6 → kekikstream-2.2.8}/README.md +36 -29
  7. {kekikstream-2.2.6 → kekikstream-2.2.8}/setup.py +1 -1
  8. kekikstream-2.2.6/KekikStream/Extractors/CloseLoad.py +0 -40
  9. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/CLI/__init__.py +0 -0
  10. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/CLI/pypi_kontrol.py +0 -0
  11. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  12. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  13. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  14. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  15. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  16. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Media/MediaHandler.py +0 -0
  17. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Media/MediaManager.py +0 -0
  18. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  19. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  20. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  21. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  22. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/UI/UIManager.py +0 -0
  23. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/__init__.py +0 -0
  24. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/ContentX.py +0 -0
  25. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/DonilasPlay.py +0 -0
  26. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/DzenRu.py +0 -0
  27. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/ExPlay.py +0 -0
  28. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/Filemoon.py +0 -0
  29. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  30. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/JFVid.py +0 -0
  31. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/JetTv.py +0 -0
  32. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MailRu.py +0 -0
  33. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MixPlayHD.py +0 -0
  34. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MixTiger.py +0 -0
  35. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MolyStream.py +0 -0
  36. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  37. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  38. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/PixelDrain.py +0 -0
  39. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  40. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/RapidVid.py +0 -0
  41. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/SetPlay.py +0 -0
  42. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/SetPrime.py +0 -0
  43. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/SibNet.py +0 -0
  44. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  45. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TRsTX.py +0 -0
  46. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TauVideo.py +0 -0
  47. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TurboImgz.py +0 -0
  48. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  49. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VCTPlay.py +0 -0
  50. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidHide.py +0 -0
  51. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidMoly.py +0 -0
  52. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidMoxy.py +0 -0
  53. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidPapi.py +0 -0
  54. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VideoSeyred.py +0 -0
  55. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/YTDLP.py +0 -0
  56. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  57. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/BelgeselX.py +0 -0
  58. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/DiziBox.py +0 -0
  59. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/DiziPal.py +0 -0
  60. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/DiziYou.py +0 -0
  61. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FilmBip.py +0 -0
  62. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  63. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FilmModu.py +0 -0
  64. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FullHDFilm.py +0 -0
  65. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  66. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/JetFilmizle.py +0 -0
  67. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/KultFilmler.py +0 -0
  68. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/RecTV.py +0 -0
  69. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/RoketDizi.py +0 -0
  70. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SelcukFlix.py +0 -0
  71. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SetFilmIzle.py +0 -0
  72. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  73. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SineWix.py +0 -0
  74. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/Sinefy.py +0 -0
  75. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SinemaCX.py +0 -0
  76. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/Sinezy.py +0 -0
  77. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  78. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/UgurFilm.py +0 -0
  79. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/__init__.py +0 -0
  80. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/__main__.py +0 -0
  81. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/requirements.txt +0 -0
  82. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/SOURCES.txt +0 -0
  83. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/dependency_links.txt +0 -0
  84. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/entry_points.txt +0 -0
  85. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/requires.txt +0 -0
  86. {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/top_level.txt +0 -0
  87. {kekikstream-2.2.6 → kekikstream-2.2.8}/LICENSE +0 -0
  88. {kekikstream-2.2.6 → kekikstream-2.2.8}/MANIFEST.in +0 -0
  89. {kekikstream-2.2.6 → kekikstream-2.2.8}/setup.cfg +0 -0
@@ -0,0 +1,77 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
4
+ from Kekik.Sifreleme import Packer, StreamDecoder
5
+ from selectolax.parser import HTMLParser
6
+ import re, json
7
+
8
+ class CloseLoadExtractor(ExtractorBase):
9
+ name = "CloseLoad"
10
+ main_url = "https://closeload.filmmakinesi.to"
11
+
12
+ def _extract_from_json_ld(self, html: str) -> str | None:
13
+ """JSON-LD script tag'inden contentUrl'i çıkar (Kotlin versiyonundaki gibi)"""
14
+ secici = HTMLParser(html)
15
+ for script in secici.css("script[type='application/ld+json']"):
16
+ try:
17
+ data = json.loads(script.text(strip=True))
18
+ if content_url := data.get("contentUrl"):
19
+ if content_url.startswith("http"):
20
+ return content_url
21
+ except (json.JSONDecodeError, TypeError):
22
+ # Regex ile contentUrl'i çıkarmayı dene
23
+ match = re.search(r'"contentUrl"\s*:\s*"([^"]+)"', script.text())
24
+ if match and match.group(1).startswith("http"):
25
+ return match.group(1)
26
+ return None
27
+
28
+ def _extract_from_packed(self, html: str) -> str | None:
29
+ """Packed JavaScript'ten video URL'sini çıkar (fallback)"""
30
+ try:
31
+ eval_func = re.compile(r'\s*(eval\(function[\s\S].*)').findall(html)
32
+ if eval_func:
33
+ return StreamDecoder.extract_stream_url(Packer.unpack(eval_func[0]))
34
+ except Exception:
35
+ pass
36
+ return None
37
+
38
+ async def extract(self, url, referer=None) -> ExtractResult:
39
+ if referer:
40
+ self.httpx.headers.update({"Referer": referer})
41
+
42
+ self.httpx.headers.update({
43
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0",
44
+ "Origin": self.main_url
45
+ })
46
+
47
+ istek = await self.httpx.get(url)
48
+ istek.raise_for_status()
49
+
50
+ # Önce JSON-LD'den dene (daha güvenilir - Kotlin versiyonu gibi)
51
+ m3u_link = self._extract_from_json_ld(istek.text)
52
+
53
+ # Fallback: Packed JavaScript'ten çıkar
54
+ if not m3u_link:
55
+ m3u_link = self._extract_from_packed(istek.text)
56
+
57
+ if not m3u_link:
58
+ raise Exception("Video URL bulunamadı (ne JSON-LD ne de packed script'ten)")
59
+
60
+ # Subtitle'ları parse et (Kotlin referansı: track elementleri)
61
+ subtitles = []
62
+ secici = HTMLParser(istek.text)
63
+ for track in secici.css("track"):
64
+ raw_src = track.attrs.get("src") or ""
65
+ raw_src = raw_src.strip()
66
+ label = track.attrs.get("label") or track.attrs.get("srclang") or "Altyazı"
67
+
68
+ if raw_src:
69
+ full_url = raw_src if raw_src.startswith("http") else f"{self.main_url}{raw_src}"
70
+ subtitles.append(Subtitle(name=label, url=full_url))
71
+
72
+ return ExtractResult(
73
+ name = self.name,
74
+ url = m3u_link,
75
+ referer = self.main_url,
76
+ subtitles = subtitles
77
+ )
@@ -10,7 +10,7 @@ from base64 import b64decode
10
10
  class Dizilla(PluginBase):
11
11
  name = "Dizilla"
12
12
  language = "tr"
13
- main_url = "https://dizilla40.com"
13
+ main_url = "https://dizilla.to"
14
14
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
15
15
  description = "1080p yabancı dizi izle. Türkçe altyazılı veya dublaj seçenekleriyle 1080p çözünürlükte yabancı dizilere anında ulaş. Popüler dizileri kesintisiz izle."
16
16
 
@@ -205,30 +205,23 @@ class HDFilmCehennemi(PluginBase):
205
205
 
206
206
  return results
207
207
 
208
- def extract_hdch_url(self, unpacked: str) -> str:
209
- """HDFilmCehennemi unpacked script'ten video URL'sini çıkar"""
210
- # 1) Decode fonksiyonunun adını bul: function <NAME>(value_parts)
211
- match_fn = re.search(r'function\s+(\w+)\s*\(\s*value_parts\s*\)', unpacked)
212
- if not match_fn:
213
- return ""
214
-
215
- fn_name = match_fn.group(1)
216
-
217
- # 2) Bu fonksiyonun array ile çağrıldığı yeri bul: <NAME>([ ... ])
218
- array_call_regex = re.compile(rf'{re.escape(fn_name)}\(\s*\[(.*?)\]\s*\)', re.DOTALL)
219
- match_call = array_call_regex.search(unpacked)
220
- if not match_call:
221
- return ""
222
-
223
- array_body = match_call.group(1)
224
-
225
- # 3) Array içindeki string parçalarını topla
226
- parts = re.findall(r'["\']([^"\']+)["\']', array_body)
227
- if not parts:
228
- return ""
229
-
230
- # 4) Özel decoder ile çöz
231
- return StreamDecoder.extract_stream_url(unpacked)
208
+ def _extract_from_json_ld(self, html: str) -> str | None:
209
+ """JSON-LD script tag'inden contentUrl'i çıkar (Kotlin versiyonundaki gibi)"""
210
+ # Önce JSON-LD'den dene
211
+ json_ld_match = re.search(r'<script[^>]+type=["\']application/ld\+json["\'][^>]*>(.*?)</script>', html, re.DOTALL)
212
+ if json_ld_match:
213
+ try:
214
+ import json
215
+ data = json.loads(json_ld_match.group(1).strip())
216
+ if content_url := data.get("contentUrl"):
217
+ if content_url.startswith("http"):
218
+ return content_url
219
+ except Exception:
220
+ # Regex ile contentUrl'i çıkarmayı dene
221
+ match = re.search(r'"contentUrl"\s*:\s*"([^"]+)"', html)
222
+ if match and match.group(1).startswith("http"):
223
+ return match.group(1)
224
+ return None
232
225
 
233
226
  async def invoke_local_source(self, iframe: str, source: str, url: str):
234
227
  self.httpx.headers.update({
@@ -240,18 +233,21 @@ class HDFilmCehennemi(PluginBase):
240
233
  if not istek.text:
241
234
  return await self.cehennempass(iframe.split("/")[-1])
242
235
 
243
- # eval(function...) içeren packed script bul
244
- eval_match = re.search(r'(eval\(function[\s\S]+)', istek.text)
245
- if not eval_match:
246
- return await self.cehennempass(iframe.split("/")[-1])
236
+ # Önce JSON-LD'den dene (Kotlin versiyonu gibi - daha güvenilir)
237
+ video_url = self._extract_from_json_ld(istek.text)
247
238
 
248
- try:
249
- unpacked = Packer.unpack(eval_match.group(1))
250
- except Exception:
251
- return await self.cehennempass(iframe.split("/")[-1])
252
-
253
- # HDFilmCehennemi özel decoder ile video URL'sini çıkar
254
- video_url = self.extract_hdch_url(unpacked)
239
+ # Fallback: Packed JavaScript'ten çıkar
240
+ if not video_url:
241
+ # eval(function...) içeren packed script bul
242
+ eval_match = re.search(r'(eval\(function[\s\S]+)', istek.text)
243
+ if not eval_match:
244
+ return await self.cehennempass(iframe.split("/")[-1])
245
+
246
+ try:
247
+ unpacked = Packer.unpack(eval_match.group(1))
248
+ video_url = StreamDecoder.extract_stream_url(unpacked)
249
+ except Exception:
250
+ return await self.cehennempass(iframe.split("/")[-1])
255
251
 
256
252
  if not video_url:
257
253
  return await self.cehennempass(iframe.split("/")[-1])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.2.6
3
+ Version: 2.2.8
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
@@ -150,64 +150,71 @@ Vidmoly, Filemoon, Sibnet, Sendvid, Voe, Doodstream, Streamtape, Upstream, Daily
150
150
 
151
151
  ```mermaid
152
152
  graph TB
153
- CLI[🖥️ CLI Interface]
154
- Manager[🔌 Plugin Manager]
155
-
156
- subgraph Plugins
157
- P1[📺 Dizilla]
158
- P2[🎬 HDFilmCehennemi]
159
- P3[🍿 Dizipal]
160
- PN[... 20+ Plugin]
153
+ subgraph KekikStream[🎬 KekikStream]
154
+ CLI[🖥️ CLI Interface]
155
+ Manager[🔌 Plugin Manager]
156
+
157
+ subgraph Plugins
158
+ P1[📺 Dizilla]
159
+ P2[🎬 HDFilmCehennemi]
160
+ P3[🍿 Dizipal]
161
+ PN[... 20+ Plugin]
162
+ end
163
+
164
+ subgraph Extractors
165
+ E1[🔗 Vidmoly]
166
+ E2[🔗 Filemoon]
167
+ E3[🔗 Sibnet]
168
+ EN[... Extractors]
169
+ end
170
+
171
+ subgraph Players
172
+ MPV[🎥 MPV]
173
+ VLC[🎥 VLC]
174
+ MX[🎥 MX Player]
175
+ end
161
176
  end
162
-
163
- subgraph Extractors
164
- E1[🔗 Vidmoly]
165
- E2[🔗 Filemoon]
166
- E3[🔗 Sibnet]
167
- EN[... Extractors]
168
- end
169
-
170
- subgraph Players
171
- MPV[🎥 MPV]
172
- VLC[🎥 VLC]
173
- MX[🎥 MX Player]
174
- end
175
-
177
+
176
178
  CLI --> Manager
177
179
  Manager --> P1
178
180
  Manager --> P2
179
181
  Manager --> P3
180
182
  Manager --> PN
181
-
183
+
182
184
  %% Her plugin otomatik olarak ihtiyaç duyduğu extractor'ı kullanır
183
185
  P1 -.-> E1
184
186
  P1 -.-> E2
185
187
  P1 -.-> E3
186
-
188
+
187
189
  P2 -.-> E1
188
190
  P2 -.-> E2
189
191
  P2 -.-> E3
190
-
192
+
191
193
  P3 -.-> E1
192
194
  P3 -.-> E2
193
195
  P3 -.-> E3
194
-
196
+
195
197
  PN -.-> EN
196
-
198
+
197
199
  E1 --> VLC
198
200
  E2 --> VLC
199
201
  E3 --> VLC
200
202
  EN --> VLC
201
-
203
+
202
204
  E1 --> MPV
203
205
  E2 --> MPV
204
206
  E3 --> MPV
205
207
  EN --> MPV
206
-
208
+
207
209
  E1 --> MX
208
210
  E2 --> MX
209
211
  E3 --> MX
210
212
  EN --> MX
213
+
214
+ style KekikStream fill:#2b2a29,stroke:#ef7f1a,stroke-width:2px
215
+ style Plugins fill:#242322,stroke:#0087a3,stroke-width:2px
216
+ style Extractors fill:#242322,stroke:#5a7c8c,stroke-width:2px
217
+ style Players fill:#242322,stroke:#0087a3,stroke-width:2px
211
218
  ```
212
219
 
213
220
  ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.2.6
3
+ Version: 2.2.8
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
@@ -150,64 +150,71 @@ Vidmoly, Filemoon, Sibnet, Sendvid, Voe, Doodstream, Streamtape, Upstream, Daily
150
150
 
151
151
  ```mermaid
152
152
  graph TB
153
- CLI[🖥️ CLI Interface]
154
- Manager[🔌 Plugin Manager]
155
-
156
- subgraph Plugins
157
- P1[📺 Dizilla]
158
- P2[🎬 HDFilmCehennemi]
159
- P3[🍿 Dizipal]
160
- PN[... 20+ Plugin]
153
+ subgraph KekikStream[🎬 KekikStream]
154
+ CLI[🖥️ CLI Interface]
155
+ Manager[🔌 Plugin Manager]
156
+
157
+ subgraph Plugins
158
+ P1[📺 Dizilla]
159
+ P2[🎬 HDFilmCehennemi]
160
+ P3[🍿 Dizipal]
161
+ PN[... 20+ Plugin]
162
+ end
163
+
164
+ subgraph Extractors
165
+ E1[🔗 Vidmoly]
166
+ E2[🔗 Filemoon]
167
+ E3[🔗 Sibnet]
168
+ EN[... Extractors]
169
+ end
170
+
171
+ subgraph Players
172
+ MPV[🎥 MPV]
173
+ VLC[🎥 VLC]
174
+ MX[🎥 MX Player]
175
+ end
161
176
  end
162
-
163
- subgraph Extractors
164
- E1[🔗 Vidmoly]
165
- E2[🔗 Filemoon]
166
- E3[🔗 Sibnet]
167
- EN[... Extractors]
168
- end
169
-
170
- subgraph Players
171
- MPV[🎥 MPV]
172
- VLC[🎥 VLC]
173
- MX[🎥 MX Player]
174
- end
175
-
177
+
176
178
  CLI --> Manager
177
179
  Manager --> P1
178
180
  Manager --> P2
179
181
  Manager --> P3
180
182
  Manager --> PN
181
-
183
+
182
184
  %% Her plugin otomatik olarak ihtiyaç duyduğu extractor'ı kullanır
183
185
  P1 -.-> E1
184
186
  P1 -.-> E2
185
187
  P1 -.-> E3
186
-
188
+
187
189
  P2 -.-> E1
188
190
  P2 -.-> E2
189
191
  P2 -.-> E3
190
-
192
+
191
193
  P3 -.-> E1
192
194
  P3 -.-> E2
193
195
  P3 -.-> E3
194
-
196
+
195
197
  PN -.-> EN
196
-
198
+
197
199
  E1 --> VLC
198
200
  E2 --> VLC
199
201
  E3 --> VLC
200
202
  EN --> VLC
201
-
203
+
202
204
  E1 --> MPV
203
205
  E2 --> MPV
204
206
  E3 --> MPV
205
207
  EN --> MPV
206
-
208
+
207
209
  E1 --> MX
208
210
  E2 --> MX
209
211
  E3 --> MX
210
212
  EN --> MX
213
+
214
+ style KekikStream fill:#2b2a29,stroke:#ef7f1a,stroke-width:2px
215
+ style Plugins fill:#242322,stroke:#0087a3,stroke-width:2px
216
+ style Extractors fill:#242322,stroke:#5a7c8c,stroke-width:2px
217
+ style Players fill:#242322,stroke:#0087a3,stroke-width:2px
211
218
  ```
212
219
 
213
220
  ---
@@ -113,64 +113,71 @@ Vidmoly, Filemoon, Sibnet, Sendvid, Voe, Doodstream, Streamtape, Upstream, Daily
113
113
 
114
114
  ```mermaid
115
115
  graph TB
116
- CLI[🖥️ CLI Interface]
117
- Manager[🔌 Plugin Manager]
118
-
119
- subgraph Plugins
120
- P1[📺 Dizilla]
121
- P2[🎬 HDFilmCehennemi]
122
- P3[🍿 Dizipal]
123
- PN[... 20+ Plugin]
116
+ subgraph KekikStream[🎬 KekikStream]
117
+ CLI[🖥️ CLI Interface]
118
+ Manager[🔌 Plugin Manager]
119
+
120
+ subgraph Plugins
121
+ P1[📺 Dizilla]
122
+ P2[🎬 HDFilmCehennemi]
123
+ P3[🍿 Dizipal]
124
+ PN[... 20+ Plugin]
125
+ end
126
+
127
+ subgraph Extractors
128
+ E1[🔗 Vidmoly]
129
+ E2[🔗 Filemoon]
130
+ E3[🔗 Sibnet]
131
+ EN[... Extractors]
132
+ end
133
+
134
+ subgraph Players
135
+ MPV[🎥 MPV]
136
+ VLC[🎥 VLC]
137
+ MX[🎥 MX Player]
138
+ end
124
139
  end
125
-
126
- subgraph Extractors
127
- E1[🔗 Vidmoly]
128
- E2[🔗 Filemoon]
129
- E3[🔗 Sibnet]
130
- EN[... Extractors]
131
- end
132
-
133
- subgraph Players
134
- MPV[🎥 MPV]
135
- VLC[🎥 VLC]
136
- MX[🎥 MX Player]
137
- end
138
-
140
+
139
141
  CLI --> Manager
140
142
  Manager --> P1
141
143
  Manager --> P2
142
144
  Manager --> P3
143
145
  Manager --> PN
144
-
146
+
145
147
  %% Her plugin otomatik olarak ihtiyaç duyduğu extractor'ı kullanır
146
148
  P1 -.-> E1
147
149
  P1 -.-> E2
148
150
  P1 -.-> E3
149
-
151
+
150
152
  P2 -.-> E1
151
153
  P2 -.-> E2
152
154
  P2 -.-> E3
153
-
155
+
154
156
  P3 -.-> E1
155
157
  P3 -.-> E2
156
158
  P3 -.-> E3
157
-
159
+
158
160
  PN -.-> EN
159
-
161
+
160
162
  E1 --> VLC
161
163
  E2 --> VLC
162
164
  E3 --> VLC
163
165
  EN --> VLC
164
-
166
+
165
167
  E1 --> MPV
166
168
  E2 --> MPV
167
169
  E3 --> MPV
168
170
  EN --> MPV
169
-
171
+
170
172
  E1 --> MX
171
173
  E2 --> MX
172
174
  E3 --> MX
173
175
  EN --> MX
176
+
177
+ style KekikStream fill:#2b2a29,stroke:#ef7f1a,stroke-width:2px
178
+ style Plugins fill:#242322,stroke:#0087a3,stroke-width:2px
179
+ style Extractors fill:#242322,stroke:#5a7c8c,stroke-width:2px
180
+ style Players fill:#242322,stroke:#0087a3,stroke-width:2px
174
181
  ```
175
182
 
176
183
  ---
@@ -6,7 +6,7 @@ from io import open
6
6
  setup(
7
7
  # ? Genel Bilgiler
8
8
  name = "KekikStream",
9
- version = "2.2.6",
9
+ version = "2.2.8",
10
10
  url = "https://github.com/keyiflerolsun/KekikStream",
11
11
  description = "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ı",
12
12
  keywords = ["KekikStream", "KekikAkademi", "keyiflerolsun"],
@@ -1,40 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
4
- from Kekik.Sifreleme import Packer, StreamDecoder
5
- from selectolax.parser import HTMLParser
6
- import re
7
-
8
- class CloseLoadExtractor(ExtractorBase):
9
- name = "CloseLoad"
10
- main_url = "https://closeload.filmmakinesi.to"
11
-
12
- async def extract(self, url, referer=None) -> ExtractResult:
13
- if referer:
14
- self.httpx.headers.update({"Referer": referer})
15
-
16
- istek = await self.httpx.get(url)
17
- istek.raise_for_status()
18
-
19
- # Video URL'sini çıkar
20
- eval_func = re.compile(r'\s*(eval\(function[\s\S].*)').findall(istek.text)[0]
21
- m3u_link = StreamDecoder.extract_stream_url(Packer.unpack(eval_func))
22
-
23
- # Subtitle'ları parse et (Kotlin referansı: track elementleri)
24
- subtitles = []
25
- secici = HTMLParser(istek.text)
26
- for track in secici.css("track"):
27
- raw_src = track.attrs.get("src") or ""
28
- raw_src = raw_src.strip()
29
- label = track.attrs.get("label") or track.attrs.get("srclang") or "Altyazı"
30
-
31
- if raw_src:
32
- full_url = raw_src if raw_src.startswith("http") else f"{self.main_url}{raw_src}"
33
- subtitles.append(Subtitle(name=label, url=full_url))
34
-
35
- return ExtractResult(
36
- name = self.name,
37
- url = m3u_link,
38
- referer = self.main_url,
39
- subtitles = subtitles
40
- )
File without changes
File without changes
File without changes