KekikStream 2.3.9__py3-none-any.whl → 2.5.4__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 (85) hide show
  1. KekikStream/Core/Extractor/ExtractorBase.py +3 -2
  2. KekikStream/Core/Extractor/ExtractorLoader.py +8 -14
  3. KekikStream/Core/HTMLHelper.py +120 -49
  4. KekikStream/Core/Plugin/PluginBase.py +35 -12
  5. KekikStream/Core/Plugin/PluginLoader.py +12 -14
  6. KekikStream/Core/Plugin/PluginManager.py +2 -2
  7. KekikStream/Core/Plugin/PluginModels.py +0 -3
  8. KekikStream/Extractors/Abstream.py +27 -0
  9. KekikStream/Extractors/CloseLoad.py +30 -54
  10. KekikStream/Extractors/ContentX.py +27 -72
  11. KekikStream/Extractors/DonilasPlay.py +33 -77
  12. KekikStream/Extractors/DzenRu.py +10 -24
  13. KekikStream/Extractors/ExPlay.py +20 -38
  14. KekikStream/Extractors/Filemoon.py +21 -46
  15. KekikStream/Extractors/HDMomPlayer.py +30 -0
  16. KekikStream/Extractors/HDPlayerSystem.py +13 -31
  17. KekikStream/Extractors/HotStream.py +27 -0
  18. KekikStream/Extractors/JFVid.py +3 -24
  19. KekikStream/Extractors/JetTv.py +21 -34
  20. KekikStream/Extractors/JetV.py +55 -0
  21. KekikStream/Extractors/MailRu.py +11 -29
  22. KekikStream/Extractors/MixPlayHD.py +15 -28
  23. KekikStream/Extractors/MixTiger.py +17 -40
  24. KekikStream/Extractors/MolyStream.py +17 -21
  25. KekikStream/Extractors/Odnoklassniki.py +40 -104
  26. KekikStream/Extractors/PeaceMakerst.py +18 -45
  27. KekikStream/Extractors/PixelDrain.py +8 -16
  28. KekikStream/Extractors/PlayerFilmIzle.py +22 -41
  29. KekikStream/Extractors/RapidVid.py +21 -35
  30. KekikStream/Extractors/SetPlay.py +18 -43
  31. KekikStream/Extractors/SibNet.py +7 -17
  32. KekikStream/Extractors/Sobreatsesuyp.py +23 -45
  33. KekikStream/Extractors/TRsTX.py +23 -53
  34. KekikStream/Extractors/TurboImgz.py +7 -14
  35. KekikStream/Extractors/VCTPlay.py +10 -28
  36. KekikStream/Extractors/Veev.py +145 -0
  37. KekikStream/Extractors/VidBiz.py +62 -0
  38. KekikStream/Extractors/VidHide.py +58 -30
  39. KekikStream/Extractors/VidMoly.py +65 -99
  40. KekikStream/Extractors/VidMoxy.py +16 -27
  41. KekikStream/Extractors/VidPapi.py +24 -54
  42. KekikStream/Extractors/VideoSeyred.py +19 -40
  43. KekikStream/Extractors/Videostr.py +58 -0
  44. KekikStream/Extractors/Vidoza.py +18 -0
  45. KekikStream/Extractors/Vtbe.py +38 -0
  46. KekikStream/Extractors/YTDLP.py +2 -2
  47. KekikStream/Extractors/YildizKisaFilm.py +13 -31
  48. KekikStream/Extractors/Zeus.py +61 -0
  49. KekikStream/Plugins/BelgeselX.py +97 -77
  50. KekikStream/Plugins/DiziBox.py +28 -45
  51. KekikStream/Plugins/DiziMom.py +179 -0
  52. KekikStream/Plugins/DiziPal.py +95 -161
  53. KekikStream/Plugins/DiziYou.py +51 -147
  54. KekikStream/Plugins/Dizilla.py +40 -61
  55. KekikStream/Plugins/FilmBip.py +90 -39
  56. KekikStream/Plugins/FilmEkseni.py +199 -0
  57. KekikStream/Plugins/FilmMakinesi.py +72 -73
  58. KekikStream/Plugins/FilmModu.py +25 -35
  59. KekikStream/Plugins/Filmatek.py +184 -0
  60. KekikStream/Plugins/FilmciBaba.py +155 -0
  61. KekikStream/Plugins/FullHDFilmizlesene.py +16 -37
  62. KekikStream/Plugins/HDFilm.py +243 -0
  63. KekikStream/Plugins/HDFilmCehennemi.py +242 -189
  64. KekikStream/Plugins/JetFilmizle.py +101 -69
  65. KekikStream/Plugins/KultFilmler.py +138 -104
  66. KekikStream/Plugins/RecTV.py +52 -73
  67. KekikStream/Plugins/RoketDizi.py +18 -27
  68. KekikStream/Plugins/SelcukFlix.py +30 -48
  69. KekikStream/Plugins/SetFilmIzle.py +76 -104
  70. KekikStream/Plugins/SezonlukDizi.py +90 -94
  71. KekikStream/Plugins/Sinefy.py +195 -167
  72. KekikStream/Plugins/SinemaCX.py +148 -78
  73. KekikStream/Plugins/Sinezy.py +29 -31
  74. KekikStream/Plugins/SuperFilmGeldi.py +12 -17
  75. KekikStream/Plugins/UgurFilm.py +85 -38
  76. KekikStream/Plugins/Watch32.py +160 -0
  77. KekikStream/Plugins/YabanciDizi.py +176 -211
  78. {kekikstream-2.3.9.dist-info → kekikstream-2.5.4.dist-info}/METADATA +1 -1
  79. kekikstream-2.5.4.dist-info/RECORD +99 -0
  80. {kekikstream-2.3.9.dist-info → kekikstream-2.5.4.dist-info}/WHEEL +1 -1
  81. KekikStream/Plugins/FullHDFilm.py +0 -249
  82. kekikstream-2.3.9.dist-info/RECORD +0 -84
  83. {kekikstream-2.3.9.dist-info → kekikstream-2.5.4.dist-info}/entry_points.txt +0 -0
  84. {kekikstream-2.3.9.dist-info → kekikstream-2.5.4.dist-info}/licenses/LICENSE +0 -0
  85. {kekikstream-2.3.9.dist-info → kekikstream-2.5.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,184 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
4
+ from urllib.parse import unquote
5
+ from contextlib import suppress
6
+
7
+ class Filmatek(PluginBase):
8
+ name = "Filmatek"
9
+ language = "tr"
10
+ main_url = "https://filmatek.net"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Sosyalizmin Sineması Veritabanı"
13
+
14
+ main_page = {
15
+ f"{main_url}/tur/aile/page" : "Aile",
16
+ f"{main_url}/tur/aksiyon/page" : "Aksiyon",
17
+ f"{main_url}/tur/animasyon/page" : "Animasyon",
18
+ f"{main_url}/tur/bilim-kurgu/page" : "Bilim Kurgu",
19
+ f"{main_url}/tur/komedi/page" : "Komedi",
20
+ f"{main_url}/tur/korku/page" : "Korku",
21
+ f"{main_url}/tur/macera/page" : "Macera",
22
+ f"{main_url}/tur/romantik/page" : "Romantik",
23
+ f"{main_url}/tur/suc/page" : "Suç",
24
+ f"{main_url}/tur/yerli-filmler/page" : "Yerli Filmler",
25
+ f"{main_url}/film-arsivi/page" : "Tüm Filmler",
26
+ }
27
+
28
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
29
+ istek = await self.httpx.get(f"{url}/{page}/")
30
+ secici = HTMLHelper(istek.text)
31
+
32
+ results = []
33
+ for item in secici.select("div.items article, #archive-content article"):
34
+ title_el = secici.select_first("div.data h3 a, h3 a", item)
35
+ if not title_el:
36
+ continue
37
+
38
+ title = title_el.text(strip=True)
39
+ href = self.fix_url(title_el.attrs.get("href"))
40
+ poster = self.fix_url(secici.select_poster("img", item))
41
+
42
+ results.append(MainPageResult(
43
+ category = category,
44
+ title = title,
45
+ url = href,
46
+ poster = poster
47
+ ))
48
+
49
+ return results
50
+
51
+ async def search(self, query: str) -> list[SearchResult]:
52
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
53
+ secici = HTMLHelper(istek.text)
54
+
55
+ results = []
56
+ for item in secici.select("div.result-item"):
57
+ title_el = secici.select_first("div.title a", item)
58
+ if not title_el:
59
+ continue
60
+
61
+ title = title_el.text(strip=True)
62
+ href = self.fix_url(title_el.attrs.get("href"))
63
+ poster = self.fix_url(secici.select_poster("div.image img", item))
64
+
65
+ results.append(SearchResult(
66
+ title = title,
67
+ url = href,
68
+ poster = poster
69
+ ))
70
+
71
+ return results
72
+
73
+ async def load_item(self, url: str) -> MovieInfo:
74
+ istek = await self.httpx.get(url)
75
+ secici = HTMLHelper(istek.text)
76
+
77
+ title = self.clean_title(secici.select_text("div.data h1, h1"))
78
+ poster = secici.select_poster("div.poster img") or secici.select_attr("meta[property='og:image']", "content")
79
+ description = secici.select_text("div.wp-content p") or secici.select_attr("meta[property='og:description']", "content")
80
+ year = secici.extract_year("span.date")
81
+ rating = secici.select_text("span.dt_rating_vgs") or secici.select_text("span.dt_rating_vmanual")
82
+ duration = secici.regex_first(r"(\d+)", secici.select_text("span.runtime"))
83
+ tags = secici.select_texts("div.sgeneros a")
84
+ actors = secici.select_texts("div.person div.name a")
85
+
86
+ return MovieInfo(
87
+ url = url,
88
+ title = title,
89
+ description = description,
90
+ poster = self.fix_url(poster),
91
+ year = year,
92
+ rating = rating,
93
+ duration = duration,
94
+ tags = tags,
95
+ actors = actors
96
+ )
97
+
98
+ async def load_links(self, url: str) -> list[ExtractResult]:
99
+ istek = await self.httpx.get(url)
100
+ secici = HTMLHelper(istek.text)
101
+
102
+ # Player seçeneklerini bul
103
+ options = secici.select("div#playeroptions ul.ajax_mode li.dooplay_player_option")
104
+ if not options:
105
+ # Fallback: Body class'tan post_id
106
+ body_class = secici.select_attr("body", "class") or ""
107
+ if pid := secici.regex_first(r"postid-(\d+)", body_class):
108
+ options = [{"data-post": pid, "data-nume": "1", "data-type": "movie", "title": "Varsayılan"}]
109
+ else:
110
+ options = []
111
+
112
+ results = []
113
+ for opt in options:
114
+ if isinstance(opt, dict):
115
+ post_id = opt.get("data-post")
116
+ nume = opt.get("data-nume")
117
+ type_ = opt.get("data-type")
118
+ title = opt.get("title")
119
+ else:
120
+ post_id = opt.attrs.get("data-post")
121
+ nume = opt.attrs.get("data-nume")
122
+ type_ = opt.attrs.get("data-type")
123
+ title = secici.select_text("span.title", opt)
124
+
125
+ if not post_id or not nume:
126
+ continue
127
+
128
+ try:
129
+ # Need to use post with data
130
+ player_resp = await self.httpx.post(
131
+ url = f"{self.main_url}/wp-admin/admin-ajax.php",
132
+ headers = {
133
+ "X-Requested-With" : "XMLHttpRequest",
134
+ "Referer" : url,
135
+ "Content-Type" : "application/x-www-form-urlencoded"
136
+ },
137
+ data = {
138
+ "action" : "doo_player_ajax",
139
+ "post" : post_id,
140
+ "nume" : nume,
141
+ "type" : type_
142
+ }
143
+ )
144
+
145
+ content = player_resp.text.replace(r"\/", "/")
146
+ iframe_url = secici.regex_first(r'(?:src|url)["\']?\s*[:=]\s*["\']([^"\']+)["\']', content)
147
+
148
+ if iframe_url:
149
+ if iframe_url.startswith("/"):
150
+ iframe_url = self.main_url + iframe_url
151
+
152
+ iframe_url = self.fix_url(iframe_url)
153
+
154
+ # Unwrap internal JWPlayer
155
+ if "jwplayer/?source=" in iframe_url:
156
+ with suppress(Exception):
157
+ raw_source = iframe_url.split("source=")[1].split("&")[0]
158
+ iframe_url = unquote(raw_source)
159
+
160
+ # Direct media files
161
+ if ".m3u8" in iframe_url or ".mp4" in iframe_url:
162
+ results.append(ExtractResult(
163
+ name = f"{title} | Direct",
164
+ url = iframe_url,
165
+ referer = url
166
+ ))
167
+ else:
168
+ extracted = await self.extract(iframe_url, prefix=title)
169
+ if extracted:
170
+ if isinstance(extracted, list):
171
+ results.extend(extracted)
172
+ else:
173
+ results.append(extracted)
174
+ else:
175
+ results.append(ExtractResult(
176
+ name = f"{title} | External",
177
+ url = iframe_url,
178
+ referer = url
179
+ ))
180
+ except Exception as e:
181
+ # print(f"Filmatek Error: {e}")
182
+ pass
183
+
184
+ return results
@@ -0,0 +1,155 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, HTMLHelper
4
+
5
+ class FilmciBaba(PluginBase):
6
+ name = "FilmciBaba"
7
+ language = "tr"
8
+ main_url = "https://4kizle.live"
9
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
10
+ description = "Filmci Baba, film izleme sitesi 4k Full film izle, 1080p ve 4k kalite de sinema filmleri ve dizileri, tek parça hd kalitede türkçe dublajlı filmler seyret."
11
+
12
+ main_page = {
13
+ f"{main_url}/Kategori/en-populer-filmler/page" : "En Popüler Filmler",
14
+ f"{main_url}/Kategori/tur/aksiyon-filmleri/page" : "Aksiyon",
15
+ f"{main_url}/Kategori/tur/macera-filmleri/page" : "Macera",
16
+ f"{main_url}/Kategori/tur/bilim-kurgu-filmleri/page" : "Bilim Kurgu",
17
+ f"{main_url}/Kategori/tur/fantastik-filmler/page" : "Fantastik",
18
+ f"{main_url}/Kategori/tur/korku-filmleri/page" : "Korku",
19
+ f"{main_url}/Kategori/tur/gerilim-filmleri-hd/page" : "Gerilim",
20
+ f"{main_url}/Kategori/tur/gizem-filmleri/page" : "Gizem",
21
+ f"{main_url}/Kategori/tur/dram-filmleri-hd/page" : "Dram",
22
+ f"{main_url}/Kategori/tur/komedi-filmleri-hd/page" : "Komedi",
23
+ f"{main_url}/Kategori/tur/romantik-filmler/page" : "Romantik",
24
+ f"{main_url}/Kategori/tur/aile-filmleri/page" : "Aile",
25
+ f"{main_url}/Kategori/tur/animasyon-filmleri/page" : "Animasyon",
26
+ f"{main_url}/Kategori/tur/biyografi-filmleri/page" : "Biyografi",
27
+ f"{main_url}/Kategori/tur/polisiye-suc-filmleri/page" : "Polisiye / Suç",
28
+ f"{main_url}/Kategori/tur/savas-filmleri/page" : "Savaş",
29
+ f"{main_url}/Kategori/tur/western-filmler/page" : "Western",
30
+ f"{main_url}/Kategori/tur/hint-filmleri/page" : "Hint Filmleri",
31
+ f"{main_url}/Kategori/tur/kore-filmleri/page" : "Kore Filmleri",
32
+ f"{main_url}/Kategori/tur/yerli-filmler-izle/page" : "Yerli Filmler",
33
+ f"{main_url}/Kategori/tur/yerli-diziler/page" : "Yerli Diziler",
34
+ f"{main_url}/Kategori/tur/18-erotik-filmler/page" : "+18 Erotik Filmler",
35
+ }
36
+
37
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
38
+ istek = await self.httpx.get(f"{url}/{page}/")
39
+ secici = HTMLHelper(istek.text)
40
+
41
+ results = []
42
+ for item in secici.select("div.movie-preview"):
43
+ title_el = secici.select_first(".movie-title a", item)
44
+ if not title_el:
45
+ continue
46
+
47
+ title = self.clean_title(title_el.text(strip=True))
48
+ href = self.fix_url(title_el.attrs.get("href"))
49
+ poster = self.fix_url(secici.select_poster(".movie-poster img", item))
50
+
51
+ results.append(MainPageResult(
52
+ category = category,
53
+ title = title,
54
+ url = href,
55
+ poster = poster
56
+ ))
57
+
58
+ return results
59
+
60
+ async def search(self, query: str) -> list[SearchResult]:
61
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
62
+ secici = HTMLHelper(istek.text)
63
+
64
+ results = []
65
+ for item in secici.select("div.movie-preview"):
66
+ title_el = secici.select_first(".movie-title a", item)
67
+ if not title_el:
68
+ continue
69
+
70
+ title = self.clean_title(title_el.text(strip=True))
71
+ href = self.fix_url(title_el.attrs.get("href"))
72
+ poster = self.fix_url(secici.select_poster(".movie-poster img", item))
73
+
74
+ results.append(SearchResult(
75
+ title = title,
76
+ url = href,
77
+ poster = poster
78
+ ))
79
+
80
+ return results
81
+
82
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
83
+ istek = await self.httpx.get(url)
84
+ secici = HTMLHelper(istek.text)
85
+
86
+ title = self.clean_title(secici.select_text("h1"))
87
+ poster = secici.select_poster(".poster img")
88
+ description = secici.select_text(".excerpt p")
89
+ year = secici.extract_year(".release", ".movie-info")
90
+ rating = secici.regex_first(r"([\d\.]+)", secici.select_text(".imdb-rating"))
91
+ tags = secici.select_texts("div.categories a[href*='/Kategori/tur/']")
92
+ actors = secici.select_texts("a[href*='/oyuncular/']") or secici.select_texts(".cast-list .actor-name, .cast-list a")
93
+
94
+ # Bölüm linklerini kontrol et
95
+ ep_elements = secici.select(".parts-middle a, .parts-middle .part.active")
96
+
97
+ if not ep_elements:
98
+ return MovieInfo(
99
+ url = url,
100
+ title = title,
101
+ description = description,
102
+ poster = self.fix_url(poster),
103
+ year = year,
104
+ rating = rating if rating != "." else None,
105
+ tags = tags,
106
+ actors = actors
107
+ )
108
+
109
+ episodes = []
110
+ for i, el in enumerate(ep_elements):
111
+ name = secici.select_text(".part-name", el) or f"Bölüm {i+1}"
112
+ href = el.attrs.get("href") or url
113
+ s, e = secici.extract_season_episode(name)
114
+ episodes.append(Episode(season=s or 1, episode=e or (i + 1), title=name, url=self.fix_url(href)))
115
+
116
+ return SeriesInfo(
117
+ url = url,
118
+ title = title,
119
+ description = description,
120
+ poster = self.fix_url(poster),
121
+ year = year,
122
+ rating = rating,
123
+ tags = tags,
124
+ actors = actors,
125
+ episodes = episodes
126
+ )
127
+
128
+ async def load_links(self, url: str) -> list[ExtractResult]:
129
+ istek = await self.httpx.get(url)
130
+ secici = HTMLHelper(istek.text)
131
+
132
+ iframe = secici.select_attr(".center-container iframe", "src")
133
+ if not iframe:
134
+ iframe = secici.select_attr("iframe[src*='hotstream.club']", "src")
135
+
136
+ results = []
137
+
138
+ if iframe:
139
+ iframe = self.fix_url(iframe)
140
+
141
+ # Use general extract method
142
+ extracted = await self.extract(iframe)
143
+ if extracted:
144
+ if isinstance(extracted, list):
145
+ results.extend(extracted)
146
+ else:
147
+ results.append(extracted)
148
+ else:
149
+ results.append(ExtractResult(
150
+ name = "FilmciBaba | External",
151
+ url = iframe,
152
+ referer = url
153
+ ))
154
+
155
+ return results
@@ -54,7 +54,7 @@ class FullHDFilmizlesene(PluginBase):
54
54
  category = category,
55
55
  title = title,
56
56
  url = self.fix_url(href),
57
- poster = self.fix_url(poster) if poster else None,
57
+ poster = self.fix_url(poster),
58
58
  ))
59
59
 
60
60
  return results
@@ -65,15 +65,15 @@ class FullHDFilmizlesene(PluginBase):
65
65
 
66
66
  results = []
67
67
  for film in secici.select("li.film"):
68
- title = secici.select_text("span.film-title", film)
69
- href = secici.select_attr("a", "href", film)
68
+ title = secici.select_text("span.film-title", film)
69
+ href = secici.select_attr("a", "href", film)
70
70
  poster = secici.select_attr("img", "data-src", film)
71
71
 
72
72
  if title and href:
73
73
  results.append(SearchResult(
74
74
  title = title,
75
75
  url = self.fix_url(href),
76
- poster = self.fix_url(poster) if poster else None,
76
+ poster = self.fix_url(poster),
77
77
  ))
78
78
 
79
79
  return results
@@ -81,38 +81,19 @@ class FullHDFilmizlesene(PluginBase):
81
81
  async def load_item(self, url: str) -> MovieInfo:
82
82
  istek = await self.httpx.get(url)
83
83
  secici = HTMLHelper(istek.text)
84
- html_text = istek.text
85
84
 
86
- # Title: normalize-space yerine doğrudan class ile
87
- title = secici.select_text("div.izle-titles") or ""
88
-
89
- poster = secici.select_attr("div img[data-src]", "data-src") or ""
90
- poster = poster.strip()
91
-
92
- description = secici.select_text("div.ozet-ic p") or ""
93
-
94
- tags = secici.select_all_text("a[rel='category tag']")
95
-
96
- # Rating: regex ile sayısal değeri yakala
97
- rating_text = secici.select_text("div.puanx-puan") or ""
98
- rating = secici.regex_first(r"(\d+\.\d+|\d+)", rating_text)
99
-
100
- # Year: ilk yıl formatında değer
101
- year_text = secici.select_text("div.dd a.category") or ""
102
- year = secici.regex_first(r"(\d{4})", year_text)
103
-
104
- # Actors: nth-child yerine tüm li'leri alıp 2. index
105
- lis = secici.select("div.film-info ul li")
106
- actors = []
107
- if len(lis) >= 2:
108
- actors = secici.select_all_text("a > span", lis[1])
109
-
110
- # Duration: regex ile yakala (örn: 201 dk)
111
- duration = secici.regex_first(r"(\d+)\s*(?:dk|dakika)", html_text)
85
+ title = self.clean_title(secici.select_text("div.izle-titles"))
86
+ poster = secici.select_poster("div img[data-src]")
87
+ description = secici.select_text("div.ozet-ic")
88
+ tags = secici.select_texts("a[rel='category tag']")
89
+ rating = secici.regex_first(r"(\d+\.\d+|\d+)", secici.select_text("div.puanx-puan"))
90
+ year = secici.extract_year("div.dd a.category")
91
+ actors = secici.select_texts("a > span", secici.select_first("div.film-info ul li:nth-child(2)"))
92
+ duration = secici.regex_first(r"Süre: (\d+)\s*dk", secici.select_text("div.ozet-ic"))
112
93
 
113
94
  return MovieInfo(
114
95
  url = url,
115
- poster = self.fix_url(poster) if poster else None,
96
+ poster = self.fix_url(poster),
116
97
  title = title,
117
98
  description = description,
118
99
  tags = tags,
@@ -125,10 +106,9 @@ class FullHDFilmizlesene(PluginBase):
125
106
  async def load_links(self, url: str) -> list[ExtractResult]:
126
107
  istek = await self.httpx.get(url)
127
108
  secici = HTMLHelper(istek.text)
128
- html_text = istek.text
129
109
 
130
110
  # İlk script'i al (xpath (//script)[1] yerine)
131
- scripts = secici.select("script")
111
+ scripts = secici.select("script")
132
112
  script_content = scripts[0].text() if scripts else ""
133
113
 
134
114
  scx_json = HTMLHelper(script_content).regex_first(r"scx = (.*?);")
@@ -148,9 +128,8 @@ class FullHDFilmizlesene(PluginBase):
148
128
 
149
129
  response = []
150
130
  for link in link_list:
151
- link = f"https:{link}" if link.startswith("//") else link
152
- data = await self.extract(link)
131
+ data = await self.extract(self.fix_url(link))
153
132
  if data:
154
133
  response.append(data)
155
134
 
156
- return response
135
+ return response