KekikStream 2.4.0__tar.gz → 2.4.2__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 (99) hide show
  1. kekikstream-2.4.2/KekikStream/Extractors/HotStream.py +45 -0
  2. kekikstream-2.4.2/KekikStream/Extractors/Vidoza.py +25 -0
  3. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/DiziMom.py +9 -10
  4. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/DiziPal.py +1 -1
  5. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/Filmatek.py +19 -2
  6. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/Full4kizle.py +101 -17
  7. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/Sinezy.py +1 -1
  8. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/Watch32.py +26 -4
  9. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream.egg-info/PKG-INFO +1 -1
  10. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream.egg-info/SOURCES.txt +2 -0
  11. {kekikstream-2.4.0 → kekikstream-2.4.2}/PKG-INFO +1 -1
  12. {kekikstream-2.4.0 → kekikstream-2.4.2}/setup.py +1 -1
  13. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/CLI/__init__.py +0 -0
  14. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/CLI/pypi_kontrol.py +0 -0
  15. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  16. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  17. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  18. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  19. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  20. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/HTMLHelper.py +0 -0
  21. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Media/MediaHandler.py +0 -0
  22. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Media/MediaManager.py +0 -0
  23. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  24. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  25. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  26. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  27. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/UI/UIManager.py +0 -0
  28. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Core/__init__.py +0 -0
  29. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/CloseLoad.py +0 -0
  30. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/ContentX.py +0 -0
  31. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/DonilasPlay.py +0 -0
  32. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/DzenRu.py +0 -0
  33. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/ExPlay.py +0 -0
  34. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/Filemoon.py +0 -0
  35. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/HDMomPlayer.py +0 -0
  36. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  37. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/JFVid.py +0 -0
  38. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/JetTv.py +0 -0
  39. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/MailRu.py +0 -0
  40. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/MixPlayHD.py +0 -0
  41. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/MixTiger.py +0 -0
  42. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/MolyStream.py +0 -0
  43. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  44. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  45. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/PixelDrain.py +0 -0
  46. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  47. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/RapidVid.py +0 -0
  48. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/SetPlay.py +0 -0
  49. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/SetPrime.py +0 -0
  50. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/SibNet.py +0 -0
  51. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  52. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/TRsTX.py +0 -0
  53. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/TauVideo.py +0 -0
  54. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/TurboImgz.py +0 -0
  55. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  56. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/VCTPlay.py +0 -0
  57. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/VidHide.py +0 -0
  58. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/VidMoly.py +0 -0
  59. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/VidMoxy.py +0 -0
  60. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/VidPapi.py +0 -0
  61. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/VideoSeyred.py +0 -0
  62. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/Videostr.py +0 -0
  63. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/YTDLP.py +0 -0
  64. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  65. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/BelgeselX.py +0 -0
  66. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/DiziBox.py +0 -0
  67. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/DiziYou.py +0 -0
  68. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/Dizilla.py +0 -0
  69. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/FilmBip.py +0 -0
  70. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/FilmEkseni.py +0 -0
  71. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  72. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/FilmModu.py +0 -0
  73. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/FullHDFilm.py +0 -0
  74. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  75. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  76. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/JetFilmizle.py +0 -0
  77. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/KultFilmler.py +0 -0
  78. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/RecTV.py +0 -0
  79. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/RoketDizi.py +0 -0
  80. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/SelcukFlix.py +0 -0
  81. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/SetFilmIzle.py +0 -0
  82. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  83. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/SineWix.py +0 -0
  84. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/Sinefy.py +0 -0
  85. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/SinemaCX.py +0 -0
  86. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  87. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/UgurFilm.py +0 -0
  88. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/Plugins/YabanciDizi.py +0 -0
  89. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/__init__.py +0 -0
  90. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/__main__.py +0 -0
  91. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream/requirements.txt +0 -0
  92. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream.egg-info/dependency_links.txt +0 -0
  93. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream.egg-info/entry_points.txt +0 -0
  94. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream.egg-info/requires.txt +0 -0
  95. {kekikstream-2.4.0 → kekikstream-2.4.2}/KekikStream.egg-info/top_level.txt +0 -0
  96. {kekikstream-2.4.0 → kekikstream-2.4.2}/LICENSE +0 -0
  97. {kekikstream-2.4.0 → kekikstream-2.4.2}/MANIFEST.in +0 -0
  98. {kekikstream-2.4.0 → kekikstream-2.4.2}/README.md +0 -0
  99. {kekikstream-2.4.0 → kekikstream-2.4.2}/setup.cfg +0 -0
@@ -0,0 +1,45 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
4
+ from Kekik.Sifreleme import AESManager
5
+ import re
6
+ import json
7
+
8
+ class HotStream(ExtractorBase):
9
+ name = "HotStream"
10
+ main_url = "https://hotstream.club"
11
+
12
+ async def extract(self, url: str, referer: str = None) -> ExtractResult | None:
13
+ if referer:
14
+ self.httpx.headers.update({"Referer": referer})
15
+
16
+ istek = await self.httpx.get(url)
17
+ html = istek.text
18
+ helper = HTMLHelper(html)
19
+
20
+ m = re.search(r"bePlayer\('([^']+)',\s*'(\{[^']+\})'\)", html)
21
+ if not m:
22
+ # Try double quotes just in case
23
+ m = re.search(r'bePlayer\("([^"]+)",\s*"(\{[^"]+\})"\)', html)
24
+
25
+ if m:
26
+ pass_val = m.group(1)
27
+ data_val = m.group(2)
28
+
29
+ try:
30
+ decrypted = AESManager.decrypt(data_val, pass_val)
31
+ if decrypted:
32
+ decrypted = decrypted.replace("\\", "")
33
+ # Search for video_location in decrypted string
34
+ m_loc = re.search(r'"video_location":"([^"]+)"', decrypted)
35
+ if m_loc:
36
+ video_url = m_loc.group(1).replace(r"\/", "/")
37
+ return ExtractResult(
38
+ name = self.name,
39
+ url = video_url,
40
+ referer = url
41
+ )
42
+ except Exception:
43
+ pass
44
+
45
+ return None
@@ -0,0 +1,25 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
4
+
5
+ class Vidoza(ExtractorBase):
6
+ name = "Vidoza"
7
+ main_url = "https://vidoza.net"
8
+
9
+ async def extract(self, url: str, referer: str = None) -> ExtractResult | None:
10
+ if referer:
11
+ self.httpx.headers.update({"Referer": referer})
12
+
13
+ istek = await self.httpx.get(url)
14
+ helper = HTMLHelper(istek.text)
15
+
16
+ video_url = helper.select_attr("source", "src")
17
+
18
+ if video_url:
19
+ return ExtractResult(
20
+ name = self.name,
21
+ url = video_url,
22
+ referer = url
23
+ )
24
+
25
+ return None
@@ -77,15 +77,16 @@ class DiziMom(PluginBase):
77
77
  rating = None
78
78
  actors = None
79
79
 
80
- # Regex approach for specific fields might be safer/easier if structure varies
81
- # Matches: Yapım Yılı : </span> 2025
82
- year_val = helper.regex_first(r"Yapım Yılı\s*:\s*(?:</span>)?\s*(\d{4})")
83
- if year_val:
84
- year = int(year_val)
80
+ # Regex approach based on debug output (multiline support)
81
+ # Context: <span class="dizimeta"><i class="fas fa-globe"></i> Yapım Yılı : </span>\n 2022
82
+ year_val_all = helper.regex_all(r"Yapım Yılı\s*:\s*(?:</span>)?\s*(\d{4})", flags=re.DOTALL)
83
+ if year_val_all:
84
+ year = int(year_val_all[0])
85
85
 
86
- rating_val = helper.regex_first(r"IMDB\s*:\s*([\d\.]+)")
87
- if rating_val:
88
- rating = rating_val
86
+ # Context: <span class="dizimeta"><i class="fas fa-star"></i> IMDB : </span>\n 4.5
87
+ rating_val_all = helper.regex_all(r"IMDB\s*:\s*(?:</span>)?\s*([\d\.]+)", flags=re.DOTALL)
88
+ if rating_val_all:
89
+ rating = rating_val_all[0]
89
90
 
90
91
  actors_val = helper.regex_first(r"Oyuncular\s*:\s*(.+?)(?:</div>|<br|$)")
91
92
  if not actors_val:
@@ -127,8 +128,6 @@ class DiziMom(PluginBase):
127
128
 
128
129
  # Clean footer text start
129
130
  # The footer block usually starts with "Dizimom, dizi ve film..."
130
- # If we find "Dizimom," and it's not at the start (meaning it's part of the footer appended), split there.
131
- # Note: The description might legitimately start with "Dizimom," strictly speaking, but unlikely for a series description.
132
131
  if "Dizimom," in description_raw:
133
132
  description = description_raw.split("Dizimom,")[0].strip()
134
133
  elif "dizi izle film izle" in description_raw:
@@ -5,7 +5,7 @@ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInf
5
5
  class DiziPal(PluginBase):
6
6
  name = "DiziPal"
7
7
  language = "tr"
8
- main_url = "https://dizipal1225.com"
8
+ main_url = "https://dizipal1226.com"
9
9
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
10
10
  description = "dizipal güncel, dizipal yeni ve gerçek adresi. dizipal en yeni dizi ve filmleri güvenli ve hızlı şekilde sunar."
11
11
 
@@ -3,6 +3,7 @@
3
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, HTMLHelper
4
4
  import re
5
5
  from json import loads
6
+ from urllib.parse import unquote
6
7
 
7
8
  class Filmatek(PluginBase):
8
9
  name = "Filmatek"
@@ -97,8 +98,15 @@ class Filmatek(PluginBase):
97
98
  year_text = helper.select_text("span.date")
98
99
  year = year_text.strip()[-4:] if year_text else None
99
100
 
100
- score_text = helper.select_text("span.dt_rating_vmanual")
101
- rating = score_text.strip() if score_text else None
101
+ # Rating extraction updated
102
+ rating = helper.select_text("span.dt_rating_vgs") or helper.select_text("span.dt_rating_vmanual")
103
+
104
+ # Duration extraction
105
+ duration = None
106
+ duration_text = helper.select_text("span.runtime")
107
+ if duration_text:
108
+ # "80 Dak." -> "80"
109
+ duration = duration_text.split()[0]
102
110
 
103
111
  tags = helper.select_all_text("div.sgeneros a")
104
112
 
@@ -118,6 +126,7 @@ class Filmatek(PluginBase):
118
126
  poster = poster,
119
127
  year = year,
120
128
  rating = rating,
129
+ duration = duration,
121
130
  tags = tags,
122
131
  actors = actors
123
132
  )
@@ -169,6 +178,14 @@ class Filmatek(PluginBase):
169
178
 
170
179
  iframe_url = self.fix_url(iframe_url)
171
180
 
181
+ # Unwrap internal JWPlayer
182
+ if "jwplayer/?source=" in iframe_url:
183
+ try:
184
+ raw_source = iframe_url.split("source=")[1].split("&")[0]
185
+ iframe_url = unquote(raw_source)
186
+ except:
187
+ pass
188
+
172
189
  extracted = await self.extract(iframe_url)
173
190
  if extracted:
174
191
  if isinstance(extracted, list):
@@ -11,16 +11,31 @@ class Full4kizle(PluginBase):
11
11
  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."
12
12
 
13
13
  main_page = {
14
- f"{main_url}/Kategori/en-populer-filmler/page" : "En Popüler Filmler",
15
- f"{main_url}/Kategori/vizyondaki-filmler-izle/page" : "Vizyondaki Filmler",
16
- f"{main_url}/Kategori/yerli-filmler-izle/page" : "Yerli Filmler",
17
- f"{main_url}/Kategori/yabanci-diziler/page" : "Yabancı Diziler",
18
- f"{main_url}/Kategori/netflix-filmleri-izle/page" : "Netflix Filmleri",
19
- f"{main_url}/Kategori/netflix-dizileri/page" : "Netflix Dizileri",
20
- f"{main_url}/Kategori/anime-izle/page" : "Anime İzle",
21
- f"{main_url}/Kategori/cizgi-filmler/page" : "Çizgi Filmler",
14
+ f"{main_url}/Kategori/en-populer-filmler/page" : "En Popüler Filmler",
15
+ f"{main_url}/Kategori/tur/aksiyon-filmleri/page" : "Aksiyon",
16
+ f"{main_url}/Kategori/tur/macera-filmleri/page" : "Macera",
17
+ f"{main_url}/Kategori/tur/bilim-kurgu-filmleri/page" : "Bilim Kurgu",
18
+ f"{main_url}/Kategori/tur/fantastik-filmler/page" : "Fantastik",
19
+ f"{main_url}/Kategori/tur/korku-filmleri/page" : "Korku",
20
+ f"{main_url}/Kategori/tur/gerilim-filmleri-hd/page" : "Gerilim",
21
+ f"{main_url}/Kategori/tur/gizem-filmleri/page" : "Gizem",
22
+ f"{main_url}/Kategori/tur/dram-filmleri-hd/page" : "Dram",
23
+ f"{main_url}/Kategori/tur/komedi-filmleri-hd/page" : "Komedi",
24
+ f"{main_url}/Kategori/tur/romantik-filmler/page" : "Romantik",
25
+ f"{main_url}/Kategori/tur/aile-filmleri/page" : "Aile",
26
+ f"{main_url}/Kategori/tur/animasyon-filmleri/page" : "Animasyon",
27
+ f"{main_url}/Kategori/tur/biyografi-filmleri/page" : "Biyografi",
28
+ f"{main_url}/Kategori/tur/polisiye-suc-filmleri/page" : "Polisiye / Suç",
29
+ f"{main_url}/Kategori/tur/savas-filmleri/page" : "Savaş",
30
+ f"{main_url}/Kategori/tur/western-filmler/page" : "Western",
31
+ f"{main_url}/Kategori/tur/hint-filmleri/page" : "Hint Filmleri",
32
+ f"{main_url}/Kategori/tur/kore-filmleri/page" : "Kore Filmleri",
33
+ f"{main_url}/Kategori/tur/yerli-filmler-izle/page" : "Yerli Filmler",
34
+ f"{main_url}/Kategori/tur/yerli-diziler/page" : "Yerli Diziler",
35
+ f"{main_url}/Kategori/tur/18-erotik-filmler/page" : "+18 Erotik Filmler",
22
36
  }
23
37
 
38
+
24
39
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
25
40
  target_url = f"{url}/{page}/"
26
41
  istek = await self.httpx.get(target_url)
@@ -92,14 +107,81 @@ class Full4kizle(PluginBase):
92
107
 
93
108
  description = helper.select_text(".excerpt p")
94
109
 
95
- year_text = helper.select_text(".release a")
96
- year = year_text.strip() if year_text else None
110
+ # Robust metadata extraction using Regex
111
+
112
+ # Initialize year first
113
+ year = None
97
114
 
115
+ # Try .release first (legacy) or directly regex
116
+ rel_text = helper.select_text(".release")
117
+ if rel_text:
118
+ m_y = re.search(r"(\d{4})", rel_text)
119
+ if m_y: year = m_y.group(1)
120
+
121
+ # Year fallbacks
122
+ if not year:
123
+ # Try finding year in text like "Yapım: 2024" or just isolated year in release date
124
+ m_year = helper.regex_first(r"Yapım:\s*(\d{4})") or helper.regex_first(r"Yıl:\s*(\d{4})")
125
+ if m_year:
126
+ year = m_year
127
+
128
+ # Rating
98
129
  rating_text = helper.select_text(".imdb-rating")
99
- rating = None
100
130
  if rating_text:
101
- rating_text = rating_text.replace("IMDB Puanı", "").strip()
102
- rating = rating_text
131
+ rating = rating_text.replace("IMDB Puanı", "").strip()
132
+ else:
133
+ rating = helper.regex_first(r"IMDB\s*:\s*([\d\.]+)")
134
+
135
+ # Duration
136
+ duration = None
137
+ duration_val = helper.regex_first(r"Süre:\s*(\d+)")
138
+ if duration_val:
139
+ duration = int(duration_val)
140
+
141
+ # Actors - Extract from actor links
142
+ actors = None
143
+ actors_list = []
144
+
145
+ # Site uses: <a href=".../oyuncular/...">Actor Name</a>
146
+ actor_els = helper.select("a[href*='/oyuncular/']")
147
+ if actor_els:
148
+ actors_list = [el.text(strip=True) for el in actor_els if el.text(strip=True)]
149
+
150
+ # Fallback: Try .cast-list selector
151
+ if not actors_list:
152
+ actor_els = helper.select(".cast-list .actor-name, .cast-list a")
153
+ if actor_els:
154
+ actors_list = [el.text(strip=True) for el in actor_els if el.text(strip=True)]
155
+
156
+ if actors_list:
157
+ actors = ", ".join(actors_list)
158
+
159
+
160
+ # Tags (Genres) - Extract from genre links
161
+ tags = None
162
+ tags_list = []
163
+
164
+ # Site uses: <a href=".../tur/...">Genre Name</a> or <a href=".../Kategori/tur/...">
165
+ tag_els = helper.select("a[href*='/tur/'], a[href*='/Kategori/tur/']")
166
+ if tag_els:
167
+ tags_list = [el.text(strip=True) for el in tag_els if el.text(strip=True)]
168
+
169
+ # Fallback: Try .genres selector
170
+ if not tags_list:
171
+ tag_els = helper.select(".genres a, .genre a")
172
+ if tag_els:
173
+ tags_list = [el.text(strip=True) for el in tag_els if el.text(strip=True)]
174
+
175
+ # Remove duplicates while preserving order
176
+ if tags_list:
177
+ seen = set()
178
+ unique_tags = []
179
+ for tag in tags_list:
180
+ if tag not in seen:
181
+ seen.add(tag)
182
+ unique_tags.append(tag)
183
+ tags = unique_tags if unique_tags else None
184
+
103
185
 
104
186
  # Check for Episodes to decide if Series or Movie
105
187
  ep_elements = helper.select(".parts-middle a, .parts-middle .part.active")
@@ -113,8 +195,9 @@ class Full4kizle(PluginBase):
113
195
  poster = poster,
114
196
  year = year,
115
197
  rating = rating,
116
- tags = None, # Tags usually in genres list, implementation skipped for now or add if easy
117
- actors = None # Actors not extracted in Kotlin reference provided
198
+ duration = duration,
199
+ tags = tags,
200
+ actors = actors
118
201
  )
119
202
  else:
120
203
  # Series
@@ -155,8 +238,9 @@ class Full4kizle(PluginBase):
155
238
  poster = poster,
156
239
  year = year,
157
240
  rating = rating,
158
- tags = None,
159
- actors = None,
241
+ duration = duration,
242
+ tags = tags,
243
+ actors = actors,
160
244
  episodes = episodes
161
245
  )
162
246
 
@@ -6,7 +6,7 @@ import base64
6
6
  class Sinezy(PluginBase):
7
7
  name = "Sinezy"
8
8
  language = "tr"
9
- main_url = "https://sinezy.fit"
9
+ main_url = "https://sinezy.ink"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
11
  description = "Yerli ve yabancı film izle! Türkçe Dublaj ve Alt Yazılı Seçenekleriyle full hd film izlemek için En çok tercih edilen adres!"
12
12
 
@@ -12,12 +12,34 @@ class Watch32(PluginBase):
12
12
  description = "Watch Your Favorite Movies &amp; TV Shows Online - Streaming For Free. With Movies &amp; TV Shows Full HD. Find Your Movies &amp; Watch NOW!"
13
13
 
14
14
  main_page = {
15
- f"{main_url}/movie?page=" : "Popular Movies",
16
- f"{main_url}/tv-show?page=" : "Popular TV Shows",
17
- f"{main_url}/coming-soon?page=" : "Coming Soon",
18
- f"{main_url}/top-imdb?page=" : "Top IMDB Rating",
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",
19
40
  }
20
41
 
42
+
21
43
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
22
44
  istek = await self.httpx.get(f"{url}{page}")
23
45
  helper = HTMLHelper(istek.text)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.4.0
3
+ Version: 2.4.2
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
@@ -35,6 +35,7 @@ KekikStream/Extractors/ExPlay.py
35
35
  KekikStream/Extractors/Filemoon.py
36
36
  KekikStream/Extractors/HDMomPlayer.py
37
37
  KekikStream/Extractors/HDPlayerSystem.py
38
+ KekikStream/Extractors/HotStream.py
38
39
  KekikStream/Extractors/JFVid.py
39
40
  KekikStream/Extractors/JetTv.py
40
41
  KekikStream/Extractors/MailRu.py
@@ -61,6 +62,7 @@ KekikStream/Extractors/VidMoxy.py
61
62
  KekikStream/Extractors/VidPapi.py
62
63
  KekikStream/Extractors/VideoSeyred.py
63
64
  KekikStream/Extractors/Videostr.py
65
+ KekikStream/Extractors/Vidoza.py
64
66
  KekikStream/Extractors/YTDLP.py
65
67
  KekikStream/Extractors/YildizKisaFilm.py
66
68
  KekikStream/Plugins/BelgeselX.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.4.0
3
+ Version: 2.4.2
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.4.0",
9
+ version = "2.4.2",
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