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, SeriesInfo, Episode
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, ExtractResult
4
4
  from parsel import Selector
5
5
  from json import loads
6
6
  from urllib.parse import urlparse, urlunparse
@@ -170,7 +170,7 @@ class Dizilla(PluginBase):
170
170
  actors = actors
171
171
  )
172
172
 
173
- async def load_links(self, url: str) -> list[dict]:
173
+ async def load_links(self, url: str) -> list[ExtractResult]:
174
174
  istek = await self.httpx.get(url)
175
175
  secici = Selector(istek.text)
176
176
 
@@ -179,17 +179,22 @@ class Dizilla(PluginBase):
179
179
  decrypted = await self.decrypt_response(secure_data)
180
180
  results = decrypted.get("RelatedResults", {}).get("getEpisodeSources", {}).get("result", [])
181
181
 
182
- links = []
183
- for result in results:
184
- iframe_src = Selector(result.get("source_content")).css("iframe::attr(src)").get()
185
- iframe_url = self.fix_url(iframe_src)
186
- if not iframe_url:
187
- continue
182
+ if not results:
183
+ return []
188
184
 
189
- extractor = self.ex_manager.find_extractor(iframe_url)
190
- links.append({
191
- "url" : iframe_url,
192
- "name" : f"{extractor.name if extractor else 'Main Player'} | {result.get('language_name')}",
193
- })
185
+ # Get first source (matching Kotlin)
186
+ first_result = results[0]
187
+ source_content = first_result.get("source_content", "")
188
+
189
+ # Clean the source_content string (matching Kotlin: .replace("\"", "").replace("\\", ""))
190
+ cleaned_source = source_content.replace('"', '').replace('\\', '')
191
+
192
+ # Parse cleaned HTML
193
+ iframe_src = Selector(cleaned_source).css("iframe::attr(src)").get()
194
+ iframe_url = self.fix_url(iframe_src)
195
+
196
+ if not iframe_url:
197
+ return []
194
198
 
195
- return links
199
+ data = await self.extract(iframe_url, prefix=first_result.get('language_name', 'Unknown'))
200
+ return [data] if data else []
@@ -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 FilmBip(PluginBase):
@@ -125,7 +125,7 @@ class FilmBip(PluginBase):
125
125
  actors = actors,
126
126
  )
127
127
 
128
- async def load_links(self, url: str) -> list[dict]:
128
+ async def load_links(self, url: str) -> list[ExtractResult]:
129
129
  istek = await self.httpx.get(url)
130
130
  secici = Selector(istek.text)
131
131
 
@@ -135,11 +135,8 @@ class FilmBip(PluginBase):
135
135
  iframe = self.fix_url(player.css("iframe::attr(src)").get())
136
136
 
137
137
  if iframe:
138
- extractor = self.ex_manager.find_extractor(iframe)
139
- results.append({
140
- "name" : extractor.name if extractor else "Player",
141
- "url" : iframe,
142
- "referer" : f"{self.main_url}/"
143
- })
138
+ data = await self.extract(iframe)
139
+ if data:
140
+ results.append(data)
144
141
 
145
142
  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 FilmMakinesi(PluginBase):
@@ -8,7 +8,7 @@ class FilmMakinesi(PluginBase):
8
8
  language = "tr"
9
9
  main_url = "https://filmmakinesi.to"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
- description = "Film Makinesi, en yeni ve en güncel filmleri sitemizde full HD kalite farkı ile izleyebilirsiniz. HD film izle denildiğinde akla gelen en kaliteli film izleme sitesi."
11
+ description = "Film Makinesi ile en yeni ve güncel filmleri Full HD kalite farkı ile izleyebilirsiniz. Film izle denildiğinde akla gelen en kaliteli film sitesi."
12
12
 
13
13
  main_page = {
14
14
  f"{main_url}/filmler-1/" : "Son Filmler",
@@ -75,18 +75,22 @@ class FilmMakinesi(PluginBase):
75
75
  istek = await self.httpx.get(url)
76
76
  secici = Selector(istek.text)
77
77
 
78
- title = secici.css("h1.title::text").get().strip()
79
- poster = secici.css("img.cover-img::attr(src)").get().strip()
80
- description = secici.css("div.info-description p::text").get().strip()
78
+ title = secici.css("h1.title::text").get()
79
+ title = title.strip() if title else ""
80
+ poster = secici.css("img.cover-img::attr(src)").get()
81
+ poster = poster.strip() if poster else ""
82
+ description = secici.css("div.info-description p::text").get()
83
+ description = description.strip() if description else ""
81
84
  rating = secici.css("div.score::text").get()
82
85
  if rating:
83
86
  rating = rating.strip().split()[0]
84
- year = secici.css("span.date a::text").get().strip()
87
+ year = secici.css("span.date a::text").get()
88
+ year = year.strip() if year else ""
85
89
  actors = secici.css("div.cast-name::text").getall()
86
90
  tags = secici.css("div.genre a::text").getall()
87
91
  duration = secici.css("div.time::text").get()
88
92
  if duration:
89
- duration = duration.split()[1].strip()
93
+ duration = duration.split()[1].strip() if len(duration.split()) > 1 else ""
90
94
 
91
95
  return MovieInfo(
92
96
  url = url,
@@ -100,22 +104,28 @@ class FilmMakinesi(PluginBase):
100
104
  duration = duration
101
105
  )
102
106
 
103
- async def load_links(self, url: str) -> list[dict]:
107
+ async def load_links(self, url: str) -> list[ExtractResult]:
104
108
  istek = await self.httpx.get(url)
105
109
  secici = Selector(istek.text)
106
110
 
107
- iframe_src = secici.css("iframe::attr(data-src)").get()
111
+ response = []
108
112
 
109
- all_links = [iframe_src] if iframe_src else []
113
+ # Video parts linklerini ve etiketlerini al
110
114
  for link in secici.css("div.video-parts a[data-video_url]"):
111
- all_links.append(link.attrib.get("data-video_url"))
112
-
113
- response = []
114
- for idx, link in enumerate(all_links):
115
- extractor = self.ex_manager.find_extractor(link)
116
- response.append({
117
- "url" : link,
118
- "name" : f"{extractor.name if extractor else f'Player {idx + 1}'}",
119
- })
120
-
121
- return response
115
+ video_url = link.attrib.get("data-video_url")
116
+ label = link.css("::text").get() or ""
117
+ label = label.strip()
118
+
119
+ data = await self.extract(video_url, prefix=label.split()[0] if label else None)
120
+ if data:
121
+ response.append(data)
122
+
123
+ # Eğer video-parts yoksa iframe kullan
124
+ if not response:
125
+ iframe_src = secici.css("iframe::attr(data-src)").get()
126
+ if iframe_src:
127
+ data = await self.extract(iframe_src)
128
+ if data:
129
+ response.append(data)
130
+
131
+ return response
@@ -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,7 +9,7 @@ class FilmModu(PluginBase):
9
9
  language = "tr"
10
10
  main_url = "https://www.filmmodu.ws"
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 = "Film modun geldiyse yüksek kalitede yeni filmleri izle, 1080p izleyebileceğiniz reklamsız tek film sitesi."
13
13
 
14
14
  main_page = {
15
15
  f"{main_url}/hd-film-kategori/4k-film-izle?page=SAYFA" : "4K",
@@ -87,13 +87,17 @@ class FilmModu(PluginBase):
87
87
  actors = [a.css("span::text").get() for a in secici.css("a[itemprop='actor']")],
88
88
  )
89
89
 
90
- async def load_links(self, url: str) -> list[dict]:
90
+ async def load_links(self, url: str) -> list[ExtractResult]:
91
91
  istek = await self.httpx.get(url)
92
92
  secici = Selector(istek.text)
93
93
 
94
+ alternates = secici.css("div.alternates a")
95
+ if not alternates:
96
+ return [] # No alternates available
97
+
94
98
  results = []
95
99
 
96
- for alternatif in secici.css("div.alternates a"):
100
+ for alternatif in alternates:
97
101
  alt_link = self.fix_url(alternatif.css("::attr(href)").get())
98
102
  alt_name = alternatif.css("::text").get()
99
103
 
@@ -120,19 +124,11 @@ class FilmModu(PluginBase):
120
124
  subtitle_url = None
121
125
 
122
126
  for source in source_data.get("sources", []):
123
- results.append({
124
- "name" : f"{self.name} | {alt_name} | {source.get('label', 'Bilinmiyor')}",
125
- "url" : self.fix_url(source["src"]),
126
- "referer" : f"{self.main_url}/",
127
- "subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
128
- })
127
+ results.append(ExtractResult(
128
+ name = f"{self.name} | {alt_name} | {source.get('label', 'Bilinmiyor')}",
129
+ url = self.fix_url(source["src"]),
130
+ referer = f"{self.main_url}/",
131
+ subtitles = [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
132
+ ))
129
133
 
130
134
  return results
131
-
132
- async def play(self, **kwargs):
133
- extract_result = ExtractResult(**kwargs)
134
- self.media_handler.title = kwargs.get("name")
135
- if self.name not in self.media_handler.title:
136
- self.media_handler.title = f"{self.name} | {self.media_handler.title}"
137
-
138
- 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, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, Subtitle
4
4
  from parsel import Selector
5
5
  import re, base64
6
6
 
@@ -14,23 +14,29 @@ class FullHDFilm(PluginBase):
14
14
  main_page = {
15
15
  f"{main_url}/tur/turkce-altyazili-film-izle" : "Altyazılı Filmler",
16
16
  f"{main_url}/tur/netflix-filmleri-izle" : "Netflix",
17
+ f"{main_url}/tur/yerli-film-izle" : "Yerli Film",
17
18
  f"{main_url}/category/aile-filmleri-izle" : "Aile",
18
19
  f"{main_url}/category/aksiyon-filmleri-izle" : "Aksiyon",
19
20
  f"{main_url}/category/animasyon-filmleri-izle" : "Animasyon",
20
21
  f"{main_url}/category/belgesel-filmleri-izle" : "Belgesel",
21
- f"{main_url}/category/bilim-kurgu-filmleri-izle" : "Bilim-Kurgu",
22
+ f"{main_url}/category/bilim-kurgu-filmleri-izle" : "Bilim Kurgu",
22
23
  f"{main_url}/category/biyografi-filmleri-izle" : "Biyografi",
23
24
  f"{main_url}/category/dram-filmleri-izle" : "Dram",
24
25
  f"{main_url}/category/fantastik-filmler-izle" : "Fantastik",
25
26
  f"{main_url}/category/gerilim-filmleri-izle" : "Gerilim",
26
27
  f"{main_url}/category/gizem-filmleri-izle" : "Gizem",
28
+ f"{main_url}/category/kisa" : "Kısa",
27
29
  f"{main_url}/category/komedi-filmleri-izle" : "Komedi",
28
30
  f"{main_url}/category/korku-filmleri-izle" : "Korku",
29
31
  f"{main_url}/category/macera-filmleri-izle" : "Macera",
32
+ f"{main_url}/category/muzik" : "Müzik",
33
+ f"{main_url}/category/muzikal-filmleri-izle" : "Müzikal",
30
34
  f"{main_url}/category/romantik-filmler-izle" : "Romantik",
31
35
  f"{main_url}/category/savas-filmleri-izle" : "Savaş",
36
+ f"{main_url}/category/spor-filmleri-izle" : "Spor",
32
37
  f"{main_url}/category/suc-filmleri-izle" : "Suç",
33
- f"{main_url}/tur/yerli-film-izle" : "Yerli Film",
38
+ f"{main_url}/category/tarih-filmleri-izle" : "Tarih",
39
+ f"{main_url}/category/western-filmleri-izle" : "Western",
34
40
  }
35
41
 
36
42
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
@@ -69,14 +75,13 @@ class FullHDFilm(PluginBase):
69
75
  if veri.css("img::attr(alt)").get()
70
76
  ]
71
77
 
72
- async def load_item(self, url: str) -> MovieInfo:
78
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
73
79
  istek = await self.httpx.get(url)
74
80
  secici = Selector(istek.text)
75
81
 
76
- title = secici.css("h1::text").get()
77
- poster = self.fix_url(secici.css("div.poster img::attr(src)").get())
78
- description = secici.css("div#details div.text::text").get() or \
79
- secici.css("div#details div::text").get()
82
+ title = secici.css("h1::text").get() or ""
83
+ title = title.strip() if title else ""
84
+ poster = self.fix_url(secici.css("div.poster img::attr(src)").get() or "")
80
85
 
81
86
  actors_text = secici.css("div.oyuncular.info::text").get()
82
87
  if actors_text:
@@ -89,20 +94,72 @@ class FullHDFilm(PluginBase):
89
94
  tags = secici.css("div.tur.info a::text").getall()
90
95
  rating = secici.css("div.imdb::text").re_first(r"IMDb\s*([\d\.]+)")
91
96
 
92
- # Açıklama usually above .others
97
+ # Description
93
98
  description = secici.xpath("//div[contains(@class, 'others')]/preceding-sibling::div[1]//text()").getall()
94
99
  description = "".join(description).strip() if description else None
95
100
 
96
- return MovieInfo(
97
- url = url,
98
- poster = poster,
99
- title = self.clean_title(title) if title else "",
100
- description = description,
101
- tags = tags,
102
- year = year,
103
- actors = actors,
104
- rating = rating.strip() if rating else None,
105
- )
101
+ # Kotlin referansı: URL'de -dizi kontrolü veya tags içinde "dizi" kontrolü
102
+ is_series = "-dizi" in url.lower() or any("dizi" in tag.lower() for tag in tags)
103
+
104
+ if is_series:
105
+ episodes = []
106
+ part_elements = secici.css("li.psec")
107
+ part_names = secici.css("li.psec a::text").getall()
108
+
109
+ # pdata değerlerini çıkar
110
+ pdata_matches = re.findall(r"pdata\['([^']+)'\]\s*=\s*'([^']+)'", istek.text)
111
+
112
+ for idx, (part_id, part_name) in enumerate(zip([el.css("::attr(id)").get() for el in part_elements], part_names)):
113
+ if not part_name:
114
+ continue
115
+
116
+ part_name = part_name.strip()
117
+
118
+ # Fragman'ları atla
119
+ if "fragman" in part_name.lower() or (part_id and "fragman" in part_id.lower()):
120
+ continue
121
+
122
+ # Sezon ve bölüm numarası çıkar
123
+ sz_match = re.search(r'(\d+)\s*sezon', part_id.lower() if part_id else "")
124
+ ep_match = re.search(r'^(\d+)\.', part_name)
125
+
126
+ sz_num = int(sz_match.group(1)) if sz_match else 1
127
+ ep_num = int(ep_match.group(1)) if ep_match else idx + 1
128
+
129
+ # pdata'dan video URL'si çık (varsa)
130
+ video_url = url # Varsayılan olarak ana URL kullan
131
+ if idx < len(pdata_matches):
132
+ video_url = pdata_matches[idx][1] if pdata_matches[idx][1] else url
133
+
134
+ episodes.append(Episode(
135
+ season = sz_num,
136
+ episode = ep_num,
137
+ title = f"{sz_num}. Sezon {ep_num}. Bölüm",
138
+ url = url # Bölüm URL'leri load_links'te işlenecek
139
+ ))
140
+
141
+ return SeriesInfo(
142
+ url = url,
143
+ poster = poster,
144
+ title = self.clean_title(title) if title else "",
145
+ description = description,
146
+ tags = tags,
147
+ year = year,
148
+ actors = actors,
149
+ rating = rating.strip() if rating else None,
150
+ episodes = episodes
151
+ )
152
+ else:
153
+ return MovieInfo(
154
+ url = url,
155
+ poster = poster,
156
+ title = self.clean_title(title) if title else "",
157
+ description = description,
158
+ tags = tags,
159
+ year = year,
160
+ actors = actors,
161
+ rating = rating.strip() if rating else None,
162
+ )
106
163
 
107
164
  def _get_iframe(self, source_code: str) -> str:
108
165
  """Base64 kodlu iframe'i çözümle"""
@@ -131,7 +188,7 @@ class FullHDFilm(PluginBase):
131
188
 
132
189
  return None
133
190
 
134
- async def load_links(self, url: str) -> list[dict]:
191
+ async def load_links(self, url: str) -> list[ExtractResult]:
135
192
  self.httpx.headers.update({
136
193
  "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
137
194
  "Referer" : self.main_url
@@ -153,12 +210,11 @@ class FullHDFilm(PluginBase):
153
210
  results = []
154
211
 
155
212
  if iframe_src:
156
- extractor = self.ex_manager.find_extractor(iframe_src)
157
- results.append({
158
- "name" : extractor.name if extractor else "FullHDFilm Player",
159
- "url" : iframe_src,
160
- "referer" : self.main_url,
161
- "subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
162
- })
213
+ data = await self.extract(iframe_src)
214
+ if data:
215
+ # ExtractResult objesi immutable, yeni bir kopya oluştur
216
+ subtitles = [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
217
+ updated_data = data.model_copy(update={"subtitles": subtitles}) if subtitles else data
218
+ results.append(updated_data)
163
219
 
164
220
  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
  from Kekik.Sifreleme import StringCodec
6
6
  import json, re
@@ -10,7 +10,7 @@ class FullHDFilmizlesene(PluginBase):
10
10
  language = "tr"
11
11
  main_url = "https://www.fullhdfilmizlesene.tv"
12
12
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
- description = "Sinema zevkini evinize kadar getirdik. Türkiye'nin lider Film sitesinde, en yeni filmleri Full HD izleyin."
13
+ description = "Türkiye'nin ilk ve lider HD film izleme platformu, kaliteli ve sorunsuz hizmetiyle sinema keyfini zirveye taşır."
14
14
 
15
15
  main_page = {
16
16
  f"{main_url}/en-cok-izlenen-hd-filmler/" : "En Çok izlenen Filmler",
@@ -100,7 +100,7 @@ class FullHDFilmizlesene(PluginBase):
100
100
  duration = duration
101
101
  )
102
102
 
103
- async def load_links(self, url: str) -> list[dict]:
103
+ async def load_links(self, url: str) -> list[ExtractResult]:
104
104
  istek = await self.httpx.get(url)
105
105
  secici = Selector(istek.text)
106
106
 
@@ -119,10 +119,8 @@ class FullHDFilmizlesene(PluginBase):
119
119
  response = []
120
120
  for link in link_list:
121
121
  link = f"https:{link}" if link.startswith("//") else link
122
- extractor = self.ex_manager.find_extractor(link)
123
- response.append({
124
- "url" : link,
125
- "name" : extractor.name if extractor else "Direct Link"
126
- })
122
+ data = await self.extract(link)
123
+ if data:
124
+ response.append(data)
127
125
 
128
126
  return response