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.
- kekikstream-2.2.8/KekikStream/Extractors/CloseLoad.py +77 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/Dizilla.py +1 -1
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/HDFilmCehennemi.py +31 -35
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/PKG-INFO +37 -30
- {kekikstream-2.2.6 → kekikstream-2.2.8}/PKG-INFO +37 -30
- {kekikstream-2.2.6 → kekikstream-2.2.8}/README.md +36 -29
- {kekikstream-2.2.6 → kekikstream-2.2.8}/setup.py +1 -1
- kekikstream-2.2.6/KekikStream/Extractors/CloseLoad.py +0 -40
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/DonilasPlay.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/Filemoon.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/JFVid.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VCTPlay.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/YTDLP.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/BelgeselX.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SetFilmIzle.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/__init__.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/__main__.py +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream/requirements.txt +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/LICENSE +0 -0
- {kekikstream-2.2.6 → kekikstream-2.2.8}/MANIFEST.in +0 -0
- {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://
|
|
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
|
|
209
|
-
"""
|
|
210
|
-
#
|
|
211
|
-
|
|
212
|
-
if
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
#
|
|
244
|
-
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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.
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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.
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|