KekikStream 0.3.3__py3-none-any.whl → 0.3.5__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/pypi_kontrol.py +1 -0
- KekikStream/__init__.py +137 -149
- {KekikStream-0.3.3.dist-info → KekikStream-0.3.5.dist-info}/METADATA +1 -1
- {KekikStream-0.3.3.dist-info → KekikStream-0.3.5.dist-info}/RECORD +8 -8
- {KekikStream-0.3.3.dist-info → KekikStream-0.3.5.dist-info}/LICENSE +0 -0
- {KekikStream-0.3.3.dist-info → KekikStream-0.3.5.dist-info}/WHEEL +0 -0
- {KekikStream-0.3.3.dist-info → KekikStream-0.3.5.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.3.3.dist-info → KekikStream-0.3.5.dist-info}/top_level.txt +0 -0
KekikStream/CLI/pypi_kontrol.py
CHANGED
@@ -9,6 +9,7 @@ import sys
|
|
9
9
|
|
10
10
|
def pypi_kontrol_guncelle(paket_adi: str):
|
11
11
|
try:
|
12
|
+
konsol.print(f"[bold cyan] {paket_adi} Güncellemesi kontrol ediliyor...[/bold cyan]")
|
12
13
|
mevcut_surum = get_distribution(paket_adi).version
|
13
14
|
konsol.print(Panel(f"[cyan]Yüklü sürüm:[/cyan] [bold yellow]{mevcut_surum}[/bold yellow]"))
|
14
15
|
|
KekikStream/__init__.py
CHANGED
@@ -1,258 +1,246 @@
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
2
|
|
3
|
-
from .CLI import konsol, cikis_yap, hata_yakala
|
3
|
+
from .CLI import konsol, cikis_yap, hata_yakala, pypi_kontrol_guncelle
|
4
4
|
from .Managers import PluginManager, ExtractorManager, UIManager, MediaManager
|
5
5
|
from .Core import PluginBase, ExtractorBase, SeriesInfo
|
6
6
|
from asyncio import run
|
7
7
|
|
8
8
|
class KekikStream:
|
9
9
|
def __init__(self):
|
10
|
-
self.
|
11
|
-
self.
|
12
|
-
self.
|
13
|
-
self.
|
14
|
-
self.
|
15
|
-
|
16
|
-
async def
|
17
|
-
self.
|
10
|
+
self.eklentiler_yonetici = PluginManager()
|
11
|
+
self.cikaricilar_yonetici = ExtractorManager()
|
12
|
+
self.arayuz_yonetici = UIManager()
|
13
|
+
self.medya_yonetici = MediaManager()
|
14
|
+
self.suanki_eklenti: PluginBase = None
|
15
|
+
|
16
|
+
async def calistir(self):
|
17
|
+
self.arayuz_yonetici.clear_console()
|
18
18
|
konsol.rule("[bold cyan]KekikStream Başlatılıyor[/bold cyan]")
|
19
|
-
if not self.
|
19
|
+
if not self.eklentiler_yonetici.get_plugin_names():
|
20
20
|
konsol.print("[bold red]Hiçbir eklenti bulunamadı![/bold red]")
|
21
21
|
return
|
22
22
|
|
23
23
|
try:
|
24
|
-
await self.
|
24
|
+
await self.eklenti_sec()
|
25
25
|
finally:
|
26
|
-
await self.
|
26
|
+
await self.eklentiler_yonetici.close_plugins()
|
27
27
|
|
28
|
-
async def
|
29
|
-
|
28
|
+
async def hicbir_sonuc_bulunamazsa(self):
|
29
|
+
secim = await self.arayuz_yonetici.select_from_list(
|
30
30
|
message = "Ne yapmak istersiniz?",
|
31
|
-
choices = ["
|
31
|
+
choices = ["Tüm Eklentilerde Ara", "Ana Menü", "Çıkış"]
|
32
32
|
)
|
33
33
|
|
34
|
-
match
|
35
|
-
case "
|
36
|
-
await self.
|
34
|
+
match secim:
|
35
|
+
case "Tüm Eklentilerde Ara":
|
36
|
+
await self.tum_eklentilerde_ara()
|
37
37
|
case "Ana Menü":
|
38
|
-
await self.
|
38
|
+
await self.calistir()
|
39
39
|
case "Çıkış":
|
40
40
|
cikis_yap(False)
|
41
41
|
|
42
|
-
async def
|
43
|
-
|
42
|
+
async def eklenti_sec(self):
|
43
|
+
eklenti_adi = await self.arayuz_yonetici.select_from_fuzzy(
|
44
44
|
message = "Arama yapılacak eklentiyi seçin:",
|
45
|
-
choices = ["Tüm Eklentilerde Ara", *self.
|
45
|
+
choices = ["Tüm Eklentilerde Ara", *self.eklentiler_yonetici.get_plugin_names()]
|
46
46
|
)
|
47
47
|
|
48
|
-
if
|
49
|
-
await self.
|
48
|
+
if eklenti_adi == "Tüm Eklentilerde Ara":
|
49
|
+
await self.tum_eklentilerde_ara()
|
50
50
|
else:
|
51
|
-
self.
|
52
|
-
await self.
|
51
|
+
self.suanki_eklenti = self.eklentiler_yonetici.select_plugin(eklenti_adi)
|
52
|
+
await self.eklenti_ile_ara()
|
53
53
|
|
54
|
-
async def
|
55
|
-
self.
|
56
|
-
konsol.rule(f"[bold cyan]{self.
|
54
|
+
async def eklenti_ile_ara(self):
|
55
|
+
self.arayuz_yonetici.clear_console()
|
56
|
+
konsol.rule(f"[bold cyan]{self.suanki_eklenti.name} Eklentisinde Arama Yapın[/bold cyan]")
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
|
59
|
+
sonuclar = await self.suanki_eklenti.search(sorgu)
|
60
60
|
|
61
|
-
if not
|
61
|
+
if not sonuclar:
|
62
62
|
konsol.print("[bold red]Arama sonucu bulunamadı![/bold red]")
|
63
|
-
return await self.
|
63
|
+
return await self.hicbir_sonuc_bulunamazsa()
|
64
64
|
|
65
|
-
|
65
|
+
if secilen_sonuc:= await self.sonuc_sec(sonuclar) :
|
66
|
+
await self.detaylari_goster({"plugin": self.suanki_eklenti.name, "url": secilen_sonuc})
|
66
67
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
async def search_all(self):
|
71
|
-
self.ui_manager.clear_console()
|
68
|
+
async def tum_eklentilerde_ara(self):
|
69
|
+
self.arayuz_yonetici.clear_console()
|
72
70
|
konsol.rule("[bold cyan]Tüm Eklentilerde Arama Yapın[/bold cyan]")
|
73
71
|
|
74
|
-
|
75
|
-
|
72
|
+
sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
|
73
|
+
sonuclar = await self.tum_eklentilerde_arama(sorgu)
|
76
74
|
|
77
|
-
if not
|
78
|
-
return await self.
|
75
|
+
if not sonuclar:
|
76
|
+
return await self.hicbir_sonuc_bulunamazsa()
|
79
77
|
|
80
|
-
|
78
|
+
secilen_sonuc = await self.tum_sonuc_sec(sonuclar)
|
81
79
|
|
82
|
-
if
|
83
|
-
await self.
|
80
|
+
if secilen_sonuc:
|
81
|
+
await self.detaylari_goster(secilen_sonuc)
|
84
82
|
|
85
|
-
async def
|
86
|
-
|
87
|
-
message = "İçerik
|
88
|
-
choices = [{"name":
|
83
|
+
async def sonuc_sec(self, sonuclar):
|
84
|
+
return await self.arayuz_yonetici.select_from_fuzzy(
|
85
|
+
message = "İçerik sonuclarından birini seçin:",
|
86
|
+
choices = [{"name": sonuc.title, "value": sonuc.url} for sonuc in sonuclar]
|
89
87
|
)
|
90
88
|
|
91
|
-
|
92
|
-
return selected_url
|
93
|
-
|
94
|
-
async def show_details(self, selected_result):
|
89
|
+
async def detaylari_goster(self, secilen_sonuc):
|
95
90
|
try:
|
96
|
-
if isinstance(
|
97
|
-
|
98
|
-
url =
|
91
|
+
if isinstance(secilen_sonuc, dict) and "plugin" in secilen_sonuc:
|
92
|
+
eklenti_adi = secilen_sonuc["plugin"]
|
93
|
+
url = secilen_sonuc["url"]
|
99
94
|
|
100
|
-
self.
|
95
|
+
self.suanki_eklenti = self.eklentiler_yonetici.select_plugin(eklenti_adi)
|
101
96
|
else:
|
102
|
-
url =
|
97
|
+
url = secilen_sonuc
|
103
98
|
|
104
|
-
|
99
|
+
medya_bilgi = await self.suanki_eklenti.load_item(url)
|
105
100
|
except Exception as hata:
|
106
|
-
konsol.log(
|
101
|
+
konsol.log(secilen_sonuc)
|
107
102
|
hata_yakala(hata)
|
108
103
|
return
|
109
104
|
|
110
|
-
self.
|
105
|
+
self.medya_yonetici.set_title(f"{self.suanki_eklenti.name} | {medya_bilgi.title}")
|
106
|
+
self.arayuz_yonetici.display_media_info(f"{self.suanki_eklenti.name} | {medya_bilgi.title}", medya_bilgi)
|
111
107
|
|
112
|
-
|
113
|
-
|
114
|
-
if isinstance(media_info, SeriesInfo):
|
115
|
-
selected_episode = await self.ui_manager.select_from_fuzzy(
|
108
|
+
if isinstance(medya_bilgi, SeriesInfo):
|
109
|
+
secilen_bolum = await self.arayuz_yonetici.select_from_fuzzy(
|
116
110
|
message = "İzlemek istediğiniz bölümü seçin:",
|
117
111
|
choices = [
|
118
|
-
{"name": f"{
|
119
|
-
for
|
112
|
+
{"name": f"{bolum.season}. Sezon {bolum.episode}. Bölüm - {bolum.title}", "value": bolum.url}
|
113
|
+
for bolum in medya_bilgi.episodes
|
120
114
|
]
|
121
115
|
)
|
122
|
-
if
|
123
|
-
|
124
|
-
await self.
|
116
|
+
if secilen_bolum:
|
117
|
+
baglantilar = await self.suanki_eklenti.load_links(secilen_bolum)
|
118
|
+
await self.secenekleri_goster(baglantilar)
|
125
119
|
else:
|
126
|
-
|
127
|
-
await self.
|
120
|
+
baglantilar = await self.suanki_eklenti.load_links(medya_bilgi.url)
|
121
|
+
await self.secenekleri_goster(baglantilar)
|
128
122
|
|
129
|
-
async def
|
130
|
-
if not
|
123
|
+
async def secenekleri_goster(self, baglantilar):
|
124
|
+
if not baglantilar:
|
131
125
|
konsol.print("[bold red]Hiçbir bağlantı bulunamadı![/bold red]")
|
132
|
-
return await self.
|
126
|
+
return await self.hicbir_sonuc_bulunamazsa()
|
133
127
|
|
134
|
-
|
135
|
-
|
128
|
+
haritalama = self.cikaricilar_yonetici.map_links_to_extractors(baglantilar)
|
129
|
+
play_fonksiyonu_var = hasattr(self.suanki_eklenti, "play") and callable(getattr(self.suanki_eklenti, "play", None))
|
136
130
|
# ! DEBUG
|
137
|
-
# konsol.print(
|
138
|
-
if not
|
131
|
+
# konsol.print(baglantilar)
|
132
|
+
if not haritalama and not play_fonksiyonu_var:
|
139
133
|
konsol.print("[bold red]Hiçbir Extractor bulunamadı![/bold red]")
|
140
|
-
konsol.print(
|
141
|
-
return await self.
|
134
|
+
konsol.print(baglantilar)
|
135
|
+
return await self.hicbir_sonuc_bulunamazsa()
|
142
136
|
|
143
|
-
if not
|
144
|
-
|
137
|
+
if not haritalama:
|
138
|
+
secilen_link = await self.arayuz_yonetici.select_from_list(
|
145
139
|
message = "Doğrudan oynatmak için bir bağlantı seçin:",
|
146
|
-
choices = [{"name": self.
|
140
|
+
choices = [{"name": self.suanki_eklenti.name, "value": link} for link in baglantilar]
|
147
141
|
)
|
148
|
-
if
|
149
|
-
await self.
|
142
|
+
if secilen_link:
|
143
|
+
await self.medya_oynat(secilen_link)
|
150
144
|
return
|
151
145
|
|
152
|
-
|
146
|
+
secim = await self.arayuz_yonetici.select_from_list(
|
153
147
|
message = "Ne yapmak istersiniz?",
|
154
|
-
choices = ["İzle", "
|
148
|
+
choices = ["İzle", "Tüm Eklentilerde Ara", "Ana Menü"]
|
155
149
|
)
|
156
150
|
|
157
|
-
match
|
151
|
+
match secim:
|
158
152
|
case "İzle":
|
159
|
-
|
160
|
-
message = "İzlemek için bir bağlantı seçin:",
|
161
|
-
choices = [{"name":
|
153
|
+
secilen_link = await self.arayuz_yonetici.select_from_list(
|
154
|
+
message = "İzlemek için bir bağlantı seçin:",
|
155
|
+
choices = [{"name": cikarici_adi, "value": link} for link, cikarici_adi in haritalama.items()]
|
162
156
|
)
|
163
|
-
if
|
164
|
-
await self.
|
157
|
+
if secilen_link:
|
158
|
+
await self.medya_oynat(secilen_link)
|
165
159
|
|
166
|
-
case "
|
167
|
-
await self.
|
160
|
+
case "Tüm Eklentilerde Ara":
|
161
|
+
await self.tum_eklentilerde_ara()
|
168
162
|
|
169
163
|
case _:
|
170
|
-
await self.
|
171
|
-
|
172
|
-
async def
|
173
|
-
if hasattr(self.
|
174
|
-
konsol.log(f"[yellow][»] Oynatılıyor : {
|
175
|
-
await self.
|
176
|
-
name = self.
|
177
|
-
url =
|
178
|
-
referer = self.
|
179
|
-
subtitles = self.
|
164
|
+
await self.calistir()
|
165
|
+
|
166
|
+
async def medya_oynat(self, secilen_link):
|
167
|
+
if hasattr(self.suanki_eklenti, "play") and callable(self.suanki_eklenti.play):
|
168
|
+
konsol.log(f"[yellow][»] Oynatılıyor : {secilen_link}")
|
169
|
+
return await self.suanki_eklenti.play(
|
170
|
+
name = self.suanki_eklenti._data[secilen_link]["name"],
|
171
|
+
url = secilen_link,
|
172
|
+
referer = self.suanki_eklenti._data[secilen_link]["referer"],
|
173
|
+
subtitles = self.suanki_eklenti._data[secilen_link]["subtitles"]
|
180
174
|
)
|
181
|
-
return
|
182
175
|
|
183
|
-
|
184
|
-
if not
|
185
|
-
konsol.print("[bold red]Uygun Extractor bulunamadı.[/bold red]")
|
186
|
-
return
|
176
|
+
cikarici: ExtractorBase = self.cikaricilar_yonetici.find_extractor(secilen_link)
|
177
|
+
if not cikarici:
|
178
|
+
return konsol.print("[bold red]Uygun Extractor bulunamadı.[/bold red]")
|
187
179
|
|
188
180
|
try:
|
189
|
-
extract_data = await
|
181
|
+
extract_data = await cikarici.extract(secilen_link, referer=self.suanki_eklenti.main_url)
|
190
182
|
except Exception as hata:
|
191
|
-
konsol.print(f"[bold red]{
|
192
|
-
await self.
|
193
|
-
return
|
183
|
+
konsol.print(f"[bold red]{cikarici.name} » hata oluştu: {hata}[/bold red]")
|
184
|
+
return await self.hicbir_sonuc_bulunamazsa()
|
194
185
|
|
195
186
|
if isinstance(extract_data, list):
|
196
|
-
|
187
|
+
secilen_data = await self.arayuz_yonetici.select_from_list(
|
197
188
|
message = "Birden fazla bağlantı bulundu, lütfen birini seçin:",
|
198
189
|
choices = [{"name": data.name, "value": data} for data in extract_data]
|
199
190
|
)
|
200
191
|
else:
|
201
|
-
|
192
|
+
secilen_data = extract_data
|
202
193
|
|
203
|
-
if
|
204
|
-
self.
|
194
|
+
if secilen_data.headers.get("Cookie"):
|
195
|
+
self.medya_yonetici.set_headers({"Cookie": secilen_data.headers.get("Cookie")})
|
205
196
|
|
206
|
-
self.
|
207
|
-
self.
|
208
|
-
konsol.log(f"[yellow][»] Oynatılıyor : {
|
209
|
-
self.
|
197
|
+
self.medya_yonetici.set_title(f"{self.medya_yonetici.get_title()} | {secilen_data.name}")
|
198
|
+
self.medya_yonetici.set_headers({"Referer": secilen_data.referer})
|
199
|
+
konsol.log(f"[yellow][»] Oynatılıyor : {secilen_data.url}")
|
200
|
+
self.medya_yonetici.play_media(secilen_data)
|
210
201
|
|
211
|
-
async def
|
212
|
-
|
202
|
+
async def tum_eklentilerde_arama(self, sorgu: str):
|
203
|
+
tum_sonuclar = []
|
213
204
|
|
214
|
-
for
|
215
|
-
if not isinstance(
|
216
|
-
konsol.print(f"[yellow][!] {
|
205
|
+
for eklenti_adi, eklenti in self.eklentiler_yonetici.plugins.items():
|
206
|
+
if not isinstance(eklenti, PluginBase):
|
207
|
+
konsol.print(f"[yellow][!] {eklenti_adi} geçerli bir PluginBase değil, atlanıyor...[/yellow]")
|
217
208
|
continue
|
218
209
|
|
219
|
-
konsol.log(f"[yellow][~] {
|
210
|
+
konsol.log(f"[yellow][~] {eklenti_adi:<19} aranıyor...[/]")
|
220
211
|
try:
|
221
|
-
|
222
|
-
if
|
223
|
-
|
224
|
-
[{"plugin":
|
212
|
+
sonuclar = await eklenti.search(sorgu)
|
213
|
+
if sonuclar:
|
214
|
+
tum_sonuclar.extend(
|
215
|
+
[{"plugin": eklenti_adi, "title": sonuc.title, "url": sonuc.url, "poster": sonuc.poster} for sonuc in sonuclar]
|
225
216
|
)
|
226
217
|
except Exception as hata:
|
227
|
-
konsol.print(f"[bold red]{
|
218
|
+
konsol.print(f"[bold red]{eklenti_adi} » hata oluştu: {hata}[/bold red]")
|
228
219
|
|
229
|
-
if not
|
220
|
+
if not tum_sonuclar:
|
230
221
|
konsol.print("[bold red]Hiçbir sonuç bulunamadı![/bold red]")
|
231
|
-
await self.
|
222
|
+
await self.hicbir_sonuc_bulunamazsa()
|
232
223
|
return []
|
233
224
|
|
234
|
-
return
|
225
|
+
return tum_sonuclar
|
235
226
|
|
236
|
-
async def
|
237
|
-
|
238
|
-
{"name": f"{f'[{
|
239
|
-
for
|
227
|
+
async def tum_sonuc_sec(self, sonuclar):
|
228
|
+
secenekler = [
|
229
|
+
{"name": f"{f'[{sonuc["plugin"]}]':<21} » {sonuc['title']}", "value": sonuc}
|
230
|
+
for sonuc in sonuclar
|
240
231
|
]
|
241
232
|
|
242
|
-
return await self.
|
243
|
-
message = "Arama
|
244
|
-
choices =
|
233
|
+
return await self.arayuz_yonetici.select_from_fuzzy(
|
234
|
+
message = "Arama sonuclarından bir içerik seçin:",
|
235
|
+
choices = secenekler
|
245
236
|
)
|
246
237
|
|
247
|
-
from .CLI import pypi_kontrol_guncelle
|
248
|
-
|
249
238
|
def basla():
|
250
239
|
try:
|
251
|
-
konsol.print("[bold cyan]Güncelleme kontrol ediliyor...[/bold cyan]")
|
252
240
|
pypi_kontrol_guncelle("KekikStream")
|
253
241
|
|
254
242
|
app = KekikStream()
|
255
|
-
run(app.
|
243
|
+
run(app.calistir())
|
256
244
|
cikis_yap(False)
|
257
245
|
except KeyboardInterrupt:
|
258
246
|
cikis_yap(True)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.5
|
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,8 +1,8 @@
|
|
1
|
-
KekikStream/__init__.py,sha256=
|
1
|
+
KekikStream/__init__.py,sha256=rvxttmpyOKC4MSTv6n8ThVaVtl3XEKaJ4K_fVedWvEU,10453
|
2
2
|
KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
|
3
3
|
KekikStream/requirements.txt,sha256=gS_TUUQx5A7FUmRGxj2dQedxheD7qA6AswdUb2y_Ub8,70
|
4
4
|
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
5
|
-
KekikStream/CLI/pypi_kontrol.py,sha256=
|
5
|
+
KekikStream/CLI/pypi_kontrol.py,sha256=MchatOwCWCpFBtgt09yag9Rjal9XFyh2W_oVs2p7SNg,1518
|
6
6
|
KekikStream/Core/ExtractorBase.py,sha256=-3jadehq2wIa4jwwn38ojkGHay2qAYgweSYIBqVGwNU,1068
|
7
7
|
KekikStream/Core/ExtractorLoader.py,sha256=rrll3F2CyVmx3foa57PG0FocQMrFuMpdlG0Uf0-2Fz4,3915
|
8
8
|
KekikStream/Core/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSEtOPlc0,456
|
@@ -48,9 +48,9 @@ KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8o
|
|
48
48
|
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
49
49
|
KekikStream/Plugins/SineWix.py,sha256=ZtcIwPW0ONGkSjT7Ye8b71RWdHZMUZefX-JTWu6uGSs,4854
|
50
50
|
KekikStream/Plugins/UgurFilm.py,sha256=yYXee5uxwNnPqFJZ6s6cRkmUyqS3Vv8x-iesPalc4j4,2930
|
51
|
-
KekikStream-0.3.
|
52
|
-
KekikStream-0.3.
|
53
|
-
KekikStream-0.3.
|
54
|
-
KekikStream-0.3.
|
55
|
-
KekikStream-0.3.
|
56
|
-
KekikStream-0.3.
|
51
|
+
KekikStream-0.3.5.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
52
|
+
KekikStream-0.3.5.dist-info/METADATA,sha256=bX__FH-Oc-Jirv9-9Jkz3AtTJbV6JGXMsmMeQ6AeDNQ,3987
|
53
|
+
KekikStream-0.3.5.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
54
|
+
KekikStream-0.3.5.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
55
|
+
KekikStream-0.3.5.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
56
|
+
KekikStream-0.3.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|