KekikStream 1.8.8__tar.gz → 1.9.0__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.8 → kekikstream-1.9.0}/KekikStream/Core/Media/MediaHandler.py +5 -55
- kekikstream-1.9.0/KekikStream/Extractors/YTDLP.py +109 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream.egg-info/SOURCES.txt +1 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/PKG-INFO +1 -1
- {kekikstream-1.8.8 → kekikstream-1.9.0}/setup.py +1 -1
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/FirePlayer.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/__init__.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/__main__.py +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream/requirements.txt +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/LICENSE +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/MANIFEST.in +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/README.md +0 -0
- {kekikstream-1.8.8 → kekikstream-1.9.0}/setup.cfg +0 -0
|
@@ -2,59 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
from ...CLI import konsol
|
|
4
4
|
from ..Extractor.ExtractorModels import ExtractResult
|
|
5
|
-
import subprocess, os
|
|
5
|
+
import subprocess, os
|
|
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
|
-
self._ytdlp_extractors = yt_dlp.extractor.list_extractors()
|
|
13
|
-
|
|
14
|
-
def should_use_ytdlp(self, url: str, user_agent: str) -> bool:
|
|
15
|
-
"""
|
|
16
|
-
yt-dlp gereken durumları akıllıca tespit et
|
|
17
|
-
|
|
18
|
-
yt-dlp'nin kendi 1863+ extractor'ını kullanarak otomatik tespit yapar.
|
|
19
|
-
YouTube, Vimeo, Twitch, TikTok, Instagram vb. binlerce site için çalışır.
|
|
20
|
-
|
|
21
|
-
Args:
|
|
22
|
-
url: Video URL'si
|
|
23
|
-
user_agent: User-Agent string'i
|
|
24
|
-
|
|
25
|
-
Returns:
|
|
26
|
-
bool: yt-dlp kullanılması gerekiyorsa True
|
|
27
|
-
"""
|
|
28
|
-
# 1. User-Agent bazlı kontrol (mevcut davranışı koru - RecTV, MolyStream için)
|
|
29
|
-
ytdlp_user_agents = [
|
|
30
|
-
"googleusercontent",
|
|
31
|
-
"Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
if user_agent in ytdlp_user_agents:
|
|
35
|
-
konsol.log("[cyan][ℹ] User-Agent bazlı yt-dlp tespiti[/cyan]")
|
|
36
|
-
return True
|
|
37
|
-
|
|
38
|
-
# 2. yt-dlp'nin kendi extractor tespitini kullan
|
|
39
|
-
try:
|
|
40
|
-
# Tüm extractorları kontrol et (Generic hariç)
|
|
41
|
-
for ie in self._ytdlp_extractors:
|
|
42
|
-
# Generic extractor'ı atla (her URL'ye uygundur ama özel değildir)
|
|
43
|
-
if ie.ie_key() == 'Generic':
|
|
44
|
-
continue
|
|
45
|
-
|
|
46
|
-
# Bu extractor bu URL'yi işleyebilir mi?
|
|
47
|
-
if ie.suitable(url):
|
|
48
|
-
konsol.log(f"[cyan][ℹ] yt-dlp extractor bulundu: {ie.ie_key()}[/cyan]")
|
|
49
|
-
return True
|
|
50
|
-
|
|
51
|
-
# Özel extractor bulunamadı
|
|
52
|
-
return False
|
|
53
|
-
|
|
54
|
-
except Exception as e:
|
|
55
|
-
konsol.log(f"[yellow][⚠] yt-dlp kontrol hatası: {e}[/yellow]")
|
|
56
|
-
return False
|
|
57
|
-
|
|
58
12
|
def play_media(self, extract_data: ExtractResult):
|
|
59
13
|
# user-agent ekle (varsayılan veya extract_data'dan)
|
|
60
14
|
user_agent = extract_data.user_agent or "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"
|
|
@@ -64,18 +18,14 @@ class MediaHandler:
|
|
|
64
18
|
if extract_data.referer:
|
|
65
19
|
self.headers["referer"] = extract_data.referer
|
|
66
20
|
|
|
21
|
+
# Özel Durumlar (RecTV vs. Googleusercontent)
|
|
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
|
+
|
|
67
25
|
# İşletim sistemine göre oynatıcı seç (Android durumu)
|
|
68
26
|
if subprocess.check_output(['uname', '-o']).strip() == b'Android':
|
|
69
27
|
return self.play_with_android_mxplayer(extract_data)
|
|
70
28
|
|
|
71
|
-
# Akıllı yt-dlp tespiti
|
|
72
|
-
if self.should_use_ytdlp(extract_data.url, user_agent):
|
|
73
|
-
konsol.log("[green][✓] yt-dlp kullanılacak[/green]")
|
|
74
|
-
success = self.play_with_ytdlp(extract_data)
|
|
75
|
-
if success:
|
|
76
|
-
return True
|
|
77
|
-
konsol.log("[yellow][⚠] yt-dlp başarısız, standart oynatıcılar deneniyor...[/yellow]")
|
|
78
|
-
|
|
79
29
|
# Oynatıcı öncelik sırası (fallback zincirleme)
|
|
80
30
|
players = [
|
|
81
31
|
("MPV", self.play_with_mpv),
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
|
4
|
+
import yt_dlp, sys, os
|
|
5
|
+
|
|
6
|
+
class YTDLP(ExtractorBase):
|
|
7
|
+
name = "yt-dlp"
|
|
8
|
+
main_url = "" # Universal - tüm siteleri destekler
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
def can_handle_url(self, url: str) -> bool:
|
|
14
|
+
"""
|
|
15
|
+
yt-dlp'nin bu URL'yi işleyip işleyemeyeceğini kontrol et
|
|
16
|
+
"""
|
|
17
|
+
try:
|
|
18
|
+
# stderr'ı geçici olarak kapat (hata mesajlarını gizle)
|
|
19
|
+
old_stderr = sys.stderr
|
|
20
|
+
sys.stderr = open(os.devnull, "w")
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
ydl_opts = {
|
|
24
|
+
"simulate" : True, # Download yok, sadece tespit
|
|
25
|
+
"quiet" : True, # Log kirliliği yok
|
|
26
|
+
"no_warnings" : True, # Uyarı mesajları yok
|
|
27
|
+
"extract_flat" : True, # Minimal işlem
|
|
28
|
+
"no_check_certificates" : True,
|
|
29
|
+
"ignoreerrors" : True # Hataları yoksay
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
33
|
+
# URL'yi işleyebiliyor mu kontrol et
|
|
34
|
+
info = ydl.extract_info(url, download=False, process=False)
|
|
35
|
+
|
|
36
|
+
# Generic extractor ise atla
|
|
37
|
+
if info and info.get("extractor_key") != "Generic":
|
|
38
|
+
return True
|
|
39
|
+
|
|
40
|
+
return False
|
|
41
|
+
finally:
|
|
42
|
+
# stderr'ı geri yükle
|
|
43
|
+
sys.stderr.close()
|
|
44
|
+
sys.stderr = old_stderr
|
|
45
|
+
|
|
46
|
+
except Exception:
|
|
47
|
+
# yt-dlp işleyemezse False döndür
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
async def extract(self, url: str, referer: str | None = None) -> ExtractResult:
|
|
51
|
+
ydl_opts = {
|
|
52
|
+
"quiet" : True,
|
|
53
|
+
"no_warnings" : True,
|
|
54
|
+
"extract_flat" : False, # Tam bilgi al
|
|
55
|
+
"format" : "best", # En iyi kalite
|
|
56
|
+
"no_check_certificates" : True
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Referer varsa header olarak ekle
|
|
60
|
+
if referer:
|
|
61
|
+
ydl_opts["http_headers"] = {"Referer": referer}
|
|
62
|
+
|
|
63
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
64
|
+
info = ydl.extract_info(url, download=False)
|
|
65
|
+
|
|
66
|
+
if not info:
|
|
67
|
+
raise ValueError("yt-dlp video bilgisi döndürmedi")
|
|
68
|
+
|
|
69
|
+
# Video URL'sini al
|
|
70
|
+
video_url = info.get("url")
|
|
71
|
+
if not video_url:
|
|
72
|
+
# Bazen formatlar listesinde olabilir
|
|
73
|
+
formats = info.get("formats", [])
|
|
74
|
+
if formats:
|
|
75
|
+
video_url = formats[-1].get("url") # Son format (genellikle en iyi)
|
|
76
|
+
|
|
77
|
+
if not video_url:
|
|
78
|
+
raise ValueError("Video URL bulunamadı")
|
|
79
|
+
|
|
80
|
+
# Altyazıları çıkar
|
|
81
|
+
subtitles = []
|
|
82
|
+
if subtitle_data := info.get("subtitles"):
|
|
83
|
+
for lang, subs in subtitle_data.items():
|
|
84
|
+
for sub in subs:
|
|
85
|
+
if sub_url := sub.get("url"):
|
|
86
|
+
subtitles.append(
|
|
87
|
+
Subtitle(
|
|
88
|
+
name=f"{lang} ({sub.get('ext', 'unknown')})",
|
|
89
|
+
url=sub_url
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
# User-Agent al
|
|
94
|
+
user_agent = None
|
|
95
|
+
http_headers = info.get("http_headers", {})
|
|
96
|
+
if http_headers:
|
|
97
|
+
user_agent = http_headers.get("User-Agent")
|
|
98
|
+
|
|
99
|
+
return ExtractResult(
|
|
100
|
+
name = self.name,
|
|
101
|
+
url = video_url,
|
|
102
|
+
referer = referer or info.get("webpage_url"),
|
|
103
|
+
user_agent = user_agent,
|
|
104
|
+
subtitles = subtitles
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
async def close(self):
|
|
108
|
+
"""yt-dlp için cleanup gerekmez"""
|
|
109
|
+
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.9.0
|
|
4
4
|
Summary: terminal üzerinden medya içeriği aramanızı ve VLC/MPV gibi popüler medya oynatıcılar aracılığıyla doğrudan izlemenizi sağlayan modüler ve genişletilebilir bir bıdı bıdı
|
|
5
5
|
Home-page: https://github.com/keyiflerolsun/KekikStream
|
|
6
6
|
Author: keyiflerolsun
|
|
@@ -64,6 +64,7 @@ KekikStream/Extractors/VidMolyMe.py
|
|
|
64
64
|
KekikStream/Extractors/VidMoxy.py
|
|
65
65
|
KekikStream/Extractors/VidPapi.py
|
|
66
66
|
KekikStream/Extractors/VideoSeyred.py
|
|
67
|
+
KekikStream/Extractors/YTDLP.py
|
|
67
68
|
KekikStream/Extractors/YildizKisaFilm.py
|
|
68
69
|
KekikStream/Plugins/DiziBox.py
|
|
69
70
|
KekikStream/Plugins/DiziPal.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.9.0
|
|
4
4
|
Summary: terminal üzerinden medya içeriği aramanızı ve VLC/MPV gibi popüler medya oynatıcılar aracılığıyla doğrudan izlemenizi sağlayan modüler ve genişletilebilir bir bıdı bıdı
|
|
5
5
|
Home-page: https://github.com/keyiflerolsun/KekikStream
|
|
6
6
|
Author: keyiflerolsun
|
|
@@ -6,7 +6,7 @@ from io import open
|
|
|
6
6
|
setup(
|
|
7
7
|
# ? Genel Bilgiler
|
|
8
8
|
name = "KekikStream",
|
|
9
|
-
version = "1.
|
|
9
|
+
version = "1.9.0",
|
|
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"],
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|