KekikStream 2.2.7__tar.gz → 2.2.8__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.
Files changed (89) hide show
  1. kekikstream-2.2.8/KekikStream/Extractors/CloseLoad.py +77 -0
  2. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/HDFilmCehennemi.py +31 -35
  3. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream.egg-info/PKG-INFO +1 -1
  4. {kekikstream-2.2.7 → kekikstream-2.2.8}/PKG-INFO +1 -1
  5. {kekikstream-2.2.7 → kekikstream-2.2.8}/setup.py +1 -1
  6. kekikstream-2.2.7/KekikStream/Extractors/CloseLoad.py +0 -40
  7. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/CLI/__init__.py +0 -0
  8. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/CLI/pypi_kontrol.py +0 -0
  9. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  10. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  11. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  12. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  13. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  14. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Media/MediaHandler.py +0 -0
  15. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Media/MediaManager.py +0 -0
  16. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  17. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  18. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  19. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  20. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/UI/UIManager.py +0 -0
  21. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Core/__init__.py +0 -0
  22. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/ContentX.py +0 -0
  23. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/DonilasPlay.py +0 -0
  24. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/DzenRu.py +0 -0
  25. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/ExPlay.py +0 -0
  26. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/Filemoon.py +0 -0
  27. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  28. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/JFVid.py +0 -0
  29. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/JetTv.py +0 -0
  30. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/MailRu.py +0 -0
  31. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/MixPlayHD.py +0 -0
  32. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/MixTiger.py +0 -0
  33. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/MolyStream.py +0 -0
  34. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  35. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  36. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/PixelDrain.py +0 -0
  37. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  38. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/RapidVid.py +0 -0
  39. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/SetPlay.py +0 -0
  40. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/SetPrime.py +0 -0
  41. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/SibNet.py +0 -0
  42. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  43. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/TRsTX.py +0 -0
  44. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/TauVideo.py +0 -0
  45. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/TurboImgz.py +0 -0
  46. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  47. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/VCTPlay.py +0 -0
  48. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/VidHide.py +0 -0
  49. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/VidMoly.py +0 -0
  50. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/VidMoxy.py +0 -0
  51. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/VidPapi.py +0 -0
  52. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/VideoSeyred.py +0 -0
  53. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/YTDLP.py +0 -0
  54. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  55. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/BelgeselX.py +0 -0
  56. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/DiziBox.py +0 -0
  57. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/DiziPal.py +0 -0
  58. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/DiziYou.py +0 -0
  59. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/Dizilla.py +0 -0
  60. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/FilmBip.py +0 -0
  61. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  62. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/FilmModu.py +0 -0
  63. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/FullHDFilm.py +0 -0
  64. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  65. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/JetFilmizle.py +0 -0
  66. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/KultFilmler.py +0 -0
  67. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/RecTV.py +0 -0
  68. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/RoketDizi.py +0 -0
  69. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/SelcukFlix.py +0 -0
  70. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/SetFilmIzle.py +0 -0
  71. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  72. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/SineWix.py +0 -0
  73. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/Sinefy.py +0 -0
  74. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/SinemaCX.py +0 -0
  75. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/Sinezy.py +0 -0
  76. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  77. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/Plugins/UgurFilm.py +0 -0
  78. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/__init__.py +0 -0
  79. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/__main__.py +0 -0
  80. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream/requirements.txt +0 -0
  81. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream.egg-info/SOURCES.txt +0 -0
  82. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream.egg-info/dependency_links.txt +0 -0
  83. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream.egg-info/entry_points.txt +0 -0
  84. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream.egg-info/requires.txt +0 -0
  85. {kekikstream-2.2.7 → kekikstream-2.2.8}/KekikStream.egg-info/top_level.txt +0 -0
  86. {kekikstream-2.2.7 → kekikstream-2.2.8}/LICENSE +0 -0
  87. {kekikstream-2.2.7 → kekikstream-2.2.8}/MANIFEST.in +0 -0
  88. {kekikstream-2.2.7 → kekikstream-2.2.8}/README.md +0 -0
  89. {kekikstream-2.2.7 → kekikstream-2.2.8}/setup.cfg +0 -0
@@ -0,0 +1,77 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
4
+ from Kekik.Sifreleme import Packer, StreamDecoder
5
+ from selectolax.parser import HTMLParser
6
+ import re, json
7
+
8
+ class CloseLoadExtractor(ExtractorBase):
9
+ name = "CloseLoad"
10
+ main_url = "https://closeload.filmmakinesi.to"
11
+
12
+ def _extract_from_json_ld(self, html: str) -> str | None:
13
+ """JSON-LD script tag'inden contentUrl'i çıkar (Kotlin versiyonundaki gibi)"""
14
+ secici = HTMLParser(html)
15
+ for script in secici.css("script[type='application/ld+json']"):
16
+ try:
17
+ data = json.loads(script.text(strip=True))
18
+ if content_url := data.get("contentUrl"):
19
+ if content_url.startswith("http"):
20
+ return content_url
21
+ except (json.JSONDecodeError, TypeError):
22
+ # Regex ile contentUrl'i çıkarmayı dene
23
+ match = re.search(r'"contentUrl"\s*:\s*"([^"]+)"', script.text())
24
+ if match and match.group(1).startswith("http"):
25
+ return match.group(1)
26
+ return None
27
+
28
+ def _extract_from_packed(self, html: str) -> str | None:
29
+ """Packed JavaScript'ten video URL'sini çıkar (fallback)"""
30
+ try:
31
+ eval_func = re.compile(r'\s*(eval\(function[\s\S].*)').findall(html)
32
+ if eval_func:
33
+ return StreamDecoder.extract_stream_url(Packer.unpack(eval_func[0]))
34
+ except Exception:
35
+ pass
36
+ return None
37
+
38
+ async def extract(self, url, referer=None) -> ExtractResult:
39
+ if referer:
40
+ self.httpx.headers.update({"Referer": referer})
41
+
42
+ self.httpx.headers.update({
43
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0",
44
+ "Origin": self.main_url
45
+ })
46
+
47
+ istek = await self.httpx.get(url)
48
+ istek.raise_for_status()
49
+
50
+ # Önce JSON-LD'den dene (daha güvenilir - Kotlin versiyonu gibi)
51
+ m3u_link = self._extract_from_json_ld(istek.text)
52
+
53
+ # Fallback: Packed JavaScript'ten çıkar
54
+ if not m3u_link:
55
+ m3u_link = self._extract_from_packed(istek.text)
56
+
57
+ if not m3u_link:
58
+ raise Exception("Video URL bulunamadı (ne JSON-LD ne de packed script'ten)")
59
+
60
+ # Subtitle'ları parse et (Kotlin referansı: track elementleri)
61
+ subtitles = []
62
+ secici = HTMLParser(istek.text)
63
+ for track in secici.css("track"):
64
+ raw_src = track.attrs.get("src") or ""
65
+ raw_src = raw_src.strip()
66
+ label = track.attrs.get("label") or track.attrs.get("srclang") or "Altyazı"
67
+
68
+ if raw_src:
69
+ full_url = raw_src if raw_src.startswith("http") else f"{self.main_url}{raw_src}"
70
+ subtitles.append(Subtitle(name=label, url=full_url))
71
+
72
+ return ExtractResult(
73
+ name = self.name,
74
+ url = m3u_link,
75
+ referer = self.main_url,
76
+ subtitles = subtitles
77
+ )
@@ -205,30 +205,23 @@ class HDFilmCehennemi(PluginBase):
205
205
 
206
206
  return results
207
207
 
208
- def extract_hdch_url(self, unpacked: str) -> str:
209
- """HDFilmCehennemi unpacked script'ten video URL'sini çıkar"""
210
- # 1) Decode fonksiyonunun adını bul: function <NAME>(value_parts)
211
- match_fn = re.search(r'function\s+(\w+)\s*\(\s*value_parts\s*\)', unpacked)
212
- if not match_fn:
213
- return ""
214
-
215
- fn_name = match_fn.group(1)
216
-
217
- # 2) Bu fonksiyonun array ile çağrıldığı yeri bul: <NAME>([ ... ])
218
- array_call_regex = re.compile(rf'{re.escape(fn_name)}\(\s*\[(.*?)\]\s*\)', re.DOTALL)
219
- match_call = array_call_regex.search(unpacked)
220
- if not match_call:
221
- return ""
222
-
223
- array_body = match_call.group(1)
224
-
225
- # 3) Array içindeki string parçalarını topla
226
- parts = re.findall(r'["\']([^"\']+)["\']', array_body)
227
- if not parts:
228
- return ""
229
-
230
- # 4) Özel decoder ile çöz
231
- return StreamDecoder.extract_stream_url(unpacked)
208
+ def _extract_from_json_ld(self, html: str) -> str | None:
209
+ """JSON-LD script tag'inden contentUrl'i çıkar (Kotlin versiyonundaki gibi)"""
210
+ # Önce JSON-LD'den dene
211
+ json_ld_match = re.search(r'<script[^>]+type=["\']application/ld\+json["\'][^>]*>(.*?)</script>', html, re.DOTALL)
212
+ if json_ld_match:
213
+ try:
214
+ import json
215
+ data = json.loads(json_ld_match.group(1).strip())
216
+ if content_url := data.get("contentUrl"):
217
+ if content_url.startswith("http"):
218
+ return content_url
219
+ except Exception:
220
+ # Regex ile contentUrl'i çıkarmayı dene
221
+ match = re.search(r'"contentUrl"\s*:\s*"([^"]+)"', html)
222
+ if match and match.group(1).startswith("http"):
223
+ return match.group(1)
224
+ return None
232
225
 
233
226
  async def invoke_local_source(self, iframe: str, source: str, url: str):
234
227
  self.httpx.headers.update({
@@ -240,18 +233,21 @@ class HDFilmCehennemi(PluginBase):
240
233
  if not istek.text:
241
234
  return await self.cehennempass(iframe.split("/")[-1])
242
235
 
243
- # eval(function...) içeren packed script bul
244
- eval_match = re.search(r'(eval\(function[\s\S]+)', istek.text)
245
- if not eval_match:
246
- return await self.cehennempass(iframe.split("/")[-1])
236
+ # Önce JSON-LD'den dene (Kotlin versiyonu gibi - daha güvenilir)
237
+ video_url = self._extract_from_json_ld(istek.text)
247
238
 
248
- try:
249
- unpacked = Packer.unpack(eval_match.group(1))
250
- except Exception:
251
- return await self.cehennempass(iframe.split("/")[-1])
252
-
253
- # HDFilmCehennemi özel decoder ile video URL'sini çıkar
254
- video_url = self.extract_hdch_url(unpacked)
239
+ # Fallback: Packed JavaScript'ten çıkar
240
+ if not video_url:
241
+ # eval(function...) içeren packed script bul
242
+ eval_match = re.search(r'(eval\(function[\s\S]+)', istek.text)
243
+ if not eval_match:
244
+ return await self.cehennempass(iframe.split("/")[-1])
245
+
246
+ try:
247
+ unpacked = Packer.unpack(eval_match.group(1))
248
+ video_url = StreamDecoder.extract_stream_url(unpacked)
249
+ except Exception:
250
+ return await self.cehennempass(iframe.split("/")[-1])
255
251
 
256
252
  if not video_url:
257
253
  return await self.cehennempass(iframe.split("/")[-1])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.2.7
3
+ Version: 2.2.8
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.2.7
3
+ Version: 2.2.8
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.2.7",
9
+ version = "2.2.8",
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"],
@@ -1,40 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
4
- from Kekik.Sifreleme import Packer, StreamDecoder
5
- from selectolax.parser import HTMLParser
6
- import re
7
-
8
- class CloseLoadExtractor(ExtractorBase):
9
- name = "CloseLoad"
10
- main_url = "https://closeload.filmmakinesi.to"
11
-
12
- async def extract(self, url, referer=None) -> ExtractResult:
13
- if referer:
14
- self.httpx.headers.update({"Referer": referer})
15
-
16
- istek = await self.httpx.get(url)
17
- istek.raise_for_status()
18
-
19
- # Video URL'sini çıkar
20
- eval_func = re.compile(r'\s*(eval\(function[\s\S].*)').findall(istek.text)[0]
21
- m3u_link = StreamDecoder.extract_stream_url(Packer.unpack(eval_func))
22
-
23
- # Subtitle'ları parse et (Kotlin referansı: track elementleri)
24
- subtitles = []
25
- secici = HTMLParser(istek.text)
26
- for track in secici.css("track"):
27
- raw_src = track.attrs.get("src") or ""
28
- raw_src = raw_src.strip()
29
- label = track.attrs.get("label") or track.attrs.get("srclang") or "Altyazı"
30
-
31
- if raw_src:
32
- full_url = raw_src if raw_src.startswith("http") else f"{self.main_url}{raw_src}"
33
- subtitles.append(Subtitle(name=label, url=full_url))
34
-
35
- return ExtractResult(
36
- name = self.name,
37
- url = m3u_link,
38
- referer = self.main_url,
39
- subtitles = subtitles
40
- )
File without changes
File without changes
File without changes
File without changes