KekikStream 1.8.5__tar.gz → 1.8.9__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-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Media/MediaHandler.py +87 -12
- kekikstream-1.8.9/KekikStream.egg-info/PKG-INFO +290 -0
- kekikstream-1.8.9/PKG-INFO +290 -0
- kekikstream-1.8.9/README.md +253 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/setup.py +1 -1
- kekikstream-1.8.5/KekikStream.egg-info/PKG-INFO +0 -109
- kekikstream-1.8.5/PKG-INFO +0 -109
- kekikstream-1.8.5/README.md +0 -72
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FirePlayer.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/__init__.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/__main__.py +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/requirements.txt +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/LICENSE +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/MANIFEST.in +0 -0
- {kekikstream-1.8.5 → kekikstream-1.8.9}/setup.cfg +0 -0
|
@@ -2,13 +2,62 @@
|
|
|
2
2
|
|
|
3
3
|
from ...CLI import konsol
|
|
4
4
|
from ..Extractor.ExtractorModels import ExtractResult
|
|
5
|
-
import subprocess, os
|
|
5
|
+
import subprocess, os, yt_dlp
|
|
6
6
|
|
|
7
7
|
class MediaHandler:
|
|
8
8
|
def __init__(self, title: str = "KekikStream"):
|
|
9
9
|
self.title = title
|
|
10
10
|
self.headers = {}
|
|
11
11
|
|
|
12
|
+
def should_use_ytdlp(self, url: str, user_agent: str) -> bool:
|
|
13
|
+
"""
|
|
14
|
+
yt-dlp gereken durumları profesyonel şekilde tespit et
|
|
15
|
+
|
|
16
|
+
yt-dlp'nin native Python API'sini simulate mode ile kullanarak
|
|
17
|
+
güvenilir ve performanslı tespit yapar.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
url: Video URL'si
|
|
21
|
+
user_agent: User-Agent string'i
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
bool: yt-dlp kullanılması gerekiyorsa True
|
|
25
|
+
"""
|
|
26
|
+
# 1. User-Agent bazlı kontrol (mevcut davranışı koru - RecTV, MolyStream için)
|
|
27
|
+
ytdlp_user_agents = [
|
|
28
|
+
"googleusercontent",
|
|
29
|
+
"Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
if user_agent in ytdlp_user_agents:
|
|
33
|
+
konsol.log("[cyan][ℹ] User-Agent bazlı yt-dlp tespiti[/cyan]")
|
|
34
|
+
return True
|
|
35
|
+
|
|
36
|
+
# 2. yt-dlp'nin native Python API'sini kullan (simulate mode)
|
|
37
|
+
try:
|
|
38
|
+
ydl_opts = {
|
|
39
|
+
"simulate" : True, # Download yok, sadece tespit
|
|
40
|
+
"quiet" : True, # Log kirliliği yok
|
|
41
|
+
"no_warnings" : True, # Uyarı mesajları yok
|
|
42
|
+
"extract_flat" : True # Minimal işlem
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
46
|
+
# URL'yi işleyebiliyor mu kontrol et
|
|
47
|
+
info = ydl.extract_info(url, download=False, process=False)
|
|
48
|
+
|
|
49
|
+
# Generic extractor ise atla
|
|
50
|
+
if info and info.get("extractor_key") != "Generic":
|
|
51
|
+
konsol.log(f"[cyan][ℹ] yt-dlp extractor: {info.get('extractor_key', 'Unknown')}[/cyan]")
|
|
52
|
+
return True
|
|
53
|
+
|
|
54
|
+
return False
|
|
55
|
+
|
|
56
|
+
except Exception as e:
|
|
57
|
+
# yt-dlp işleyemezse False döndür
|
|
58
|
+
konsol.log(f"[yellow][⚠] yt-dlp kontrol hatası: {e}[/yellow]")
|
|
59
|
+
return False
|
|
60
|
+
|
|
12
61
|
def play_media(self, extract_data: ExtractResult):
|
|
13
62
|
# user-agent ekle (varsayılan veya extract_data'dan)
|
|
14
63
|
user_agent = extract_data.user_agent or "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"
|
|
@@ -18,19 +67,38 @@ class MediaHandler:
|
|
|
18
67
|
if extract_data.referer:
|
|
19
68
|
self.headers["referer"] = extract_data.referer
|
|
20
69
|
|
|
21
|
-
#
|
|
22
|
-
if user_agent in ["googleusercontent", "Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"]:
|
|
23
|
-
return self.play_with_ytdlp(extract_data)
|
|
24
|
-
|
|
25
|
-
# İşletim sistemine göre oynatıcı seç
|
|
70
|
+
# İşletim sistemine göre oynatıcı seç (Android durumu)
|
|
26
71
|
if subprocess.check_output(['uname', '-o']).strip() == b'Android':
|
|
27
72
|
return self.play_with_android_mxplayer(extract_data)
|
|
28
73
|
|
|
29
|
-
#
|
|
30
|
-
if extract_data.
|
|
31
|
-
|
|
74
|
+
# Akıllı yt-dlp tespiti
|
|
75
|
+
if self.should_use_ytdlp(extract_data.url, user_agent):
|
|
76
|
+
konsol.log("[green][✓] yt-dlp kullanılacak[/green]")
|
|
77
|
+
success = self.play_with_ytdlp(extract_data)
|
|
78
|
+
if success:
|
|
79
|
+
return True
|
|
80
|
+
konsol.log("[yellow][⚠] yt-dlp başarısız, standart oynatıcılar deneniyor...[/yellow]")
|
|
81
|
+
|
|
82
|
+
# Oynatıcı öncelik sırası (fallback zincirleme)
|
|
83
|
+
players = [
|
|
84
|
+
("MPV", self.play_with_mpv),
|
|
85
|
+
("VLC", self.play_with_vlc),
|
|
86
|
+
("yt-dlp", self.play_with_ytdlp)
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
# Fallback zincirleme
|
|
90
|
+
for player_name, player_func in players:
|
|
91
|
+
try:
|
|
92
|
+
result = player_func(extract_data)
|
|
93
|
+
if result or result is None: # None = MPV (exception yok)
|
|
94
|
+
konsol.log(f"[green][✓] {player_name} ile başarılı[/green]")
|
|
95
|
+
return True
|
|
96
|
+
except Exception as e:
|
|
97
|
+
konsol.log(f"[yellow][⚠] {player_name} hatası: {e}[/yellow]")
|
|
98
|
+
continue
|
|
32
99
|
|
|
33
|
-
|
|
100
|
+
konsol.print("[red][✗] Hiçbir oynatıcı çalışmadı![/red]")
|
|
101
|
+
return False
|
|
34
102
|
|
|
35
103
|
def play_with_vlc(self, extract_data: ExtractResult):
|
|
36
104
|
konsol.log(f"[yellow][»] VLC ile Oynatılıyor : {extract_data.url}")
|
|
@@ -88,12 +156,15 @@ class MediaHandler:
|
|
|
88
156
|
with open(os.devnull, "w") as devnull:
|
|
89
157
|
subprocess.run(mpv_command, stdout=devnull, stderr=devnull, check=True)
|
|
90
158
|
|
|
159
|
+
return True
|
|
91
160
|
except subprocess.CalledProcessError as hata:
|
|
92
161
|
konsol.print(f"[red]mpv oynatma hatası: {hata}[/red]")
|
|
93
162
|
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
163
|
+
return False
|
|
94
164
|
except FileNotFoundError:
|
|
95
165
|
konsol.print("[red]mpv bulunamadı! mpv kurulu olduğundan emin olun.[/red]")
|
|
96
166
|
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
167
|
+
return False
|
|
97
168
|
|
|
98
169
|
def play_with_ytdlp(self, extract_data: ExtractResult):
|
|
99
170
|
konsol.log(f"[yellow][»] yt-dlp ile Oynatılıyor : {extract_data.url}")
|
|
@@ -121,12 +192,15 @@ class MediaHandler:
|
|
|
121
192
|
with subprocess.Popen(ytdlp_command, stdout=subprocess.PIPE) as ytdlp_proc:
|
|
122
193
|
subprocess.run(mpv_command, stdin=ytdlp_proc.stdout, check=True)
|
|
123
194
|
|
|
195
|
+
return True
|
|
124
196
|
except subprocess.CalledProcessError as hata:
|
|
125
197
|
konsol.print(f"[red]Oynatma hatası: {hata}[/red]")
|
|
126
198
|
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
199
|
+
return False
|
|
127
200
|
except FileNotFoundError:
|
|
128
201
|
konsol.print("[red]yt-dlp veya mpv bulunamadı! Kurulumlarından emin olun.[/red]")
|
|
129
202
|
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
203
|
+
return False
|
|
130
204
|
|
|
131
205
|
def play_with_android_mxplayer(self, extract_data: ExtractResult):
|
|
132
206
|
konsol.log(f"[yellow][»] MxPlayer ile Oynatılıyor : {extract_data.url}")
|
|
@@ -151,11 +225,12 @@ class MediaHandler:
|
|
|
151
225
|
with open(os.devnull, "w") as devnull:
|
|
152
226
|
subprocess.run(android_command, stdout=devnull, stderr=devnull, check=True)
|
|
153
227
|
|
|
154
|
-
return
|
|
155
|
-
|
|
228
|
+
return True
|
|
156
229
|
except subprocess.CalledProcessError as hata:
|
|
157
230
|
konsol.print(f"[red]{paket} oynatma hatası: {hata}[/red]")
|
|
158
231
|
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
232
|
+
return False
|
|
159
233
|
except FileNotFoundError:
|
|
160
234
|
konsol.print(f"Paket: {paket}, Hata: MX Player kurulu değil")
|
|
161
235
|
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
236
|
+
return False
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: KekikStream
|
|
3
|
+
Version: 1.8.9
|
|
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
|
+
Home-page: https://github.com/keyiflerolsun/KekikStream
|
|
6
|
+
Author: keyiflerolsun
|
|
7
|
+
Author-email: keyiflerolsun@gmail.com
|
|
8
|
+
License: GPLv3+
|
|
9
|
+
Keywords: KekikStream,KekikAkademi,keyiflerolsun
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Requires-Python: >=3.11
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Requires-Dist: setuptools
|
|
17
|
+
Requires-Dist: wheel
|
|
18
|
+
Requires-Dist: Kekik
|
|
19
|
+
Requires-Dist: httpx
|
|
20
|
+
Requires-Dist: cloudscraper
|
|
21
|
+
Requires-Dist: parsel
|
|
22
|
+
Requires-Dist: pydantic
|
|
23
|
+
Requires-Dist: InquirerPy
|
|
24
|
+
Requires-Dist: yt-dlp
|
|
25
|
+
Dynamic: author
|
|
26
|
+
Dynamic: author-email
|
|
27
|
+
Dynamic: classifier
|
|
28
|
+
Dynamic: description
|
|
29
|
+
Dynamic: description-content-type
|
|
30
|
+
Dynamic: home-page
|
|
31
|
+
Dynamic: keywords
|
|
32
|
+
Dynamic: license
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
Dynamic: requires-dist
|
|
35
|
+
Dynamic: requires-python
|
|
36
|
+
Dynamic: summary
|
|
37
|
+
|
|
38
|
+
# <img src="https://github.com/keyiflerolsun/KekikStream/raw/master/.github/icons/KekikStream.png?raw=True" height="32" align="center"> KekikStream
|
|
39
|
+
|
|
40
|
+
[](#)
|
|
41
|
+
[](#)
|
|
42
|
+
<a href="https://KekikAkademi.org/Kahve" target="_blank"><img src="https://img.shields.io/badge/☕️-Kahve Ismarla-ffdd00" title="☕️ Kahve Ismarla" style="padding-left:5px;"></a>
|
|
43
|
+
|
|
44
|
+
[](https://pypi.org/project/KekikStream)
|
|
45
|
+
[](https://pypi.org/project/KekikStream)
|
|
46
|
+
[](https://pypi.org/project/KekikStream)
|
|
47
|
+
|
|
48
|
+
[](#)
|
|
49
|
+
[](#)
|
|
50
|
+
[](#)
|
|
51
|
+
|
|
52
|
+
[](https://github.com/keyiflerolsun/KekikStream/actions/workflows/pypiYukle.yml)
|
|
53
|
+
|
|
54
|
+
**Modüler ve genişletilebilir medya streaming kütüphanesi**
|
|
55
|
+
Terminal üzerinden içerik arayın, VLC/MPV ile doğrudan izleyin veya kendi API’nizi kurun. 🚀
|
|
56
|
+
|
|
57
|
+
[](https://github.com/user-attachments/assets/63d31bb0-0b69-40b4-84aa-66623f2a253f)
|
|
58
|
+
|
|
59
|
+
[](https://www.python.org/)
|
|
60
|
+
[](https://GitHub.com/keyiflerolsun/)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 🚦 Ne Sunar?
|
|
65
|
+
|
|
66
|
+
KekikStream, Türkçe medya kaynaklarını tek CLI arayüzünde toplayarak hızlı arama ve oynatma sunar. Plugin mimarisi sayesinde yeni kaynaklar eklemek ve [KekikStreamAPI](https://github.com/keyiflerolsun/KekikStreamAPI) ile web/API üzerinden yayın yapmak kolaydır.
|
|
67
|
+
|
|
68
|
+
- 🎥 Çoklu kaynak desteği: Onlarca Türkçe medya sitesi
|
|
69
|
+
- 🔌 Plugin mimarisi: Yeni kaynak eklemek dakikalar sürer
|
|
70
|
+
- 🎬 Çoklu oynatıcı: VLC, MPV, MX Player
|
|
71
|
+
- 🖥️ CLI & kütüphane: Terminalde veya kod içinde kullanın
|
|
72
|
+
- 🌐 API/Web UI: KekikStreamAPI üzerinden uzak erişim
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 🚀 Hızlı Başlangıç
|
|
77
|
+
|
|
78
|
+
> Gereksinimler: Python 3.11+, sistemde VLC veya MPV kurulu olmalı (Android için MX Player + ADB).
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Kurulum
|
|
82
|
+
pip install KekikStream
|
|
83
|
+
|
|
84
|
+
# Güncelleme
|
|
85
|
+
pip install -U KekikStream
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Temel Kullanım
|
|
89
|
+
|
|
90
|
+
**CLI:**
|
|
91
|
+
```bash
|
|
92
|
+
KekikStream
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Kütüphane (örnek arama):**
|
|
96
|
+
```python
|
|
97
|
+
from KekikStream import Manager
|
|
98
|
+
results = Manager().search("vikings")
|
|
99
|
+
print(results[0].title)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## ✨ Özellikler
|
|
105
|
+
|
|
106
|
+
### 🔌 Plugin Sistemi
|
|
107
|
+
|
|
108
|
+
KekikStream modüler bir plugin mimarisi kullanır; her medya kaynağı bağımsız bir plugin'dir.
|
|
109
|
+
|
|
110
|
+
**Mevcut Pluginler (örnek):** Dizilla, HDFilmCehennemi, Dizipal, Dizifon, RoketDizi, Sinefy, Moviesseed, FullHDFilmizlesene, HDBestMovies, SuperFilmGeldi, Sinezy ve daha fazlası.
|
|
111
|
+
|
|
112
|
+
**Plugin Geliştirme:**
|
|
113
|
+
```python
|
|
114
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo
|
|
115
|
+
|
|
116
|
+
class MyPlugin(PluginBase):
|
|
117
|
+
name = "MyPlugin"
|
|
118
|
+
language = "en"
|
|
119
|
+
main_url = "https://example.com"
|
|
120
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
121
|
+
description = "MyPlugin description"
|
|
122
|
+
|
|
123
|
+
main_page = {
|
|
124
|
+
f"{main_url}/category/" : "Category Name"
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
128
|
+
return results
|
|
129
|
+
|
|
130
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
131
|
+
return results
|
|
132
|
+
|
|
133
|
+
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
134
|
+
return details
|
|
135
|
+
|
|
136
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
137
|
+
return links
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 🎬 Oynatıcı Desteği
|
|
141
|
+
|
|
142
|
+
| Oynatıcı | Platform | Özellikler |
|
|
143
|
+
|----------|----------|------------|
|
|
144
|
+
| **VLC** | Desktop | Custom headers, subtitles, varsayılan |
|
|
145
|
+
| **MPV** | Desktop | Custom headers, subtitles |
|
|
146
|
+
| **MX Player** | Android | ADB üzerinden |
|
|
147
|
+
|
|
148
|
+
> Özel durumlar için (Google Drive vb.) arka planda otomatik olarak yt-dlp devreye girer.
|
|
149
|
+
|
|
150
|
+
### 🔗 Extractor Sistemi
|
|
151
|
+
|
|
152
|
+
Vidmoly, Filemoon, Sibnet, Sendvid, Voe, Doodstream, Streamtape, Upstream, Dailymotion, JWPlayer ve birçok kaynaktan direkt streaming linki çıkarır.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 🏗️ Mimari
|
|
157
|
+
|
|
158
|
+
```mermaid
|
|
159
|
+
graph TB
|
|
160
|
+
CLI[🖥️ CLI Interface]
|
|
161
|
+
Manager[🔌 Plugin Manager]
|
|
162
|
+
|
|
163
|
+
subgraph Plugins
|
|
164
|
+
P1[📺 Dizilla]
|
|
165
|
+
P2[🎬 HDFilmCehennemi]
|
|
166
|
+
P3[🍿 Dizipal]
|
|
167
|
+
PN[... 20+ Plugin]
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
subgraph Extractors
|
|
171
|
+
E1[🔗 Vidmoly]
|
|
172
|
+
E2[🔗 Filemoon]
|
|
173
|
+
E3[🔗 Sibnet]
|
|
174
|
+
EN[... Extractors]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
subgraph Players
|
|
178
|
+
VLC[🎥 VLC]
|
|
179
|
+
MPV[🎥 MPV]
|
|
180
|
+
MX[🎥 MX Player]
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
CLI --> Manager
|
|
184
|
+
Manager --> P1
|
|
185
|
+
Manager --> P2
|
|
186
|
+
Manager --> P3
|
|
187
|
+
Manager --> PN
|
|
188
|
+
|
|
189
|
+
%% Her plugin otomatik olarak ihtiyaç duyduğu extractor'ı kullanır
|
|
190
|
+
P1 -.-> E1
|
|
191
|
+
P1 -.-> E2
|
|
192
|
+
P1 -.-> E3
|
|
193
|
+
|
|
194
|
+
P2 -.-> E1
|
|
195
|
+
P2 -.-> E2
|
|
196
|
+
P2 -.-> E3
|
|
197
|
+
|
|
198
|
+
P3 -.-> E1
|
|
199
|
+
P3 -.-> E2
|
|
200
|
+
P3 -.-> E3
|
|
201
|
+
|
|
202
|
+
PN -.-> EN
|
|
203
|
+
|
|
204
|
+
E1 --> VLC
|
|
205
|
+
E2 --> VLC
|
|
206
|
+
E3 --> VLC
|
|
207
|
+
EN --> VLC
|
|
208
|
+
|
|
209
|
+
E1 --> MPV
|
|
210
|
+
E2 --> MPV
|
|
211
|
+
E3 --> MPV
|
|
212
|
+
EN --> MPV
|
|
213
|
+
|
|
214
|
+
E1 --> MX
|
|
215
|
+
E2 --> MX
|
|
216
|
+
E3 --> MX
|
|
217
|
+
EN --> MX
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 🛠️ Geliştirme
|
|
223
|
+
|
|
224
|
+
### Proje Yapısı
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
KekikStream/
|
|
228
|
+
├── KekikStream/
|
|
229
|
+
│ ├── Core/ # Temel sınıflar
|
|
230
|
+
│ ├── Libs/ # Yardımcı kütüphaneler
|
|
231
|
+
│ ├── Plugins/ # Medya kaynak pluginleri
|
|
232
|
+
│ ├── Extractors/ # Video extractorları
|
|
233
|
+
│ └── __init__.py # CLI entry point
|
|
234
|
+
├── Tests/ # Örnek kullanım
|
|
235
|
+
└── requirements.txt
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Yeni Plugin Ekleme
|
|
239
|
+
|
|
240
|
+
1. `KekikStream/Plugins/` altına yeni dosya oluşturun.
|
|
241
|
+
2. `PluginBase` sınıfından türetin.
|
|
242
|
+
3. `get_main_page`, `search`, `load_item`, `load_links` metodlarını implemente edin.
|
|
243
|
+
4. Plugin'i test edin (örnek: `Tests/Single.py`).
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 📊 Performans
|
|
248
|
+
|
|
249
|
+
| Metrik | Değer |
|
|
250
|
+
|--------|-------|
|
|
251
|
+
| Plugin Sayısı | 20+ |
|
|
252
|
+
| Extractor Sayısı | 40+ |
|
|
253
|
+
| Desteklenen Platform | Desktop, Android |
|
|
254
|
+
| Async Arama | ✅ |
|
|
255
|
+
| Cache Desteği | ✅ |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 🤝 Katkıda Bulunma
|
|
260
|
+
|
|
261
|
+
Projeyi geliştirmek için katkılarınızı bekliyoruz!
|
|
262
|
+
|
|
263
|
+
1. Yeni plugin ekleyin
|
|
264
|
+
2. Bug raporu açın
|
|
265
|
+
3. Feature request gönderin
|
|
266
|
+
4. Dokümantasyon iyileştirin
|
|
267
|
+
|
|
268
|
+
### 🎁 Teşekkürler
|
|
269
|
+
|
|
270
|
+
- [DeoDorqnt387/aniwatch-tr](https://github.com/DeoDorqnt387/aniwatch-tr)
|
|
271
|
+
|
|
272
|
+
### 💻 Genişletme Referansları
|
|
273
|
+
|
|
274
|
+
- [keyiflerolsun/Kekik-cloudstream](https://github.com/keyiflerolsun/Kekik-cloudstream)
|
|
275
|
+
- [keyiflerolsun/seyirTurk-Parser](https://github.com/keyiflerolsun/seyirTurk-Parser)
|
|
276
|
+
|
|
277
|
+
## 🌐 Telif Hakkı ve Lisans
|
|
278
|
+
|
|
279
|
+
*Copyright (C) 2024 by* [keyiflerolsun](https://github.com/keyiflerolsun) ❤️️
|
|
280
|
+
[GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007](https://github.com/keyiflerolsun/KekikStream/blob/master/LICENSE) *Koşullarına göre lisanslanmıştır..*
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
<p align="center">
|
|
285
|
+
Bu proje <a href="https://github.com/keyiflerolsun">@keyiflerolsun</a> tarafından <a href="https://t.me/KekikAkademi">@KekikAkademi</a> için geliştirilmiştir.
|
|
286
|
+
</p>
|
|
287
|
+
|
|
288
|
+
<p align="center">
|
|
289
|
+
<sub>⭐ Beğendiyseniz yıldız vermeyi unutmayın!</sub>
|
|
290
|
+
</p>
|