KekikStream 0.2.3__py3-none-any.whl → 0.5.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- KekikStream/CLI/__init__.py +1 -1
- KekikStream/CLI/pypi_kontrol.py +30 -0
- KekikStream/Core/ExtractorBase.py +13 -2
- KekikStream/Core/ExtractorLoader.py +31 -10
- KekikStream/Core/ExtractorModels.py +2 -0
- KekikStream/Core/MediaHandler.py +70 -30
- KekikStream/Core/PluginBase.py +6 -5
- KekikStream/Core/PluginLoader.py +3 -5
- KekikStream/Core/PluginModels.py +6 -16
- KekikStream/Extractors/ContentX.py +80 -0
- KekikStream/Extractors/FourCX.py +7 -0
- KekikStream/Extractors/FourPichive.py +7 -0
- KekikStream/Extractors/FourPlayRu.py +7 -0
- KekikStream/Extractors/HDStreamAble.py +7 -0
- KekikStream/Extractors/Hotlinger.py +7 -0
- KekikStream/Extractors/MixPlayHD.py +42 -0
- KekikStream/Extractors/Odnoklassniki.py +106 -0
- KekikStream/Extractors/OkRuHTTP.py +7 -0
- KekikStream/Extractors/OkRuSSL.py +7 -0
- KekikStream/Extractors/PeaceMakerst.py +57 -0
- KekikStream/Extractors/Pichive.py +7 -0
- KekikStream/Extractors/PixelDrain.py +1 -1
- KekikStream/Extractors/PlayRu.py +7 -0
- KekikStream/Extractors/RapidVid.py +9 -10
- KekikStream/Extractors/SibNet.py +1 -1
- KekikStream/Extractors/Sobreatsesuyp.py +5 -6
- KekikStream/Extractors/TRsTX.py +5 -6
- KekikStream/Extractors/TauVideo.py +11 -10
- KekikStream/Extractors/TurboImgz.py +9 -12
- KekikStream/Extractors/VidMoly.py +25 -33
- KekikStream/Extractors/VidMoxy.py +1 -1
- KekikStream/Extractors/VideoSeyred.py +47 -0
- KekikStream/Managers/MediaManager.py +1 -1
- KekikStream/Managers/UIManager.py +6 -2
- KekikStream/Plugins/DiziBox.py +138 -0
- KekikStream/Plugins/Dizilla.py +95 -0
- KekikStream/Plugins/FilmMakinesi.py +8 -8
- KekikStream/Plugins/FullHDFilmizlesene.py +5 -4
- KekikStream/Plugins/JetFilmizle.py +4 -8
- KekikStream/Plugins/RecTV.py +111 -0
- KekikStream/Plugins/SineWix.py +4 -1
- KekikStream/Plugins/UgurFilm.py +3 -3
- KekikStream/__init__.py +177 -158
- KekikStream/__main__.py +1 -1
- KekikStream/requirements.txt +2 -1
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.3.dist-info}/METADATA +4 -3
- KekikStream-0.5.3.dist-info/RECORD +58 -0
- KekikStream/CLI/check_update.py +0 -33
- KekikStream-0.2.3.dist-info/RECORD +0 -41
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.3.dist-info}/LICENSE +0 -0
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.3.dist-info}/WHEEL +0 -0
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.3.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.3.dist-info}/top_level.txt +0 -0
KekikStream/__init__.py
CHANGED
@@ -1,234 +1,253 @@
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
2
|
|
3
|
-
from .CLI
|
4
|
-
from .Managers
|
5
|
-
from .Core
|
6
|
-
from asyncio
|
3
|
+
from .CLI import konsol, cikis_yap, hata_yakala, pypi_kontrol_guncelle
|
4
|
+
from .Managers import PluginManager, ExtractorManager, UIManager, MediaManager
|
5
|
+
from .Core import PluginBase, ExtractorBase, SeriesInfo
|
6
|
+
from asyncio import run
|
7
|
+
from contextlib import suppress
|
7
8
|
|
8
9
|
class KekikStream:
|
9
10
|
def __init__(self):
|
10
|
-
self.
|
11
|
-
self.
|
12
|
-
self.
|
13
|
-
self.
|
14
|
-
self.
|
15
|
-
|
16
|
-
async def
|
17
|
-
self.
|
11
|
+
self.eklentiler_yonetici = PluginManager()
|
12
|
+
self.cikaricilar_yonetici = ExtractorManager()
|
13
|
+
self.arayuz_yonetici = UIManager()
|
14
|
+
self.medya_yonetici = MediaManager()
|
15
|
+
self.suanki_eklenti: PluginBase = None
|
16
|
+
|
17
|
+
async def baslat(self):
|
18
|
+
self.arayuz_yonetici.clear_console()
|
18
19
|
konsol.rule("[bold cyan]KekikStream Başlatılıyor[/bold cyan]")
|
19
|
-
if not self.
|
20
|
-
konsol.print("[bold red]Hiçbir eklenti bulunamadı![/bold red]")
|
21
|
-
return
|
20
|
+
if not self.eklentiler_yonetici.get_plugin_names():
|
21
|
+
return konsol.print("[bold red]Hiçbir eklenti bulunamadı![/bold red]")
|
22
22
|
|
23
23
|
try:
|
24
|
-
await self.
|
24
|
+
await self.eklenti_secimi()
|
25
25
|
finally:
|
26
|
-
await self.
|
26
|
+
await self.eklentiler_yonetici.close_plugins()
|
27
|
+
|
28
|
+
async def sonuc_bulunamadi(self):
|
29
|
+
secim = await self.arayuz_yonetici.select_from_list(
|
30
|
+
message = "Ne yapmak istersiniz?",
|
31
|
+
choices = ["Tüm Eklentilerde Ara", "Ana Menü", "Çıkış"]
|
32
|
+
)
|
27
33
|
|
28
|
-
|
29
|
-
|
34
|
+
match secim:
|
35
|
+
case "Tüm Eklentilerde Ara":
|
36
|
+
await self.tum_eklentilerde_arama()
|
37
|
+
case "Ana Menü":
|
38
|
+
await self.baslat()
|
39
|
+
case "Çıkış":
|
40
|
+
cikis_yap(False)
|
41
|
+
|
42
|
+
async def eklenti_secimi(self):
|
43
|
+
eklenti_adi = await self.arayuz_yonetici.select_from_fuzzy(
|
30
44
|
message = "Arama yapılacak eklentiyi seçin:",
|
31
|
-
choices = ["Tüm Eklentilerde Ara", *self.
|
45
|
+
choices = ["Tüm Eklentilerde Ara", *self.eklentiler_yonetici.get_plugin_names()]
|
32
46
|
)
|
33
47
|
|
34
|
-
if
|
35
|
-
await self.
|
48
|
+
if eklenti_adi == "Tüm Eklentilerde Ara":
|
49
|
+
await self.tum_eklentilerde_arama()
|
36
50
|
else:
|
37
|
-
self.
|
38
|
-
await self.
|
51
|
+
self.suanki_eklenti = self.eklentiler_yonetici.select_plugin(eklenti_adi)
|
52
|
+
await self.eklenti_ile_arama()
|
39
53
|
|
40
|
-
async def
|
41
|
-
self.
|
42
|
-
konsol.rule(f"[bold cyan]{self.
|
54
|
+
async def eklenti_ile_arama(self):
|
55
|
+
self.arayuz_yonetici.clear_console()
|
56
|
+
konsol.rule(f"[bold cyan]{self.suanki_eklenti.name} Eklentisinde Arama Yapın[/bold cyan]")
|
43
57
|
|
44
|
-
|
45
|
-
|
58
|
+
sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
|
59
|
+
sonuclar = await self.suanki_eklenti.search(sorgu)
|
46
60
|
|
47
|
-
if not
|
61
|
+
if not sonuclar:
|
48
62
|
konsol.print("[bold red]Arama sonucu bulunamadı![/bold red]")
|
49
|
-
return
|
63
|
+
return await self.sonuc_bulunamadi()
|
50
64
|
|
51
|
-
|
65
|
+
if secilen_sonuc := await self.eklenti_sonuc_secimi(sonuclar):
|
66
|
+
await self.sonuc_detaylari_goster({"plugin": self.suanki_eklenti.name, "url": secilen_sonuc})
|
52
67
|
|
53
|
-
|
54
|
-
|
68
|
+
async def eklenti_sonuc_secimi(self, sonuclar):
|
69
|
+
return await self.arayuz_yonetici.select_from_fuzzy(
|
70
|
+
message = "İçerik sonuçlarından birini seçin:",
|
71
|
+
choices = [{"name": sonuc.title, "value": sonuc.url} for sonuc in sonuclar]
|
72
|
+
)
|
55
73
|
|
56
|
-
async def
|
57
|
-
self.
|
74
|
+
async def tum_eklentilerde_arama(self):
|
75
|
+
self.arayuz_yonetici.clear_console()
|
58
76
|
konsol.rule("[bold cyan]Tüm Eklentilerde Arama Yapın[/bold cyan]")
|
59
77
|
|
60
|
-
|
61
|
-
|
78
|
+
sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
|
79
|
+
sonuclar = await self.tum_eklentilerde_arama_sorgula(sorgu)
|
62
80
|
|
63
|
-
if not
|
64
|
-
return
|
81
|
+
if not sonuclar:
|
82
|
+
return await self.sonuc_bulunamadi()
|
65
83
|
|
66
|
-
|
84
|
+
secilen_sonuc = await self.tum_sonuc_secimi(sonuclar)
|
67
85
|
|
68
|
-
if
|
69
|
-
await self.
|
86
|
+
if secilen_sonuc:
|
87
|
+
return await self.sonuc_detaylari_goster(secilen_sonuc)
|
70
88
|
|
71
|
-
async def
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
89
|
+
async def tum_eklentilerde_arama_sorgula(self, sorgu: str) -> list:
|
90
|
+
tum_sonuclar = []
|
91
|
+
|
92
|
+
for eklenti_adi, eklenti in self.eklentiler_yonetici.plugins.items():
|
93
|
+
if not isinstance(eklenti, PluginBase):
|
94
|
+
konsol.print(f"[yellow][!] {eklenti_adi} geçerli bir PluginBase değil, atlanıyor...[/yellow]")
|
95
|
+
continue
|
76
96
|
|
77
|
-
|
78
|
-
|
97
|
+
konsol.log(f"[yellow][~] {eklenti_adi:<19} aranıyor...[/]")
|
98
|
+
try:
|
99
|
+
sonuclar = await eklenti.search(sorgu)
|
100
|
+
if sonuclar:
|
101
|
+
tum_sonuclar.extend(
|
102
|
+
[{"plugin": eklenti_adi, "title": sonuc.title, "url": sonuc.url, "poster": sonuc.poster} for sonuc in sonuclar]
|
103
|
+
)
|
104
|
+
except Exception as hata:
|
105
|
+
konsol.print(f"[bold red]{eklenti_adi} » hata oluştu: {hata}[/bold red]")
|
106
|
+
|
107
|
+
if not tum_sonuclar:
|
108
|
+
konsol.print("[bold red]Hiçbir sonuç bulunamadı![/bold red]")
|
109
|
+
await self.sonuc_bulunamadi()
|
110
|
+
return []
|
111
|
+
|
112
|
+
return tum_sonuclar
|
79
113
|
|
80
|
-
async def
|
114
|
+
async def tum_sonuc_secimi(self, sonuclar):
|
115
|
+
secenekler = [
|
116
|
+
{"name": f"[{sonuc['plugin']}]".ljust(21) + f" » {sonuc['title']}", "value": sonuc}
|
117
|
+
for sonuc in sonuclar
|
118
|
+
]
|
119
|
+
|
120
|
+
return await self.arayuz_yonetici.select_from_fuzzy(
|
121
|
+
message = "Arama sonuçlarından bir içerik seçin:",
|
122
|
+
choices = secenekler
|
123
|
+
)
|
124
|
+
|
125
|
+
async def sonuc_detaylari_goster(self, secilen_sonuc):
|
81
126
|
try:
|
82
|
-
if isinstance(
|
83
|
-
|
84
|
-
url =
|
127
|
+
if isinstance(secilen_sonuc, dict) and "plugin" in secilen_sonuc:
|
128
|
+
eklenti_adi = secilen_sonuc["plugin"]
|
129
|
+
url = secilen_sonuc["url"]
|
85
130
|
|
86
|
-
self.
|
131
|
+
self.suanki_eklenti = self.eklentiler_yonetici.select_plugin(eklenti_adi)
|
87
132
|
else:
|
88
|
-
url =
|
133
|
+
url = secilen_sonuc
|
89
134
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
135
|
+
medya_bilgi = None
|
136
|
+
for _ in range(3):
|
137
|
+
with suppress(Exception):
|
138
|
+
medya_bilgi = await self.suanki_eklenti.load_item(url)
|
139
|
+
break
|
140
|
+
if not medya_bilgi:
|
141
|
+
konsol.print("[bold red]Medya bilgileri yüklenemedi![/bold red]")
|
142
|
+
return await self.sonuc_bulunamadi()
|
95
143
|
|
96
|
-
|
144
|
+
except Exception as hata:
|
145
|
+
konsol.log(secilen_sonuc)
|
146
|
+
return hata_yakala(hata)
|
97
147
|
|
98
|
-
self.
|
148
|
+
self.medya_yonetici.set_title(f"{self.suanki_eklenti.name} | {medya_bilgi.title}")
|
149
|
+
self.arayuz_yonetici.display_media_info(f"{self.suanki_eklenti.name} | {medya_bilgi.title}", medya_bilgi)
|
99
150
|
|
100
|
-
if isinstance(
|
101
|
-
|
151
|
+
if isinstance(medya_bilgi, SeriesInfo):
|
152
|
+
secilen_bolum = await self.arayuz_yonetici.select_from_fuzzy(
|
102
153
|
message = "İzlemek istediğiniz bölümü seçin:",
|
103
154
|
choices = [
|
104
|
-
{"name": f"{
|
105
|
-
for
|
155
|
+
{"name": f"{bolum.season}. Sezon {bolum.episode}. Bölüm - {bolum.title}", "value": bolum.url}
|
156
|
+
for bolum in medya_bilgi.episodes
|
106
157
|
]
|
107
158
|
)
|
108
|
-
if
|
109
|
-
|
110
|
-
await self.
|
159
|
+
if secilen_bolum:
|
160
|
+
baglantilar = await self.suanki_eklenti.load_links(secilen_bolum)
|
161
|
+
await self.baglanti_secenekleri_goster(baglantilar)
|
111
162
|
else:
|
112
|
-
|
113
|
-
await self.
|
163
|
+
baglantilar = await self.suanki_eklenti.load_links(medya_bilgi.url)
|
164
|
+
await self.baglanti_secenekleri_goster(baglantilar)
|
114
165
|
|
115
|
-
async def
|
116
|
-
|
117
|
-
|
166
|
+
async def baglanti_secenekleri_goster(self, baglantilar):
|
167
|
+
if not baglantilar:
|
168
|
+
konsol.print("[bold red]Hiçbir bağlantı bulunamadı![/bold red]")
|
169
|
+
return await self.sonuc_bulunamadi()
|
170
|
+
|
171
|
+
haritalama = self.cikaricilar_yonetici.map_links_to_extractors(baglantilar)
|
172
|
+
play_fonksiyonu_var = hasattr(self.suanki_eklenti, "play") and callable(getattr(self.suanki_eklenti, "play", None))
|
118
173
|
# ! DEBUG
|
119
|
-
# konsol.print(
|
120
|
-
if not
|
174
|
+
# konsol.print(baglantilar)
|
175
|
+
if not haritalama and not play_fonksiyonu_var:
|
121
176
|
konsol.print("[bold red]Hiçbir Extractor bulunamadı![/bold red]")
|
122
|
-
konsol.print(
|
123
|
-
return
|
177
|
+
konsol.print(baglantilar)
|
178
|
+
return await self.sonuc_bulunamadi()
|
124
179
|
|
125
|
-
if not
|
126
|
-
|
180
|
+
if not haritalama:
|
181
|
+
secilen_link = await self.arayuz_yonetici.select_from_list(
|
127
182
|
message = "Doğrudan oynatmak için bir bağlantı seçin:",
|
128
|
-
choices = [{"name": self.
|
183
|
+
choices = [{"name": self.suanki_eklenti.name, "value": link} for link in baglantilar]
|
129
184
|
)
|
130
|
-
if
|
131
|
-
await self.
|
185
|
+
if secilen_link:
|
186
|
+
await self.medya_oynat(secilen_link)
|
132
187
|
return
|
133
188
|
|
134
|
-
|
189
|
+
secim = await self.arayuz_yonetici.select_from_list(
|
135
190
|
message = "Ne yapmak istersiniz?",
|
136
|
-
choices = ["İzle", "
|
191
|
+
choices = ["İzle", "Tüm Eklentilerde Ara", "Ana Menü"]
|
137
192
|
)
|
138
193
|
|
139
|
-
match
|
194
|
+
match secim:
|
140
195
|
case "İzle":
|
141
|
-
|
142
|
-
message = "İzlemek için bir bağlantı seçin:",
|
143
|
-
choices = [{"name":
|
196
|
+
secilen_link = await self.arayuz_yonetici.select_from_list(
|
197
|
+
message = "İzlemek için bir bağlantı seçin:",
|
198
|
+
choices = [{"name": cikarici_adi, "value": link} for link, cikarici_adi in haritalama.items()]
|
144
199
|
)
|
145
|
-
if
|
146
|
-
await self.
|
200
|
+
if secilen_link:
|
201
|
+
await self.medya_oynat(secilen_link)
|
147
202
|
|
148
|
-
case "
|
149
|
-
await self.
|
203
|
+
case "Tüm Eklentilerde Ara":
|
204
|
+
await self.tum_eklentilerde_arama()
|
150
205
|
|
151
206
|
case _:
|
152
|
-
await self.
|
153
|
-
|
154
|
-
async def
|
155
|
-
if hasattr(self.
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
207
|
+
await self.baslat()
|
208
|
+
|
209
|
+
async def medya_oynat(self, secilen_link):
|
210
|
+
if hasattr(self.suanki_eklenti, "play") and callable(self.suanki_eklenti.play):
|
211
|
+
konsol.log(f"[yellow][»] Oynatılıyor : {secilen_link}")
|
212
|
+
return await self.suanki_eklenti.play(
|
213
|
+
name = self.suanki_eklenti._data[secilen_link]["name"],
|
214
|
+
url = secilen_link,
|
215
|
+
referer = self.suanki_eklenti._data[secilen_link]["referer"],
|
216
|
+
subtitles = self.suanki_eklenti._data[secilen_link]["subtitles"]
|
161
217
|
)
|
162
|
-
return
|
163
218
|
|
164
|
-
|
165
|
-
if not
|
166
|
-
konsol.print("[bold red]Uygun Extractor bulunamadı.[/bold red]")
|
167
|
-
return
|
219
|
+
cikarici: ExtractorBase = self.cikaricilar_yonetici.find_extractor(secilen_link)
|
220
|
+
if not cikarici:
|
221
|
+
return konsol.print("[bold red]Uygun Extractor bulunamadı.[/bold red]")
|
168
222
|
|
169
|
-
|
223
|
+
try:
|
224
|
+
extract_data = await cikarici.extract(secilen_link, referer=self.suanki_eklenti.main_url)
|
225
|
+
except Exception as hata:
|
226
|
+
konsol.print(f"[bold red]{cikarici.name} » hata oluştu: {hata}[/bold red]")
|
227
|
+
return await self.sonuc_bulunamadi()
|
170
228
|
|
171
229
|
if isinstance(extract_data, list):
|
172
|
-
|
230
|
+
secilen_data = await self.arayuz_yonetici.select_from_list(
|
173
231
|
message = "Birden fazla bağlantı bulundu, lütfen birini seçin:",
|
174
232
|
choices = [{"name": data.name, "value": data} for data in extract_data]
|
175
233
|
)
|
176
234
|
else:
|
177
|
-
|
178
|
-
|
179
|
-
if selected_data.headers.get("Cookie"):
|
180
|
-
self.media_manager.set_headers({"Cookie": selected_data.headers.get("Cookie")})
|
181
|
-
|
182
|
-
self.media_manager.set_title(f"{self.media_manager.get_title()} | {selected_data.name}")
|
183
|
-
self.media_manager.set_headers({"Referer": selected_data.referer})
|
184
|
-
self.media_manager.play_media(selected_data)
|
185
|
-
|
186
|
-
async def search_all_plugins(self, query: str):
|
187
|
-
all_results = []
|
188
|
-
|
189
|
-
for plugin_name, plugin in self.plugin_manager.plugins.items():
|
190
|
-
if not isinstance(plugin, PluginBase):
|
191
|
-
konsol.print(f"[yellow][!] {plugin_name} geçerli bir PluginBase değil, atlanıyor...[/yellow]")
|
192
|
-
continue
|
193
|
-
|
194
|
-
konsol.log(f"[yellow][~] {plugin_name:<19} aranıyor...[/]")
|
195
|
-
try:
|
196
|
-
results = await plugin.search(query)
|
197
|
-
if results:
|
198
|
-
all_results.extend(
|
199
|
-
[{"plugin": plugin_name, "title": result.title, "url": result.url, "poster": result.poster} for result in results]
|
200
|
-
)
|
201
|
-
except Exception as hata:
|
202
|
-
konsol.print(f"[bold red]{plugin_name} » hata oluştu: {hata}[/bold red]")
|
203
|
-
|
204
|
-
if not all_results:
|
205
|
-
konsol.print("[bold red]Hiçbir sonuç bulunamadı![/bold red]")
|
206
|
-
return []
|
207
|
-
|
208
|
-
return all_results
|
209
|
-
|
210
|
-
async def select_from_all_results(self, results):
|
211
|
-
choices = [
|
212
|
-
{"name": f"{f'[{res["plugin"]}]':<21} » {res['title']}", "value": res}
|
213
|
-
for res in results
|
214
|
-
]
|
215
|
-
|
216
|
-
selected_result = await self.ui_manager.select_from_fuzzy(
|
217
|
-
message = "Arama sonuçlarından bir içerik seçin:",
|
218
|
-
choices = choices
|
219
|
-
)
|
235
|
+
secilen_data = extract_data
|
220
236
|
|
221
|
-
|
237
|
+
if secilen_data.headers.get("Cookie"):
|
238
|
+
self.medya_yonetici.set_headers({"Cookie": secilen_data.headers.get("Cookie")})
|
222
239
|
|
223
|
-
|
240
|
+
self.medya_yonetici.set_title(f"{self.medya_yonetici.get_title()} | {secilen_data.name}")
|
241
|
+
self.medya_yonetici.set_headers({"Referer": secilen_data.referer})
|
242
|
+
konsol.log(f"[yellow][»] Oynatılıyor : {secilen_data.url}")
|
243
|
+
self.medya_yonetici.play_media(secilen_data)
|
224
244
|
|
225
245
|
def basla():
|
226
246
|
try:
|
227
|
-
|
228
|
-
check_and_update_package("KekikStream")
|
247
|
+
pypi_kontrol_guncelle("KekikStream")
|
229
248
|
|
230
249
|
app = KekikStream()
|
231
|
-
run(app.
|
250
|
+
run(app.baslat())
|
232
251
|
cikis_yap(False)
|
233
252
|
except KeyboardInterrupt:
|
234
253
|
cikis_yap(True)
|
KekikStream/__main__.py
CHANGED
KekikStream/requirements.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.5.3
|
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
|
@@ -16,7 +16,8 @@ License-File: LICENSE
|
|
16
16
|
Requires-Dist: setuptools
|
17
17
|
Requires-Dist: wheel
|
18
18
|
Requires-Dist: Kekik
|
19
|
-
Requires-Dist: httpx
|
19
|
+
Requires-Dist: httpx[http2]
|
20
|
+
Requires-Dist: cloudscraper
|
20
21
|
Requires-Dist: parsel
|
21
22
|
Requires-Dist: pydantic
|
22
23
|
Requires-Dist: InquirerPy
|
@@ -39,7 +40,7 @@ Requires-Dist: InquirerPy
|
|
39
40
|
|
40
41
|
*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ı*
|
41
42
|
|
42
|
-
[](https://github.com/user-attachments/assets/63d31bb0-0b69-40b4-84aa-66623f2a253f)
|
43
44
|
|
44
45
|
[](https://www.python.org/)
|
45
46
|
[](https://GitHub.com/keyiflerolsun/)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
KekikStream/__init__.py,sha256=qj5yyeV1jANK-GDuzNXoURWms1lXzjCE3-Gc1p32vyg,10851
|
2
|
+
KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
|
3
|
+
KekikStream/requirements.txt,sha256=QWCXrrmKodIm7mGtIz9cWr9sks-lmL_TilKMrruWJn0,77
|
4
|
+
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
5
|
+
KekikStream/CLI/pypi_kontrol.py,sha256=MchatOwCWCpFBtgt09yag9Rjal9XFyh2W_oVs2p7SNg,1518
|
6
|
+
KekikStream/Core/ExtractorBase.py,sha256=wmGl-Xiem4s5M7baVOxYLba7UdygCDAXggo6Up8pFJE,1409
|
7
|
+
KekikStream/Core/ExtractorLoader.py,sha256=rrll3F2CyVmx3foa57PG0FocQMrFuMpdlG0Uf0-2Fz4,3915
|
8
|
+
KekikStream/Core/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSEtOPlc0,456
|
9
|
+
KekikStream/Core/MediaHandler.py,sha256=eV0ugdIwxRlWQtgYt--XmfPJP8K9FL1Q0T1d04YUls0,4517
|
10
|
+
KekikStream/Core/PluginBase.py,sha256=ZQx6adxOKuX50TPN5pxE8oG9FD-ZjPXSHpSiW086QPQ,2479
|
11
|
+
KekikStream/Core/PluginLoader.py,sha256=5HQF8Em1TjvqMBPLKB7M_i2y6zPH6JZao-uekeacoSs,2574
|
12
|
+
KekikStream/Core/PluginModels.py,sha256=q8tjkt_-uiJ7uNxOThYR0FgTQLZglVAOAaM0Kske-28,2063
|
13
|
+
KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
|
14
|
+
KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
|
15
|
+
KekikStream/Extractors/ContentX.py,sha256=XPoAuA95LOTgCUGyioXxOFWR0nNKWWOHLkYMlzguIIE,2980
|
16
|
+
KekikStream/Extractors/FourCX.py,sha256=4FrMj1IZBBpN_g1P6S3A-8eUu7QFwlt4fJXzJ7vfe0Q,221
|
17
|
+
KekikStream/Extractors/FourPichive.py,sha256=iq3BCUbih1UVF4y4BIWO--0hX5jP2nxqesNx3MGP3kQ,234
|
18
|
+
KekikStream/Extractors/FourPlayRu.py,sha256=wq1ylxKpsO_IBoYr_ALzB2dVrQpJ-jY9lf2zPhcAZX8,228
|
19
|
+
KekikStream/Extractors/HDStreamAble.py,sha256=66n5EvIdX_or5cdnlJ_Uqmzi50n4rl9c5VCw8kBqhQk,245
|
20
|
+
KekikStream/Extractors/Hotlinger.py,sha256=NFMRgUmb6BCrJfa7Hi0VarDNYvCeVknBWEk24FKBBa0,224
|
21
|
+
KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
|
22
|
+
KekikStream/Extractors/MixPlayHD.py,sha256=M7Zxmpkazkj6ewgLWKKDeZDbBOCM9vkMDyIaVhaSPrY,1554
|
23
|
+
KekikStream/Extractors/Odnoklassniki.py,sha256=B0A2krVVvzmpZBzIpxu40WB9AZ_zzH-Km2HTetrNvqQ,3593
|
24
|
+
KekikStream/Extractors/OkRuHTTP.py,sha256=L-B0i_i_Vnm61GvUfd6cGIW-o_H4M-C7DO_cdw2rQPU,228
|
25
|
+
KekikStream/Extractors/OkRuSSL.py,sha256=FHJ5XZ1dO5ED3mIku3e3vnq8K0slrcr0jqhaUnHmfVk,227
|
26
|
+
KekikStream/Extractors/PeaceMakerst.py,sha256=VSXeCeA_-9IkKdjoQ3lvA4FFDzdT_Oj1oFM7i-_3tvQ,2100
|
27
|
+
KekikStream/Extractors/Pichive.py,sha256=BSVYFwL3Ax6yGoS1WkpOWtngxNyuZLoKzpPwjibpu2s,221
|
28
|
+
KekikStream/Extractors/PixelDrain.py,sha256=1kf1kKKxcYwLVPo_8Fg1Za3E2kOplqqVFM41xBT52KY,992
|
29
|
+
KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
|
30
|
+
KekikStream/Extractors/RapidVid.py,sha256=n03CyrnFLSoL6Ys5Dy4a4d-5iIAdmouqz4-k6Vl3Hok,2369
|
31
|
+
KekikStream/Extractors/SibNet.py,sha256=Jrl93OdKwEhssG348-F2BKaj-XUS7v-Qw3dKMh_ZMRQ,878
|
32
|
+
KekikStream/Extractors/Sobreatsesuyp.py,sha256=p5aHxIM9aNBfWEnqjTdI_kYpcFKvBHg1BZoPqbB_eyo,2004
|
33
|
+
KekikStream/Extractors/TRsTX.py,sha256=Z-Xk6kSAFFbxnj2I7x0gAbBbaQyuj1mIqn2Sw0xFtP4,2156
|
34
|
+
KekikStream/Extractors/TauVideo.py,sha256=I6TYHqAYSb_fAIcb8PiIdkzlQ0ZX-9Bb5_KMG955sJ4,1114
|
35
|
+
KekikStream/Extractors/TurboImgz.py,sha256=VXx9vZZRTdQiVNER0LcXm2nsv2OaXnxuPpslG-sEKD0,826
|
36
|
+
KekikStream/Extractors/VidMoly.py,sha256=BKJgk60GomFYiLFsRQSR2sOYP105Aix5y5XLazBNWmw,3368
|
37
|
+
KekikStream/Extractors/VidMoxy.py,sha256=_K6BA7Uo59DA3ty_tsayCUZjXmRoDBTghekVNXiuZ7g,1800
|
38
|
+
KekikStream/Extractors/VideoSeyred.py,sha256=otyGi1zdY_JPrXJjoZjesCQDiOkxFdaWiXQ9mOmrygA,1780
|
39
|
+
KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
|
40
|
+
KekikStream/Managers/MediaManager.py,sha256=SPO85LchT7bJKSecmXd1FzCjg0rUT8s3B1wulPa4SMw,519
|
41
|
+
KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
|
42
|
+
KekikStream/Managers/UIManager.py,sha256=_jJSUDCsOvrByw55KdZD0ioE2U2XmTBuw1KIaPpmm6o,1676
|
43
|
+
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
44
|
+
KekikStream/Plugins/DiziBox.py,sha256=ARzsao-r91c3PVV_3-NCLvNcVRSIxjlGdWl_3-1Q6Mo,5722
|
45
|
+
KekikStream/Plugins/Dizilla.py,sha256=D-gQ23rck3UjnYeYSYzokYWVL7lshzEk4vS3qsR_7Tk,3813
|
46
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=rz8TQeL41PJbeEmksgPHIhp6J-4vbSCBTeEH0ukExz4,2822
|
47
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=Fa0gRP_NoMfPC8HIKRxERjQVOv8Fyb-ayMJ2EooZ7BE,3080
|
48
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=FXkMSQtjYoxwIonjRENFa91rC42L_8SYRhjhuSgsu60,3919
|
49
|
+
KekikStream/Plugins/RecTV.py,sha256=TvTxpLLmyv5WH1yIlZmyu0BPXorvKVT2e4P_2cho9Kk,4842
|
50
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
51
|
+
KekikStream/Plugins/SineWix.py,sha256=iBtSl150N3GHWqHJDLVNFDSJff-00PHksQC1h2urR8w,4851
|
52
|
+
KekikStream/Plugins/UgurFilm.py,sha256=yYXee5uxwNnPqFJZ6s6cRkmUyqS3Vv8x-iesPalc4j4,2930
|
53
|
+
KekikStream-0.5.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
54
|
+
KekikStream-0.5.3.dist-info/METADATA,sha256=djZz561K9J21Zym--33YUHmpvHrwhDq4FgbniHbR2gs,3994
|
55
|
+
KekikStream-0.5.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
56
|
+
KekikStream-0.5.3.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
57
|
+
KekikStream-0.5.3.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
58
|
+
KekikStream-0.5.3.dist-info/RECORD,,
|
KekikStream/CLI/check_update.py
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
-
|
3
|
-
from . import konsol
|
4
|
-
from rich.panel import Panel
|
5
|
-
from pkg_resources import get_distribution
|
6
|
-
from requests import get
|
7
|
-
from subprocess import check_call
|
8
|
-
import sys
|
9
|
-
|
10
|
-
def check_and_update_package(package_name: str):
|
11
|
-
"""Paketi kontrol et ve gerekirse güncelle."""
|
12
|
-
try:
|
13
|
-
# Mevcut sürümü al
|
14
|
-
current_version = get_distribution(package_name).version
|
15
|
-
konsol.print(Panel(f"[cyan]Yüklü sürüm:[/cyan] [bold yellow]{current_version}[/bold yellow]"))
|
16
|
-
|
17
|
-
# PyPI'den en son sürümü al
|
18
|
-
response = get(f"https://pypi.org/pypi/{package_name}/json")
|
19
|
-
if response.status_code == 200:
|
20
|
-
latest_version = response.json()["info"]["version"]
|
21
|
-
konsol.print(Panel(f"[cyan]En son sürüm:[/cyan] [bold green]{latest_version}[/bold green]"))
|
22
|
-
|
23
|
-
# Eğer güncel değilse güncelle
|
24
|
-
if current_version != latest_version:
|
25
|
-
konsol.print(f"[bold red]{package_name} güncelleniyor...[/bold red]")
|
26
|
-
check_call([sys.executable, "-m", "pip", "install", "--upgrade", package_name, "--break-system-packages"])
|
27
|
-
konsol.print(f"[bold green]{package_name} güncellendi![/bold green]")
|
28
|
-
else:
|
29
|
-
konsol.print(f"[bold green]{package_name} zaten güncel.[/bold green]")
|
30
|
-
else:
|
31
|
-
konsol.print("[bold red]PyPI'ye erişilemiyor. Güncelleme kontrolü atlanıyor.[/bold red]")
|
32
|
-
except Exception as e:
|
33
|
-
konsol.print(f"[bold red]Güncelleme kontrolü sırasında hata oluştu: {e}[/bold red]")
|
@@ -1,41 +0,0 @@
|
|
1
|
-
KekikStream/__init__.py,sha256=51EpuqJ5H7CU9aA-K2V1DN2iOF9eRp_y776mhv1E8ls,9328
|
2
|
-
KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
|
3
|
-
KekikStream/requirements.txt,sha256=Kh3E0NzIkAmhVODtIwRVffVOHLiElO6Ua9kIgjbocPE,57
|
4
|
-
KekikStream/CLI/__init__.py,sha256=9YlF135BVff85y492hX4sq2WY2CNqa4BuVzF9hIIaKE,233
|
5
|
-
KekikStream/CLI/check_update.py,sha256=rOa16bO9sGN-p78yaTRaccFoNfhHWEfDgGZNavpcwNI,1642
|
6
|
-
KekikStream/Core/ExtractorBase.py,sha256=SPXKZPfpzvgkJeMds-USzgpm8-qb0vgZjjLDs58NfGU,1069
|
7
|
-
KekikStream/Core/ExtractorLoader.py,sha256=JovJJr6Clk3xpbRLlh7v_XOl3FGwVXCjTZivec1FktI,2533
|
8
|
-
KekikStream/Core/ExtractorModels.py,sha256=vJeh4qd05K7nbqdCCGU29UkGQpce6jXfsCm7LuDL1G8,454
|
9
|
-
KekikStream/Core/MediaHandler.py,sha256=Q_9LMc4Wnmv8PhMfoo2IgxpHLeikUgrqp_B_Rfs217U,3005
|
10
|
-
KekikStream/Core/PluginBase.py,sha256=MmhGy0XtbkWxE5SNvsag0M_jNehMxPGtVyZFOKlJPM8,2304
|
11
|
-
KekikStream/Core/PluginLoader.py,sha256=og5EPfnVqrb2kUkeGU65AY0fU43IbiUo_h3ix6ZiINY,2596
|
12
|
-
KekikStream/Core/PluginModels.py,sha256=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
|
13
|
-
KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
|
14
|
-
KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
|
15
|
-
KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
|
16
|
-
KekikStream/Extractors/PixelDrain.py,sha256=JLNaTdFJfXj5ExB_OjjyjwBZBD_gCOmL3fO_TWbHe90,998
|
17
|
-
KekikStream/Extractors/RapidVid.py,sha256=HmSXDWhE1EXZRhNCxrqqEBbyJKbqFtTFRtq-zYg3G2c,2430
|
18
|
-
KekikStream/Extractors/SibNet.py,sha256=w0Rv1cYB_Ho6M9Aho9n38Thp6mAfKPNe-eKFC_DbGuE,884
|
19
|
-
KekikStream/Extractors/Sobreatsesuyp.py,sha256=7JUbqHLMWFkHuzH3NG2ogaV53e9fUmGvAr7h83yRtxs,1953
|
20
|
-
KekikStream/Extractors/TRsTX.py,sha256=jhPcQq7KPxL0SPvEFL4MG7oDXDpBbt6Qh8vRJ_bLQMU,2105
|
21
|
-
KekikStream/Extractors/TauVideo.py,sha256=bBjrZFSi4QqSJhRB0sDWMA0Saio-zpoAb6Ss4QZmBeY,1045
|
22
|
-
KekikStream/Extractors/TurboImgz.py,sha256=0d9t6bj4prVt1_LIbzwcfuqrSRB7SMvc4RKvE25BtW4,851
|
23
|
-
KekikStream/Extractors/VidMoly.py,sha256=a2ElfpEcTWBpBT0mADWcEF2T8l9WjAEuX8Dux0hiYrU,3390
|
24
|
-
KekikStream/Extractors/VidMoxy.py,sha256=UnVrCEI4XNiONE2aLV9dGUhRqQ9ELJTnYVXyG81N11A,1800
|
25
|
-
KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
|
26
|
-
KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
|
27
|
-
KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
|
28
|
-
KekikStream/Managers/UIManager.py,sha256=RNsvfwker2Pwel9Ur14Bo0oY7Xg5XmlpvFAWdHQJJMc,1590
|
29
|
-
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
30
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=g4LRDP5Atn97PqbgnEdm0-wjVdXaJIVk1Ru0F8B66Ws,2902
|
31
|
-
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
|
32
|
-
KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
|
33
|
-
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
34
|
-
KekikStream/Plugins/SineWix.py,sha256=RJxggTrZxBimQHI4ehtJipVeIBpfHy85NW-ixE2iF2k,4762
|
35
|
-
KekikStream/Plugins/UgurFilm.py,sha256=U7ryNWpjSZJWuYlMGX1Be9uuyiM3SfuI9VJcEiXedNs,2960
|
36
|
-
KekikStream-0.2.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
37
|
-
KekikStream-0.2.3.dist-info/METADATA,sha256=KRLxDSHdAxoA7dl62Xe3rFDvq5DnEnTOSrmuUeiXC9s,3959
|
38
|
-
KekikStream-0.2.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
39
|
-
KekikStream-0.2.3.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
40
|
-
KekikStream-0.2.3.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
41
|
-
KekikStream-0.2.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|