KekikStream 0.9.3__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.
@@ -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)
@@ -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 = "http://localhost:8080"
68
+ main_url = "https://shorten.com"
69
69
  token = None
70
70
 
71
71
  async def __giris(self):
72
- await self.oturum.get("https://shorten.com/tr", follow_redirects=True)
72
+ await self.oturum.get(f"{self.main_url}/tr", follow_redirects=True)
73
73
 
74
- self.token = await self.oturum.get("https://shorten.com/api/session")
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"https://shorten.com/tr/series/{slug}", follow_redirects=True)
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" : "https://shorten.com/",
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"https://shorten.com/tr/series/{slug}/episode-{number}-{_hash}", follow_redirects=True)
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
 
@@ -188,7 +188,7 @@ class Shorten(PluginBase):
188
188
  self._data[ep_model.url] = {
189
189
  "ext_name" : self.name,
190
190
  "name" : f"{ep_model.title}",
191
- "referer" : "https://shorten.com/tr",
191
+ "referer" : f"{self.main_url}/tr",
192
192
  "subtitles" : []
193
193
  }
194
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
- # Yönetici sınıflarını başlat
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
- # Konsolu temizle ve başlık göster
20
- self.arayuz_yonetici.clear_console()
21
- konsol.rule("[bold cyan]KekikStream Başlatılıyor[/bold cyan]")
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
- # Sonuç bulunamadığında kullanıcıya seçenekler sun
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
- # Fuzzy ile eklenti seçimi yap
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
- # Seçilen eklentide arama yap
63
- self.arayuz_yonetici.clear_console()
64
- konsol.rule(f"[bold cyan]{self.suanki_eklenti.name} Eklentisinde Arama Yapın[/bold cyan]")
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
- if secilen_sonuc := await self.eklenti_sonuc_secimi(sonuclar):
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
- # Arama sonuçlarından birini seç
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
- # Tüm eklentilerde arama yap
86
- self.arayuz_yonetici.clear_console()
87
- konsol.rule("[bold cyan]Tüm Eklentilerde Arama Yapın[/bold cyan]")
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
- return await self.sonuc_detaylari_goster(secilen_sonuc)
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
- [{"plugin": eklenti_adi, "title": sonuc.title, "url": sonuc.url, "poster": sonuc.poster} for sonuc in sonuclar]
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
- # Tüm sonuçlardan birini seç
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
- # Medya bilgilerini yükle (3 deneme hakkı)
153
- medya_bilgi = None
154
- for _ in range(3):
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 başlığını ayarla ve bilgileri göster
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
- # Dizi ise bölüm seçimi yap
206
+ # Eğer medya bilgisi dizi ise bölüm seçimi yapılır
171
207
  if isinstance(medya_bilgi, SeriesInfo):
172
- secilen_bolum = await self.arayuz_yonetici.select_from_fuzzy(
173
- message = "İzlemek istediğiniz bölümü seçin:",
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
- secilen_link = await self.arayuz_yonetici.select_from_list(
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 medya_oynat(self, secilen_link):
238
- # Eklentinin kendi oynatıcısı varsa onu kullan
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
- return await self.suanki_eklenti.play(
242
- name = self.suanki_eklenti._data[secilen_link]["name"],
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 = self.suanki_eklenti._data[secilen_link]["referer"],
245
- subtitles = self.suanki_eklenti._data[secilen_link]["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.9.3
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=gK5pSk1olFmcdzOpqWM5-XuGE0WPTamqk39p_i0ZdQg,12494
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=-yVOnI5pNKWgvrRgJ8DVKjvTWuHTwUC7JSKlKa06lSw,6179
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=aS65Mfc4V7wezAYtO4ZwL6DOt66ra1wMO9Cpjji7tCQ,8880
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.9.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
55
- KekikStream-0.9.3.dist-info/METADATA,sha256=Mw1WBHesxtVOt70nl9pH8yjZBIscuBuiqsGUMB1Iyn8,4226
56
- KekikStream-0.9.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
57
- KekikStream-0.9.3.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
58
- KekikStream-0.9.3.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
59
- KekikStream-0.9.3.dist-info/RECORD,,
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,,