KekikStream 2.0.5__tar.gz → 2.0.6__tar.gz
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-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/HDFilmCehennemi.py +82 -7
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/SetFilmIzle.py +17 -1
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-2.0.5 → kekikstream-2.0.6}/PKG-INFO +1 -1
- {kekikstream-2.0.5 → kekikstream-2.0.6}/setup.py +1 -1
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/DonilasPlay.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/FirePlayer.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/VCTPlay.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/YTDLP.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/BelgeselX.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/__init__.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/__main__.py +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream/requirements.txt +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/LICENSE +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/MANIFEST.in +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/README.md +0 -0
- {kekikstream-2.0.5 → kekikstream-2.0.6}/setup.cfg +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
from Kekik.Sifreleme import Packer, StreamDecoder
|
|
6
|
-
import random, string, re
|
|
6
|
+
import random, string, re, base64
|
|
7
7
|
|
|
8
8
|
class HDFilmCehennemi(PluginBase):
|
|
9
9
|
name = "HDFilmCehennemi"
|
|
@@ -146,17 +146,85 @@ class HDFilmCehennemi(PluginBase):
|
|
|
146
146
|
|
|
147
147
|
return results
|
|
148
148
|
|
|
149
|
+
def hdch_decode(self, value_parts: list[str]) -> str:
|
|
150
|
+
"""
|
|
151
|
+
HDFilmCehennemi için özel decoder.
|
|
152
|
+
JavaScript sırası: join -> reverse -> atob -> atob -> shift_back
|
|
153
|
+
"""
|
|
154
|
+
try:
|
|
155
|
+
# 1. Parçaları birleştir
|
|
156
|
+
joined = ''.join(value_parts)
|
|
157
|
+
|
|
158
|
+
# 2. Ters çevir (REV)
|
|
159
|
+
result = StreamDecoder._reverse(joined)
|
|
160
|
+
|
|
161
|
+
# 3. İlk base64 decode (B64D)
|
|
162
|
+
result = StreamDecoder._base64_decode(result)
|
|
163
|
+
if result is None:
|
|
164
|
+
return ""
|
|
165
|
+
|
|
166
|
+
# 4. İkinci base64 decode (B64D) - JavaScript'te iki kez atob yapılıyor!
|
|
167
|
+
result = StreamDecoder._base64_decode(result)
|
|
168
|
+
if result is None:
|
|
169
|
+
return ""
|
|
170
|
+
|
|
171
|
+
# 5. Shift back (SHF)
|
|
172
|
+
result = StreamDecoder._shift_back(result)
|
|
173
|
+
|
|
174
|
+
return result
|
|
175
|
+
except Exception:
|
|
176
|
+
return ""
|
|
177
|
+
|
|
178
|
+
def extract_hdch_url(self, unpacked: str) -> str:
|
|
179
|
+
"""HDFilmCehennemi unpacked script'ten video URL'sini çıkar"""
|
|
180
|
+
# 1) Decode fonksiyonunun adını bul: function <NAME>(value_parts)
|
|
181
|
+
match_fn = re.search(r'function\s+(\w+)\s*\(\s*value_parts\s*\)', unpacked)
|
|
182
|
+
if not match_fn:
|
|
183
|
+
return ""
|
|
184
|
+
|
|
185
|
+
fn_name = match_fn.group(1)
|
|
186
|
+
|
|
187
|
+
# 2) Bu fonksiyonun array ile çağrıldığı yeri bul: <NAME>([ ... ])
|
|
188
|
+
array_call_regex = re.compile(rf'{re.escape(fn_name)}\(\s*\[(.*?)\]\s*\)', re.DOTALL)
|
|
189
|
+
match_call = array_call_regex.search(unpacked)
|
|
190
|
+
if not match_call:
|
|
191
|
+
return ""
|
|
192
|
+
|
|
193
|
+
array_body = match_call.group(1)
|
|
194
|
+
|
|
195
|
+
# 3) Array içindeki string parçalarını topla
|
|
196
|
+
parts = re.findall(r'["\']([^"\']+)["\']', array_body)
|
|
197
|
+
if not parts:
|
|
198
|
+
return ""
|
|
199
|
+
|
|
200
|
+
# 4) Özel decoder ile çöz
|
|
201
|
+
return self.hdch_decode(parts)
|
|
202
|
+
|
|
149
203
|
async def invoke_local_source(self, iframe: str, source: str, url: str):
|
|
150
|
-
self.httpx.headers.update({
|
|
204
|
+
self.httpx.headers.update({
|
|
205
|
+
"Referer": f"{self.main_url}/",
|
|
206
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0"
|
|
207
|
+
})
|
|
151
208
|
istek = await self.httpx.get(iframe)
|
|
152
209
|
|
|
210
|
+
if not istek.text:
|
|
211
|
+
return await self.cehennempass(iframe.split("/")[-1])
|
|
212
|
+
|
|
213
|
+
# eval(function...) içeren packed script bul
|
|
214
|
+
eval_match = re.search(r'(eval\(function[\s\S]+)', istek.text)
|
|
215
|
+
if not eval_match:
|
|
216
|
+
return await self.cehennempass(iframe.split("/")[-1])
|
|
217
|
+
|
|
153
218
|
try:
|
|
154
|
-
|
|
219
|
+
unpacked = Packer.unpack(eval_match.group(1))
|
|
155
220
|
except Exception:
|
|
156
221
|
return await self.cehennempass(iframe.split("/")[-1])
|
|
157
222
|
|
|
158
|
-
|
|
159
|
-
video_url =
|
|
223
|
+
# HDFilmCehennemi özel decoder ile video URL'sini çıkar
|
|
224
|
+
video_url = self.extract_hdch_url(unpacked)
|
|
225
|
+
|
|
226
|
+
if not video_url:
|
|
227
|
+
return await self.cehennempass(iframe.split("/")[-1])
|
|
160
228
|
|
|
161
229
|
subtitles = []
|
|
162
230
|
try:
|
|
@@ -200,8 +268,15 @@ class HDFilmCehennemi(PluginBase):
|
|
|
200
268
|
match = re.search(r'data-src=\\\"([^"]+)', api_get.text)
|
|
201
269
|
iframe = match[1].replace("\\", "") if match else None
|
|
202
270
|
|
|
203
|
-
if
|
|
204
|
-
|
|
271
|
+
if not iframe:
|
|
272
|
+
continue
|
|
273
|
+
|
|
274
|
+
# mobi URL'si varsa direkt kullan (query string'i kaldır)
|
|
275
|
+
if "mobi" in iframe:
|
|
276
|
+
iframe = iframe.split("?")[0] # rapidrame_id query param'ı kaldır
|
|
277
|
+
# mobi değilse ve rapidrame varsa rplayer kullan
|
|
278
|
+
elif "rapidrame" in iframe and "?rapidrame_id=" in iframe:
|
|
279
|
+
iframe = f"{self.main_url}/rplayer/{iframe.split('?rapidrame_id=')[1]}"
|
|
205
280
|
|
|
206
281
|
video_data_list = await self.invoke_local_source(iframe, source, url)
|
|
207
282
|
if not video_data_list:
|
|
@@ -199,6 +199,13 @@ class SetFilmIzle(PluginBase):
|
|
|
199
199
|
|
|
200
200
|
nonce = secici.css("div#playex::attr(data-nonce)").get() or ""
|
|
201
201
|
|
|
202
|
+
# partKey to dil label mapping
|
|
203
|
+
part_key_labels = {
|
|
204
|
+
"turkcedublaj" : "Türkçe Dublaj",
|
|
205
|
+
"turkcealtyazi" : "Türkçe Altyazı",
|
|
206
|
+
"orijinal" : "Orijinal"
|
|
207
|
+
}
|
|
208
|
+
|
|
202
209
|
links = []
|
|
203
210
|
for player in secici.css("nav.player a"):
|
|
204
211
|
source_id = player.css("::attr(data-post-id)").get()
|
|
@@ -233,10 +240,19 @@ class SetFilmIzle(PluginBase):
|
|
|
233
240
|
if "setplay" not in iframe_url and part_key:
|
|
234
241
|
iframe_url = f"{iframe_url}?partKey={part_key}"
|
|
235
242
|
|
|
243
|
+
# Dil etiketi oluştur
|
|
244
|
+
label = part_key_labels.get(part_key, "")
|
|
245
|
+
if not label and part_key:
|
|
246
|
+
label = part_key.replace("_", " ").title()
|
|
247
|
+
|
|
236
248
|
extractor = self.ex_manager.find_extractor(iframe_url)
|
|
249
|
+
name = extractor.name if extractor else player_name or "Direct Link"
|
|
250
|
+
if label:
|
|
251
|
+
name = f"{name} | {label}"
|
|
252
|
+
|
|
237
253
|
links.append({
|
|
238
254
|
"url" : iframe_url,
|
|
239
|
-
"name" :
|
|
255
|
+
"name" : name,
|
|
240
256
|
"referer" : self.main_url
|
|
241
257
|
})
|
|
242
258
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.6
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.6
|
|
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
|
|
@@ -6,7 +6,7 @@ from io import open
|
|
|
6
6
|
setup(
|
|
7
7
|
# ? Genel Bilgiler
|
|
8
8
|
name = "KekikStream",
|
|
9
|
-
version = "2.0.
|
|
9
|
+
version = "2.0.6",
|
|
10
10
|
url = "https://github.com/keyiflerolsun/KekikStream",
|
|
11
11
|
description = "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ı",
|
|
12
12
|
keywords = ["KekikStream", "KekikAkademi", "keyiflerolsun"],
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|