KekikStream 2.1.6__py3-none-any.whl → 2.1.8__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 (35) hide show
  1. KekikStream/Core/Plugin/PluginBase.py +20 -21
  2. KekikStream/Extractors/Filemoon.py +78 -0
  3. KekikStream/Extractors/RapidVid.py +15 -5
  4. KekikStream/Extractors/VidHide.py +11 -2
  5. KekikStream/Plugins/BelgeselX.py +7 -7
  6. KekikStream/Plugins/DiziBox.py +2 -2
  7. KekikStream/Plugins/DiziPal.py +8 -8
  8. KekikStream/Plugins/DiziYou.py +8 -8
  9. KekikStream/Plugins/Dizilla.py +2 -2
  10. KekikStream/Plugins/FilmBip.py +2 -2
  11. KekikStream/Plugins/FilmMakinesi.py +2 -2
  12. KekikStream/Plugins/FilmModu.py +8 -8
  13. KekikStream/Plugins/FullHDFilm.py +13 -5
  14. KekikStream/Plugins/FullHDFilmizlesene.py +2 -2
  15. KekikStream/Plugins/HDFilmCehennemi.py +19 -19
  16. KekikStream/Plugins/JetFilmizle.py +2 -2
  17. KekikStream/Plugins/KultFilmler.py +10 -9
  18. KekikStream/Plugins/RecTV.py +15 -15
  19. KekikStream/Plugins/RoketDizi.py +2 -2
  20. KekikStream/Plugins/SelcukFlix.py +2 -2
  21. KekikStream/Plugins/SetFilmIzle.py +2 -2
  22. KekikStream/Plugins/SezonlukDizi.py +2 -2
  23. KekikStream/Plugins/SineWix.py +13 -13
  24. KekikStream/Plugins/Sinefy.py +6 -6
  25. KekikStream/Plugins/SinemaCX.py +31 -22
  26. KekikStream/Plugins/Sinezy.py +2 -2
  27. KekikStream/Plugins/SuperFilmGeldi.py +30 -19
  28. KekikStream/Plugins/UgurFilm.py +2 -2
  29. KekikStream/__init__.py +15 -15
  30. {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/METADATA +3 -3
  31. {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/RECORD +35 -34
  32. {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/WHEEL +0 -0
  33. {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/entry_points.txt +0 -0
  34. {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/licenses/LICENSE +0 -0
  35. {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/top_level.txt +0 -0
@@ -160,7 +160,7 @@ class KultFilmler(PluginBase):
160
160
  match = re.search(r"(https?://[^\s\"]+\.srt)", source_code)
161
161
  return match[1] if match else None
162
162
 
163
- async def load_links(self, url: str) -> list[dict]:
163
+ async def load_links(self, url: str) -> list[ExtractResult]:
164
164
  istek = await self.httpx.get(url)
165
165
  secici = Selector(istek.text)
166
166
 
@@ -195,12 +195,12 @@ class KultFilmler(PluginBase):
195
195
  m3u_match = re.search(r'file:"([^"]+)"', iframe_istek.text)
196
196
 
197
197
  if m3u_match:
198
- results.append({
199
- "name" : "VidMoly",
200
- "url" : m3u_match[1],
201
- "referer" : self.main_url,
202
- "subtitles" : []
203
- })
198
+ results.append(ExtractResult(
199
+ name = "VidMoly",
200
+ url = m3u_match[1],
201
+ referer = self.main_url,
202
+ subtitles = []
203
+ ))
204
204
  continue
205
205
 
206
206
  # Altyazı çıkar
@@ -210,7 +210,8 @@ class KultFilmler(PluginBase):
210
210
 
211
211
  data = await self.extract(iframe)
212
212
  if data:
213
- data["subtitles"] = subtitles
214
- results.append(data)
213
+ # ExtractResult objesi immutable, yeni bir kopya oluştur
214
+ updated_data = data.model_copy(update={"subtitles": subtitles}) if subtitles else data
215
+ results.append(updated_data)
215
216
 
216
217
  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, Episode, SeriesInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult
4
4
  from json import dumps, loads
5
5
  import re
6
6
 
@@ -116,21 +116,21 @@ class RecTV(PluginBase):
116
116
  actors = []
117
117
  )
118
118
 
119
- async def load_links(self, url: str) -> list[dict]:
119
+ async def load_links(self, url: str) -> list[ExtractResult]:
120
120
  try:
121
121
  veri = loads(url)
122
122
  except Exception:
123
123
  # JSON değilse düz URL'dir (eski yapı veya hata)
124
- return [{"url": url, "name": "Video"}]
124
+ return [ExtractResult(url=url, name="Video")]
125
125
 
126
126
  # Eğer dizi bölümü ise (bizim oluşturduğumuz yapı)
127
127
  if veri.get("is_episode"):
128
- return [{
129
- "url" : veri.get("url"),
130
- "name" : veri.get("title", "Bölüm"),
131
- "user_agent" : "googleusercontent",
132
- "referer" : "https://twitter.com/"
133
- }]
128
+ return [ExtractResult(
129
+ url = veri.get("url"),
130
+ name = veri.get("title", "Bölüm"),
131
+ user_agent = "googleusercontent",
132
+ referer = "https://twitter.com/"
133
+ )]
134
134
 
135
135
  # Film ise (RecTV API yapısı)
136
136
  results = []
@@ -140,11 +140,11 @@ class RecTV(PluginBase):
140
140
  if "otolinkaff" in video_link:
141
141
  continue
142
142
 
143
- results.append({
144
- "url" : video_link,
145
- "name" : f"{veri.get('title')} - {kaynak.get('title')}",
146
- "user_agent" : "googleusercontent",
147
- "referer" : "https://twitter.com/"
148
- })
143
+ results.append(ExtractResult(
144
+ url = video_link,
145
+ name = f"{veri.get('title')} - {kaynak.get('title')}",
146
+ user_agent = "googleusercontent",
147
+ referer = "https://twitter.com/"
148
+ ))
149
149
 
150
150
  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, SeriesInfo, Episode, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, ExtractResult, MovieInfo
4
4
  from parsel import Selector
5
5
  import re, base64, json
6
6
 
@@ -169,7 +169,7 @@ class RoketDizi(PluginBase):
169
169
  year = year
170
170
  )
171
171
 
172
- async def load_links(self, url: str) -> list[dict]:
172
+ async def load_links(self, url: str) -> list[ExtractResult]:
173
173
  resp = await self.httpx.get(url)
174
174
  sel = Selector(resp.text)
175
175
 
@@ -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, SeriesInfo, Episode
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult
4
4
  from parsel import Selector
5
5
  import re, base64, json, urllib.parse
6
6
 
@@ -256,7 +256,7 @@ class SelcukFlix(PluginBase):
256
256
  duration = duration
257
257
  )
258
258
 
259
- async def load_links(self, url: str) -> list[dict]:
259
+ async def load_links(self, url: str) -> list[ExtractResult]:
260
260
  resp = await self.httpx.get(url)
261
261
  sel = Selector(resp.text)
262
262
 
@@ -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, SeriesInfo, Episode
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult
4
4
  from parsel import Selector
5
5
  import re, json
6
6
 
@@ -194,7 +194,7 @@ class SetFilmIzle(PluginBase):
194
194
  actors = actors
195
195
  )
196
196
 
197
- async def load_links(self, url: str) -> list[dict]:
197
+ async def load_links(self, url: str) -> list[ExtractResult]:
198
198
  istek = await self.httpx.get(url)
199
199
  secici = Selector(istek.text)
200
200
 
@@ -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
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, ExtractResult
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -114,7 +114,7 @@ class SezonlukDizi(PluginBase):
114
114
  except Exception:
115
115
  return ("22", "22") # Fallback to default versions
116
116
 
117
- async def load_links(self, url: str) -> list[dict]:
117
+ async def load_links(self, url: str) -> list[ExtractResult]:
118
118
  istek = await self.httpx.get(url)
119
119
  secici = Selector(istek.text)
120
120
 
@@ -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
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,10 +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
@@ -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,7 +223,7 @@ 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
 
@@ -235,7 +235,7 @@ class Sinefy(PluginBase):
235
235
 
236
236
  # Always return iframe (matching Kotlin - no extractor check)
237
237
  # loadExtractor in Kotlin handles extraction internally
238
- return [{
239
- "url" : iframe_url,
240
- "name" : "Sinefy Player"
241
- }]
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, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle, ExtractResult
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -12,20 +12,29 @@ class SinemaCX(PluginBase):
12
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,12 +139,12 @@ 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
150
  data = await self.extract(iframe)
@@ -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)
@@ -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
6
6
 
@@ -12,17 +12,26 @@ class SuperFilmGeldi(PluginBase):
12
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
 
@@ -104,12 +115,12 @@ 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
125
  # Extractor'a yönlendir
115
126
  data = await self.extract(iframe)
@@ -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):
@@ -79,7 +79,7 @@ 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 = []
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,7 +226,7 @@ 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]")
@@ -235,33 +235,33 @@ class KekikStream:
235
235
  # Direkt oynatma - tüm pluginlerde artık play metodu var (PluginBase'den miras)
236
236
  return await self.play_direct(links)
237
237
 
238
- async def play_direct(self, links: list[dict]):
238
+ async def play_direct(self, links: list[ExtractResult]):
239
239
  """Plugin'in kendi metoduyla oynat"""
240
240
  selected = await self.ui.select_from_list(
241
241
  message = "Bağlantı seçin:",
242
- 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]
243
243
  )
244
244
 
245
245
  if not selected:
246
246
  return await self.content_finished()
247
247
 
248
248
  self.update_title(self.episode_title)
249
- self.update_title(selected.get("name"))
249
+ self.update_title(selected.name)
250
250
 
251
251
  await self.current_plugin.play(
252
252
  name = self.media.get_title(),
253
- url = selected.get("url"),
254
- user_agent = selected.get("user_agent"),
255
- referer = selected.get("referer"),
256
- subtitles = selected.get("subtitles", [])
253
+ url = selected.url,
254
+ user_agent = selected.user_agent,
255
+ referer = selected.referer,
256
+ subtitles = selected.subtitles or []
257
257
  )
258
258
  return await self.content_finished()
259
259
 
260
- async def play_with_extractor(self, links: list[dict], mapping: dict):
260
+ async def play_with_extractor(self, links: list[ExtractResult], mapping: dict):
261
261
  """Extractor ile oynat"""
262
262
  options = [
263
- {"name": link.get("name", mapping[link["url"]]), "value": link}
264
- 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
265
265
  ]
266
266
 
267
267
  if not options:
@@ -272,7 +272,7 @@ class KekikStream:
272
272
  if not selected:
273
273
  return await self.content_finished()
274
274
 
275
- url = selected.get("url")
275
+ url = selected.url
276
276
  extractor: ExtractorBase = self.extractor.find_extractor(url)
277
277
 
278
278
  if not extractor:
@@ -280,7 +280,7 @@ class KekikStream:
280
280
  return await self.handle_no_results()
281
281
 
282
282
  try:
283
- referer = selected.get("referer", self.current_plugin.main_url)
283
+ referer = selected.referer or self.current_plugin.main_url
284
284
  extract_data = await extractor.extract(url, referer=referer)
285
285
  except Exception as e:
286
286
  konsol.print(f"[bold red]{extractor.name} hatası: {e}[/bold red]")
@@ -298,7 +298,7 @@ class KekikStream:
298
298
 
299
299
  # Başlıkları güncelle ve oynat
300
300
  self.update_title(self.episode_title)
301
- self.update_title(selected.get("name"))
301
+ self.update_title(selected.name)
302
302
  self.update_title(extract_data.name)
303
303
 
304
304
  self.media.play_media(extract_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.1.6
3
+ Version: 2.1.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
@@ -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