KekikStream 2.0.2__py3-none-any.whl → 2.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. KekikStream/Core/Extractor/ExtractorBase.py +7 -2
  2. KekikStream/Core/Plugin/PluginBase.py +61 -13
  3. KekikStream/Extractors/CloseLoad.py +17 -2
  4. KekikStream/Extractors/ContentX.py +19 -2
  5. KekikStream/Extractors/DonilasPlay.py +86 -0
  6. KekikStream/Extractors/Filemoon.py +78 -0
  7. KekikStream/Extractors/MixTiger.py +5 -5
  8. KekikStream/Extractors/Odnoklassniki.py +6 -0
  9. KekikStream/Extractors/PeaceMakerst.py +6 -0
  10. KekikStream/Extractors/PlayerFilmIzle.py +8 -5
  11. KekikStream/Extractors/RapidVid.py +21 -5
  12. KekikStream/Extractors/SetPlay.py +13 -4
  13. KekikStream/Extractors/VCTPlay.py +41 -0
  14. KekikStream/Extractors/VidHide.py +11 -2
  15. KekikStream/Extractors/VidMoly.py +52 -30
  16. KekikStream/Extractors/YTDLP.py +88 -54
  17. KekikStream/Plugins/BelgeselX.py +196 -0
  18. KekikStream/Plugins/DiziBox.py +8 -12
  19. KekikStream/Plugins/DiziPal.py +11 -22
  20. KekikStream/Plugins/DiziYou.py +9 -17
  21. KekikStream/Plugins/Dizilla.py +19 -14
  22. KekikStream/Plugins/FilmBip.py +5 -8
  23. KekikStream/Plugins/FilmMakinesi.py +31 -21
  24. KekikStream/Plugins/FilmModu.py +14 -18
  25. KekikStream/Plugins/FullHDFilm.py +83 -27
  26. KekikStream/Plugins/FullHDFilmizlesene.py +6 -8
  27. KekikStream/Plugins/HDFilmCehennemi.py +133 -57
  28. KekikStream/Plugins/JetFilmizle.py +29 -14
  29. KekikStream/Plugins/KultFilmler.py +13 -15
  30. KekikStream/Plugins/RecTV.py +16 -24
  31. KekikStream/Plugins/RoketDizi.py +22 -32
  32. KekikStream/Plugins/SelcukFlix.py +99 -80
  33. KekikStream/Plugins/SetFilmIzle.py +252 -0
  34. KekikStream/Plugins/SezonlukDizi.py +43 -9
  35. KekikStream/Plugins/SineWix.py +13 -21
  36. KekikStream/Plugins/Sinefy.py +13 -10
  37. KekikStream/Plugins/SinemaCX.py +35 -38
  38. KekikStream/Plugins/Sinezy.py +5 -8
  39. KekikStream/Plugins/SuperFilmGeldi.py +36 -27
  40. KekikStream/Plugins/UgurFilm.py +7 -9
  41. KekikStream/__init__.py +17 -36
  42. {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/METADATA +6 -3
  43. kekikstream-2.2.0.dist-info/RECORD +81 -0
  44. KekikStream/Extractors/ContentX_.py +0 -40
  45. KekikStream/Extractors/FirePlayer.py +0 -60
  46. KekikStream/Extractors/Odnoklassniki_.py +0 -11
  47. KekikStream/Extractors/PeaceMakerst_.py +0 -7
  48. KekikStream/Extractors/RapidVid_.py +0 -7
  49. KekikStream/Extractors/VidMoly_.py +0 -7
  50. kekikstream-2.0.2.dist-info/RECORD +0 -82
  51. {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/WHEEL +0 -0
  52. {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/entry_points.txt +0 -0
  53. {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/licenses/LICENSE +0 -0
  54. {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult
4
4
  import json
5
5
 
6
6
  class SineWix(PluginBase):
@@ -123,21 +123,21 @@ class SineWix(PluginBase):
123
123
  episodes = episodes,
124
124
  )
125
125
 
126
- async def load_links(self, url: str) -> list[dict]:
126
+ async def load_links(self, url: str) -> list[ExtractResult]:
127
127
  try:
128
128
  veri = json.loads(url)
129
129
  if veri.get("is_episode"):
130
- return [{
131
- "url" : veri.get("url"),
132
- "name" : veri.get("title"),
133
- "referer" : self.main_url
134
- }]
130
+ return [ExtractResult(
131
+ url = veri.get("url"),
132
+ name = veri.get("title"),
133
+ referer = self.main_url
134
+ )]
135
135
  except Exception:
136
136
  pass
137
137
 
138
138
  # Eğer JSON değilse ve direkt URL ise (eski yapı veya harici link)
139
139
  if not url.startswith(self.main_url) and not url.startswith("{"):
140
- return [{"url": url, "name": "Video"}]
140
+ return [ExtractResult(url=url, name="Video")]
141
141
 
142
142
  istek = await self.httpx.get(url)
143
143
  veri = istek.json()
@@ -149,18 +149,10 @@ class SineWix(PluginBase):
149
149
  results = []
150
150
  for video in veri.get("videos"):
151
151
  video_link = video.get("link").split("_blank\">")[-1]
152
- results.append({
153
- "url" : video_link,
154
- "name" : f"{self.name}",
155
- "referer" : self.main_url
156
- })
152
+ results.append(ExtractResult(
153
+ url = video_link,
154
+ name = f"{self.name}",
155
+ referer = self.main_url
156
+ ))
157
157
 
158
158
  return results
159
-
160
- async def play(self, **kwargs):
161
- extract_result = ExtractResult(**kwargs)
162
- self.media_handler.title = kwargs.get("name")
163
- if self.name not in self.media_handler.title:
164
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
165
-
166
- self.media_handler.play_media(extract_result)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, MovieInfo, ExtractResult
4
4
  from parsel import Selector
5
5
  import re, json, urllib.parse
6
6
 
@@ -223,16 +223,19 @@ class Sinefy(PluginBase):
223
223
  year = year
224
224
  )
225
225
 
226
- async def load_links(self, url: str) -> list[dict]:
226
+ async def load_links(self, url: str) -> list[ExtractResult]:
227
227
  resp = await self.httpx.get(url)
228
228
  sel = Selector(resp.text)
229
229
 
230
230
  iframe = sel.css("iframe::attr(src)").get()
231
- if iframe:
232
- iframe = self.fix_url(iframe)
233
- extractor = self.ex_manager.find_extractor(iframe)
234
- return [{
235
- "url" : iframe,
236
- "name" : extractor.name if extractor else "Iframe"
237
- }]
238
- return []
231
+ if not iframe:
232
+ return []
233
+
234
+ iframe_url = self.fix_url(iframe)
235
+
236
+ # Always return iframe (matching Kotlin - no extractor check)
237
+ # loadExtractor in Kotlin handles extraction internally
238
+ return [ExtractResult(
239
+ url = iframe_url,
240
+ name = "Sinefy Player"
241
+ )]
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle, ExtractResult
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -9,23 +9,32 @@ class SinemaCX(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://www.sinema.fit"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
- description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
12
+ description = "Türkiye'nin en iyi film platformu Sinema.cc! 2026'nın en yeni ve popüler yabancı yapımları, Türkçe dublaj ve altyazılı HD kalitede, reklamsız ve ücretsiz olarak seni bekliyor. Şimdi izle!"
13
13
 
14
14
  main_page = {
15
- f"{main_url}/page/SAYFA" : "Son Eklenen Filmler",
16
- f"{main_url}/izle/aile-filmleri/page/SAYFA" : "Aile Filmleri",
17
- f"{main_url}/izle/aksiyon-filmleri/page/SAYFA" : "Aksiyon Filmleri",
18
- f"{main_url}/izle/animasyon-filmleri/page/SAYFA" : "Animasyon Filmleri",
19
- f"{main_url}/izle/belgesel/page/SAYFA" : "Belgesel Filmleri",
20
- f"{main_url}/izle/bilim-kurgu-filmleri/page/SAYFA" : "Bilim Kurgu Filmler",
21
- f"{main_url}/izle/biyografi/page/SAYFA" : "Biyografi Filmleri",
22
- f"{main_url}/izle/fantastik-filmler/page/SAYFA" : "Fantastik Filmler",
23
- f"{main_url}/izle/gizem-filmleri/page/SAYFA" : "Gizem Filmleri",
24
- f"{main_url}/izle/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
25
- f"{main_url}/izle/korku-filmleri/page/SAYFA" : "Korku Filmleri",
26
- f"{main_url}/izle/macera-filmleri/page/SAYFA" : "Macera Filmleri",
27
- f"{main_url}/izle/romantik-filmler/page/SAYFA" : "Romantik Filmler",
28
- f"{main_url}/izle/erotik-filmler/page/SAYFA" : "Erotik Film",
15
+ f"{main_url}/page/SAYFA" : "Son Eklenen Filmler",
16
+ f"{main_url}/izle/aile-filmleri/page/SAYFA" : "Aile Filmleri",
17
+ f"{main_url}/izle/aksiyon-filmleri/page/SAYFA" : "Aksiyon Filmleri",
18
+ f"{main_url}/izle/animasyon-filmleri/page/SAYFA" : "Animasyon Filmleri",
19
+ f"{main_url}/izle/belgesel/page/SAYFA" : "Belgesel Filmleri",
20
+ f"{main_url}/izle/bilim-kurgu-filmleri/page/SAYFA" : "Bilim Kurgu Filmler",
21
+ f"{main_url}/izle/biyografi/page/SAYFA" : "Biyografi Filmleri",
22
+ f"{main_url}/izle/dram-filmleri/page/SAYFA" : "Dram Filmleri",
23
+ f"{main_url}/izle/erotik-filmler/page/SAYFA" : "Erotik Film",
24
+ f"{main_url}/izle/fantastik-filmler/page/SAYFA" : "Fantastik Filmler",
25
+ f"{main_url}/izle/gerilim-filmleri/page/SAYFA" : "Gerilim Filmleri",
26
+ f"{main_url}/izle/gizem-filmleri/page/SAYFA" : "Gizem Filmleri",
27
+ f"{main_url}/izle/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
28
+ f"{main_url}/izle/korku-filmleri/page/SAYFA" : "Korku Filmleri",
29
+ f"{main_url}/izle/macera-filmleri/page/SAYFA" : "Macera Filmleri",
30
+ f"{main_url}/izle/muzikal-filmler/page/SAYFA" : "Müzikal Filmler",
31
+ f"{main_url}/izle/romantik-filmler/page/SAYFA" : "Romantik Filmler",
32
+ f"{main_url}/izle/savas-filmleri/page/SAYFA" : "Savaş Filmleri",
33
+ f"{main_url}/izle/seri-filmler/page/SAYFA" : "Seri Filmler",
34
+ f"{main_url}/izle/spor-filmleri/page/SAYFA" : "Spor Filmleri",
35
+ f"{main_url}/izle/suc-filmleri/page/SAYFA" : "Suç Filmleri",
36
+ f"{main_url}/izle/tarihi-filmler/page/SAYFA" : "Tarih Filmler",
37
+ f"{main_url}/izle/western-filmleri/page/SAYFA" : "Western Filmler",
29
38
  }
30
39
 
31
40
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
@@ -75,7 +84,7 @@ class SinemaCX(PluginBase):
75
84
  duration = int(duration_match[1]) if duration_match else None,
76
85
  )
77
86
 
78
- async def load_links(self, url: str) -> list[dict]:
87
+ async def load_links(self, url: str) -> list[ExtractResult]:
79
88
  istek = await self.httpx.get(url)
80
89
  secici = Selector(istek.text)
81
90
 
@@ -130,28 +139,16 @@ class SinemaCX(PluginBase):
130
139
  vid_data = vid_istek.json()
131
140
 
132
141
  if vid_data.get("securedLink"):
133
- results.append({
134
- "name" : f"{self.name}",
135
- "url" : vid_data["securedLink"],
136
- "referer" : iframe,
137
- "subtitles" : subtitles
138
- })
142
+ results.append(ExtractResult(
143
+ name = f"{self.name}",
144
+ url = vid_data["securedLink"],
145
+ referer = iframe,
146
+ subtitles = subtitles
147
+ ))
139
148
  else:
140
149
  # Extractor'a yönlendir
141
- extractor = self.ex_manager.find_extractor(iframe)
142
- results.append({
143
- "name" : f"{extractor.name if extractor else self.name}",
144
- "url" : iframe,
145
- "referer" : f"{self.main_url}/",
146
- "subtitles" : subtitles
147
- })
150
+ data = await self.extract(iframe)
151
+ if data:
152
+ results.append(data)
148
153
 
149
154
  return results
150
-
151
- async def play(self, **kwargs):
152
- extract_result = ExtractResult(**kwargs)
153
- self.media_handler.title = kwargs.get("name")
154
- if self.name not in self.media_handler.title:
155
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
156
-
157
- self.media_handler.play_media(extract_result)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult
4
4
  from parsel import Selector
5
5
  import re, base64
6
6
 
@@ -120,7 +120,7 @@ class Sinezy(PluginBase):
120
120
  year = year
121
121
  )
122
122
 
123
- async def load_links(self, url: str) -> list[dict]:
123
+ async def load_links(self, url: str) -> list[ExtractResult]:
124
124
  resp = await self.httpx.get(url)
125
125
 
126
126
  match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
@@ -134,12 +134,9 @@ class Sinezy(PluginBase):
134
134
  iframe = iframe_match.group(1)
135
135
  iframe = self.fix_url(iframe)
136
136
 
137
- extractor = self.ex_manager.find_extractor(iframe)
138
-
139
- return [{
140
- "url" : iframe,
141
- "name" : extractor.name if extractor else "Iframe"
142
- }]
137
+ data = await self.extract(iframe)
138
+ if data:
139
+ return [data]
143
140
  except Exception:
144
141
  pass
145
142
 
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -9,20 +9,29 @@ class SuperFilmGeldi(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://www.superfilmgeldi13.art"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
- description = "Ücretsiz film izleme sitesi."
12
+ 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."
13
13
 
14
14
  main_page = {
15
- f"{main_url}/page/SAYFA" : "Son Eklenenler",
16
- f"{main_url}/hdizle/category/aksiyon/page/SAYFA" : "Aksiyon",
17
- f"{main_url}/hdizle/category/animasyon/page/SAYFA" : "Animasyon",
18
- f"{main_url}/hdizle/category/belgesel/page/SAYFA" : "Belgesel",
19
- f"{main_url}/hdizle/category/bilim-kurgu/page/SAYFA" : "Bilim Kurgu",
20
- f"{main_url}/hdizle/category/fantastik/page/SAYFA" : "Fantastik",
21
- f"{main_url}/hdizle/category/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
22
- f"{main_url}/hdizle/category/macera/page/SAYFA" : "Macera",
23
- f"{main_url}/hdizle/category/gerilim/page/SAYFA" : "Gerilim",
24
- f"{main_url}/hdizle/category/suc/page/SAYFA" : "Suç",
25
- f"{main_url}/hdizle/category/karete-filmleri/page/SAYFA" : "Karate Filmleri",
15
+ f"{main_url}/page/SAYFA" : "Son Eklenenler",
16
+ f"{main_url}/hdizle/category/aksiyon/page/SAYFA" : "Aksiyon",
17
+ f"{main_url}/hdizle/category/animasyon/page/SAYFA" : "Animasyon",
18
+ f"{main_url}/hdizle/category/belgesel/page/SAYFA" : "Belgesel",
19
+ f"{main_url}/hdizle/category/biyografi/page/SAYFA" : "Biyografi",
20
+ f"{main_url}/hdizle/category/bilim-kurgu/page/SAYFA" : "Bilim Kurgu",
21
+ f"{main_url}/hdizle/category/fantastik/page/SAYFA" : "Fantastik",
22
+ f"{main_url}/hdizle/category/dram/page/SAYFA" : "Dram",
23
+ f"{main_url}/hdizle/category/gerilim/page/SAYFA" : "Gerilim",
24
+ f"{main_url}/hdizle/category/gizem/page/SAYFA" : "Gizem",
25
+ f"{main_url}/hdizle/category/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
26
+ f"{main_url}/hdizle/category/karete-filmleri/page/SAYFA" : "Karate Filmleri",
27
+ f"{main_url}/hdizle/category/korku/page/SAYFA" : "Korku",
28
+ f"{main_url}/hdizle/category/muzik/page/SAYFA" : "Müzik",
29
+ f"{main_url}/hdizle/category/macera/page/SAYFA" : "Macera",
30
+ f"{main_url}/hdizle/category/romantik/page/SAYFA" : "Romantik",
31
+ f"{main_url}/hdizle/category/spor/page/SAYFA" : "Spor",
32
+ f"{main_url}/hdizle/category/savas/page/SAYFA" : "Savaş",
33
+ f"{main_url}/hdizle/category/suc/page/SAYFA" : "Suç",
34
+ f"{main_url}/hdizle/category/western/page/SAYFA" : "Western",
26
35
  }
27
36
 
28
37
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
@@ -76,7 +85,9 @@ class SuperFilmGeldi(PluginBase):
76
85
  actors = actors,
77
86
  )
78
87
 
79
- async def load_links(self, url: str) -> list[dict]:
88
+ async def load_links(self, url: str) -> list[ExtractResult]:
89
+ from KekikStream.Core import ExtractResult
90
+
80
91
  istek = await self.httpx.get(url)
81
92
  secici = Selector(istek.text)
82
93
 
@@ -89,7 +100,7 @@ class SuperFilmGeldi(PluginBase):
89
100
  # Mix player özel işleme
90
101
  if "mix" in iframe and "index.php?data=" in iframe:
91
102
  iframe_istek = await self.httpx.get(iframe, headers={"Referer": f"{self.main_url}/"})
92
- mix_point = re.search(r'videoUrl":"(.*)","videoServer', iframe_istek.text)
103
+ mix_point = re.search(r'videoUrl"\s*:\s*"(.*?)"\s*,\s*"videoServer', iframe_istek.text)
93
104
 
94
105
  if mix_point:
95
106
  mix_point = mix_point[1].replace("\\", "")
@@ -104,18 +115,16 @@ class SuperFilmGeldi(PluginBase):
104
115
 
105
116
  m3u_link = iframe.split("/player")[0] + mix_point + end_point
106
117
 
107
- results.append({
108
- "name" : f"{self.name} | Mix Player",
109
- "url" : m3u_link,
110
- "referer" : iframe,
111
- "subtitles" : []
112
- })
118
+ results.append(ExtractResult(
119
+ name = f"{self.name} | Mix Player",
120
+ url = m3u_link,
121
+ referer = iframe,
122
+ subtitles = []
123
+ ))
113
124
  else:
114
- extractor = self.ex_manager.find_extractor(iframe)
115
- results.append({
116
- "name" : extractor.name if extractor else "Player",
117
- "url" : iframe,
118
- "referer" : f"{self.main_url}/"
119
- })
125
+ # Extractor'a yönlendir
126
+ data = await self.extract(iframe)
127
+ if data:
128
+ results.append(data)
120
129
 
121
130
  return results
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult
4
4
  from parsel import Selector
5
5
 
6
6
  class UgurFilm(PluginBase):
@@ -8,7 +8,7 @@ class UgurFilm(PluginBase):
8
8
  language = "tr"
9
9
  main_url = "https://ugurfilm3.xyz"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
- description = "Yabancı film izle, Türkçe dublaj ve Türkçe altyazılı film seçenekleriyle 720p ve 1080p HD kalitesinde film izle - Uğur Film full hd film izle."
11
+ description = "Uğur Film ile film izle! En yeni ve güncel filmleri, Türk yerli filmleri Full HD 1080p kalitede Türkçe Altyazılı olarak izle."
12
12
 
13
13
  main_page = {
14
14
  f"{main_url}/turkce-altyazili-filmler/page/" : "Türkçe Altyazılı Filmler",
@@ -79,12 +79,12 @@ class UgurFilm(PluginBase):
79
79
  actors = actors,
80
80
  )
81
81
 
82
- async def load_links(self, url: str) -> list[dict]:
82
+ async def load_links(self, url: str) -> list[ExtractResult]:
83
83
  istek = await self.httpx.get(url)
84
84
  secici = Selector(istek.text)
85
85
  results = []
86
86
 
87
- for idx, part_link in enumerate(secici.css("li.parttab a::attr(href)").getall()):
87
+ for part_link in secici.css("li.parttab a::attr(href)").getall():
88
88
  sub_response = await self.httpx.get(part_link)
89
89
  sub_selector = Selector(sub_response.text)
90
90
 
@@ -100,10 +100,8 @@ class UgurFilm(PluginBase):
100
100
  data = post_data
101
101
  )
102
102
  iframe = self.fix_url(player_response.json().get("iframe"))
103
- extractor = self.ex_manager.find_extractor(iframe)
104
- results.append({
105
- "url" : iframe,
106
- "name" : f"{extractor.name if extractor else f'Part {idx + 1}'}"
107
- })
103
+ data = await self.extract(iframe)
104
+ if data:
105
+ results.append(data)
108
106
 
109
107
  return results
KekikStream/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from .CLI import konsol, cikis_yap, hata_yakala, pypi_kontrol_guncelle
4
- from .Core import PluginManager, ExtractorManager, UIManager, MediaManager, PluginBase, ExtractorBase, SeriesInfo
4
+ from .Core import PluginManager, ExtractorManager, UIManager, MediaManager, PluginBase, ExtractorBase, SeriesInfo, ExtractResult
5
5
  from asyncio import run, TaskGroup, Semaphore
6
6
  from contextlib import suppress
7
7
 
@@ -226,61 +226,42 @@ class KekikStream:
226
226
  case "Çıkış":
227
227
  cikis_yap(False)
228
228
 
229
- async def show_link_options(self, links: list[dict]):
229
+ async def show_link_options(self, links: list[ExtractResult]):
230
230
  """Bağlantı seçeneklerini göster"""
231
231
  if not links:
232
232
  konsol.print("[bold red]Bağlantı bulunamadı![/bold red]")
233
233
  return await self.handle_no_results()
234
234
 
235
- # Direkt oynatma varsa
236
- if hasattr(self.current_plugin, "play"):
237
- return await self.play_direct(links)
235
+ # Direkt oynatma - tüm pluginlerde artık play metodu var (PluginBase'den miras)
236
+ return await self.play_direct(links)
238
237
 
239
- # Extractor ile oynat
240
- url_list = [link["url"] for link in links]
241
- mapping = self.extractor.map_links_to_extractors(url_list)
242
-
243
- if not mapping:
244
- konsol.print("[bold red]Extractor bulunamadı![/bold red]")
245
- return await self.handle_no_results()
246
-
247
- choice = await self.ui.select_from_list("Ne yapmak istersiniz?", ["İzle", "Tüm Eklentilerde Ara", "Ana Menü"])
248
-
249
- match choice:
250
- case "İzle":
251
- await self.play_with_extractor(links, mapping)
252
- case "Tüm Eklentilerde Ara":
253
- await self.search_all_plugins()
254
- case "Ana Menü":
255
- await self.start()
256
-
257
- async def play_direct(self, links: list[dict]):
238
+ async def play_direct(self, links: list[ExtractResult]):
258
239
  """Plugin'in kendi metoduyla oynat"""
259
240
  selected = await self.ui.select_from_list(
260
241
  message = "Bağlantı seçin:",
261
- choices = [{"name": link.get("name", "Bilinmiyor"), "value": link} for link in links]
242
+ choices = [{"name": link.name or "Bilinmiyor", "value": link} for link in links]
262
243
  )
263
244
 
264
245
  if not selected:
265
246
  return await self.content_finished()
266
247
 
267
248
  self.update_title(self.episode_title)
268
- self.update_title(selected.get("name"))
249
+ self.update_title(selected.name)
269
250
 
270
251
  await self.current_plugin.play(
271
252
  name = self.media.get_title(),
272
- url = selected.get("url"),
273
- user_agent = selected.get("user_agent"),
274
- referer = selected.get("referer"),
275
- subtitles = selected.get("subtitles", [])
253
+ url = selected.url,
254
+ user_agent = selected.user_agent,
255
+ referer = selected.referer,
256
+ subtitles = selected.subtitles or []
276
257
  )
277
258
  return await self.content_finished()
278
259
 
279
- async def play_with_extractor(self, links: list[dict], mapping: dict):
260
+ async def play_with_extractor(self, links: list[ExtractResult], mapping: dict):
280
261
  """Extractor ile oynat"""
281
262
  options = [
282
- {"name": link.get("name", mapping[link["url"]]), "value": link}
283
- for link in links if link["url"] in mapping
263
+ {"name": link.name or mapping.get(link.url, "Bilinmiyor"), "value": link}
264
+ for link in links if link.url in mapping
284
265
  ]
285
266
 
286
267
  if not options:
@@ -291,7 +272,7 @@ class KekikStream:
291
272
  if not selected:
292
273
  return await self.content_finished()
293
274
 
294
- url = selected.get("url")
275
+ url = selected.url
295
276
  extractor: ExtractorBase = self.extractor.find_extractor(url)
296
277
 
297
278
  if not extractor:
@@ -299,7 +280,7 @@ class KekikStream:
299
280
  return await self.handle_no_results()
300
281
 
301
282
  try:
302
- referer = selected.get("referer", self.current_plugin.main_url)
283
+ referer = selected.referer or self.current_plugin.main_url
303
284
  extract_data = await extractor.extract(url, referer=referer)
304
285
  except Exception as e:
305
286
  konsol.print(f"[bold red]{extractor.name} hatası: {e}[/bold red]")
@@ -317,7 +298,7 @@ class KekikStream:
317
298
 
318
299
  # Başlıkları güncelle ve oynat
319
300
  self.update_title(self.episode_title)
320
- self.update_title(selected.get("name"))
301
+ self.update_title(selected.name)
321
302
  self.update_title(extract_data.name)
322
303
 
323
304
  self.media.play_media(extract_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.0.2
3
+ Version: 2.2.0
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
@@ -104,7 +104,7 @@ KekikStream modüler bir plugin mimarisi kullanır; her medya kaynağı bağıms
104
104
 
105
105
  **Plugin Geliştirme:**
106
106
  ```python
107
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo
107
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, ExtractResult
108
108
 
109
109
  class MyPlugin(PluginBase):
110
110
  name = "MyPlugin"
@@ -126,7 +126,7 @@ class MyPlugin(PluginBase):
126
126
  async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
127
127
  return details
128
128
 
129
- async def load_links(self, url: str) -> list[dict]:
129
+ async def load_links(self, url: str) -> list[ExtractResult]:
130
130
  return links
131
131
  ```
132
132
 
@@ -292,6 +292,9 @@ Projeyi geliştirmek için katkılarınızı bekliyoruz!
292
292
 
293
293
  - [keyiflerolsun/Kekik-cloudstream](https://github.com/keyiflerolsun/Kekik-cloudstream)
294
294
  - [keyiflerolsun/seyirTurk-Parser](https://github.com/keyiflerolsun/seyirTurk-Parser)
295
+ - [feroxx/Kekik-cloudstream](https://github.com/feroxx/Kekik-cloudstream)
296
+ - [kerimmkirac/cs-kerim](https://github.com/kerimmkirac/cs-kerim)
297
+ - [Phisher98/Extractors](https://github.com/phisher98/cloudstream-extensions-phisher/blob/master/StreamPlay/src/main/kotlin/com/Phisher98/Extractors.kt)
295
298
 
296
299
  ## 🌐 Telif Hakkı ve Lisans
297
300
 
@@ -0,0 +1,81 @@
1
+ KekikStream/__init__.py,sha256=nTgIxO1716DVX-cZnMvwi6OjPbuebFyeYpHvpqCJ0Js,12767
2
+ KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
3
+ KekikStream/requirements.txt,sha256=0fO-7byqgLMr4NyJO7fQBFOnLv0zcAeqk7tLhHXqonk,76
4
+ KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
5
+ KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElcii8,1487
6
+ KekikStream/Core/__init__.py,sha256=Ise27_Hqe1YeqTcSNnf3HqynhbySEVC-pNP2uKa2GOo,771
7
+ KekikStream/Core/Extractor/ExtractorBase.py,sha256=CAdeel6zGlj_RHD0lwjyNW5hAaivo1XyAZbnmiVDaZo,2023
8
+ KekikStream/Core/Extractor/ExtractorLoader.py,sha256=GPGCmgFpDBywR8CsNw43-ddseZhSKTjAUETp1Ohbi6E,4796
9
+ KekikStream/Core/Extractor/ExtractorManager.py,sha256=VYkj4CCE5Puqsr6PCeN8i_OS0hfYKI4NScj98BLO39o,2644
10
+ KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6XBOc0HS0tXGDwajI,445
11
+ KekikStream/Core/Extractor/YTDLPCache.py,sha256=sRg5kwFxkRXA_8iRwsV29E51g9qQJvg8dWUnzfr7EwA,984
12
+ KekikStream/Core/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
13
+ KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
14
+ KekikStream/Core/Plugin/PluginBase.py,sha256=iirN7cQHccqUa6f6Gr86x8XYg4Rr6TlkaWOtbhnzU9g,5923
15
+ KekikStream/Core/Plugin/PluginLoader.py,sha256=GcDqN1u3nJeoGKH_oDFHCpwteJlLCxHNbmPrC5L-hZE,3692
16
+ KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
17
+ KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P8S0tRNhS6E,2476
18
+ KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
19
+ KekikStream/Extractors/CloseLoad.py,sha256=m3wpLvbLRakqv0yn9v6OOpVlEDIqgAy6XBMIiuD5g0Q,1558
20
+ KekikStream/Extractors/ContentX.py,sha256=x0j67e1OAw4L1m7ejUTyiIxqr1EhvpjaA_0U-s4IQ-I,3617
21
+ KekikStream/Extractors/DonilasPlay.py,sha256=Lr60pEht96SMlXICYWo9J5dOwV4ty8fetBCCqJ3ARUY,3221
22
+ KekikStream/Extractors/DzenRu.py,sha256=X0Rhm1-W4YjQwVrJs8YFqVcCxMaZi8rsKiLhK_ZsYlU,1185
23
+ KekikStream/Extractors/ExPlay.py,sha256=EJNVKAbaIxlbOsCx7J9aLfNHKOFoqSLZZUw7W4QYeH0,1827
24
+ KekikStream/Extractors/Filemoon.py,sha256=l0AVyRrYA2DTuSkYoy6Jh02_w53TeBRyROkY9koiees,2684
25
+ KekikStream/Extractors/HDPlayerSystem.py,sha256=EgnFzx5Q4PkuwAtuff5SYU9k59B-CyOdySl7lbCZ9hM,1312
26
+ KekikStream/Extractors/JetTv.py,sha256=aA3WeOvR-tszac-WSwunZZb1NRy25TQH8vxY3TDscRI,1596
27
+ KekikStream/Extractors/MailRu.py,sha256=xQVCWwYqNoG5T43VAW1_m0v4e80FbO-1pNPKkwhTccU,1218
28
+ KekikStream/Extractors/MixPlayHD.py,sha256=POV_yq3KoZ6S6EqFsKYULEBz92NdUa2BpYKNo0eNQH8,1552
29
+ KekikStream/Extractors/MixTiger.py,sha256=4VbOYgE4s5H-BGVvJI0AI57M-WBWqnek_LGfCFHAucw,2116
30
+ KekikStream/Extractors/MolyStream.py,sha256=IeeBw9tJJrL5QQ-t2Yp-a-6lnDc3Y00UNiaN6m-o-7c,1160
31
+ KekikStream/Extractors/Odnoklassniki.py,sha256=YfFRCL3Ag5N4zDzK9ZLOr3HVQcsETFQpff1px02imJ0,4019
32
+ KekikStream/Extractors/PeaceMakerst.py,sha256=pEgJb3KDfEPAUjbuvrYbUlxIciKgED-Vd0arrRO3QCk,2317
33
+ KekikStream/Extractors/PixelDrain.py,sha256=Uk2pPvtBzaKtRXu1iNO8FLHd0EAuIOIzI1H_n02tg-U,964
34
+ KekikStream/Extractors/PlayerFilmIzle.py,sha256=kH-O_RtQvG4iRLGKi-sFn1ST14DrxxoAa5iRT2PsdXc,2503
35
+ KekikStream/Extractors/RapidVid.py,sha256=t_8ZUp5DCTIaohc5aW4s9HEQQ1A2lU5bTMX84lctmtY,3529
36
+ KekikStream/Extractors/SetPlay.py,sha256=6XuNXoNFM1h3KOCkTxeZmcAl8QTdqzVN_pp_dEIKF8A,2235
37
+ KekikStream/Extractors/SetPrime.py,sha256=ob09y-Sm91YR7rIRzikhZiMHX6D4Djm5QzFTg6KbO4k,1536
38
+ KekikStream/Extractors/SibNet.py,sha256=zJTkzlr34ufKCWzKKCgJrzhb2o-fpjTjFdi38gv6N6g,849
39
+ KekikStream/Extractors/Sobreatsesuyp.py,sha256=qlSQHUHjTjBoY0nsuZQWAjnfswbPORkBg6rUuP7SagA,2000
40
+ KekikStream/Extractors/TRsTX.py,sha256=mbSRGnQt26a73SbqwtY9rpiYFwgRgVbvA6bkGb_PvP8,2152
41
+ KekikStream/Extractors/TauVideo.py,sha256=2ai9BwwM6qlCgxK7E0B642LtOF5y4hEb9tQ2aDpbMtc,1112
42
+ KekikStream/Extractors/TurboImgz.py,sha256=nnWnP1K4JZbMj6S-YuXxej31UZtF4JcboSW4n7A4A5c,824
43
+ KekikStream/Extractors/TurkeyPlayer.py,sha256=FX_H3vzXjAD7IjK11bjJVVw_VdPQ4n6YQLfjQ6E3t7o,1247
44
+ KekikStream/Extractors/VCTPlay.py,sha256=1BCl2_vVIrwvG56LCzl2KE5g2CUaMAhzImOZMdZpZCQ,1377
45
+ KekikStream/Extractors/VidHide.py,sha256=UIAPFLbGDPRjcJVuDmaVbFN5r0ZyJoW4CRn1INH8mJs,2837
46
+ KekikStream/Extractors/VidMoly.py,sha256=QLRRGH1uHFTREl5Oq3V8WIkVpqaZuuygmHaW1ulj1Lg,4774
47
+ KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0Jcek,1771
48
+ KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
49
+ KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
50
+ KekikStream/Extractors/YTDLP.py,sha256=Hy8loCSFSquu2zaL3INord-Jm6T8CM6K2-VcDA2K79g,7390
51
+ KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
52
+ KekikStream/Plugins/BelgeselX.py,sha256=upxN78gIFrPdVCw3hJ0DGqwa6vtrd_ShCWbO7_JLQhg,8427
53
+ KekikStream/Plugins/DiziBox.py,sha256=3O8RHPvzMPcMB-8Wc1gwxI7GQlBitQvz4WDR6bmXuqQ,9715
54
+ KekikStream/Plugins/DiziPal.py,sha256=xwz6XeN2bMvShClfsPTK5dI4EktSZQyCrVu8Gn0x_pU,9715
55
+ KekikStream/Plugins/DiziYou.py,sha256=sH4UOCEbl-o9fIGORgz1YVMMnfbZVfjnitPsGuCl7PI,8698
56
+ KekikStream/Plugins/Dizilla.py,sha256=Rk_rS6ymlj5RT-ZBspjXS-Dv0ds3d9n46LCpGKtycP4,11765
57
+ KekikStream/Plugins/FilmBip.py,sha256=xJA79gwPXwvdQLfUu5QGdwv8kGZngjAg3csLQqQYSDU,6036
58
+ KekikStream/Plugins/FilmMakinesi.py,sha256=_Ulwi0bo-8bXZZjRxbpBKAIkAnlyG6D0qEvD1UJTsjk,5708
59
+ KekikStream/Plugins/FilmModu.py,sha256=HVawdKHuqcFb3PQ-93uwGlwv1dNhkM2kpStBlTJJXR4,6553
60
+ KekikStream/Plugins/FullHDFilm.py,sha256=fimK5MqPYjmog859lfuEuJeg8AGylYyDm36Ak3X3Msg,9768
61
+ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=_-HaoNvPVzITB_aK3jOkSSAOA50SYFNdnjHH4JGCmOc,6078
62
+ KekikStream/Plugins/HDFilmCehennemi.py,sha256=I-dwkerkwfzcaSQA9XzIGh2LeRywBGydX0D0k6FmoOc,13029
63
+ KekikStream/Plugins/JetFilmizle.py,sha256=njmaX7Rhi0bewZvK_NO9PTs86uB-8zxYcuwrYthA2aw,7956
64
+ KekikStream/Plugins/KultFilmler.py,sha256=ODnQu2_qLKx68dpT16MFUiIXYQlkQSDU0x15o91LWU8,9097
65
+ KekikStream/Plugins/RecTV.py,sha256=Nj4AdeetPMzvZ-VKUdUGhBC1SiFSBRYRebODgE2UeI8,7228
66
+ KekikStream/Plugins/RoketDizi.py,sha256=7cP6935unhrn_yDt0hsLoW3nboX3WUD0P2DqqRny3_M,8568
67
+ KekikStream/Plugins/SelcukFlix.py,sha256=WKMsZpVVdHn_zW69xxhAuIP7OhAPbPFxFRWzGzHBgaE,13601
68
+ KekikStream/Plugins/SetFilmIzle.py,sha256=EcoHSacJO9bvzA9lZZzDZAwAhXfaDstI4M4C3YOwvEU,10113
69
+ KekikStream/Plugins/SezonlukDizi.py,sha256=7N4S8ikA4IzHszD5WaXAUESAVfHDKSnMQeX4iQFP3KY,8457
70
+ KekikStream/Plugins/SineWix.py,sha256=z0r90lggAugEWE1g9vg8gZsInBObUZPnVFQwq7GYmJs,7052
71
+ KekikStream/Plugins/Sinefy.py,sha256=Ogw0-qjROz8T0EkV1jwbOvz0WM4FN9D24bNrJmi314k,9998
72
+ KekikStream/Plugins/SinemaCX.py,sha256=aujqCWPGZHcRqKcMFlZYEwMonj0C_UQ_J4ZqCyF59pU,7492
73
+ KekikStream/Plugins/Sinezy.py,sha256=lFOfbMwxzP6IkhPZ_C3ZWGrgwThSk58pYQAD61rCJnM,6128
74
+ KekikStream/Plugins/SuperFilmGeldi.py,sha256=dqU1IJHcTPU9zlnA9rSKsX0ehpBYSgDuz6eSlCCop8k,6044
75
+ KekikStream/Plugins/UgurFilm.py,sha256=TlMDy3tSfkEUy_ziIdCkgnfmoRtVdXEv8m4kjKeAWrE,4696
76
+ kekikstream-2.2.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
77
+ kekikstream-2.2.0.dist-info/METADATA,sha256=bTOZwY8eWMqFaV8mBsxRjS-NPd8HAAtdJGQvjD3K_Ng,10407
78
+ kekikstream-2.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
79
+ kekikstream-2.2.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
80
+ kekikstream-2.2.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
81
+ kekikstream-2.2.0.dist-info/RECORD,,