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

@@ -0,0 +1,65 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle, HTMLHelper
4
+ from Kekik.Sifreleme import AESManager
5
+ import json, contextlib
6
+
7
+ class LuciferPlays(ExtractorBase):
8
+ name = "LuciferPlays"
9
+ main_url = "https://luciferplays.com"
10
+
11
+ async def extract(self, url: str, referer: str = None) -> ExtractResult:
12
+ # LuciferPlays genelde referer olarak kendi ana dizinini veya gömüldüğü sayfayı bekler
13
+ self.httpx.headers.update({"Referer": referer or url})
14
+
15
+ resp = await self.httpx.get(url)
16
+ sel = HTMLHelper(resp.text)
17
+
18
+ m3u8_url = None
19
+ subtitles = []
20
+
21
+ # 1. bePlayer (AES Decryption)
22
+ # patern: bePlayer('pass', '{"ct":"...", "iv":"...", "s":"..."}');
23
+ if match := sel.regex_first(r"bePlayer\('([^']+)',\s*'(\{[^}]+\})'\);", group=None):
24
+ pass_val, data_val = match
25
+ with contextlib.suppress(Exception):
26
+ decrypted = AESManager.decrypt(data_val, pass_val)
27
+
28
+ # Çözülen içerik genelde JSON formatındadır
29
+ try:
30
+ data = json.loads(decrypted)
31
+
32
+ # Video Lokasyonu (Donilas/HDMom Style)
33
+ m3u8_url = data.get("video_location")
34
+
35
+ # Altyazılar
36
+ for sub in data.get("strSubtitles", []):
37
+ sub_url = self.fix_url(sub.get("file"))
38
+ if sub_url and "Forced" not in sub.get("label", ""):
39
+ subtitles.append(Subtitle(
40
+ name = sub.get("label", "TR").upper(),
41
+ url = sub_url
42
+ ))
43
+
44
+ # Eğer video_location bulunamadıysa MixPlay style kontrol et
45
+ if not m3u8_url:
46
+ client_data = data.get("schedule", {}).get("client", "")
47
+ m3u8_url = HTMLHelper(client_data).regex_first(r'"video_location":"([^"]+)"')
48
+
49
+ except json.JSONDecodeError:
50
+ # JSON değilse düz metin içinde ara
51
+ m3u8_url = HTMLHelper(decrypted).regex_first(r'"video_location":"([^"]+)"')
52
+
53
+ # 2. Fallback (Düz JS içinde file ara)
54
+ if not m3u8_url:
55
+ m3u8_url = sel.regex_first(r'file\s*:\s*"([^"]+)"')
56
+
57
+ if not m3u8_url:
58
+ raise ValueError(f"LuciferPlays: Video linki bulunamadı. {url}")
59
+
60
+ return ExtractResult(
61
+ name = self.name,
62
+ url = self.fix_url(m3u8_url),
63
+ referer = url,
64
+ subtitles = subtitles
65
+ )
@@ -5,7 +5,7 @@ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
5
5
  class FilmciBaba(PluginBase):
6
6
  name = "FilmciBaba"
7
7
  language = "tr"
8
- main_url = "https://4kizle.live"
8
+ main_url = "https://izle.live"
9
9
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
10
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
11
 
@@ -38,7 +38,7 @@ class FilmciBaba(PluginBase):
38
38
  istek = await self.httpx.get(f"{url}/{page}/")
39
39
  secici = HTMLHelper(istek.text)
40
40
 
41
- results = []
41
+ results = []
42
42
  for item in secici.select("div.movie-preview"):
43
43
  title_el = secici.select_first(".movie-title a", item)
44
44
  if not title_el:
@@ -67,7 +67,7 @@ class FilmciBaba(PluginBase):
67
67
  if not title_el:
68
68
  continue
69
69
 
70
- title = self.clean_title(title_el.text(strip=True))
70
+ title = self.clean_title(title_el.text(strip=True))
71
71
  href = self.fix_url(title_el.attrs.get("href"))
72
72
  poster = self.fix_url(secici.select_poster(".movie-poster img", item))
73
73
 
@@ -6,7 +6,7 @@ import asyncio
6
6
  class JetFilmizle(PluginBase):
7
7
  name = "JetFilmizle"
8
8
  language = "tr"
9
- main_url = "https://jetfilmizle.website"
9
+ main_url = "https://jetfilmizle.net"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
11
  description = "Film izle, Yerli, Yabancı film izle, Türkçe dublaj, alt yazılı seçenekleriyle ödül almış filmleri Full HD kalitesiyle ve jetfilmizle hızıyla donmadan ücretsizce izleyebilirsiniz."
12
12
 
@@ -0,0 +1,178 @@
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
+ import asyncio
5
+
6
+ class SuperFilmIzle(PluginBase):
7
+ name = "SuperFilmIzle"
8
+ language = "tr"
9
+ main_url = "https://superfilmizle.com"
10
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
+ description = "Superfilmizle ile HD Kalite film izle türkçe altyazılı olarak super kalitede donmadan izleyin."
12
+
13
+ main_page = {
14
+ f"{main_url}/category/aile-filmleri/page/" : "Aile Filmleri",
15
+ f"{main_url}/category/aksiyon-filmleri/page/" : "Aksiyon Filmleri",
16
+ f"{main_url}/category/animasyon-filmleri/page/" : "Animasyon Filmleri",
17
+ f"{main_url}/category/bilim-kurgu/page/" : "Bilim Kurgu",
18
+ f"{main_url}/category/biyografi-filmleri/page/" : "Biyografi Filmleri",
19
+ f"{main_url}/category/dram-filmleri/page/" : "Dram Filmleri",
20
+ f"{main_url}/category/editor-secim/page/" : "Editör Seçim",
21
+ f"{main_url}/category/erotik-film/page/" : "Erotik Film",
22
+ f"{main_url}/category/fantastik-filmler/page/" : "Fantastik Filmler",
23
+ f"{main_url}/category/gelecek-filmler/page/" : "Gelecek Filmler",
24
+ f"{main_url}/category/gerilim-filmleri/page/" : "Gerilim Filmleri",
25
+ f"{main_url}/category/hint-filmleri/page/" : "Hint Filmleri",
26
+ f"{main_url}/category/komedi-filmleri/page/" : "Komedi Filmleri",
27
+ f"{main_url}/category/kore-filmleri/page/" : "Kore Filmleri",
28
+ f"{main_url}/category/korku-filmleri/page/" : "Korku Filmleri",
29
+ f"{main_url}/category/macera-filmleri/page/" : "Macera Filmleri",
30
+ f"{main_url}/category/muzikal-filmler/page/" : "Müzikal Filmler",
31
+ f"{main_url}/category/romantik-filmler/page/" : "Romantik Filmler",
32
+ f"{main_url}/category/savas-filmleri/page/" : "Savaş Filmleri",
33
+ f"{main_url}/category/spor-filmleri/page/" : "Spor Filmleri",
34
+ f"{main_url}/category/suc-filmleri/page/" : "Suç Filmleri",
35
+ f"{main_url}/category/tarih-filmleri/page/" : "Tarih Filmleri",
36
+ f"{main_url}/category/western-filmleri/page/" : "Western Filmleri",
37
+ f"{main_url}/category/yerli-filmler/page/" : "Yerli Filmler",
38
+ f"{main_url}/category/yetiskin-filmleri/page/" : "Yetişkin Filmleri"
39
+ }
40
+
41
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
42
+ istek = await self.httpx.get(f"{url}{page}")
43
+ secici = HTMLHelper(istek.text)
44
+
45
+ results = []
46
+ for veri in secici.select("div.movie-box"):
47
+ title_text = secici.select_text("div.name a", veri)
48
+ if not title_text:
49
+ continue
50
+
51
+ href = secici.select_attr("div.name a", "href", veri)
52
+ poster = secici.select_poster("img", veri)
53
+
54
+ results.append(MainPageResult(
55
+ category = category,
56
+ title = self.clean_title(title_text),
57
+ url = self.fix_url(href),
58
+ poster = self.fix_url(poster),
59
+ ))
60
+
61
+ return results
62
+
63
+ async def search(self, query: str) -> list[SearchResult]:
64
+ istek = await self.httpx.get(f"{self.main_url}?s={query}")
65
+ secici = HTMLHelper(istek.text)
66
+
67
+ results = []
68
+ for veri in secici.select("div.movie-box"):
69
+ title_text = secici.select_text("div.name a", veri)
70
+ if not title_text:
71
+ continue
72
+
73
+ href = secici.select_attr("div.name a", "href", veri)
74
+ poster = secici.select_poster("img", veri)
75
+
76
+ results.append(SearchResult(
77
+ title = self.clean_title(title_text),
78
+ url = self.fix_url(href),
79
+ poster = self.fix_url(poster),
80
+ ))
81
+
82
+ return results
83
+
84
+ async def load_item(self, url: str) -> MovieInfo:
85
+ istek = await self.httpx.get(url)
86
+ secici = HTMLHelper(istek.text)
87
+
88
+ title = self.clean_title(secici.select_text("div.film h1"))
89
+ poster = secici.select_poster("div.poster img")
90
+ year = secici.extract_year("div.release a")
91
+ description = secici.select_direct_text("div.description")
92
+ tags = secici.select_texts("ul.post-categories li a")
93
+ rating = secici.select_text("div.imdb-count")
94
+ rating = rating.replace("IMDB Puanı", "") if rating else None
95
+ actors = secici.select_texts("div.actors a") or secici.select_texts("div.cast a")
96
+
97
+ return MovieInfo(
98
+ url = url,
99
+ poster = self.fix_url(poster),
100
+ title = title,
101
+ description = description,
102
+ tags = tags,
103
+ rating = rating,
104
+ year = year,
105
+ actors = actors
106
+ )
107
+
108
+ async def load_links(self, url: str) -> list[ExtractResult]:
109
+ istek = await self.httpx.get(url)
110
+ main_text = istek.text
111
+ secici = HTMLHelper(main_text)
112
+
113
+ # 1. Alternatifleri / Parçaları Belirle
114
+ # (url, name, needs_fetch)
115
+ sources = []
116
+
117
+ # Keremiya / Movifox Alternatif Yapısı (li.part)
118
+ part_items = secici.select("div#action-parts li.part")
119
+ if part_items:
120
+ for li in part_items:
121
+ name = secici.select_text("div.part-name", li) or "Alternatif"
122
+
123
+ # Aktif olan parça (Mevcut sayfada)
124
+ if "active" in li.attrs.get("class", []):
125
+ sources.append((None, name, False))
126
+
127
+ # Pasif olanlar (Link verilmişse)
128
+ elif a_tag := secici.select_first("a.post-page-numbers", li):
129
+ href = a_tag.attrs.get("href")
130
+ if href:
131
+ sources.append((self.fix_url(href), name, True))
132
+ else:
133
+ # Alternatif menüsü yoksa tek parça olarak işle
134
+ sources.append((None, "", False))
135
+
136
+ # 2. İşleme Görevlerini Hazırla
137
+ extract_tasks = []
138
+
139
+ async def process_task(source_data):
140
+ src_url, src_name, needs_fetch = source_data
141
+
142
+ # Iframe'i bulacağımız HTML kaynağını belirle
143
+ html_to_parse = main_text
144
+ if needs_fetch:
145
+ try:
146
+ resp = await self.httpx.get(src_url)
147
+ html_to_parse = resp.text
148
+ except:
149
+ return []
150
+
151
+ # HTML içindeki iframeleri topla
152
+ temp_secici = HTMLHelper(html_to_parse)
153
+ iframes = []
154
+ for ifr in temp_secici.select("div.video-content iframe"):
155
+ if src := ifr.attrs.get("src") or ifr.attrs.get("data-src"):
156
+ iframes.append(self.fix_url(src))
157
+
158
+ # Bulunan iframeleri extract et (prefix olarak parça adını ekle)
159
+ results = []
160
+ for ifr_url in iframes:
161
+ if extracted := await self.extract(ifr_url, prefix=src_name or None):
162
+ if isinstance(extracted, list):
163
+ results.extend(extracted)
164
+ else:
165
+ results.append(extracted)
166
+ return results
167
+
168
+ for src in sources:
169
+ extract_tasks.append(process_task(src))
170
+
171
+ # 3. Tüm Görevleri Paralel Çalıştır ve Sonuçları Topla
172
+ results_groups = await asyncio.gather(*extract_tasks)
173
+
174
+ final_results = []
175
+ for group in results_groups:
176
+ final_results.extend(group)
177
+
178
+ return final_results
@@ -40,7 +40,7 @@ class UgurFilm(PluginBase):
40
40
  results.append(MainPageResult(
41
41
  category = category,
42
42
  title = title,
43
- url = self.fix_url(href) if href else "",
43
+ url = self.fix_url(href),
44
44
  poster = self.fix_url(poster),
45
45
  ))
46
46
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.5.6
3
+ Version: 2.5.7
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
@@ -30,6 +30,7 @@ KekikStream/Extractors/HotStream.py,sha256=37H9pK4HSEqGR6QKgxz887JCBXfXB1NXDpBGu
30
30
  KekikStream/Extractors/JFVid.py,sha256=rdy0bmqZIruejn1G1YNxVM3wlqxkdFRd4zunxxZlev4,746
31
31
  KekikStream/Extractors/JetTv.py,sha256=Cdx1XZEtQZkrmOdZdgM9E1iBkCNzVTExjrI_F-3Nv-I,1176
32
32
  KekikStream/Extractors/JetV.py,sha256=knyDiOCSBMC1eQHo5LRFx5apn3NQflKY3xyloLDGkaI,2069
33
+ KekikStream/Extractors/LuciferPlays.py,sha256=rQotXkjpAT1FSRRObmKoczusnUGT0mWosjYOd031Tss,2699
33
34
  KekikStream/Extractors/MailRu.py,sha256=n87wBc9jQ4nP8OJbqS7LsHHCKuRxlsgdtL_xHVn0rdY,779
34
35
  KekikStream/Extractors/MixPlayHD.py,sha256=otA2SKDnJisY4Zt9DCuNdjNVHtSquHoMVvP3_5Q0poY,1205
35
36
  KekikStream/Extractors/MixTiger.py,sha256=kF_AKkJoyAS6peQ94eu3pLzS-VeZ_8IYjpaDrTo3x_I,1135
@@ -72,11 +73,11 @@ KekikStream/Plugins/FilmEkseni.py,sha256=EwtHH1kuTV2ow1Yc9D063CZ0c4OOXcwchyKN5oA
72
73
  KekikStream/Plugins/FilmMakinesi.py,sha256=AdollSseX3M7sQQ5YAyLU93t7PncP4PIdqYd3nUog6s,7970
73
74
  KekikStream/Plugins/FilmModu.py,sha256=7qm7kC4R0oH1OWyLleSqj6SMUgWbbERfYbE1d726ZOM,6943
74
75
  KekikStream/Plugins/Filmatek.py,sha256=AdOeBVP1rfq5R1YJlQj2saT77rnzVHX54tEOAH-t9fI,7700
75
- KekikStream/Plugins/FilmciBaba.py,sha256=rBrtFwZpe4QtR2Q-Jze_KaC2x2dXrArpUpQPn5Na4CU,6934
76
+ KekikStream/Plugins/FilmciBaba.py,sha256=sv_p45g_Nd5NUJCIGr85i1ykfQqnAl3gD2ls1eHXLt0,6912
76
77
  KekikStream/Plugins/FullHDFilmizlesene.py,sha256=dJ1xo1D3ujPCQE6PewpqdvSMKlBbifA67uU7BAMmvVM,6274
77
78
  KekikStream/Plugins/HDFilm.py,sha256=m6tjV1O1l5U_jqkGKizi62GOdSMd5osyOS2_9jehS-w,10754
78
79
  KekikStream/Plugins/HDFilmCehennemi.py,sha256=h3FTKN-psrzvN0Juw8Am83MV8QL9aX-RSWhYqXRQU-E,17368
79
- KekikStream/Plugins/JetFilmizle.py,sha256=YyZmOWoh_SFGRARrKioq8fhv8VgzTiURFypJMoW8nzU,10279
80
+ KekikStream/Plugins/JetFilmizle.py,sha256=zvjO18atPLJtdDRsY_yr0s9YKcHpePWhdp2PMuI7nIs,10275
80
81
  KekikStream/Plugins/KultFilmler.py,sha256=D5aAFrv0ACtSBinwHTfNvP1Jp0W8W7-mwUsju_YPilk,10841
81
82
  KekikStream/Plugins/RecTV.py,sha256=6rYxZV6J84rr2CZKTmP_0raYVp4pa5EMXQD6mMbZHbE,7315
82
83
  KekikStream/Plugins/RoketDizi.py,sha256=TnupXb3cRJMDJAA7hclOPwECgOt5mOJx1hYEL_oK6rk,8488
@@ -87,13 +88,13 @@ KekikStream/Plugins/SineWix.py,sha256=z0r90lggAugEWE1g9vg8gZsInBObUZPnVFQwq7GYmJ
87
88
  KekikStream/Plugins/Sinefy.py,sha256=tRfXKeDkIiKrrl9mWQ8WGQV1r0MNFblE9Q9NNBm5wKQ,12514
88
89
  KekikStream/Plugins/SinemaCX.py,sha256=DRHD3bZXeIwm6TGsGQZyky0m61L77vy7LLIGch56eoA,10844
89
90
  KekikStream/Plugins/Sinezy.py,sha256=2vTRsCUFXSJgKZJbXxDoGRJ8_i4ZZptuPTjeQ4EiZWk,5733
90
- KekikStream/Plugins/SuperFilmGeldi.py,sha256=hXhYYuQkVbYJ07P8y5QjY5iR3rVgUfAWc_MkOWtsXdM,6306
91
- KekikStream/Plugins/UgurFilm.py,sha256=2U3-rC9JzwDoF1c8t3VyE3jMcz-SB51uxFX-8DqrQ7M,6778
91
+ KekikStream/Plugins/SuperFilmIzle.py,sha256=iN-kTGHxA1t6QcCtCuN-g00THNWTf1fiBPydEJRLG2c,7637
92
+ KekikStream/Plugins/UgurFilm.py,sha256=pS5xGwiN_5cut4JIfpz3R-mHCvIZJS4S_DpMRI_Cw-Y,6762
92
93
  KekikStream/Plugins/Watch32.py,sha256=wAw-glE9bQNsyfzhv1zlFIjYAhSvK58mUri-XGytuHs,7318
93
94
  KekikStream/Plugins/YabanciDizi.py,sha256=aqdPLQ3Oajs32JNkgIPeqHuYgcM8K2jGHT0Ikw8Q6jY,10582
94
- kekikstream-2.5.6.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
95
- kekikstream-2.5.6.dist-info/METADATA,sha256=S7IG7Jj4ZkS-KhwnFhzbE5RaOHX4lFlT2-StrrxFRRM,10761
96
- kekikstream-2.5.6.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
97
- kekikstream-2.5.6.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
98
- kekikstream-2.5.6.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
99
- kekikstream-2.5.6.dist-info/RECORD,,
95
+ kekikstream-2.5.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
96
+ kekikstream-2.5.7.dist-info/METADATA,sha256=lHy47dgEbzr__M-LS5-IMgSHU-mskbvHU9EuIf9k9dI,10761
97
+ kekikstream-2.5.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
98
+ kekikstream-2.5.7.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
99
+ kekikstream-2.5.7.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
100
+ kekikstream-2.5.7.dist-info/RECORD,,
@@ -1,142 +0,0 @@
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
-
5
- class SuperFilmGeldi(PluginBase):
6
- name = "SuperFilmGeldi"
7
- language = "tr"
8
- main_url = "https://www.superfilmgeldi13.art"
9
- favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
10
- 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."
11
-
12
- main_page = {
13
- f"{main_url}/page/SAYFA" : "Son Eklenenler",
14
- f"{main_url}/hdizle/category/aksiyon/page/SAYFA" : "Aksiyon",
15
- f"{main_url}/hdizle/category/animasyon/page/SAYFA" : "Animasyon",
16
- f"{main_url}/hdizle/category/belgesel/page/SAYFA" : "Belgesel",
17
- f"{main_url}/hdizle/category/biyografi/page/SAYFA" : "Biyografi",
18
- f"{main_url}/hdizle/category/bilim-kurgu/page/SAYFA" : "Bilim Kurgu",
19
- f"{main_url}/hdizle/category/fantastik/page/SAYFA" : "Fantastik",
20
- f"{main_url}/hdizle/category/dram/page/SAYFA" : "Dram",
21
- f"{main_url}/hdizle/category/gerilim/page/SAYFA" : "Gerilim",
22
- f"{main_url}/hdizle/category/gizem/page/SAYFA" : "Gizem",
23
- f"{main_url}/hdizle/category/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
24
- f"{main_url}/hdizle/category/karete-filmleri/page/SAYFA" : "Karate Filmleri",
25
- f"{main_url}/hdizle/category/korku/page/SAYFA" : "Korku",
26
- f"{main_url}/hdizle/category/muzik/page/SAYFA" : "Müzik",
27
- f"{main_url}/hdizle/category/macera/page/SAYFA" : "Macera",
28
- f"{main_url}/hdizle/category/romantik/page/SAYFA" : "Romantik",
29
- f"{main_url}/hdizle/category/spor/page/SAYFA" : "Spor",
30
- f"{main_url}/hdizle/category/savas/page/SAYFA" : "Savaş",
31
- f"{main_url}/hdizle/category/suc/page/SAYFA" : "Suç",
32
- f"{main_url}/hdizle/category/western/page/SAYFA" : "Western",
33
- }
34
-
35
- async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
36
- istek = await self.httpx.get(url.replace("SAYFA", str(page)))
37
- secici = HTMLHelper(istek.text)
38
-
39
- results = []
40
- for veri in secici.select("div.movie-preview-content"):
41
- title_text = secici.select_text("span.movie-title a", veri)
42
- if not title_text:
43
- continue
44
-
45
- href = secici.select_attr("span.movie-title a", "href", veri)
46
- poster = secici.select_attr("img", "src", veri)
47
-
48
- results.append(MainPageResult(
49
- category = category,
50
- title = self.clean_title(title_text.split(" izle")[0]),
51
- url = self.fix_url(href) if href else "",
52
- poster = self.fix_url(poster),
53
- ))
54
-
55
- return results
56
-
57
- async def search(self, query: str) -> list[SearchResult]:
58
- istek = await self.httpx.get(f"{self.main_url}?s={query}")
59
- secici = HTMLHelper(istek.text)
60
-
61
- results = []
62
- for veri in secici.select("div.movie-preview-content"):
63
- title_text = secici.select_text("span.movie-title a", veri)
64
- if not title_text:
65
- continue
66
-
67
- href = secici.select_attr("span.movie-title a", "href", veri)
68
- poster = secici.select_attr("img", "src", veri)
69
-
70
- results.append(SearchResult(
71
- title = self.clean_title(title_text.split(" izle")[0]),
72
- url = self.fix_url(href) if href else "",
73
- poster = self.fix_url(poster),
74
- ))
75
-
76
- return results
77
-
78
- async def load_item(self, url: str) -> MovieInfo:
79
- istek = await self.httpx.get(url)
80
- secici = HTMLHelper(istek.text)
81
-
82
- title = self.clean_title(secici.select_text("div.title h1").split(" izle")[0]) if secici.select_text("div.title h1") else ""
83
- poster = secici.select_poster("div.poster img")
84
- year = secici.extract_year("div.release a")
85
- description = secici.select_text("div.excerpt p")
86
- tags = secici.select_texts("div.categories a")
87
- actors = secici.select_texts("div.actor a")
88
-
89
- return MovieInfo(
90
- url = url,
91
- poster = self.fix_url(poster),
92
- title = title,
93
- description = description,
94
- tags = tags,
95
- year = year,
96
- actors = actors
97
- )
98
-
99
- async def load_links(self, url: str) -> list[ExtractResult]:
100
- istek = await self.httpx.get(url)
101
- secici = HTMLHelper(istek.text)
102
-
103
- iframe = secici.select_attr("div#vast iframe", "src")
104
- iframe = self.fix_url(iframe) if iframe else None
105
-
106
- if not iframe:
107
- return []
108
-
109
- results = []
110
-
111
- # Mix player özel işleme
112
- if "mix" in iframe and "index.php?data=" in iframe:
113
- iframe_istek = await self.httpx.get(iframe, headers={"Referer": f"{self.main_url}/"})
114
- iframe_sec = HTMLHelper(iframe_istek.text)
115
- mix_point = iframe_sec.regex_first(r'videoUrl"\s*:\s*"(.*?)"\s*,\s*"videoServer')
116
-
117
- if mix_point:
118
- mix_point = mix_point.replace("\\", "")
119
-
120
- # Endpoint belirleme
121
- if "mixlion" in iframe:
122
- end_point = "?s=3&d="
123
- elif "mixeagle" in iframe:
124
- end_point = "?s=1&d="
125
- else:
126
- end_point = "?s=0&d="
127
-
128
- m3u_link = iframe.split("/player")[0] + mix_point + end_point
129
-
130
- results.append(ExtractResult(
131
- name = f"{self.name} | Mix Player",
132
- url = m3u_link,
133
- referer = iframe,
134
- subtitles = []
135
- ))
136
- else:
137
- # Extractor'a yönlendir
138
- data = await self.extract(iframe)
139
- if data:
140
- results.append(data)
141
-
142
- return results