KekikStream 2.4.7__py3-none-any.whl → 2.4.9__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.

Potentially problematic release.


This version of KekikStream might be problematic. Click here for more details.

@@ -54,7 +54,7 @@ class Dizilla(PluginBase):
54
54
 
55
55
  # Genel olarak dizi sayfalarına giden linkleri al
56
56
  for veri in secici.select('a[href*="/dizi/"]'):
57
- href = secici.select_attr('a', 'href', veri)
57
+ href = secici.select_attr('a', 'href', veri)
58
58
  title = secici.select_text(None, veri)
59
59
  if not href or not title:
60
60
  continue
@@ -118,7 +118,7 @@ class Dizilla(PluginBase):
118
118
  SearchResult(
119
119
  title = veri.get("object_name"),
120
120
  url = self.fix_url(f"{self.main_url}/{veri.get('used_slug')}"),
121
- poster = self.fix_poster_url(self.fix_url(veri.get("poster_url"))),
121
+ poster = self.fix_poster_url(self.fix_url(veri.get("object_poster_url"))),
122
122
  )
123
123
  for veri in arama_veri
124
124
  ]
@@ -1,6 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
4
+ from contextlib import suppress
4
5
 
5
6
  class FilmBip(PluginBase):
6
7
  name = "FilmBip"
@@ -123,12 +124,8 @@ class FilmBip(PluginBase):
123
124
  secici = HTMLHelper(istek.text)
124
125
 
125
126
  results = []
126
- # Tabs (Diller)
127
- tabs = secici.select("ul.tab.alternative-group li[data-number]")
128
-
129
- for tab in tabs:
127
+ for tab in secici.select("ul.tab.alternative-group li[data-number]"):
130
128
  tab_id = tab.attrs.get("data-number")
131
- # Tab ismini al
132
129
  tab_name = secici.select_text(None, tab)
133
130
  tab_hash = tab.attrs.get("data-group-hash")
134
131
 
@@ -148,7 +145,7 @@ class FilmBip(PluginBase):
148
145
 
149
146
  elif tab_hash:
150
147
  # Div yok veya boş, AJAX ile çek
151
- try:
148
+ with suppress(Exception):
152
149
  hash_resp = await self.httpx.post(
153
150
  url = f"{self.main_url}/get/video/group",
154
151
  headers = {
@@ -175,11 +172,9 @@ class FilmBip(PluginBase):
175
172
  sub_btns = sub_helper.select("ul li button")
176
173
  for btn in sub_btns:
177
174
  button_data.append((btn.text(strip=True), btn.attrs.get("data-hhs")))
178
- except Exception:
179
- pass
180
175
 
181
176
  for player_name, iframe_url in button_data:
182
- try:
177
+ with suppress(Exception):
183
178
  if iframe_url:
184
179
  data = await self.extract(
185
180
  url = self.fix_url(iframe_url),
@@ -190,8 +185,6 @@ class FilmBip(PluginBase):
190
185
  results.extend(data)
191
186
  else:
192
187
  results.append(data)
193
- except Exception:
194
- pass
195
188
 
196
189
  # Eğer hiç sonuç bulunamazsa fallback
197
190
  if not results:
@@ -1,6 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
4
+ import asyncio
4
5
 
5
6
  class FilmEkseni(PluginBase):
6
7
  name = "FilmEkseni"
@@ -30,17 +31,17 @@ class FilmEkseni(PluginBase):
30
31
 
31
32
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
32
33
  istek = await self.httpx.get(f"{url}/{page}/")
33
- helper = HTMLHelper(istek.text)
34
- posters = helper.select("div.poster")
34
+ secici = HTMLHelper(istek.text)
35
+ posters = secici.select("div.poster")
35
36
 
36
37
  return [
37
38
  MainPageResult(
38
39
  category = category,
39
- title = self.clean_title(helper.select_text("h2", veri)),
40
- url = helper.select_attr("a", "href", veri),
41
- poster = helper.select_attr("img", "data-src", veri)
40
+ title = self.clean_title(secici.select_text("h2", veri)),
41
+ url = secici.select_attr("a", "href", veri),
42
+ poster = secici.select_attr("img", "data-src", veri)
42
43
  )
43
- for veri in posters
44
+ for veri in posters
44
45
  ]
45
46
 
46
47
  async def search(self, query: str) -> list[SearchResult]:
@@ -62,21 +63,21 @@ class FilmEkseni(PluginBase):
62
63
  url = f"{self.main_url}/{veri.get('slug')}",
63
64
  poster = f"{self.main_url}/uploads/poster/{veri.get('cover')}" if veri.get('cover') else None,
64
65
  )
65
- for veri in veriler
66
+ for veri in veriler
66
67
  ]
67
68
 
68
69
  async def load_item(self, url: str) -> MovieInfo:
69
70
  istek = await self.httpx.get(url)
70
- helper = HTMLHelper(istek.text)
71
+ secici = HTMLHelper(istek.text)
71
72
 
72
- title = self.clean_title(helper.select_text("div.page-title h1"))
73
- poster = helper.select_poster("picture.poster-auto img")
74
- description = helper.select_direct_text("article.text-white p")
75
- year = helper.extract_year("div.page-title", "strong a")
76
- tags = helper.select_texts("div.pb-2 a[href*='/tur/']")
77
- rating = helper.select_text("div.rate")
78
- duration = helper.regex_first(r"(\d+)", helper.select_text("div.d-flex.flex-column.text-nowrap"))
79
- actors = helper.select_texts("div.card-body.p-0.pt-2 .story-item .story-item-title")
73
+ title = self.clean_title(secici.select_text("div.page-title h1"))
74
+ poster = secici.select_poster("picture.poster-auto img")
75
+ description = secici.select_direct_text("article.text-white p")
76
+ year = secici.extract_year("div.page-title", "strong a")
77
+ tags = secici.select_texts("div.pb-2 a[href*='/tur/']")
78
+ rating = secici.select_text("div.rate")
79
+ duration = secici.regex_first(r"(\d+)", secici.select_text("div.d-flex.flex-column.text-nowrap"))
80
+ actors = secici.select_texts("div.card-body.p-0.pt-2 .story-item .story-item-title")
80
81
 
81
82
  return MovieInfo(
82
83
  url = url,
@@ -90,51 +91,24 @@ class FilmEkseni(PluginBase):
90
91
  duration = duration
91
92
  )
92
93
 
93
- async def load_links(self, url: str) -> list[ExtractResult]:
94
- istek = await self.httpx.get(url)
95
- helper = HTMLHelper(istek.text)
96
-
97
- results = []
98
- sources = [] # (name, url, is_active)
99
-
100
- nav_links = helper.select("nav.card-nav a.nav-link")
101
- if nav_links:
102
- seen_urls = set()
103
- for link in nav_links:
104
- if link.attrs.get("href") == "#":
105
- continue # Sinema Modu vb.
106
-
107
- name = link.text(strip=True)
108
- href = link.attrs.get("href")
109
- is_active = "active" in link.attrs.get("class", "")
110
-
111
- if href and href not in seen_urls:
112
- seen_urls.add(href)
113
- sources.append((name, href, is_active))
114
- else:
115
- # Nav yoksa mevcut sayfayı (Varsayılan/VIP) al
116
- sources.append(("VIP", url, True))
117
-
118
- for name, link_url, is_active in sources:
119
- current_helper = helper
120
-
121
- # Eğer aktif değilse sayfaya git
122
- if not is_active:
123
- try:
124
- resp = await self.httpx.get(link_url)
125
- current_helper = HTMLHelper(resp.text)
126
- except:
127
- continue
94
+ async def _get_source_links(self, name: str, url: str, is_active: bool, initial_helper: HTMLHelper | None = None) -> list[ExtractResult]:
95
+ try:
96
+ if is_active and initial_helper:
97
+ secici = initial_helper
98
+ else:
99
+ resp = await self.httpx.get(url)
100
+ secici = HTMLHelper(resp.text)
128
101
 
129
- iframe = current_helper.select_first("div.card-video iframe")
102
+ iframe = secici.select_first("div.card-video iframe")
130
103
  if not iframe:
131
- continue
104
+ return []
132
105
 
133
106
  iframe_url = iframe.attrs.get("data-src") or iframe.attrs.get("src")
134
107
  if not iframe_url:
135
- continue
108
+ return []
136
109
 
137
110
  iframe_url = self.fix_url(iframe_url)
111
+ results = []
138
112
 
139
113
  # VIP / EksenLoad mantığı
140
114
  if "eksenload" in iframe_url or name == "VIP":
@@ -155,4 +129,34 @@ class FilmEkseni(PluginBase):
155
129
  else:
156
130
  results.append(extracted)
157
131
 
158
- return results
132
+ return results
133
+ except Exception:
134
+ return []
135
+
136
+ async def load_links(self, url: str) -> list[ExtractResult]:
137
+ istek = await self.httpx.get(url)
138
+ secici = HTMLHelper(istek.text)
139
+
140
+ sources = [] # (name, url, is_active)
141
+ if nav_links := secici.select("nav.card-nav a.nav-link"):
142
+ seen_urls = set()
143
+ for link in nav_links:
144
+ if link.attrs.get("href") == "#":
145
+ continue # Sinema Modu vb.
146
+
147
+ name = link.text(strip=True)
148
+ href = link.attrs.get("href")
149
+ is_active = "active" in link.attrs.get("class", "")
150
+
151
+ if href and href not in seen_urls:
152
+ seen_urls.add(href)
153
+ sources.append((name, href, is_active))
154
+ else:
155
+ # Nav yoksa mevcut sayfayı (Varsayılan/VIP) al
156
+ sources.append(("VIP", url, True))
157
+
158
+ tasks = []
159
+ for name, link_url, is_active in sources:
160
+ tasks.append(self._get_source_links(name, link_url, is_active, secici if is_active else None))
161
+
162
+ return [item for sublist in await asyncio.gather(*tasks) for item in sublist]
@@ -79,7 +79,7 @@ class FilmMakinesi(PluginBase):
79
79
  title = self.clean_title(secici.select_text("h1.title"))
80
80
  poster = secici.select_poster("img.cover-img")
81
81
  description = secici.select_text("div.info-description p")
82
- rating = secici.regex_first(r"(\d+[\d.]*)", secici.select_text("div.score"))
82
+ rating = secici.select_text("div.info div.imdb b")
83
83
  year = secici.select_text("span.date a")
84
84
  actors = secici.select_texts("div.cast-name")
85
85
  tags = secici.select_texts("div.type a[href*='/tur/']")
@@ -91,7 +91,12 @@ class FilmMakinesi(PluginBase):
91
91
  s, e = secici.extract_season_episode(href)
92
92
  if s and e:
93
93
  name = link.text(strip=True).split("Bölüm")[-1].strip() if "Bölüm" in link.text() else ""
94
- episodes.append(Episode(season=s, episode=e, title=name, url=self.fix_url(href)))
94
+ episodes.append(Episode(
95
+ season = s,
96
+ episode = e,
97
+ title = name,
98
+ url = self.fix_url(href)
99
+ ))
95
100
 
96
101
  # Tekrar edenleri temizle ve sırala
97
102
  if episodes:
@@ -132,7 +137,8 @@ class FilmMakinesi(PluginBase):
132
137
  istek = await self.httpx.get(url)
133
138
  secici = HTMLHelper(istek.text)
134
139
 
135
- response = []
140
+ response = []
141
+ shared_subs = []
136
142
 
137
143
  # Video parts linklerini ve etiketlerini al
138
144
  for link in secici.select("div.video-parts a[data-video_url]"):
@@ -142,7 +148,15 @@ class FilmMakinesi(PluginBase):
142
148
  if video_url:
143
149
  data = await self.extract(video_url, prefix=label.split()[0] if label else None)
144
150
  if data:
145
- response.append(data)
151
+ if isinstance(data, list):
152
+ for d in data:
153
+ response.append(d)
154
+ if d.subtitles:
155
+ shared_subs.extend(d.subtitles)
156
+ else:
157
+ response.append(data)
158
+ if data.subtitles:
159
+ shared_subs.extend(data.subtitles)
146
160
 
147
161
  # Eğer video-parts yoksa iframe kullan
148
162
  if not response:
@@ -150,6 +164,29 @@ class FilmMakinesi(PluginBase):
150
164
  if iframe_src:
151
165
  data = await self.extract(iframe_src)
152
166
  if data:
153
- response.append(data)
167
+ if isinstance(data, list):
168
+ for d in data:
169
+ response.append(d)
170
+ if d.subtitles:
171
+ shared_subs.extend(d.subtitles)
172
+ else:
173
+ response.append(data)
174
+ if data.subtitles:
175
+ shared_subs.extend(data.subtitles)
176
+
177
+ # Altyazıları Dağıt
178
+ if shared_subs:
179
+ unique_subs = []
180
+ seen_urls = set()
181
+ for sub in shared_subs:
182
+ if sub.url not in seen_urls:
183
+ seen_urls.add(sub.url)
184
+ unique_subs.append(sub)
185
+
186
+ for res in response:
187
+ current_urls = {s.url for s in res.subtitles}
188
+ for sub in unique_subs:
189
+ if sub.url not in current_urls:
190
+ res.subtitles.append(sub)
154
191
 
155
192
  return response
@@ -111,7 +111,6 @@ class FilmModu(PluginBase):
111
111
  return []
112
112
 
113
113
  results = []
114
-
115
114
  for alternatif in alternates:
116
115
  alt_link = alternatif.attrs.get("href")
117
116
  alt_name = alternatif.text(strip=True)
@@ -2,7 +2,7 @@
2
2
 
3
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
4
4
  from urllib.parse import unquote
5
-
5
+ from contextlib import suppress
6
6
 
7
7
  class Filmatek(PluginBase):
8
8
  name = "Filmatek"
@@ -29,10 +29,8 @@ class Filmatek(PluginBase):
29
29
  istek = await self.httpx.get(f"{url}/{page}/")
30
30
  secici = HTMLHelper(istek.text)
31
31
 
32
- items = secici.select("div.items article, #archive-content article")
33
32
  results = []
34
-
35
- for item in items:
33
+ for item in secici.select("div.items article, #archive-content article"):
36
34
  title_el = secici.select_first("div.data h3 a, h3 a", item)
37
35
  if not title_el:
38
36
  continue
@@ -54,10 +52,8 @@ class Filmatek(PluginBase):
54
52
  istek = await self.httpx.get(f"{self.main_url}/?s={query}")
55
53
  secici = HTMLHelper(istek.text)
56
54
 
57
- items = secici.select("div.result-item")
58
55
  results = []
59
-
60
- for item in items:
56
+ for item in secici.select("div.result-item"):
61
57
  title_el = secici.select_first("div.title a", item)
62
58
  if not title_el:
63
59
  continue
@@ -114,7 +110,6 @@ class Filmatek(PluginBase):
114
110
  options = []
115
111
 
116
112
  results = []
117
-
118
113
  for opt in options:
119
114
  if isinstance(opt, dict):
120
115
  post_id = opt.get("data-post")
@@ -158,11 +153,9 @@ class Filmatek(PluginBase):
158
153
 
159
154
  # Unwrap internal JWPlayer
160
155
  if "jwplayer/?source=" in iframe_url:
161
- try:
156
+ with suppress(Exception):
162
157
  raw_source = iframe_url.split("source=")[1].split("&")[0]
163
158
  iframe_url = unquote(raw_source)
164
- except:
165
- pass
166
159
 
167
160
  # Direct media files
168
161
  if ".m3u8" in iframe_url or ".mp4" in iframe_url:
@@ -1,10 +1,9 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, HTMLHelper
4
- import re
5
4
 
6
- class Full4kizle(PluginBase):
7
- name = "Full4kizle"
5
+ class FilmciBaba(PluginBase):
6
+ name = "FilmciBaba"
8
7
  language = "tr"
9
8
  main_url = "https://izlehdfilm.cc"
10
9
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
@@ -35,81 +34,65 @@ class Full4kizle(PluginBase):
35
34
  f"{main_url}/Kategori/tur/18-erotik-filmler/page" : "+18 Erotik Filmler",
36
35
  }
37
36
 
38
-
39
37
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
40
- target_url = f"{url}/{page}/"
41
- istek = await self.httpx.get(target_url)
42
- helper = HTMLHelper(istek.text)
43
-
44
- items = helper.select("div.movie-preview")
45
- results = []
46
-
47
- for item in items:
48
- title_el = helper.select_first(".movie-title a", item)
49
- if not title_el: continue
50
-
51
- title = title_el.text(strip=True)
52
- # Remove " izle" case insensitive
53
- title = re.sub(r"(?i) izle", "", title).strip()
54
-
55
- href = self.fix_url(title_el.attrs.get("href"))
56
-
57
- poster_el = helper.select_first(".movie-poster img", item)
58
- poster = self.fix_url(poster_el.attrs.get("src")) if poster_el else None
59
-
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
+
60
51
  results.append(MainPageResult(
61
52
  category = category,
62
53
  title = title,
63
54
  url = href,
64
55
  poster = poster
65
56
  ))
66
-
57
+
67
58
  return results
68
59
 
69
60
  async def search(self, query: str) -> list[SearchResult]:
70
- url = f"{self.main_url}/?s={query}"
71
- istek = await self.httpx.get(url)
72
- helper = HTMLHelper(istek.text)
73
-
74
- items = helper.select("div.movie-preview")
61
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
62
+ secici = HTMLHelper(istek.text)
63
+
75
64
  results = []
76
-
77
- for item in items:
78
- title_el = helper.select_first(".movie-title a", item)
79
- if not title_el: continue
80
-
81
- title = title_el.text(strip=True)
82
- # Remove " izle" case insensitive
83
- title = re.sub(r"(?i) izle", "", title).strip()
84
-
85
- href = self.fix_url(title_el.attrs.get("href"))
86
-
87
- poster_el = helper.select_first(".movie-poster img", item)
88
- poster = self.fix_url(poster_el.attrs.get("src")) if poster_el else None
89
-
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
+
90
74
  results.append(SearchResult(
91
75
  title = title,
92
76
  url = href,
93
77
  poster = poster
94
78
  ))
95
-
79
+
96
80
  return results
97
81
 
98
82
  async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
99
- istek = await self.httpx.get(url)
100
- helper = HTMLHelper(istek.text)
101
-
102
- title = self.clean_title(helper.select_text("h1"))
103
- poster = helper.select_poster(".poster img")
104
- description = helper.select_text(".excerpt p")
105
- year = helper.extract_year(".release", ".movie-info")
106
- rating = helper.regex_first(r"([\d\.]+)", helper.select_text(".imdb-rating"))
107
- duration = int(helper.regex_first(r"(\d+)", helper.select_text(".movie-info")) or 0)
108
- tags = helper.select_texts("a[href*='/tur/'], a[href*='/Kategori/tur/']")
109
- actors = helper.select_texts("a[href*='/oyuncular/']") or helper.select_texts(".cast-list .actor-name, .cast-list a")
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")
110
93
 
111
94
  # Bölüm linklerini kontrol et
112
- ep_elements = helper.select(".parts-middle a, .parts-middle .part.active")
95
+ ep_elements = secici.select(".parts-middle a, .parts-middle .part.active")
113
96
 
114
97
  if not ep_elements:
115
98
  return MovieInfo(
@@ -118,17 +101,16 @@ class Full4kizle(PluginBase):
118
101
  description = description,
119
102
  poster = self.fix_url(poster),
120
103
  year = year,
121
- rating = rating,
122
- duration = duration,
104
+ rating = rating if rating != "." else None,
123
105
  tags = tags,
124
106
  actors = actors
125
107
  )
126
-
108
+
127
109
  episodes = []
128
110
  for i, el in enumerate(ep_elements):
129
- name = helper.select_text(".part-name", el) or f"Bölüm {i+1}"
111
+ name = secici.select_text(".part-name", el) or f"Bölüm {i+1}"
130
112
  href = el.attrs.get("href") or url
131
- s, e = helper.extract_season_episode(name)
113
+ s, e = secici.extract_season_episode(name)
132
114
  episodes.append(Episode(season=s or 1, episode=e or (i + 1), title=name, url=self.fix_url(href)))
133
115
 
134
116
  return SeriesInfo(
@@ -138,25 +120,24 @@ class Full4kizle(PluginBase):
138
120
  poster = self.fix_url(poster),
139
121
  year = year,
140
122
  rating = rating,
141
- duration = duration,
142
123
  tags = tags,
143
124
  actors = actors,
144
125
  episodes = episodes
145
126
  )
146
127
 
147
128
  async def load_links(self, url: str) -> list[ExtractResult]:
148
- istek = await self.httpx.get(url)
149
- helper = HTMLHelper(istek.text)
150
-
151
- iframe = helper.select_attr(".center-container iframe", "src")
129
+ istek = await self.httpx.get(url)
130
+ secici = HTMLHelper(istek.text)
131
+
132
+ iframe = secici.select_attr(".center-container iframe", "src")
152
133
  if not iframe:
153
- iframe = helper.select_attr("iframe[src*='hotstream.club']", "src")
154
-
134
+ iframe = secici.select_attr("iframe[src*='hotstream.club']", "src")
135
+
155
136
  results = []
156
-
137
+
157
138
  if iframe:
158
139
  iframe = self.fix_url(iframe)
159
-
140
+
160
141
  # Use general extract method
161
142
  extracted = await self.extract(iframe)
162
143
  if extracted:
@@ -166,9 +147,9 @@ class Full4kizle(PluginBase):
166
147
  results.append(extracted)
167
148
  else:
168
149
  results.append(ExtractResult(
169
- name = "Full4kizle | External",
170
- url = iframe,
150
+ name = "FilmciBaba | External",
151
+ url = iframe,
171
152
  referer = url
172
153
  ))
173
-
154
+
174
155
  return results
@@ -65,8 +65,8 @@ 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:
@@ -84,12 +84,12 @@ class FullHDFilmizlesene(PluginBase):
84
84
 
85
85
  title = self.clean_title(secici.select_text("div.izle-titles"))
86
86
  poster = secici.select_poster("div img[data-src]")
87
- description = secici.select_text("div.ozet-ic p")
87
+ description = secici.select_text("div.ozet-ic")
88
88
  tags = secici.select_texts("a[rel='category tag']")
89
89
  rating = secici.regex_first(r"(\d+\.\d+|\d+)", secici.select_text("div.puanx-puan"))
90
90
  year = secici.extract_year("div.dd a.category")
91
91
  actors = secici.select_texts("a > span", secici.select_first("div.film-info ul li:nth-child(2)"))
92
- duration = int(secici.regex_first(r"(\d+)", secici.select_text("div.film-info ul li:nth-child(4)")) or 0)
92
+ duration = secici.regex_first(r"Süre: (\d+)\s*dk", secici.select_text("div.ozet-ic"))
93
93
 
94
94
  return MovieInfo(
95
95
  url = url,
@@ -106,10 +106,9 @@ class FullHDFilmizlesene(PluginBase):
106
106
  async def load_links(self, url: str) -> list[ExtractResult]:
107
107
  istek = await self.httpx.get(url)
108
108
  secici = HTMLHelper(istek.text)
109
- html_text = istek.text
110
109
 
111
110
  # İlk script'i al (xpath (//script)[1] yerine)
112
- scripts = secici.select("script")
111
+ scripts = secici.select("script")
113
112
  script_content = scripts[0].text() if scripts else ""
114
113
 
115
114
  scx_json = HTMLHelper(script_content).regex_first(r"scx = (.*?);")
@@ -133,4 +132,4 @@ class FullHDFilmizlesene(PluginBase):
133
132
  if data:
134
133
  response.append(data)
135
134
 
136
- return response
135
+ return response