KekikStream 0.9.2__py3-none-any.whl → 1.0.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- KekikStream/Core/Media/MediaHandler.py +4 -0
- KekikStream/Plugins/Shorten.py +8 -7
- KekikStream/__init__.py +123 -61
- {KekikStream-0.9.2.dist-info → KekikStream-1.0.0.dist-info}/METADATA +1 -1
- {KekikStream-0.9.2.dist-info → KekikStream-1.0.0.dist-info}/RECORD +9 -9
- {KekikStream-0.9.2.dist-info → KekikStream-1.0.0.dist-info}/LICENSE +0 -0
- {KekikStream-0.9.2.dist-info → KekikStream-1.0.0.dist-info}/WHEEL +0 -0
- {KekikStream-0.9.2.dist-info → KekikStream-1.0.0.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.9.2.dist-info → KekikStream-1.0.0.dist-info}/top_level.txt +0 -0
@@ -14,6 +14,10 @@ class MediaHandler:
|
|
14
14
|
self.title = title
|
15
15
|
|
16
16
|
def play_media(self, extract_data: ExtractResult):
|
17
|
+
# Referer varsa headers'a ekle
|
18
|
+
if extract_data.referer:
|
19
|
+
self.headers.update({"Referer": extract_data.referer})
|
20
|
+
|
17
21
|
# Google Drive gibi özel durumlar için yt-dlp kullan
|
18
22
|
if self.headers.get("User-Agent") == "googleusercontent":
|
19
23
|
return self.play_with_ytdlp(extract_data)
|
KekikStream/Plugins/Shorten.py
CHANGED
@@ -65,13 +65,13 @@ async def extract_next_f_push_data(source_code):
|
|
65
65
|
|
66
66
|
class Shorten(PluginBase):
|
67
67
|
name = "Shorten"
|
68
|
-
main_url = "
|
68
|
+
main_url = "https://shorten.com"
|
69
69
|
token = None
|
70
70
|
|
71
71
|
async def __giris(self):
|
72
|
-
await self.oturum.get("
|
72
|
+
await self.oturum.get(f"{self.main_url}/tr", follow_redirects=True)
|
73
73
|
|
74
|
-
self.token = await self.oturum.get("
|
74
|
+
self.token = await self.oturum.get(f"{self.main_url}/api/session")
|
75
75
|
self.token = self.token.json().get("token")
|
76
76
|
|
77
77
|
self.oturum.headers.update({"Authorization": f"Bearer {self.token}"})
|
@@ -94,7 +94,7 @@ class Shorten(PluginBase):
|
|
94
94
|
if not self.token:
|
95
95
|
await self.__giris()
|
96
96
|
|
97
|
-
istek = await self.oturum.get(f"
|
97
|
+
istek = await self.oturum.get(f"{self.main_url}/tr/series/{slug}", follow_redirects=True)
|
98
98
|
veriler = await extract_next_f_push_data(istek.text)
|
99
99
|
veriler = veriler["8"][-1]["children"][-2][-1]["children"][-1]["data"]
|
100
100
|
return [
|
@@ -114,7 +114,7 @@ class Shorten(PluginBase):
|
|
114
114
|
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
|
115
115
|
"Content-Type" : "application/json",
|
116
116
|
"Origin" : "https://vod.byteplusapi.com",
|
117
|
-
"Referer" : "
|
117
|
+
"Referer" : f"{self.main_url}/",
|
118
118
|
}
|
119
119
|
)
|
120
120
|
|
@@ -128,7 +128,7 @@ class Shorten(PluginBase):
|
|
128
128
|
raw_req = await self.raw_bolumler(slug)
|
129
129
|
number, _hash = raw_req[0].values()
|
130
130
|
|
131
|
-
istek = await self.oturum.get(f"
|
131
|
+
istek = await self.oturum.get(f"{self.main_url}/tr/series/{slug}/episode-{number}-{_hash}", follow_redirects=True)
|
132
132
|
veriler = await extract_next_f_push_data(istek.text)
|
133
133
|
veriler = veriler["b"][3]["children"][1][3]["children"][3]["children"][3]["children"][-1]
|
134
134
|
|
@@ -175,6 +175,7 @@ class Shorten(PluginBase):
|
|
175
175
|
for episode in veri.get("episodes"):
|
176
176
|
episode["name"] = veri["title"] + f" | {episode.get('number')}. Bölüm"
|
177
177
|
episode["subtitles"] = [subtitle for subtitle in episode["subtitles"] if subtitle.get("code").lower() in ["tr", "en"]]
|
178
|
+
episode["subtitles"].reverse()
|
178
179
|
|
179
180
|
ep_model = Episode(
|
180
181
|
season = 1,
|
@@ -187,7 +188,7 @@ class Shorten(PluginBase):
|
|
187
188
|
self._data[ep_model.url] = {
|
188
189
|
"ext_name" : self.name,
|
189
190
|
"name" : f"{ep_model.title}",
|
190
|
-
"referer" : "
|
191
|
+
"referer" : f"{self.main_url}/tr",
|
191
192
|
"subtitles" : []
|
192
193
|
}
|
193
194
|
|
KekikStream/__init__.py
CHANGED
@@ -7,19 +7,22 @@ from contextlib import suppress
|
|
7
7
|
|
8
8
|
class KekikStream:
|
9
9
|
def __init__(self):
|
10
|
-
|
10
|
+
"""
|
11
|
+
KekikStream sınıfı, eklenti, çıkarıcı, arayüz ve medya yönetimini yürütür.
|
12
|
+
"""
|
11
13
|
self.eklentiler_yonetici = PluginManager()
|
12
14
|
self.cikaricilar_yonetici = ExtractorManager()
|
13
15
|
self.arayuz_yonetici = UIManager()
|
14
16
|
self.medya_yonetici = MediaManager()
|
15
17
|
self.suanki_eklenti: PluginBase = None
|
16
18
|
self.secilen_sonuc = None
|
19
|
+
self.dizi = False
|
17
20
|
|
18
21
|
async def baslat(self):
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
"""
|
23
|
+
Uygulamayı başlatır: konsolu temizler, başlığı gösterir ve eklenti seçimiyle devam eder.
|
24
|
+
"""
|
25
|
+
self._temizle_ve_baslik_goster("[bold cyan]KekikStream Başlatılıyor[/bold cyan]")
|
23
26
|
# Eklenti kontrolü
|
24
27
|
if not self.eklentiler_yonetici.get_plugin_names():
|
25
28
|
return konsol.print("[bold red]Hiçbir eklenti bulunamadı![/bold red]")
|
@@ -30,8 +33,17 @@ class KekikStream:
|
|
30
33
|
# Program kapanırken tüm eklentileri kapat
|
31
34
|
await self.eklentiler_yonetici.close_plugins()
|
32
35
|
|
36
|
+
def _temizle_ve_baslik_goster(self, baslik: str):
|
37
|
+
"""
|
38
|
+
Konsolu temizler ve verilen başlıkla bir kural (separator) gösterir.
|
39
|
+
"""
|
40
|
+
self.arayuz_yonetici.clear_console()
|
41
|
+
konsol.rule(baslik)
|
42
|
+
|
33
43
|
async def sonuc_bulunamadi(self):
|
34
|
-
|
44
|
+
"""
|
45
|
+
Arama sonucunda hiçbir içerik bulunamadığında kullanıcıya seçenekler sunar.
|
46
|
+
"""
|
35
47
|
secim = await self.arayuz_yonetici.select_from_list(
|
36
48
|
message = "Ne yapmak istersiniz?",
|
37
49
|
choices = ["Tüm Eklentilerde Ara", "Ana Menü", "Çıkış"]
|
@@ -46,7 +58,9 @@ class KekikStream:
|
|
46
58
|
cikis_yap(False)
|
47
59
|
|
48
60
|
async def eklenti_secimi(self):
|
49
|
-
|
61
|
+
"""
|
62
|
+
Kullanıcıdan eklenti seçimi alır ve seçime göre arama işlemini başlatır.
|
63
|
+
"""
|
50
64
|
eklenti_adi = await self.arayuz_yonetici.select_from_fuzzy(
|
51
65
|
message = "Arama yapılacak eklentiyi seçin:",
|
52
66
|
choices = ["Tüm Eklentilerde Ara", *self.eklentiler_yonetici.get_plugin_names()]
|
@@ -59,9 +73,10 @@ class KekikStream:
|
|
59
73
|
await self.eklenti_ile_arama()
|
60
74
|
|
61
75
|
async def eklenti_ile_arama(self):
|
62
|
-
|
63
|
-
|
64
|
-
|
76
|
+
"""
|
77
|
+
Seçilen eklentiyle arama yapar; kullanıcıdan sorgu alır, sonuçları listeler ve seçim sonrası detayları gösterir.
|
78
|
+
"""
|
79
|
+
self._temizle_ve_baslik_goster(f"[bold cyan]{self.suanki_eklenti.name} Eklentisinde Arama Yapın[/bold cyan]")
|
65
80
|
|
66
81
|
# Kullanıcıdan sorgu al ve ara
|
67
82
|
sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
|
@@ -71,21 +86,24 @@ class KekikStream:
|
|
71
86
|
konsol.print("[bold red]Arama sonucu bulunamadı![/bold red]")
|
72
87
|
return await self.sonuc_bulunamadi()
|
73
88
|
|
74
|
-
|
89
|
+
secilen_sonuc = await self.eklenti_sonuc_secimi(sonuclar)
|
90
|
+
if secilen_sonuc:
|
75
91
|
await self.sonuc_detaylari_goster({"plugin": self.suanki_eklenti.name, "url": secilen_sonuc})
|
76
92
|
|
77
|
-
async def eklenti_sonuc_secimi(self, sonuclar):
|
78
|
-
|
93
|
+
async def eklenti_sonuc_secimi(self, sonuclar: list):
|
94
|
+
"""
|
95
|
+
Arama sonuçlarından kullanıcıya seçim yaptırır.
|
96
|
+
"""
|
79
97
|
return await self.arayuz_yonetici.select_from_fuzzy(
|
80
98
|
message = "İçerik sonuçlarından birini seçin:",
|
81
99
|
choices = [{"name": sonuc.title, "value": sonuc.url} for sonuc in sonuclar]
|
82
100
|
)
|
83
101
|
|
84
102
|
async def tum_eklentilerde_arama(self):
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
103
|
+
"""
|
104
|
+
Tüm eklentilerde arama yapar ve sonuçlara göre işlem yapar.
|
105
|
+
"""
|
106
|
+
self._temizle_ve_baslik_goster("[bold cyan]Tüm Eklentilerde Arama Yapın[/bold cyan]")
|
89
107
|
sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
|
90
108
|
sonuclar = await self.tum_eklentilerde_arama_sorgula(sorgu)
|
91
109
|
|
@@ -95,11 +113,13 @@ class KekikStream:
|
|
95
113
|
secilen_sonuc = await self.tum_sonuc_secimi(sonuclar)
|
96
114
|
|
97
115
|
if secilen_sonuc:
|
98
|
-
|
116
|
+
await self.sonuc_detaylari_goster(secilen_sonuc)
|
99
117
|
|
100
118
|
async def tum_eklentilerde_arama_sorgula(self, sorgu: str) -> list:
|
119
|
+
"""
|
120
|
+
Tüm eklentilerde arama yapar ve bulunan sonuçları listeler.
|
121
|
+
"""
|
101
122
|
tum_sonuclar = []
|
102
|
-
|
103
123
|
# Her eklentide arama yap
|
104
124
|
for eklenti_adi, eklenti in self.eklentiler_yonetici.plugins.items():
|
105
125
|
# Eklenti türü kontrolü
|
@@ -113,7 +133,15 @@ class KekikStream:
|
|
113
133
|
if sonuclar:
|
114
134
|
# Sonuçları listeye ekle
|
115
135
|
tum_sonuclar.extend(
|
116
|
-
[
|
136
|
+
[
|
137
|
+
{
|
138
|
+
"plugin" : eklenti_adi,
|
139
|
+
"title" : sonuc.title,
|
140
|
+
"url" : sonuc.url,
|
141
|
+
"poster" : sonuc.poster
|
142
|
+
}
|
143
|
+
for sonuc in sonuclar
|
144
|
+
]
|
117
145
|
)
|
118
146
|
except Exception as hata:
|
119
147
|
konsol.print(f"[bold red]{eklenti_adi} » hata oluştu: {hata}[/bold red]")
|
@@ -121,12 +149,12 @@ class KekikStream:
|
|
121
149
|
if not tum_sonuclar:
|
122
150
|
konsol.print("[bold red]Hiçbir sonuç bulunamadı![/bold red]")
|
123
151
|
await self.sonuc_bulunamadi()
|
124
|
-
return []
|
125
|
-
|
126
152
|
return tum_sonuclar
|
127
153
|
|
128
|
-
async def tum_sonuc_secimi(self, sonuclar):
|
129
|
-
|
154
|
+
async def tum_sonuc_secimi(self, sonuclar: list):
|
155
|
+
"""
|
156
|
+
Tüm arama sonuçlarından kullanıcıya seçim yaptırır.
|
157
|
+
"""
|
130
158
|
secenekler = [
|
131
159
|
{"name": f"[{sonuc['plugin']}]".ljust(21) + f" » {sonuc['title']}", "value": sonuc}
|
132
160
|
for sonuc in sonuclar
|
@@ -137,7 +165,21 @@ class KekikStream:
|
|
137
165
|
choices = secenekler
|
138
166
|
)
|
139
167
|
|
168
|
+
async def _medya_bilgisi_yukle(self, url: str, deneme: int = 3):
|
169
|
+
"""
|
170
|
+
Belirtilen URL için medya bilgilerini, belirlenen deneme sayısı kadar yüklemeye çalışır.
|
171
|
+
"""
|
172
|
+
for _ in range(deneme):
|
173
|
+
with suppress(Exception):
|
174
|
+
return await self.suanki_eklenti.load_item(url)
|
175
|
+
|
176
|
+
konsol.print("[bold red]Medya bilgileri yüklenemedi![/bold red]")
|
177
|
+
return None
|
178
|
+
|
140
179
|
async def sonuc_detaylari_goster(self, secilen_sonuc):
|
180
|
+
"""
|
181
|
+
Seçilen sonucun detaylarını gösterir; medya bilgilerini yükler, dizi ise bölüm seçimi sağlar.
|
182
|
+
"""
|
141
183
|
self.secilen_sonuc = secilen_sonuc
|
142
184
|
try:
|
143
185
|
# Seçilen sonucun detaylarını al
|
@@ -149,41 +191,45 @@ class KekikStream:
|
|
149
191
|
else:
|
150
192
|
url = secilen_sonuc
|
151
193
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
with suppress(Exception):
|
156
|
-
medya_bilgi = await self.suanki_eklenti.load_item(url)
|
157
|
-
break
|
158
|
-
if not medya_bilgi:
|
159
|
-
konsol.print("[bold red]Medya bilgileri yüklenemedi![/bold red]")
|
160
|
-
return await self.sonuc_bulunamadi()
|
194
|
+
medya_bilgi = await self._medya_bilgisi_yukle(url)
|
195
|
+
if not medya_bilgi:
|
196
|
+
return await self.sonuc_bulunamadi()
|
161
197
|
|
162
198
|
except Exception as hata:
|
163
199
|
konsol.log(secilen_sonuc)
|
164
200
|
return hata_yakala(hata)
|
165
201
|
|
166
|
-
# Medya
|
202
|
+
# Medya bilgilerini göster ve başlığı ayarla
|
167
203
|
self.medya_yonetici.set_title(f"{self.suanki_eklenti.name} | {medya_bilgi.title}")
|
168
204
|
self.arayuz_yonetici.display_media_info(f"{self.suanki_eklenti.name} | {medya_bilgi.title}", medya_bilgi)
|
169
205
|
|
170
|
-
#
|
206
|
+
# Eğer medya bilgisi dizi ise bölüm seçimi yapılır
|
171
207
|
if isinstance(medya_bilgi, SeriesInfo):
|
172
|
-
|
173
|
-
|
174
|
-
choices = [
|
175
|
-
{"name": f"{bolum.season}. Sezon {bolum.episode}. Bölüm{f' - {bolum.title}' if bolum.title else ''}", "value": bolum.url}
|
176
|
-
for bolum in medya_bilgi.episodes
|
177
|
-
]
|
178
|
-
)
|
179
|
-
if secilen_bolum:
|
180
|
-
baglantilar = await self.suanki_eklenti.load_links(secilen_bolum)
|
181
|
-
await self.baglanti_secenekleri_goster(baglantilar)
|
208
|
+
self.dizi = True
|
209
|
+
await self.dizi_bolum_secimi(medya_bilgi)
|
182
210
|
else:
|
183
211
|
baglantilar = await self.suanki_eklenti.load_links(medya_bilgi.url)
|
184
212
|
await self.baglanti_secenekleri_goster(baglantilar)
|
185
213
|
|
214
|
+
async def dizi_bolum_secimi(self, medya_bilgi: SeriesInfo):
|
215
|
+
"""
|
216
|
+
Dizi içeriği için bölüm seçimi yapar ve seçilen bölümün bağlantılarını yükler.
|
217
|
+
"""
|
218
|
+
secilen_bolum = await self.arayuz_yonetici.select_from_fuzzy(
|
219
|
+
message = "İzlemek istediğiniz bölümü seçin:",
|
220
|
+
choices = [
|
221
|
+
{"name": f"{bolum.season}. Sezon {bolum.episode}. Bölüm" + (f" - {bolum.title}" if bolum.title else ""), "value": bolum.url}
|
222
|
+
for bolum in medya_bilgi.episodes
|
223
|
+
]
|
224
|
+
)
|
225
|
+
if secilen_bolum:
|
226
|
+
baglantilar = await self.suanki_eklenti.load_links(secilen_bolum)
|
227
|
+
await self.baglanti_secenekleri_goster(baglantilar)
|
228
|
+
|
186
229
|
async def baglanti_secenekleri_goster(self, baglantilar):
|
230
|
+
"""
|
231
|
+
Bağlantı seçeneklerini kullanıcıya sunar ve seçilen bağlantıya göre oynatma işlemini gerçekleştirir.
|
232
|
+
"""
|
187
233
|
if not baglantilar:
|
188
234
|
konsol.print("[bold red]Hiçbir bağlantı bulunamadı![/bold red]")
|
189
235
|
return await self.sonuc_bulunamadi()
|
@@ -202,16 +248,7 @@ class KekikStream:
|
|
202
248
|
|
203
249
|
# Doğrudan oynatma seçeneği
|
204
250
|
if not haritalama:
|
205
|
-
|
206
|
-
message = "Doğrudan oynatmak için bir bağlantı seçin:",
|
207
|
-
choices = [{"name": value["ext_name"], "value": key} for key, value in self.suanki_eklenti._data.items() if key in baglantilar]
|
208
|
-
)
|
209
|
-
if secilen_link:
|
210
|
-
await self.medya_oynat(secilen_link)
|
211
|
-
|
212
|
-
self.arayuz_yonetici.clear_console()
|
213
|
-
konsol.rule(f"[bold cyan]{self.suanki_eklenti.name} » Bi Bölüm Daha?[/bold cyan]")
|
214
|
-
return await self.sonuc_detaylari_goster(self.secilen_sonuc)
|
251
|
+
return await self.direkt_oynat(baglantilar)
|
215
252
|
|
216
253
|
# Kullanıcı seçenekleri
|
217
254
|
secim = await self.arayuz_yonetici.select_from_list(
|
@@ -234,16 +271,39 @@ class KekikStream:
|
|
234
271
|
case _:
|
235
272
|
await self.baslat()
|
236
273
|
|
237
|
-
async def
|
238
|
-
|
274
|
+
async def direkt_oynat(self, baglantilar):
|
275
|
+
"""
|
276
|
+
Extractor eşleşmesi yoksa, doğrudan oynatma seçeneği sunar.
|
277
|
+
"""
|
278
|
+
secilen_link = await self.arayuz_yonetici.select_from_list(
|
279
|
+
message = "Doğrudan oynatmak için bir bağlantı seçin:",
|
280
|
+
choices = [
|
281
|
+
{"name": value["ext_name"], "value": key}
|
282
|
+
for key, value in self.suanki_eklenti._data.items() if key in baglantilar
|
283
|
+
]
|
284
|
+
)
|
285
|
+
if secilen_link:
|
286
|
+
await self.medya_oynat(secilen_link)
|
287
|
+
|
288
|
+
async def bi_bolum_daha(self):
|
289
|
+
self._temizle_ve_baslik_goster(f"[bold cyan]{self.suanki_eklenti.name} » Bi Bölüm Daha?[/bold cyan]")
|
290
|
+
return await self.sonuc_detaylari_goster(self.secilen_sonuc)
|
291
|
+
|
292
|
+
async def medya_oynat(self, secilen_link: str):
|
293
|
+
"""
|
294
|
+
Seçilen bağlantıya göre medya oynatma işlemini gerçekleştirir.
|
295
|
+
"""
|
239
296
|
if hasattr(self.suanki_eklenti, "play") and callable(self.suanki_eklenti.play):
|
240
297
|
konsol.log(f"[yellow][»] Oynatılıyor : {secilen_link}")
|
241
|
-
|
242
|
-
|
298
|
+
data = self.suanki_eklenti._data.get(secilen_link, {})
|
299
|
+
|
300
|
+
await self.suanki_eklenti.play(
|
301
|
+
name = data.get("name"),
|
243
302
|
url = secilen_link,
|
244
|
-
referer =
|
245
|
-
subtitles =
|
303
|
+
referer = data.get("referer"),
|
304
|
+
subtitles = data.get("subtitles")
|
246
305
|
)
|
306
|
+
return await self.bi_bolum_daha() if self.dizi else await self.baslat()
|
247
307
|
|
248
308
|
# Uygun çıkarıcıyı bul
|
249
309
|
cikarici: ExtractorBase = self.cikaricilar_yonetici.find_extractor(secilen_link)
|
@@ -275,6 +335,8 @@ class KekikStream:
|
|
275
335
|
self.medya_yonetici.set_headers({"Referer": secilen_data.referer})
|
276
336
|
konsol.log(f"[yellow][»] Oynatılıyor : {secilen_data.url}")
|
277
337
|
self.medya_yonetici.play_media(secilen_data)
|
338
|
+
|
339
|
+
await self.bi_bolum_daha() if self.dizi else await self.baslat()
|
278
340
|
|
279
341
|
def basla():
|
280
342
|
try:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.
|
3
|
+
Version: 1.0.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
|
@@ -1,4 +1,4 @@
|
|
1
|
-
KekikStream/__init__.py,sha256=
|
1
|
+
KekikStream/__init__.py,sha256=_mhsXdPnXnDu4AjIiwxoz6qjr4PP1qKOKpU__Gi1flg,14676
|
2
2
|
KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
|
3
3
|
KekikStream/requirements.txt,sha256=QWCXrrmKodIm7mGtIz9cWr9sks-lmL_TilKMrruWJn0,77
|
4
4
|
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
@@ -8,7 +8,7 @@ KekikStream/Core/Extractor/ExtractorBase.py,sha256=ZyasO5m7iAsnh-mwhtlp-VXkZ4pIu
|
|
8
8
|
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=ecrfz9mYizlENCjbyfjdfnOrQorxQTF4ZFGhPpU6JHk,4193
|
9
9
|
KekikStream/Core/Extractor/ExtractorManager.py,sha256=4L1H3jiTnf0kTq4W6uS7n95bBYHlKJ8_hh0og8z4erQ,1244
|
10
10
|
KekikStream/Core/Extractor/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSEtOPlc0,456
|
11
|
-
KekikStream/Core/Media/MediaHandler.py,sha256
|
11
|
+
KekikStream/Core/Media/MediaHandler.py,sha256=xq2Kwe7_2hyfS1EU17OvNKqcrKxHTTYW3L2aYxhYvvw,6319
|
12
12
|
KekikStream/Core/Media/MediaManager.py,sha256=9ItiUguOkk3wg3YY5uf3mrjfwLPCvggnP8QviX0uiuE,526
|
13
13
|
KekikStream/Core/Plugin/PluginBase.py,sha256=KuR89bkrChPAct4-PMjxbK4i6busXMMFeZjv-x4F1CQ,2521
|
14
14
|
KekikStream/Core/Plugin/PluginLoader.py,sha256=2UM3gNcEgd7k-FxG-JB5nTIS0K_clzvFtzGjMA_Sx7Q,3379
|
@@ -48,12 +48,12 @@ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=Fa0gRP_NoMfPC8HIKRxERjQVOv8Fyb-
|
|
48
48
|
KekikStream/Plugins/JetFilmizle.py,sha256=Gu4Ums-88x7jNKAtKkdSXyMaOyLv0_Kb6jnomhAWhM0,3916
|
49
49
|
KekikStream/Plugins/RecTV.py,sha256=7hxlt3Rvm1gV2lF6dFLOxiK_CjNng_7a02l0YkMuNZc,4886
|
50
50
|
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
51
|
-
KekikStream/Plugins/Shorten.py,sha256=
|
51
|
+
KekikStream/Plugins/Shorten.py,sha256=kDQGmj7qvfdDyDkU__QGjx-FoGSgCOPxcA3veM2BGPk,8858
|
52
52
|
KekikStream/Plugins/SineWix.py,sha256=WxlGoE8GMWr7S7Htu_Bh_OP4qIav1igHLJ3GWzP8ttQ,4859
|
53
53
|
KekikStream/Plugins/UgurFilm.py,sha256=yYXee5uxwNnPqFJZ6s6cRkmUyqS3Vv8x-iesPalc4j4,2930
|
54
|
-
KekikStream-0.
|
55
|
-
KekikStream-0.
|
56
|
-
KekikStream-0.
|
57
|
-
KekikStream-0.
|
58
|
-
KekikStream-0.
|
59
|
-
KekikStream-0.
|
54
|
+
KekikStream-1.0.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
55
|
+
KekikStream-1.0.0.dist-info/METADATA,sha256=A6Ujb9uRiGlLhTG9icGMhoG5Fx0b89g3W91wlOLjmBQ,4226
|
56
|
+
KekikStream-1.0.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
57
|
+
KekikStream-1.0.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
58
|
+
KekikStream-1.0.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
59
|
+
KekikStream-1.0.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|