KekikStream 2.4.6__py3-none-any.whl → 2.4.8__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.
- KekikStream/Core/HTMLHelper.py +2 -2
- KekikStream/Core/Plugin/PluginBase.py +15 -4
- KekikStream/Extractors/Odnoklassniki.py +14 -2
- KekikStream/Extractors/YTDLP.py +2 -2
- KekikStream/Plugins/BelgeselX.py +30 -23
- KekikStream/Plugins/DiziBox.py +14 -11
- KekikStream/Plugins/DiziMom.py +110 -86
- KekikStream/Plugins/DiziPal.py +37 -23
- KekikStream/Plugins/DiziYou.py +23 -11
- KekikStream/Plugins/Dizilla.py +35 -30
- KekikStream/Plugins/FilmBip.py +83 -18
- KekikStream/Plugins/FilmEkseni.py +100 -58
- KekikStream/Plugins/FilmMakinesi.py +71 -19
- KekikStream/Plugins/FilmModu.py +17 -20
- KekikStream/Plugins/Filmatek.py +103 -98
- KekikStream/Plugins/{Full4kizle.py → FilmciBaba.py} +61 -80
- KekikStream/Plugins/FullHDFilmizlesene.py +12 -14
- KekikStream/Plugins/HDFilm.py +243 -0
- KekikStream/Plugins/HDFilmCehennemi.py +194 -125
- KekikStream/Plugins/JetFilmizle.py +5 -5
- KekikStream/Plugins/KultFilmler.py +6 -6
- KekikStream/Plugins/RoketDizi.py +5 -5
- KekikStream/Plugins/SelcukFlix.py +2 -2
- KekikStream/Plugins/SetFilmIzle.py +5 -5
- KekikStream/Plugins/SezonlukDizi.py +4 -4
- KekikStream/Plugins/Sinefy.py +5 -5
- KekikStream/Plugins/SinemaCX.py +5 -5
- KekikStream/Plugins/Sinezy.py +5 -5
- KekikStream/Plugins/SuperFilmGeldi.py +5 -5
- KekikStream/Plugins/UgurFilm.py +4 -4
- KekikStream/Plugins/YabanciDizi.py +5 -5
- {kekikstream-2.4.6.dist-info → kekikstream-2.4.8.dist-info}/METADATA +1 -1
- {kekikstream-2.4.6.dist-info → kekikstream-2.4.8.dist-info}/RECORD +37 -37
- KekikStream/Plugins/FullHDFilm.py +0 -179
- {kekikstream-2.4.6.dist-info → kekikstream-2.4.8.dist-info}/WHEEL +0 -0
- {kekikstream-2.4.6.dist-info → kekikstream-2.4.8.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.4.6.dist-info → kekikstream-2.4.8.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.4.6.dist-info → kekikstream-2.4.8.dist-info}/top_level.txt +0 -0
|
@@ -1,179 +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, SeriesInfo, Episode, ExtractResult, Subtitle, HTMLHelper
|
|
4
|
-
import base64
|
|
5
|
-
|
|
6
|
-
class FullHDFilm(PluginBase):
|
|
7
|
-
name = "FullHDFilm"
|
|
8
|
-
language = "tr"
|
|
9
|
-
main_url = "https://hdfilm.us"
|
|
10
|
-
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
11
|
-
description = "Full HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
|
|
12
|
-
|
|
13
|
-
main_page = {
|
|
14
|
-
f"{main_url}/tur/turkce-altyazili-film-izle" : "Altyazılı Filmler",
|
|
15
|
-
f"{main_url}/tur/netflix-filmleri-izle" : "Netflix",
|
|
16
|
-
f"{main_url}/tur/yerli-film-izle" : "Yerli Film",
|
|
17
|
-
f"{main_url}/category/aile-filmleri-izle" : "Aile",
|
|
18
|
-
f"{main_url}/category/aksiyon-filmleri-izle" : "Aksiyon",
|
|
19
|
-
f"{main_url}/category/animasyon-filmleri-izle" : "Animasyon",
|
|
20
|
-
f"{main_url}/category/belgesel-filmleri-izle" : "Belgesel",
|
|
21
|
-
f"{main_url}/category/bilim-kurgu-filmleri-izle" : "Bilim Kurgu",
|
|
22
|
-
f"{main_url}/category/biyografi-filmleri-izle" : "Biyografi",
|
|
23
|
-
f"{main_url}/category/dram-filmleri-izle" : "Dram",
|
|
24
|
-
f"{main_url}/category/fantastik-filmler-izle" : "Fantastik",
|
|
25
|
-
f"{main_url}/category/gerilim-filmleri-izle" : "Gerilim",
|
|
26
|
-
f"{main_url}/category/gizem-filmleri-izle" : "Gizem",
|
|
27
|
-
f"{main_url}/category/kisa" : "Kısa",
|
|
28
|
-
f"{main_url}/category/komedi-filmleri-izle" : "Komedi",
|
|
29
|
-
f"{main_url}/category/korku-filmleri-izle" : "Korku",
|
|
30
|
-
f"{main_url}/category/macera-filmleri-izle" : "Macera",
|
|
31
|
-
f"{main_url}/category/muzik" : "Müzik",
|
|
32
|
-
f"{main_url}/category/muzikal-filmleri-izle" : "Müzikal",
|
|
33
|
-
f"{main_url}/category/romantik-filmler-izle" : "Romantik",
|
|
34
|
-
f"{main_url}/category/savas-filmleri-izle" : "Savaş",
|
|
35
|
-
f"{main_url}/category/spor-filmleri-izle" : "Spor",
|
|
36
|
-
f"{main_url}/category/suc-filmleri-izle" : "Suç",
|
|
37
|
-
f"{main_url}/category/tarih-filmleri-izle" : "Tarih",
|
|
38
|
-
f"{main_url}/category/western-filmleri-izle" : "Western",
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
42
|
-
page_url = url if page == 1 else f"{url}/page/{page}"
|
|
43
|
-
|
|
44
|
-
self.httpx.headers.update({
|
|
45
|
-
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
|
|
46
|
-
"Referer" : f"{self.main_url}/"
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
istek = await self.httpx.get(page_url)
|
|
50
|
-
secici = HTMLHelper(istek.text)
|
|
51
|
-
|
|
52
|
-
results = []
|
|
53
|
-
for veri in secici.select("div.movie-poster"):
|
|
54
|
-
alt = secici.select_attr("img", "alt", veri)
|
|
55
|
-
poster = secici.select_attr("img", "src", veri)
|
|
56
|
-
href = secici.select_attr("a", "href", veri)
|
|
57
|
-
|
|
58
|
-
if alt and href:
|
|
59
|
-
results.append(MainPageResult(
|
|
60
|
-
category = category,
|
|
61
|
-
title = alt,
|
|
62
|
-
url = self.fix_url(href),
|
|
63
|
-
poster = self.fix_url(poster) if poster else None,
|
|
64
|
-
))
|
|
65
|
-
|
|
66
|
-
return results
|
|
67
|
-
|
|
68
|
-
async def search(self, query: str) -> list[SearchResult]:
|
|
69
|
-
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
70
|
-
secici = HTMLHelper(istek.text)
|
|
71
|
-
|
|
72
|
-
results = []
|
|
73
|
-
for veri in secici.select("div.movie-poster"):
|
|
74
|
-
alt = secici.select_attr("img", "alt", veri)
|
|
75
|
-
poster = secici.select_attr("img", "src", veri)
|
|
76
|
-
href = secici.select_attr("a", "href", veri)
|
|
77
|
-
|
|
78
|
-
if alt and href:
|
|
79
|
-
results.append(SearchResult(
|
|
80
|
-
title = alt,
|
|
81
|
-
url = self.fix_url(href),
|
|
82
|
-
poster = self.fix_url(poster) if poster else None,
|
|
83
|
-
))
|
|
84
|
-
|
|
85
|
-
return results
|
|
86
|
-
|
|
87
|
-
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
88
|
-
istek = await self.httpx.get(url)
|
|
89
|
-
secici = HTMLHelper(istek.text)
|
|
90
|
-
|
|
91
|
-
title = self.clean_title(secici.select_text("h1"))
|
|
92
|
-
poster = secici.select_poster("div.poster img")
|
|
93
|
-
description = secici.select_text("div.film") or secici.select_attr("meta[property='og:description']", "content")
|
|
94
|
-
year = secici.extract_year("div.yayin-tarihi.info") or secici.regex_first(r"\((\d{4})\)")
|
|
95
|
-
tags = secici.select_texts("div.tur.info a")
|
|
96
|
-
rating = secici.regex_first(r"IMDb\s*([\d\.]+)", secici.select_text("div.imdb"))
|
|
97
|
-
actors = secici.select_direct_text("div.oyuncular")
|
|
98
|
-
|
|
99
|
-
# Kotlin referansı: URL'de -dizi veya tags içinde dizi kontrolü
|
|
100
|
-
is_series = "-dizi" in url.lower() or any("dizi" in tag.lower() for tag in tags)
|
|
101
|
-
|
|
102
|
-
if is_series:
|
|
103
|
-
episodes = []
|
|
104
|
-
for idx, el in enumerate(secici.select("li.psec")):
|
|
105
|
-
part_id = el.attrs.get("id")
|
|
106
|
-
part_name = secici.select_text("a", el) or ""
|
|
107
|
-
if not part_name or "fragman" in part_name.lower(): continue
|
|
108
|
-
|
|
109
|
-
s, e = secici.extract_season_episode(f"{part_id} {part_name}")
|
|
110
|
-
episodes.append(Episode(season=s or 1, episode=e or (idx+1), title=f"{s or 1}. Sezon {e or idx+1}. Bölüm", url=url))
|
|
111
|
-
|
|
112
|
-
return SeriesInfo(
|
|
113
|
-
url=url, poster=self.fix_url(poster) if poster else None, title=title or "", description=description,
|
|
114
|
-
tags=tags, year=str(year) if year else None, actors=actors, rating=rating, episodes=episodes
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
return MovieInfo(
|
|
118
|
-
url=url, poster=self.fix_url(poster) if poster else None, title=title or "", description=description,
|
|
119
|
-
tags=tags, year=str(year) if year else None, actors=actors, rating=rating
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
def _get_iframe(self, source_code: str) -> str:
|
|
123
|
-
"""Base64 kodlu iframe'i çözümle"""
|
|
124
|
-
script_val = HTMLHelper(source_code).regex_first(r'<script[^>]*>(PCEtLWJhc2xpazp[^<]*)</script>')
|
|
125
|
-
if not script_val:
|
|
126
|
-
return ""
|
|
127
|
-
|
|
128
|
-
try:
|
|
129
|
-
decoded_html = base64.b64decode(script_val).decode("utf-8")
|
|
130
|
-
iframe_src = HTMLHelper(decoded_html).regex_first(r'<iframe[^>]+src=["\']([^"\']+)["\']')
|
|
131
|
-
return self.fix_url(iframe_src) if iframe_src else ""
|
|
132
|
-
except Exception:
|
|
133
|
-
return ""
|
|
134
|
-
|
|
135
|
-
def _extract_subtitle_url(self, source_code: str) -> str | None:
|
|
136
|
-
"""playerjsSubtitle değişkeninden .srt URL çıkar"""
|
|
137
|
-
patterns = [
|
|
138
|
-
r'var playerjsSubtitle = "\[Türkçe\](https?://[^\s"]+?\.srt)";',
|
|
139
|
-
r'var playerjsSubtitle = "(https?://[^\s"]+?\.srt)";',
|
|
140
|
-
r'subtitle:\s*"(https?://[^\s"]+?\.srt)"',
|
|
141
|
-
]
|
|
142
|
-
|
|
143
|
-
for pattern in patterns:
|
|
144
|
-
val = HTMLHelper(source_code).regex_first(pattern)
|
|
145
|
-
if val:
|
|
146
|
-
return val
|
|
147
|
-
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
151
|
-
self.httpx.headers.update({
|
|
152
|
-
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
|
|
153
|
-
"Referer" : self.main_url
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
istek = await self.httpx.get(url)
|
|
157
|
-
source_code = istek.text
|
|
158
|
-
|
|
159
|
-
# Ana sayfadan altyazı URL'sini çek
|
|
160
|
-
subtitle_url = self._extract_subtitle_url(source_code)
|
|
161
|
-
|
|
162
|
-
# Iframe'den altyazı URL'sini çek
|
|
163
|
-
iframe_src = self._get_iframe(source_code)
|
|
164
|
-
|
|
165
|
-
if not subtitle_url and iframe_src:
|
|
166
|
-
iframe_istek = await self.httpx.get(iframe_src)
|
|
167
|
-
subtitle_url = self._extract_subtitle_url(iframe_istek.text)
|
|
168
|
-
|
|
169
|
-
results = []
|
|
170
|
-
|
|
171
|
-
if iframe_src:
|
|
172
|
-
data = await self.extract(iframe_src)
|
|
173
|
-
if data:
|
|
174
|
-
# ExtractResult objesi immutable, yeni bir kopya oluştur
|
|
175
|
-
subtitles = [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
|
|
176
|
-
updated_data = data.model_copy(update={"subtitles": subtitles}) if subtitles else data
|
|
177
|
-
results.append(updated_data)
|
|
178
|
-
|
|
179
|
-
return results
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|