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.
- KekikStream/Core/Extractor/ExtractorBase.py +7 -2
- KekikStream/Core/Plugin/PluginBase.py +61 -13
- KekikStream/Extractors/CloseLoad.py +17 -2
- KekikStream/Extractors/ContentX.py +19 -2
- KekikStream/Extractors/DonilasPlay.py +86 -0
- KekikStream/Extractors/Filemoon.py +78 -0
- KekikStream/Extractors/MixTiger.py +5 -5
- KekikStream/Extractors/Odnoklassniki.py +6 -0
- KekikStream/Extractors/PeaceMakerst.py +6 -0
- KekikStream/Extractors/PlayerFilmIzle.py +8 -5
- KekikStream/Extractors/RapidVid.py +21 -5
- KekikStream/Extractors/SetPlay.py +13 -4
- KekikStream/Extractors/VCTPlay.py +41 -0
- KekikStream/Extractors/VidHide.py +11 -2
- KekikStream/Extractors/VidMoly.py +52 -30
- KekikStream/Extractors/YTDLP.py +88 -54
- KekikStream/Plugins/BelgeselX.py +196 -0
- KekikStream/Plugins/DiziBox.py +8 -12
- KekikStream/Plugins/DiziPal.py +11 -22
- KekikStream/Plugins/DiziYou.py +9 -17
- KekikStream/Plugins/Dizilla.py +19 -14
- KekikStream/Plugins/FilmBip.py +5 -8
- KekikStream/Plugins/FilmMakinesi.py +31 -21
- KekikStream/Plugins/FilmModu.py +14 -18
- KekikStream/Plugins/FullHDFilm.py +83 -27
- KekikStream/Plugins/FullHDFilmizlesene.py +6 -8
- KekikStream/Plugins/HDFilmCehennemi.py +133 -57
- KekikStream/Plugins/JetFilmizle.py +29 -14
- KekikStream/Plugins/KultFilmler.py +13 -15
- KekikStream/Plugins/RecTV.py +16 -24
- KekikStream/Plugins/RoketDizi.py +22 -32
- KekikStream/Plugins/SelcukFlix.py +99 -80
- KekikStream/Plugins/SetFilmIzle.py +252 -0
- KekikStream/Plugins/SezonlukDizi.py +43 -9
- KekikStream/Plugins/SineWix.py +13 -21
- KekikStream/Plugins/Sinefy.py +13 -10
- KekikStream/Plugins/SinemaCX.py +35 -38
- KekikStream/Plugins/Sinezy.py +5 -8
- KekikStream/Plugins/SuperFilmGeldi.py +36 -27
- KekikStream/Plugins/UgurFilm.py +7 -9
- KekikStream/__init__.py +17 -36
- {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/METADATA +6 -3
- kekikstream-2.2.0.dist-info/RECORD +81 -0
- KekikStream/Extractors/ContentX_.py +0 -40
- KekikStream/Extractors/FirePlayer.py +0 -60
- KekikStream/Extractors/Odnoklassniki_.py +0 -11
- KekikStream/Extractors/PeaceMakerst_.py +0 -7
- KekikStream/Extractors/RapidVid_.py +0 -7
- KekikStream/Extractors/VidMoly_.py +0 -7
- kekikstream-2.0.2.dist-info/RECORD +0 -82
- {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/WHEEL +0 -0
- {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.0.2.dist-info → kekikstream-2.2.0.dist-info}/top_level.txt +0 -0
KekikStream/Plugins/Dizilla.py
CHANGED
|
@@ -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[
|
|
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
|
-
|
|
183
|
-
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
199
|
+
data = await self.extract(iframe_url, prefix=first_result.get('language_name', 'Unknown'))
|
|
200
|
+
return [data] if data else []
|
KekikStream/Plugins/FilmBip.py
CHANGED
|
@@ -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[
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
|
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()
|
|
79
|
-
|
|
80
|
-
|
|
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()
|
|
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[
|
|
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
|
-
|
|
111
|
+
response = []
|
|
108
112
|
|
|
109
|
-
|
|
113
|
+
# Video parts linklerini ve etiketlerini al
|
|
110
114
|
for link in secici.css("div.video-parts a[data-video_url]"):
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
KekikStream/Plugins/FilmModu.py
CHANGED
|
@@ -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, 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 = "
|
|
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[
|
|
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
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
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}/
|
|
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
|
-
|
|
78
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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[
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
"
|
|
160
|
-
"
|
|
161
|
-
|
|
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 = "
|
|
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[
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|