KekikStream 2.3.9__py3-none-any.whl → 2.4.1__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.
@@ -0,0 +1,207 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, HTMLHelper
4
+ from json import dumps, loads
5
+ import re
6
+
7
+ class Watch32(PluginBase):
8
+ name = "Watch32"
9
+ language = "en"
10
+ main_url = "https://watch32.sx"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Watch Your Favorite Movies & TV Shows Online - Streaming For Free. With Movies & TV Shows Full HD. Find Your Movies & Watch NOW!"
13
+
14
+ main_page = {
15
+ # Main Categories
16
+ f"{main_url}/movie?page=" : "Popular Movies",
17
+ f"{main_url}/tv-show?page=" : "Popular TV Shows",
18
+ f"{main_url}/coming-soon?page=" : "Coming Soon",
19
+ f"{main_url}/top-imdb?page=" : "Top IMDB Rating",
20
+ # Genre Categories
21
+ f"{main_url}/genre/action?page=" : "Action",
22
+ f"{main_url}/genre/adventure?page=" : "Adventure",
23
+ f"{main_url}/genre/animation?page=" : "Animation",
24
+ f"{main_url}/genre/biography?page=" : "Biography",
25
+ f"{main_url}/genre/comedy?page=" : "Comedy",
26
+ f"{main_url}/genre/crime?page=" : "Crime",
27
+ f"{main_url}/genre/documentary?page=" : "Documentary",
28
+ f"{main_url}/genre/drama?page=" : "Drama",
29
+ f"{main_url}/genre/family?page=" : "Family",
30
+ f"{main_url}/genre/fantasy?page=" : "Fantasy",
31
+ f"{main_url}/genre/history?page=" : "History",
32
+ f"{main_url}/genre/horror?page=" : "Horror",
33
+ f"{main_url}/genre/music?page=" : "Music",
34
+ f"{main_url}/genre/mystery?page=" : "Mystery",
35
+ f"{main_url}/genre/romance?page=" : "Romance",
36
+ f"{main_url}/genre/science-fiction?page=" : "Science Fiction",
37
+ f"{main_url}/genre/thriller?page=" : "Thriller",
38
+ f"{main_url}/genre/war?page=" : "War",
39
+ f"{main_url}/genre/western?page=" : "Western",
40
+ }
41
+
42
+
43
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
44
+ istek = await self.httpx.get(f"{url}{page}")
45
+ helper = HTMLHelper(istek.text)
46
+ items = helper.select("div.flw-item")
47
+
48
+ return [
49
+ MainPageResult(
50
+ category = category,
51
+ title = helper.select_attr("h2.film-name a", "title", veri),
52
+ url = self.fix_url(helper.select_attr("h2.film-name a", "href", veri)),
53
+ poster = helper.select_attr("img.film-poster-img", "data-src", veri)
54
+ )
55
+ for veri in items
56
+ ]
57
+
58
+ async def search(self, query: str) -> list[SearchResult]:
59
+ slug = query.replace(" ", "-")
60
+ url = f"{self.main_url}/search/{slug}"
61
+
62
+ istek = await self.httpx.get(url)
63
+ helper = HTMLHelper(istek.text)
64
+ items = helper.select("div.flw-item")
65
+
66
+ return [
67
+ SearchResult(
68
+ title = helper.select_attr("h2.film-name a", "title", veri),
69
+ url = self.fix_url(helper.select_attr("h2.film-name a", "href", veri)),
70
+ poster = helper.select_attr("img.film-poster-img", "data-src", veri)
71
+ )
72
+ for veri in items
73
+ ]
74
+
75
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
76
+ istek = await self.httpx.get(url)
77
+ helper = HTMLHelper(istek.text)
78
+
79
+ content_id = helper.select_attr("div.detail_page-watch", "data-id")
80
+ details = helper.select_first("div.detail_page-infor")
81
+ name = helper.select_text("h2.heading-name > a", details)
82
+
83
+ poster = helper.select_attr("div.film-poster > img", "src", details)
84
+ description = helper.select_text("div.description", details)
85
+
86
+ # Release year extraction
87
+ year_text = helper.regex_first(r"Released:\s*(\d{4})")
88
+ if not year_text:
89
+ # Fallback for series
90
+ year_text = helper.regex_first(r"Released:.+?(\d{4})")
91
+
92
+ # Tags/Genres
93
+ tags = helper.select_all_text("div.row-line:has(> span.type > strong:contains(Genre)) a")
94
+
95
+ # Rating
96
+ rating = helper.select_text("button.btn-imdb")
97
+ if rating:
98
+ rating = rating.replace("N/A", "").split(":")[-1].strip()
99
+
100
+ # Actors
101
+ actors = helper.select_all_text("div.row-line:has(> span.type > strong:contains(Casts)) a")
102
+
103
+ if "movie" in url:
104
+ return MovieInfo(
105
+ url = url,
106
+ poster = self.fix_url(poster),
107
+ title = name,
108
+ description = description,
109
+ tags = tags,
110
+ rating = rating,
111
+ year = year_text,
112
+ actors = actors
113
+ )
114
+ else:
115
+ episodes = []
116
+ seasons_resp = await self.httpx.get(f"{self.main_url}/ajax/season/list/{content_id}")
117
+ sh = HTMLHelper(seasons_resp.text)
118
+ seasons = sh.select("a.dropdown-item") # Relaxed selector from a.ss-item
119
+
120
+ for season in seasons:
121
+ season_id = season.attrs.get("data-id")
122
+ season_num_text = season.text().replace("Season ", "").replace("Series", "").strip()
123
+ season_num = int(season_num_text) if season_num_text.isdigit() else 1
124
+
125
+ episodes_resp = await self.httpx.get(f"{self.main_url}/ajax/season/episodes/{season_id}")
126
+ eh = HTMLHelper(episodes_resp.text)
127
+ eps = eh.select("a.eps-item")
128
+
129
+ for ep in eps:
130
+ ep_id = ep.attrs.get("data-id")
131
+ ep_title_raw = ep.attrs.get("title", "")
132
+ # Eps 1: Name
133
+ m = re.search(r"Eps (\d+): (.+)", ep_title_raw)
134
+ if m:
135
+ ep_num = int(m.group(1))
136
+ ep_name = m.group(2)
137
+ else:
138
+ ep_num = 1
139
+ ep_name = ep_title_raw
140
+
141
+ episodes.append(Episode(
142
+ season = season_num,
143
+ episode = ep_num,
144
+ title = ep_name,
145
+ url = f"servers/{ep_id}"
146
+ ))
147
+
148
+ return SeriesInfo(
149
+ url = url,
150
+ poster = self.fix_url(poster),
151
+ title = name,
152
+ description = description,
153
+ tags = tags,
154
+ rating = rating,
155
+ year = year_text,
156
+ actors = actors,
157
+ episodes = episodes
158
+ )
159
+
160
+ async def load_links(self, url: str) -> list[ExtractResult]:
161
+ # url in load_links might be the full page URL for movies or "servers/epId" for episodes
162
+ if "servers/" in url:
163
+ data = url.split("/")[-1]
164
+ if "servers/" in url:
165
+ data = url.split("/")[-1]
166
+ servers_url = f"servers/{data}"
167
+ elif "list/" in url:
168
+ data = url.split("/")[-1]
169
+ servers_url = f"list/{data}"
170
+ else:
171
+ # Re-fetch page to get contentId only if we don't have list/ or servers/
172
+ istek = await self.httpx.get(url)
173
+ helper = HTMLHelper(istek.text)
174
+ content_id = helper.select_attr("div.detail_page-watch", "data-id")
175
+ if not content_id:
176
+ # Try to get id from url if direct parse fails, similar to Kotlin logic
177
+ # But Kotlin parses search first. Here we assume we are at the page.
178
+ # If no content_id found, maybe it's not a valid page or structure changed.
179
+ return []
180
+ servers_url = f"list/{content_id}"
181
+
182
+ servers_resp = await self.httpx.get(f"{self.main_url}/ajax/episode/{servers_url}")
183
+ sh = HTMLHelper(servers_resp.text)
184
+ servers = sh.select("a.link-item")
185
+
186
+ results = []
187
+ for server in servers:
188
+ link_id = server.attrs.get("data-linkid") or server.attrs.get("data-id")
189
+ source_resp = await self.httpx.get(f"{self.main_url}/ajax/episode/sources/{link_id}")
190
+ source_data = source_resp.json()
191
+ video_url = source_data.get("link")
192
+
193
+ if video_url:
194
+ # Use extractors if possible
195
+ extract_result = await self.extract(video_url)
196
+ if extract_result:
197
+ if isinstance(extract_result, list):
198
+ results.extend(extract_result)
199
+ else:
200
+ results.append(extract_result)
201
+ else:
202
+ results.append(ExtractResult(
203
+ url = video_url,
204
+ name = f"{self.name} | {server.text()}"
205
+ ))
206
+
207
+ return results
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.3.9
3
+ Version: 2.4.1
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
@@ -63,13 +63,13 @@ Terminal üzerinden içerik arayın, VLC/MPV ile doğrudan izleyin veya kendi AP
63
63
 
64
64
  ## 🚦 Ne Sunar?
65
65
 
66
- KekikStream, Türkçe medya kaynaklarını tek CLI arayüzünde toplayarak hızlı arama ve oynatma sunar. Plugin mimarisi sayesinde yeni kaynaklar eklemek ve [KekikStreamAPI](https://github.com/keyiflerolsun/KekikStreamAPI) ile web/API üzerinden yayın yapmak kolaydır.
66
+ KekikStream, Türkçe medya kaynaklarını tek CLI arayüzünde toplayarak hızlı arama ve oynatma sunar. Plugin mimarisi sayesinde yeni kaynaklar eklemek ve [WatchBuddy](https://github.com/WatchBuddy-tv/Stream) ile web/API üzerinden yayın yapmak kolaydır.
67
67
 
68
68
  - 🎥 Çoklu kaynak desteği: Onlarca Türkçe medya sitesi
69
69
  - 🔌 Plugin mimarisi: Yeni kaynak eklemek dakikalar sürer
70
70
  - 🎬 Çoklu oynatıcı: VLC, MPV, MX Player
71
71
  - 🖥️ CLI & kütüphane: Terminalde veya kod içinde kullanın
72
- - 🌐 API/Web UI: KekikStreamAPI üzerinden uzak erişim
72
+ - 🌐 API/Web UI: WatchBuddy üzerinden uzak erişim
73
73
 
74
74
  ---
75
75
 
@@ -3,7 +3,7 @@ KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
3
3
  KekikStream/requirements.txt,sha256=V-Rk-4DnK8B-HRR6RtSKmTR3sHfaYgOrnBj8kmVz17w,80
4
4
  KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
5
5
  KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElcii8,1487
6
- KekikStream/Core/HTMLHelper.py,sha256=0T0iEvxDvv26zKTnks319X_eTN2QNUJqysKlW0V4PCo,5401
6
+ KekikStream/Core/HTMLHelper.py,sha256=Rpj89vqL08ef_Q8bDUJuPQOBnSEQSOuFWWJJLli4oDQ,5434
7
7
  KekikStream/Core/__init__.py,sha256=sk2pWup1_jsGB43HJzbbqgQYFDZpf2TquEBYUhqOdN4,807
8
8
  KekikStream/Core/Extractor/ExtractorBase.py,sha256=CAdeel6zGlj_RHD0lwjyNW5hAaivo1XyAZbnmiVDaZo,2023
9
9
  KekikStream/Core/Extractor/ExtractorLoader.py,sha256=GPGCmgFpDBywR8CsNw43-ddseZhSKTjAUETp1Ohbi6E,4796
@@ -15,7 +15,7 @@ KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjY
15
15
  KekikStream/Core/Plugin/PluginBase.py,sha256=DMuYf6fRZeRJWYh3UdGcV1FpmDjUnjO1pgIBMRqHjiY,6638
16
16
  KekikStream/Core/Plugin/PluginLoader.py,sha256=6LE5id0571bB-gJZxaLfd973XcG6oaGeMhLVcYYY7kw,3768
17
17
  KekikStream/Core/Plugin/PluginManager.py,sha256=6a0Q2mHtzIpx1ttdSTsVHg2HfLJIO0r_iHjK3Kui1Rw,939
18
- KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P8S0tRNhS6E,2476
18
+ KekikStream/Core/Plugin/PluginModels.py,sha256=7g1uHjJstfnrdTabDgyrBnu1ojIQ025hsmw85cDXFS8,2353
19
19
  KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
20
20
  KekikStream/Extractors/CloseLoad.py,sha256=qRsiW5SloxWgm6MNUd4DF4vC7aSeyJqD3_0vZoFp7Jc,3176
21
21
  KekikStream/Extractors/ContentX.py,sha256=6-pzHBGrwJeGzeMaPZ5s82RCQZL9MEhHDyI3c4L-xMM,3975
@@ -23,7 +23,9 @@ KekikStream/Extractors/DonilasPlay.py,sha256=-Bhfpp0AN_wNYAnsaWdL--wo8DD2VPblTAl
23
23
  KekikStream/Extractors/DzenRu.py,sha256=WIUZUIixP4X6TweJHpY86fenRY150ucH2VNImvdxcRc,1213
24
24
  KekikStream/Extractors/ExPlay.py,sha256=G2ZmXGcsjpZ5ihtL0ZYkyVO8nPuzSC_8AR0zvED6ScQ,1746
25
25
  KekikStream/Extractors/Filemoon.py,sha256=Dls1Y0HhYX4j5zJm9RP-9XFq1pzJ4eadL5Cp0uES_qo,3365
26
+ KekikStream/Extractors/HDMomPlayer.py,sha256=5uP3L5iZ4jIf1I9QcT_cfTGs7qsHIMARDvkUPyc8uEk,2190
26
27
  KekikStream/Extractors/HDPlayerSystem.py,sha256=EgnFzx5Q4PkuwAtuff5SYU9k59B-CyOdySl7lbCZ9hM,1312
28
+ KekikStream/Extractors/HotStream.py,sha256=DO6RFfx2dycVIJ67GR7v9e1Skqz4MwKs49y-VxtiVic,1605
27
29
  KekikStream/Extractors/JFVid.py,sha256=_6A0zmYrWZxIfkCCKAaNxMRLjU-_0Z0hCxCNSApcknk,1350
28
30
  KekikStream/Extractors/JetTv.py,sha256=2X1vYDQ0hxBTcpnE_XTcbw9tMS1aXFURcobnPdN8Zxg,1596
29
31
  KekikStream/Extractors/MailRu.py,sha256=xQVCWwYqNoG5T43VAW1_m0v4e80FbO-1pNPKkwhTccU,1218
@@ -49,22 +51,28 @@ KekikStream/Extractors/VidMoly.py,sha256=4k5z68MrUASUuDMEWZ_Ynvp1Z7njjRcXPBZAnpb
49
51
  KekikStream/Extractors/VidMoxy.py,sha256=dM7yBfrXSESvYyqc2uP_gLSgV61gpIAY940NAQ58Mts,1843
50
52
  KekikStream/Extractors/VidPapi.py,sha256=9y8TN-o4C3JvRyr2V8Ox908tFE1I2BItQLHZlqs8AuI,3175
51
53
  KekikStream/Extractors/VideoSeyred.py,sha256=KJxbJkuupmn4wWBj_ejnoDvmjUXwEXkzStYha3EsSpA,1995
54
+ KekikStream/Extractors/Videostr.py,sha256=epoWgLta1TpewK4opDnBXHI8Nu4pDupb5ehsqCLf4h8,4523
55
+ KekikStream/Extractors/Vidoza.py,sha256=xr1A9C-YS9nQTaxquWYNUNU5MF2oBzELP7t06SyM67s,768
52
56
  KekikStream/Extractors/YTDLP.py,sha256=Hy8loCSFSquu2zaL3INord-Jm6T8CM6K2-VcDA2K79g,7390
53
57
  KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
54
58
  KekikStream/Plugins/BelgeselX.py,sha256=smoLjEJTdptjb7h4m6LhG7ZUmJQtIhYyi0CUFBsk970,8696
55
59
  KekikStream/Plugins/DiziBox.py,sha256=KZGWhs6p2-hUTsd-fjz2fsmGEkanL4At2PI8qHAoDm4,10541
60
+ KekikStream/Plugins/DiziMom.py,sha256=__z3lwk7hcTYa-JWmD1GLp0iGvNjTPTLJkpjAIXoZSE,10304
56
61
  KekikStream/Plugins/DiziPal.py,sha256=tHUqAN8UvvzBAkJaGS4hFvdLo-eRO4EdQ_C9HYkj_0U,10576
57
62
  KekikStream/Plugins/DiziYou.py,sha256=4KOvxHg-84mUHuHWsXoYlIG2SX4DCV2dm6GblHQ5wGo,11162
58
63
  KekikStream/Plugins/Dizilla.py,sha256=PLN0pOkWB4IaGC7Toe-8f5rksmaNm_WfdSFMTAtt--0,13624
59
64
  KekikStream/Plugins/FilmBip.py,sha256=40eSECwMHSKTWoUmF90UXxTJkbx6f71J_98Ht4Hnoj8,6352
65
+ KekikStream/Plugins/FilmEkseni.py,sha256=W4XvIUVNs98-JIfnt6KgYLrcJQ3_jLk9dYYX0CrqW0A,5808
60
66
  KekikStream/Plugins/FilmMakinesi.py,sha256=0bVN28aCEfrxrvXrGyL6XtgipzUKUD9vN2QkHie2gY0,7859
61
67
  KekikStream/Plugins/FilmModu.py,sha256=ou1BrFNR4RQaJdxVqPB5FI8vnQ0UmD-siVdwLnpp7x0,7147
68
+ KekikStream/Plugins/Filmatek.py,sha256=6Sf_2Lg6dARyQCZ75XYQz7DUBASeRfRhUqBG1fsXJaQ,7820
69
+ KekikStream/Plugins/Full4kizle.py,sha256=0R1ctX5W2UuLyMtjSNFL4AK-pblAAdZfBjj3uTzfGho,11101
62
70
  KekikStream/Plugins/FullHDFilm.py,sha256=08NF5qEydmxT0rGYDWpTOSIYSad8Uv1H1V8yCKG_568,10525
63
71
  KekikStream/Plugins/FullHDFilmizlesene.py,sha256=OpdndVQ7LjZ-sJdILGEqhYX-0D18yRqTS7Kpu-HrXmY,6870
64
72
  KekikStream/Plugins/HDFilmCehennemi.py,sha256=jntMKgE81k_jl3pFzJI3akqvi3g8U961dVx7bj5Pf2w,13140
65
73
  KekikStream/Plugins/JetFilmizle.py,sha256=9sH9Z3y4SP8vta9v-gJOQOxFWAQnbZomFea1_G5EbmM,8100
66
74
  KekikStream/Plugins/KultFilmler.py,sha256=rvIkd2OXRxuAXHMjiHCRmKrS5m09gy2JoMBgJh7ZIOk,9478
67
- KekikStream/Plugins/RecTV.py,sha256=p-RELvvD1-gyUgitwosYryH9gRWQTjmn1O9tw-0YInk,8295
75
+ KekikStream/Plugins/RecTV.py,sha256=a4VxEroCCH7LhTtEjrLAhrS2uLAKaX-JVBWZOK7ODi0,9102
68
76
  KekikStream/Plugins/RoketDizi.py,sha256=KiX7Xf5IyPPJ-CVcJLM9qc0M6Fi2dhg7zU3EgWkICXA,9318
69
77
  KekikStream/Plugins/SelcukFlix.py,sha256=nJ7I5e5vBkn9AbLC_2bSu9bSSgMQeDhCQZBZovK00bc,15299
70
78
  KekikStream/Plugins/SetFilmIzle.py,sha256=Z8A_Ivbe65i13RocGZXwmpwrVxNOwdj7Gh3CS2-Fslg,11437
@@ -75,10 +83,11 @@ KekikStream/Plugins/SinemaCX.py,sha256=11kzAZWgjkitIonDHHiFHMgnViBj-GjyvTXg7k28M
75
83
  KekikStream/Plugins/Sinezy.py,sha256=fUj-3WaJMEsKZRnDpHFPxl5Eq2RPLroY80DcftLqvjM,5743
76
84
  KekikStream/Plugins/SuperFilmGeldi.py,sha256=StW0ue4qDj8p7CiWy19Lfr2aWtfYvslPExZJuR-3xiY,6348
77
85
  KekikStream/Plugins/UgurFilm.py,sha256=H6AA2iTaM0fn6uN8_Dfvr-OqUtM9gDdkg0BKIcZEj7U,4930
86
+ KekikStream/Plugins/Watch32.py,sha256=FXP5TGpxrYJEKCIjqxJlaIjhXhoXml80l8fZp1ImgEw,9099
78
87
  KekikStream/Plugins/YabanciDizi.py,sha256=QXzifSl2JMcVOwkwn2vafYIw1jqB5vBTrf-usvsyMBc,11947
79
- kekikstream-2.3.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
80
- kekikstream-2.3.9.dist-info/METADATA,sha256=LKvCMIV2kTZZGvXSRknqX_-6WVKxTzqozCVlmGawYfU,10761
81
- kekikstream-2.3.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- kekikstream-2.3.9.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
83
- kekikstream-2.3.9.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
84
- kekikstream-2.3.9.dist-info/RECORD,,
88
+ kekikstream-2.4.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
89
+ kekikstream-2.4.1.dist-info/METADATA,sha256=ZwqprBr4eqAzxY5M86iCsjjw2vF869DulL6cGhi71ac,10745
90
+ kekikstream-2.4.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
91
+ kekikstream-2.4.1.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
92
+ kekikstream-2.4.1.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
93
+ kekikstream-2.4.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5