KekikStream 2.5.6__tar.gz → 2.5.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 (108) hide show
  1. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/HotStream.py +7 -2
  2. kekikstream-2.5.8/KekikStream/Extractors/LuciferPlays.py +65 -0
  3. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/FilmciBaba.py +3 -3
  4. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/JetFilmizle.py +1 -1
  5. kekikstream-2.5.8/KekikStream/Plugins/RealFilmIzle.py +94 -0
  6. kekikstream-2.5.8/KekikStream/Plugins/SuperFilmIzle.py +178 -0
  7. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/UgurFilm.py +1 -1
  8. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream.egg-info/PKG-INFO +1 -1
  9. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream.egg-info/SOURCES.txt +3 -1
  10. {kekikstream-2.5.6 → kekikstream-2.5.8}/PKG-INFO +1 -1
  11. {kekikstream-2.5.6 → kekikstream-2.5.8}/setup.py +1 -1
  12. kekikstream-2.5.6/KekikStream/Plugins/SuperFilmGeldi.py +0 -142
  13. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/CLI/__init__.py +0 -0
  14. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/CLI/pypi_kontrol.py +0 -0
  15. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  16. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  17. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  18. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  19. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  20. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/HTMLHelper.py +0 -0
  21. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Media/MediaHandler.py +0 -0
  22. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Media/MediaManager.py +0 -0
  23. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  24. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  25. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  26. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  27. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/UI/UIManager.py +0 -0
  28. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Core/__init__.py +0 -0
  29. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Abstream.py +0 -0
  30. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/CloseLoad.py +0 -0
  31. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/ContentX.py +0 -0
  32. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/DonilasPlay.py +0 -0
  33. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/DzenRu.py +0 -0
  34. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/ExPlay.py +0 -0
  35. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Filemoon.py +0 -0
  36. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/HDMomPlayer.py +0 -0
  37. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  38. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/JFVid.py +0 -0
  39. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/JetTv.py +0 -0
  40. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/JetV.py +0 -0
  41. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/MailRu.py +0 -0
  42. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/MixPlayHD.py +0 -0
  43. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/MixTiger.py +0 -0
  44. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/MolyStream.py +0 -0
  45. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  46. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  47. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/PixelDrain.py +0 -0
  48. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  49. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/RapidVid.py +0 -0
  50. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/SetPlay.py +0 -0
  51. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/SetPrime.py +0 -0
  52. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/SibNet.py +0 -0
  53. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  54. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/TRsTX.py +0 -0
  55. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/TauVideo.py +0 -0
  56. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/TurboImgz.py +0 -0
  57. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  58. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/VCTPlay.py +0 -0
  59. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Veev.py +0 -0
  60. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/VidBiz.py +0 -0
  61. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/VidHide.py +0 -0
  62. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/VidMoly.py +0 -0
  63. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/VidMoxy.py +0 -0
  64. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/VidPapi.py +0 -0
  65. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/VideoSeyred.py +0 -0
  66. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Videostr.py +0 -0
  67. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Vidoza.py +0 -0
  68. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Vtbe.py +0 -0
  69. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/YTDLP.py +0 -0
  70. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  71. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Extractors/Zeus.py +0 -0
  72. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/BelgeselX.py +0 -0
  73. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/DiziBox.py +0 -0
  74. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/DiziMom.py +0 -0
  75. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/DiziPal.py +0 -0
  76. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/DiziYou.py +0 -0
  77. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/Dizilla.py +0 -0
  78. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/FilmBip.py +0 -0
  79. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/FilmEkseni.py +0 -0
  80. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  81. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/FilmModu.py +0 -0
  82. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/Filmatek.py +0 -0
  83. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  84. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/HDFilm.py +0 -0
  85. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  86. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/KultFilmler.py +0 -0
  87. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/RecTV.py +0 -0
  88. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/RoketDizi.py +0 -0
  89. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/SelcukFlix.py +0 -0
  90. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/SetFilmIzle.py +0 -0
  91. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  92. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/SineWix.py +0 -0
  93. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/Sinefy.py +0 -0
  94. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/SinemaCX.py +0 -0
  95. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/Sinezy.py +0 -0
  96. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/Watch32.py +0 -0
  97. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/Plugins/YabanciDizi.py +0 -0
  98. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/__init__.py +0 -0
  99. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/__main__.py +0 -0
  100. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream/requirements.txt +0 -0
  101. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream.egg-info/dependency_links.txt +0 -0
  102. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream.egg-info/entry_points.txt +0 -0
  103. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream.egg-info/requires.txt +0 -0
  104. {kekikstream-2.5.6 → kekikstream-2.5.8}/KekikStream.egg-info/top_level.txt +0 -0
  105. {kekikstream-2.5.6 → kekikstream-2.5.8}/LICENSE +0 -0
  106. {kekikstream-2.5.6 → kekikstream-2.5.8}/MANIFEST.in +0 -0
  107. {kekikstream-2.5.6 → kekikstream-2.5.8}/README.md +0 -0
  108. {kekikstream-2.5.6 → kekikstream-2.5.8}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
4
- from Kekik.Sifreleme import AESManager
4
+ from Kekik.Sifreleme import AESManager
5
5
  import contextlib
6
6
 
7
7
  class HotStream(ExtractorBase):
@@ -24,4 +24,9 @@ class HotStream(ExtractorBase):
24
24
  if not m3u8_url:
25
25
  raise ValueError(f"HotStream: Video linki bulunamadı. {url}")
26
26
 
27
- return ExtractResult(name=self.name, url=self.fix_url(m3u8_url), referer=url)
27
+ return ExtractResult(
28
+ name = self.name,
29
+ url = self.fix_url(m3u8_url),
30
+ referer = url,
31
+ user_agent = self.httpx.headers.get("User-Agent")
32
+ )
@@ -0,0 +1,65 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle, HTMLHelper
4
+ from Kekik.Sifreleme import AESManager
5
+ import json, contextlib
6
+
7
+ class LuciferPlays(ExtractorBase):
8
+ name = "LuciferPlays"
9
+ main_url = "https://luciferplays.com"
10
+
11
+ async def extract(self, url: str, referer: str = None) -> ExtractResult:
12
+ # LuciferPlays genelde referer olarak kendi ana dizinini veya gömüldüğü sayfayı bekler
13
+ self.httpx.headers.update({"Referer": referer or url})
14
+
15
+ resp = await self.httpx.get(url)
16
+ sel = HTMLHelper(resp.text)
17
+
18
+ m3u8_url = None
19
+ subtitles = []
20
+
21
+ # 1. bePlayer (AES Decryption)
22
+ # patern: bePlayer('pass', '{"ct":"...", "iv":"...", "s":"..."}');
23
+ if match := sel.regex_first(r"bePlayer\('([^']+)',\s*'(\{[^}]+\})'\);", group=None):
24
+ pass_val, data_val = match
25
+ with contextlib.suppress(Exception):
26
+ decrypted = AESManager.decrypt(data_val, pass_val)
27
+
28
+ # Çözülen içerik genelde JSON formatındadır
29
+ try:
30
+ data = json.loads(decrypted)
31
+
32
+ # Video Lokasyonu (Donilas/HDMom Style)
33
+ m3u8_url = data.get("video_location")
34
+
35
+ # Altyazılar
36
+ for sub in data.get("strSubtitles", []):
37
+ sub_url = self.fix_url(sub.get("file"))
38
+ if sub_url and "Forced" not in sub.get("label", ""):
39
+ subtitles.append(Subtitle(
40
+ name = sub.get("label", "TR").upper(),
41
+ url = sub_url
42
+ ))
43
+
44
+ # Eğer video_location bulunamadıysa MixPlay style kontrol et
45
+ if not m3u8_url:
46
+ client_data = data.get("schedule", {}).get("client", "")
47
+ m3u8_url = HTMLHelper(client_data).regex_first(r'"video_location":"([^"]+)"')
48
+
49
+ except json.JSONDecodeError:
50
+ # JSON değilse düz metin içinde ara
51
+ m3u8_url = HTMLHelper(decrypted).regex_first(r'"video_location":"([^"]+)"')
52
+
53
+ # 2. Fallback (Düz JS içinde file ara)
54
+ if not m3u8_url:
55
+ m3u8_url = sel.regex_first(r'file\s*:\s*"([^"]+)"')
56
+
57
+ if not m3u8_url:
58
+ raise ValueError(f"LuciferPlays: Video linki bulunamadı. {url}")
59
+
60
+ return ExtractResult(
61
+ name = self.name,
62
+ url = self.fix_url(m3u8_url),
63
+ referer = url,
64
+ subtitles = subtitles
65
+ )
@@ -5,7 +5,7 @@ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
5
5
  class FilmciBaba(PluginBase):
6
6
  name = "FilmciBaba"
7
7
  language = "tr"
8
- main_url = "https://4kizle.live"
8
+ main_url = "https://izle.live"
9
9
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
10
10
  description = "Filmci Baba, film izleme sitesi 4k Full film izle, 1080p ve 4k kalite de sinema filmleri ve dizileri, tek parça hd kalitede türkçe dublajlı filmler seyret."
11
11
 
@@ -38,7 +38,7 @@ class FilmciBaba(PluginBase):
38
38
  istek = await self.httpx.get(f"{url}/{page}/")
39
39
  secici = HTMLHelper(istek.text)
40
40
 
41
- results = []
41
+ results = []
42
42
  for item in secici.select("div.movie-preview"):
43
43
  title_el = secici.select_first(".movie-title a", item)
44
44
  if not title_el:
@@ -67,7 +67,7 @@ class FilmciBaba(PluginBase):
67
67
  if not title_el:
68
68
  continue
69
69
 
70
- title = self.clean_title(title_el.text(strip=True))
70
+ title = self.clean_title(title_el.text(strip=True))
71
71
  href = self.fix_url(title_el.attrs.get("href"))
72
72
  poster = self.fix_url(secici.select_poster(".movie-poster img", item))
73
73
 
@@ -6,7 +6,7 @@ import asyncio
6
6
  class JetFilmizle(PluginBase):
7
7
  name = "JetFilmizle"
8
8
  language = "tr"
9
- main_url = "https://jetfilmizle.website"
9
+ main_url = "https://jetfilmizle.net"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
11
  description = "Film izle, Yerli, Yabancı film izle, Türkçe dublaj, alt yazılı seçenekleriyle ödül almış filmleri Full HD kalitesiyle ve jetfilmizle hızıyla donmadan ücretsizce izleyebilirsiniz."
12
12
 
@@ -0,0 +1,94 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
4
+
5
+ class RealFilmIzle(PluginBase):
6
+ name = "RealFilmIzle"
7
+ language = "tr"
8
+ main_url = "https://realfilmizle.com"
9
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
10
+ description = "realfilmizle.com, sinemayı seven kullanıcılar için hazırlanmış, zengin içerik yapısına sahip bir online film izleme sitesidir."
11
+
12
+ main_page = {
13
+ f"{main_url}/dizi/aile-filmleri/page" : "Aile",
14
+ f"{main_url}/dizi/aksiyon-filmleri/page" : "Aksiyon",
15
+ f"{main_url}/dizi/animasyon-filmleri/page" : "Animasyon",
16
+ f"{main_url}/dizi/anime-filmleri/page" : "Anime",
17
+ f"{main_url}/dizi/belgeseler-filmleri/page" : "Belgeseler",
18
+ f"{main_url}/dizi/bilim-kurgu-filmleri/page" : "Bilim-Kurgu",
19
+ f"{main_url}/dizi/biyografi-filmleri/page" : "Biyoğrafi",
20
+ f"{main_url}/dizi/dram-filmleri/page" : "Dram",
21
+ f"{main_url}/dizi/erotik-filmleri/page" : "Erotik",
22
+ f"{main_url}/dizi/fantastik-filmleri/page" : "Fantastik",
23
+ f"{main_url}/dizi/gerilim-filmleri/page" : "Gerilim",
24
+ f"{main_url}/dizi/gizem-filmleri/page" : "Gizem",
25
+ f"{main_url}/dizi/hint-filmleri/page" : "Hint",
26
+ f"{main_url}/dizi/komedi-filmleri/page" : "Komedi",
27
+ f"{main_url}/dizi/korku-filmleri/page" : "Korku",
28
+ f"{main_url}/dizi/macera-filmleri/page" : "Macera",
29
+ f"{main_url}/dizi/muzikal-filmleri/page" : "Müzikal",
30
+ f"{main_url}/dizi/netflix-filmleri/page" : "Netflix",
31
+ f"{main_url}/dizi/romantik-filmleri/page" : "Romantik",
32
+ f"{main_url}/dizi/savas-filmleri/page" : "Savaş",
33
+ f"{main_url}/dizi/spor-filmleri/page" : "Spor",
34
+ f"{main_url}/dizi/suc-filmleri/page" : "Suç",
35
+ f"{main_url}/dizi/tarihi-filmleri/page" : "Tarihi",
36
+ f"{main_url}/dizi/western-filmleri/page" : "Western",
37
+ f"{main_url}/dizi/yerli-filmleri/page" : "Yerli",
38
+ }
39
+
40
+ async def get_articles(self, secici: HTMLHelper) -> list[dict]:
41
+ articles = []
42
+ for veri in secici.select("article.movie-box"):
43
+ title = secici.select_text("div.name a", veri)
44
+ href = secici.select_attr("div.name a", "href", veri)
45
+ poster = secici.select_poster("img", veri)
46
+
47
+ articles.append({
48
+ "title" : self.clean_title(title),
49
+ "url" : self.fix_url(href),
50
+ "poster": self.fix_url(poster),
51
+ })
52
+
53
+ return articles
54
+
55
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
56
+ istek = await self.httpx.get(f"{url}/{page}")
57
+ secici = HTMLHelper(istek.text)
58
+ veriler = await self.get_articles(secici)
59
+
60
+ return [MainPageResult(**veri, category=category) for veri in veriler if veri]
61
+
62
+ async def search(self, query: str) -> list[SearchResult]:
63
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
64
+ secici = HTMLHelper(istek.text)
65
+ veriler = await self.get_articles(secici)
66
+
67
+ return [SearchResult(**veri) for veri in veriler if veri]
68
+
69
+ async def load_item(self, url: str) -> MovieInfo:
70
+ istek = await self.httpx.get(url)
71
+ secici = HTMLHelper(istek.text)
72
+
73
+ title = self.clean_title(secici.select_text("div.film h1"))
74
+ poster = secici.select_poster("div.poster img")
75
+ description = secici.select_direct_text("div.description")
76
+ tags = secici.select_texts("ol.scheme-breadcrumbs li a")
77
+ tags = [tag.replace("✅ ", "").replace(" Filmleri", "") for tag in tags if tag != "Film izle"]
78
+
79
+ return MovieInfo(
80
+ url = url,
81
+ poster = self.fix_url(poster),
82
+ title = self.clean_title(title),
83
+ description = description,
84
+ tags = tags
85
+ )
86
+
87
+ async def load_links(self, url: str) -> list[ExtractResult]:
88
+ istek = await self.httpx.get(url)
89
+ secici = HTMLHelper(istek.text)
90
+
91
+ iframe = secici.select_attr("div.video-content iframe", "src")
92
+ result = await self.extract(iframe)
93
+
94
+ return [result] if result else []
@@ -0,0 +1,178 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
4
+ import asyncio
5
+
6
+ class SuperFilmIzle(PluginBase):
7
+ name = "SuperFilmIzle"
8
+ language = "tr"
9
+ main_url = "https://superfilmizle.com"
10
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
+ description = "Superfilmizle ile HD Kalite film izle türkçe altyazılı olarak super kalitede donmadan izleyin."
12
+
13
+ main_page = {
14
+ f"{main_url}/category/aile-filmleri/page/" : "Aile Filmleri",
15
+ f"{main_url}/category/aksiyon-filmleri/page/" : "Aksiyon Filmleri",
16
+ f"{main_url}/category/animasyon-filmleri/page/" : "Animasyon Filmleri",
17
+ f"{main_url}/category/bilim-kurgu/page/" : "Bilim Kurgu",
18
+ f"{main_url}/category/biyografi-filmleri/page/" : "Biyografi Filmleri",
19
+ f"{main_url}/category/dram-filmleri/page/" : "Dram Filmleri",
20
+ f"{main_url}/category/editor-secim/page/" : "Editör Seçim",
21
+ f"{main_url}/category/erotik-film/page/" : "Erotik Film",
22
+ f"{main_url}/category/fantastik-filmler/page/" : "Fantastik Filmler",
23
+ f"{main_url}/category/gelecek-filmler/page/" : "Gelecek Filmler",
24
+ f"{main_url}/category/gerilim-filmleri/page/" : "Gerilim Filmleri",
25
+ f"{main_url}/category/hint-filmleri/page/" : "Hint Filmleri",
26
+ f"{main_url}/category/komedi-filmleri/page/" : "Komedi Filmleri",
27
+ f"{main_url}/category/kore-filmleri/page/" : "Kore Filmleri",
28
+ f"{main_url}/category/korku-filmleri/page/" : "Korku Filmleri",
29
+ f"{main_url}/category/macera-filmleri/page/" : "Macera Filmleri",
30
+ f"{main_url}/category/muzikal-filmler/page/" : "Müzikal Filmler",
31
+ f"{main_url}/category/romantik-filmler/page/" : "Romantik Filmler",
32
+ f"{main_url}/category/savas-filmleri/page/" : "Savaş Filmleri",
33
+ f"{main_url}/category/spor-filmleri/page/" : "Spor Filmleri",
34
+ f"{main_url}/category/suc-filmleri/page/" : "Suç Filmleri",
35
+ f"{main_url}/category/tarih-filmleri/page/" : "Tarih Filmleri",
36
+ f"{main_url}/category/western-filmleri/page/" : "Western Filmleri",
37
+ f"{main_url}/category/yerli-filmler/page/" : "Yerli Filmler",
38
+ f"{main_url}/category/yetiskin-filmleri/page/" : "Yetişkin Filmleri"
39
+ }
40
+
41
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
42
+ istek = await self.httpx.get(f"{url}{page}")
43
+ secici = HTMLHelper(istek.text)
44
+
45
+ results = []
46
+ for veri in secici.select("div.movie-box"):
47
+ title_text = secici.select_text("div.name a", veri)
48
+ if not title_text:
49
+ continue
50
+
51
+ href = secici.select_attr("div.name a", "href", veri)
52
+ poster = secici.select_poster("img", veri)
53
+
54
+ results.append(MainPageResult(
55
+ category = category,
56
+ title = self.clean_title(title_text),
57
+ url = self.fix_url(href),
58
+ poster = self.fix_url(poster),
59
+ ))
60
+
61
+ return results
62
+
63
+ async def search(self, query: str) -> list[SearchResult]:
64
+ istek = await self.httpx.get(f"{self.main_url}?s={query}")
65
+ secici = HTMLHelper(istek.text)
66
+
67
+ results = []
68
+ for veri in secici.select("div.movie-box"):
69
+ title_text = secici.select_text("div.name a", veri)
70
+ if not title_text:
71
+ continue
72
+
73
+ href = secici.select_attr("div.name a", "href", veri)
74
+ poster = secici.select_poster("img", veri)
75
+
76
+ results.append(SearchResult(
77
+ title = self.clean_title(title_text),
78
+ url = self.fix_url(href),
79
+ poster = self.fix_url(poster),
80
+ ))
81
+
82
+ return results
83
+
84
+ async def load_item(self, url: str) -> MovieInfo:
85
+ istek = await self.httpx.get(url)
86
+ secici = HTMLHelper(istek.text)
87
+
88
+ title = self.clean_title(secici.select_text("div.film h1"))
89
+ poster = secici.select_poster("div.poster img")
90
+ year = secici.extract_year("div.release a")
91
+ description = secici.select_direct_text("div.description")
92
+ tags = secici.select_texts("ul.post-categories li a")
93
+ rating = secici.select_text("div.imdb-count")
94
+ rating = rating.replace("IMDB Puanı", "") if rating else None
95
+ actors = secici.select_texts("div.actors a") or secici.select_texts("div.cast a")
96
+
97
+ return MovieInfo(
98
+ url = url,
99
+ poster = self.fix_url(poster),
100
+ title = title,
101
+ description = description,
102
+ tags = tags,
103
+ rating = rating,
104
+ year = year,
105
+ actors = actors
106
+ )
107
+
108
+ async def load_links(self, url: str) -> list[ExtractResult]:
109
+ istek = await self.httpx.get(url)
110
+ main_text = istek.text
111
+ secici = HTMLHelper(main_text)
112
+
113
+ # 1. Alternatifleri / Parçaları Belirle
114
+ # (url, name, needs_fetch)
115
+ sources = []
116
+
117
+ # Keremiya / Movifox Alternatif Yapısı (li.part)
118
+ part_items = secici.select("div#action-parts li.part")
119
+ if part_items:
120
+ for li in part_items:
121
+ name = secici.select_text("div.part-name", li) or "Alternatif"
122
+
123
+ # Aktif olan parça (Mevcut sayfada)
124
+ if "active" in li.attrs.get("class", []):
125
+ sources.append((None, name, False))
126
+
127
+ # Pasif olanlar (Link verilmişse)
128
+ elif a_tag := secici.select_first("a.post-page-numbers", li):
129
+ href = a_tag.attrs.get("href")
130
+ if href:
131
+ sources.append((self.fix_url(href), name, True))
132
+ else:
133
+ # Alternatif menüsü yoksa tek parça olarak işle
134
+ sources.append((None, "", False))
135
+
136
+ # 2. İşleme Görevlerini Hazırla
137
+ extract_tasks = []
138
+
139
+ async def process_task(source_data):
140
+ src_url, src_name, needs_fetch = source_data
141
+
142
+ # Iframe'i bulacağımız HTML kaynağını belirle
143
+ html_to_parse = main_text
144
+ if needs_fetch:
145
+ try:
146
+ resp = await self.httpx.get(src_url)
147
+ html_to_parse = resp.text
148
+ except:
149
+ return []
150
+
151
+ # HTML içindeki iframeleri topla
152
+ temp_secici = HTMLHelper(html_to_parse)
153
+ iframes = []
154
+ for ifr in temp_secici.select("div.video-content iframe"):
155
+ if src := ifr.attrs.get("src") or ifr.attrs.get("data-src"):
156
+ iframes.append(self.fix_url(src))
157
+
158
+ # Bulunan iframeleri extract et (prefix olarak parça adını ekle)
159
+ results = []
160
+ for ifr_url in iframes:
161
+ if extracted := await self.extract(ifr_url, prefix=src_name or None):
162
+ if isinstance(extracted, list):
163
+ results.extend(extracted)
164
+ else:
165
+ results.append(extracted)
166
+ return results
167
+
168
+ for src in sources:
169
+ extract_tasks.append(process_task(src))
170
+
171
+ # 3. Tüm Görevleri Paralel Çalıştır ve Sonuçları Topla
172
+ results_groups = await asyncio.gather(*extract_tasks)
173
+
174
+ final_results = []
175
+ for group in results_groups:
176
+ final_results.extend(group)
177
+
178
+ return final_results
@@ -40,7 +40,7 @@ class UgurFilm(PluginBase):
40
40
  results.append(MainPageResult(
41
41
  category = category,
42
42
  title = title,
43
- url = self.fix_url(href) if href else "",
43
+ url = self.fix_url(href),
44
44
  poster = self.fix_url(poster),
45
45
  ))
46
46
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.5.6
3
+ Version: 2.5.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
@@ -40,6 +40,7 @@ KekikStream/Extractors/HotStream.py
40
40
  KekikStream/Extractors/JFVid.py
41
41
  KekikStream/Extractors/JetTv.py
42
42
  KekikStream/Extractors/JetV.py
43
+ KekikStream/Extractors/LuciferPlays.py
43
44
  KekikStream/Extractors/MailRu.py
44
45
  KekikStream/Extractors/MixPlayHD.py
45
46
  KekikStream/Extractors/MixTiger.py
@@ -88,6 +89,7 @@ KekikStream/Plugins/HDFilm.py
88
89
  KekikStream/Plugins/HDFilmCehennemi.py
89
90
  KekikStream/Plugins/JetFilmizle.py
90
91
  KekikStream/Plugins/KultFilmler.py
92
+ KekikStream/Plugins/RealFilmIzle.py
91
93
  KekikStream/Plugins/RecTV.py
92
94
  KekikStream/Plugins/RoketDizi.py
93
95
  KekikStream/Plugins/SelcukFlix.py
@@ -97,7 +99,7 @@ KekikStream/Plugins/SineWix.py
97
99
  KekikStream/Plugins/Sinefy.py
98
100
  KekikStream/Plugins/SinemaCX.py
99
101
  KekikStream/Plugins/Sinezy.py
100
- KekikStream/Plugins/SuperFilmGeldi.py
102
+ KekikStream/Plugins/SuperFilmIzle.py
101
103
  KekikStream/Plugins/UgurFilm.py
102
104
  KekikStream/Plugins/Watch32.py
103
105
  KekikStream/Plugins/YabanciDizi.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.5.6
3
+ Version: 2.5.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.5.6",
9
+ version = "2.5.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,142 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
4
-
5
- class SuperFilmGeldi(PluginBase):
6
- name = "SuperFilmGeldi"
7
- language = "tr"
8
- main_url = "https://www.superfilmgeldi13.art"
9
- favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
10
- description = "Hd film izliyerek arkadaşlarınızla ve sevdiklerinizle iyi bir vakit geçirmek istiyorsanız açın bir film eğlenmeye bakın. Bilim kurgu filmleri, aşk drama vahşet aşk romantik sıradışı korku filmlerini izle."
11
-
12
- main_page = {
13
- f"{main_url}/page/SAYFA" : "Son Eklenenler",
14
- f"{main_url}/hdizle/category/aksiyon/page/SAYFA" : "Aksiyon",
15
- f"{main_url}/hdizle/category/animasyon/page/SAYFA" : "Animasyon",
16
- f"{main_url}/hdizle/category/belgesel/page/SAYFA" : "Belgesel",
17
- f"{main_url}/hdizle/category/biyografi/page/SAYFA" : "Biyografi",
18
- f"{main_url}/hdizle/category/bilim-kurgu/page/SAYFA" : "Bilim Kurgu",
19
- f"{main_url}/hdizle/category/fantastik/page/SAYFA" : "Fantastik",
20
- f"{main_url}/hdizle/category/dram/page/SAYFA" : "Dram",
21
- f"{main_url}/hdizle/category/gerilim/page/SAYFA" : "Gerilim",
22
- f"{main_url}/hdizle/category/gizem/page/SAYFA" : "Gizem",
23
- f"{main_url}/hdizle/category/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
24
- f"{main_url}/hdizle/category/karete-filmleri/page/SAYFA" : "Karate Filmleri",
25
- f"{main_url}/hdizle/category/korku/page/SAYFA" : "Korku",
26
- f"{main_url}/hdizle/category/muzik/page/SAYFA" : "Müzik",
27
- f"{main_url}/hdizle/category/macera/page/SAYFA" : "Macera",
28
- f"{main_url}/hdizle/category/romantik/page/SAYFA" : "Romantik",
29
- f"{main_url}/hdizle/category/spor/page/SAYFA" : "Spor",
30
- f"{main_url}/hdizle/category/savas/page/SAYFA" : "Savaş",
31
- f"{main_url}/hdizle/category/suc/page/SAYFA" : "Suç",
32
- f"{main_url}/hdizle/category/western/page/SAYFA" : "Western",
33
- }
34
-
35
- async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
36
- istek = await self.httpx.get(url.replace("SAYFA", str(page)))
37
- secici = HTMLHelper(istek.text)
38
-
39
- results = []
40
- for veri in secici.select("div.movie-preview-content"):
41
- title_text = secici.select_text("span.movie-title a", veri)
42
- if not title_text:
43
- continue
44
-
45
- href = secici.select_attr("span.movie-title a", "href", veri)
46
- poster = secici.select_attr("img", "src", veri)
47
-
48
- results.append(MainPageResult(
49
- category = category,
50
- title = self.clean_title(title_text.split(" izle")[0]),
51
- url = self.fix_url(href) if href else "",
52
- poster = self.fix_url(poster),
53
- ))
54
-
55
- return results
56
-
57
- async def search(self, query: str) -> list[SearchResult]:
58
- istek = await self.httpx.get(f"{self.main_url}?s={query}")
59
- secici = HTMLHelper(istek.text)
60
-
61
- results = []
62
- for veri in secici.select("div.movie-preview-content"):
63
- title_text = secici.select_text("span.movie-title a", veri)
64
- if not title_text:
65
- continue
66
-
67
- href = secici.select_attr("span.movie-title a", "href", veri)
68
- poster = secici.select_attr("img", "src", veri)
69
-
70
- results.append(SearchResult(
71
- title = self.clean_title(title_text.split(" izle")[0]),
72
- url = self.fix_url(href) if href else "",
73
- poster = self.fix_url(poster),
74
- ))
75
-
76
- return results
77
-
78
- async def load_item(self, url: str) -> MovieInfo:
79
- istek = await self.httpx.get(url)
80
- secici = HTMLHelper(istek.text)
81
-
82
- title = self.clean_title(secici.select_text("div.title h1").split(" izle")[0]) if secici.select_text("div.title h1") else ""
83
- poster = secici.select_poster("div.poster img")
84
- year = secici.extract_year("div.release a")
85
- description = secici.select_text("div.excerpt p")
86
- tags = secici.select_texts("div.categories a")
87
- actors = secici.select_texts("div.actor a")
88
-
89
- return MovieInfo(
90
- url = url,
91
- poster = self.fix_url(poster),
92
- title = title,
93
- description = description,
94
- tags = tags,
95
- year = year,
96
- actors = actors
97
- )
98
-
99
- async def load_links(self, url: str) -> list[ExtractResult]:
100
- istek = await self.httpx.get(url)
101
- secici = HTMLHelper(istek.text)
102
-
103
- iframe = secici.select_attr("div#vast iframe", "src")
104
- iframe = self.fix_url(iframe) if iframe else None
105
-
106
- if not iframe:
107
- return []
108
-
109
- results = []
110
-
111
- # Mix player özel işleme
112
- if "mix" in iframe and "index.php?data=" in iframe:
113
- iframe_istek = await self.httpx.get(iframe, headers={"Referer": f"{self.main_url}/"})
114
- iframe_sec = HTMLHelper(iframe_istek.text)
115
- mix_point = iframe_sec.regex_first(r'videoUrl"\s*:\s*"(.*?)"\s*,\s*"videoServer')
116
-
117
- if mix_point:
118
- mix_point = mix_point.replace("\\", "")
119
-
120
- # Endpoint belirleme
121
- if "mixlion" in iframe:
122
- end_point = "?s=3&d="
123
- elif "mixeagle" in iframe:
124
- end_point = "?s=1&d="
125
- else:
126
- end_point = "?s=0&d="
127
-
128
- m3u_link = iframe.split("/player")[0] + mix_point + end_point
129
-
130
- results.append(ExtractResult(
131
- name = f"{self.name} | Mix Player",
132
- url = m3u_link,
133
- referer = iframe,
134
- subtitles = []
135
- ))
136
- else:
137
- # Extractor'a yönlendir
138
- data = await self.extract(iframe)
139
- if data:
140
- results.append(data)
141
-
142
- return results
File without changes
File without changes
File without changes
File without changes