KekikStream 1.6.7__py3-none-any.whl → 1.7.2__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/Plugin/PluginModels.py +1 -0
- KekikStream/Plugins/DiziPal.py +246 -0
- KekikStream/Plugins/DiziYou.py +1 -1
- KekikStream/Plugins/FilmMakinesi.py +1 -1
- KekikStream/Plugins/FilmModu.py +138 -0
- KekikStream/Plugins/HDFilmCehennemi.py +1 -1
- KekikStream/Plugins/SinemaCX.py +157 -0
- {kekikstream-1.6.7.dist-info → kekikstream-1.7.2.dist-info}/METADATA +1 -1
- {kekikstream-1.6.7.dist-info → kekikstream-1.7.2.dist-info}/RECORD +13 -10
- {kekikstream-1.6.7.dist-info → kekikstream-1.7.2.dist-info}/WHEEL +0 -0
- {kekikstream-1.6.7.dist-info → kekikstream-1.7.2.dist-info}/entry_points.txt +0 -0
- {kekikstream-1.6.7.dist-info → kekikstream-1.7.2.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-1.6.7.dist-info → kekikstream-1.7.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,246 @@
|
|
|
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
|
|
4
|
+
from parsel import Selector
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
class DiziPal(PluginBase):
|
|
8
|
+
name = "DiziPal"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://dizipal1222.com"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Yabancı Dizi ve Film izle."
|
|
13
|
+
|
|
14
|
+
main_page = {
|
|
15
|
+
f"{main_url}/diziler/son-bolumler" : "Son Bölümler",
|
|
16
|
+
f"{main_url}/diziler" : "Yeni Diziler",
|
|
17
|
+
f"{main_url}/filmler" : "Yeni Filmler",
|
|
18
|
+
f"{main_url}/koleksiyon/netflix" : "Netflix",
|
|
19
|
+
f"{main_url}/koleksiyon/exxen" : "Exxen",
|
|
20
|
+
f"{main_url}/koleksiyon/blutv" : "BluTV",
|
|
21
|
+
f"{main_url}/koleksiyon/disney" : "Disney+",
|
|
22
|
+
f"{main_url}/koleksiyon/amazon-prime" : "Amazon Prime",
|
|
23
|
+
f"{main_url}/koleksiyon/tod-bein" : "TOD (beIN)",
|
|
24
|
+
f"{main_url}/koleksiyon/gain" : "Gain",
|
|
25
|
+
f"{main_url}/tur/mubi" : "Mubi",
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
29
|
+
istek = await self.cffi.get(url)
|
|
30
|
+
secici = Selector(istek.text)
|
|
31
|
+
|
|
32
|
+
results = []
|
|
33
|
+
|
|
34
|
+
if "/son-bolumler" in url:
|
|
35
|
+
for veri in secici.css("div.episode-item"):
|
|
36
|
+
name = veri.css("div.name::text").get()
|
|
37
|
+
episode = veri.css("div.episode::text").get()
|
|
38
|
+
href = veri.css("a::attr(href)").get()
|
|
39
|
+
poster = veri.css("img::attr(src)").get()
|
|
40
|
+
|
|
41
|
+
if name and href:
|
|
42
|
+
ep_text = episode.strip().replace(". Sezon ", "x").replace(". Bölüm", "") if episode else ""
|
|
43
|
+
title = f"{name} {ep_text}"
|
|
44
|
+
# Son bölümler linkini dizi sayfasına çevir
|
|
45
|
+
dizi_url = href.split("/sezon")[0] if "/sezon" in href else href
|
|
46
|
+
|
|
47
|
+
results.append(MainPageResult(
|
|
48
|
+
category = category,
|
|
49
|
+
title = title,
|
|
50
|
+
url = self.fix_url(dizi_url),
|
|
51
|
+
poster = self.fix_url(poster) if poster else None,
|
|
52
|
+
))
|
|
53
|
+
else:
|
|
54
|
+
for veri in secici.css("article.type2 ul li"):
|
|
55
|
+
title = veri.css("span.title::text").get()
|
|
56
|
+
href = veri.css("a::attr(href)").get()
|
|
57
|
+
poster = veri.css("img::attr(src)").get()
|
|
58
|
+
|
|
59
|
+
if title and href:
|
|
60
|
+
results.append(MainPageResult(
|
|
61
|
+
category = category,
|
|
62
|
+
title = title,
|
|
63
|
+
url = self.fix_url(href),
|
|
64
|
+
poster = self.fix_url(poster) if poster else None,
|
|
65
|
+
))
|
|
66
|
+
|
|
67
|
+
return results
|
|
68
|
+
|
|
69
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
70
|
+
self.cffi.headers.update({
|
|
71
|
+
"Accept" : "application/json, text/javascript, */*; q=0.01",
|
|
72
|
+
"X-Requested-With" : "XMLHttpRequest"
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
istek = await self.cffi.post(
|
|
76
|
+
url = f"{self.main_url}/api/search-autocomplete",
|
|
77
|
+
data = {"query": query}
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
data = istek.json()
|
|
82
|
+
except Exception:
|
|
83
|
+
return []
|
|
84
|
+
|
|
85
|
+
results = []
|
|
86
|
+
|
|
87
|
+
# API bazen dict, bazen list döner
|
|
88
|
+
items = data.values() if isinstance(data, dict) else data
|
|
89
|
+
|
|
90
|
+
for item in items:
|
|
91
|
+
if not isinstance(item, dict):
|
|
92
|
+
continue
|
|
93
|
+
|
|
94
|
+
title = item.get("title")
|
|
95
|
+
url = item.get("url")
|
|
96
|
+
poster = item.get("poster")
|
|
97
|
+
|
|
98
|
+
if title and url:
|
|
99
|
+
results.append(SearchResult(
|
|
100
|
+
title = title,
|
|
101
|
+
url = f"{self.main_url}{url}",
|
|
102
|
+
poster = self.fix_url(poster) if poster else None,
|
|
103
|
+
))
|
|
104
|
+
|
|
105
|
+
return results
|
|
106
|
+
|
|
107
|
+
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
108
|
+
# Reset headers to get HTML response
|
|
109
|
+
self.cffi.headers.update({
|
|
110
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
|
|
111
|
+
})
|
|
112
|
+
self.cffi.headers.pop("X-Requested-With", None)
|
|
113
|
+
|
|
114
|
+
istek = await self.cffi.get(url)
|
|
115
|
+
secici = Selector(text=istek.text, type="html")
|
|
116
|
+
|
|
117
|
+
poster = self.fix_url(secici.css("meta[property='og:image']::attr(content)").get())
|
|
118
|
+
year = secici.xpath("//div[text()='Yapım Yılı']//following-sibling::div/text()").get()
|
|
119
|
+
description = secici.css("div.summary p::text").get()
|
|
120
|
+
rating = secici.xpath("//div[text()='IMDB Puanı']//following-sibling::div/text()").get()
|
|
121
|
+
tags_raw = secici.xpath("//div[text()='Türler']//following-sibling::div/text()").get()
|
|
122
|
+
tags = [t.strip() for t in tags_raw.split() if t.strip()] if tags_raw else None
|
|
123
|
+
|
|
124
|
+
dur_text = secici.xpath("//div[text()='Ortalama Süre']//following-sibling::div/text()").get()
|
|
125
|
+
dur_match = re.search(r"(\d+)", dur_text or "")
|
|
126
|
+
duration = int(dur_match[1]) if dur_match else None
|
|
127
|
+
|
|
128
|
+
if "/dizi/" in url:
|
|
129
|
+
title = secici.css("div.cover h5::text").get()
|
|
130
|
+
|
|
131
|
+
episodes = []
|
|
132
|
+
for ep in secici.css("div.episode-item"):
|
|
133
|
+
ep_name = ep.css("div.name::text").get()
|
|
134
|
+
ep_href = ep.css("a::attr(href)").get()
|
|
135
|
+
ep_text = ep.css("div.episode::text").get() or ""
|
|
136
|
+
ep_parts = ep_text.strip().split(" ")
|
|
137
|
+
|
|
138
|
+
ep_season = None
|
|
139
|
+
ep_episode = None
|
|
140
|
+
if len(ep_parts) >= 4:
|
|
141
|
+
try:
|
|
142
|
+
ep_season = int(ep_parts[0].replace(".", ""))
|
|
143
|
+
ep_episode = int(ep_parts[2].replace(".", ""))
|
|
144
|
+
except ValueError:
|
|
145
|
+
pass
|
|
146
|
+
|
|
147
|
+
if ep_name and ep_href:
|
|
148
|
+
episodes.append(Episode(
|
|
149
|
+
season = ep_season,
|
|
150
|
+
episode = ep_episode,
|
|
151
|
+
title = ep_name.strip(),
|
|
152
|
+
url = self.fix_url(ep_href),
|
|
153
|
+
))
|
|
154
|
+
|
|
155
|
+
return SeriesInfo(
|
|
156
|
+
url = url,
|
|
157
|
+
poster = poster,
|
|
158
|
+
title = title,
|
|
159
|
+
description = description.strip() if description else None,
|
|
160
|
+
tags = tags,
|
|
161
|
+
rating = rating.strip() if rating else None,
|
|
162
|
+
year = year.strip() if year else None,
|
|
163
|
+
duration = duration,
|
|
164
|
+
episodes = episodes if episodes else None,
|
|
165
|
+
)
|
|
166
|
+
else:
|
|
167
|
+
title = secici.xpath("//div[@class='g-title'][2]/div/text()").get()
|
|
168
|
+
|
|
169
|
+
return MovieInfo(
|
|
170
|
+
url = url,
|
|
171
|
+
poster = poster,
|
|
172
|
+
title = title.strip() if title else None,
|
|
173
|
+
description = description.strip() if description else None,
|
|
174
|
+
tags = tags,
|
|
175
|
+
rating = rating.strip() if rating else None,
|
|
176
|
+
year = year.strip() if year else None,
|
|
177
|
+
duration = duration,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
181
|
+
# Reset headers to get HTML response
|
|
182
|
+
self.cffi.headers.update({
|
|
183
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
|
|
184
|
+
})
|
|
185
|
+
self.cffi.headers.pop("X-Requested-With", None)
|
|
186
|
+
|
|
187
|
+
istek = await self.cffi.get(url)
|
|
188
|
+
secici = Selector(istek.text)
|
|
189
|
+
|
|
190
|
+
iframe = secici.css(".series-player-container iframe::attr(src)").get()
|
|
191
|
+
if not iframe:
|
|
192
|
+
iframe = secici.css("div#vast_new iframe::attr(src)").get()
|
|
193
|
+
|
|
194
|
+
if not iframe:
|
|
195
|
+
return []
|
|
196
|
+
|
|
197
|
+
results = []
|
|
198
|
+
|
|
199
|
+
self.cffi.headers.update({"Referer": f"{self.main_url}/"})
|
|
200
|
+
i_istek = await self.cffi.get(iframe)
|
|
201
|
+
i_text = i_istek.text
|
|
202
|
+
|
|
203
|
+
# m3u link çıkar
|
|
204
|
+
m3u_match = re.search(r'file:"([^"]+)"', i_text)
|
|
205
|
+
if m3u_match:
|
|
206
|
+
m3u_link = m3u_match[1]
|
|
207
|
+
|
|
208
|
+
# Altyazıları çıkar
|
|
209
|
+
subtitles = []
|
|
210
|
+
sub_match = re.search(r'"subtitle":"([^"]+)"', i_text)
|
|
211
|
+
if sub_match:
|
|
212
|
+
sub_text = sub_match[1]
|
|
213
|
+
if "," in sub_text:
|
|
214
|
+
for sub in sub_text.split(","):
|
|
215
|
+
lang = sub.split("[")[1].split("]")[0] if "[" in sub else "Türkçe"
|
|
216
|
+
sub_url = sub.replace(f"[{lang}]", "")
|
|
217
|
+
subtitles.append(Subtitle(name=lang, url=self.fix_url(sub_url)))
|
|
218
|
+
else:
|
|
219
|
+
lang = sub_text.split("[")[1].split("]")[0] if "[" in sub_text else "Türkçe"
|
|
220
|
+
sub_url = sub_text.replace(f"[{lang}]", "")
|
|
221
|
+
subtitles.append(Subtitle(name=lang, url=self.fix_url(sub_url)))
|
|
222
|
+
|
|
223
|
+
results.append({
|
|
224
|
+
"name" : self.name,
|
|
225
|
+
"url" : m3u_link,
|
|
226
|
+
"referer" : f"{self.main_url}/",
|
|
227
|
+
"subtitles" : subtitles
|
|
228
|
+
})
|
|
229
|
+
else:
|
|
230
|
+
# Extractor'a yönlendir
|
|
231
|
+
extractor = self.ex_manager.find_extractor(iframe)
|
|
232
|
+
results.append({
|
|
233
|
+
"name" : f"{extractor.name if extractor else self.name}",
|
|
234
|
+
"url" : iframe,
|
|
235
|
+
"referer" : f"{self.main_url}/",
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
return results
|
|
239
|
+
|
|
240
|
+
async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
|
|
241
|
+
extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
|
|
242
|
+
self.media_handler.title = name
|
|
243
|
+
if self.name not in self.media_handler.title:
|
|
244
|
+
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
245
|
+
|
|
246
|
+
self.media_handler.play_media(extract_result)
|
KekikStream/Plugins/DiziYou.py
CHANGED
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
class DiziYou(PluginBase):
|
|
8
8
|
name = "DiziYou"
|
|
9
9
|
language = "tr"
|
|
10
|
-
main_url = "https://www.diziyou.
|
|
10
|
+
main_url = "https://www.diziyou.one"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
12
|
description = "Diziyou en kaliteli Türkçe dublaj ve altyazılı yabancı dizi izleme sitesidir. Güncel ve efsanevi dizileri 1080p Full HD kalitede izlemek için hemen tıkla!"
|
|
13
13
|
|
|
@@ -6,7 +6,7 @@ from parsel import Selector
|
|
|
6
6
|
class FilmMakinesi(PluginBase):
|
|
7
7
|
name = "FilmMakinesi"
|
|
8
8
|
language = "tr"
|
|
9
|
-
main_url = "https://filmmakinesi.
|
|
9
|
+
main_url = "https://filmmakinesi.to"
|
|
10
10
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
11
11
|
description = "Film Makinesi, en yeni ve en güncel filmleri sitemizde full HD kalite farkı ile izleyebilirsiniz. HD film izle denildiğinde akla gelen en kaliteli film izleme sitesi."
|
|
12
12
|
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
|
|
4
|
+
from parsel import Selector
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
class FilmModu(PluginBase):
|
|
8
|
+
name = "FilmModu"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://www.filmmodu.ws"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
|
|
13
|
+
|
|
14
|
+
main_page = {
|
|
15
|
+
f"{main_url}/hd-film-kategori/4k-film-izle?page=SAYFA" : "4K",
|
|
16
|
+
f"{main_url}/hd-film-kategori/aile-filmleri?page=SAYFA" : "Aile",
|
|
17
|
+
f"{main_url}/hd-film-kategori/aksiyon?page=SAYFA" : "Aksiyon",
|
|
18
|
+
f"{main_url}/hd-film-kategori/animasyon?page=SAYFA" : "Animasyon",
|
|
19
|
+
f"{main_url}/hd-film-kategori/belgeseller?page=SAYFA" : "Belgesel",
|
|
20
|
+
f"{main_url}/hd-film-kategori/bilim-kurgu-filmleri?page=SAYFA" : "Bilim-Kurgu",
|
|
21
|
+
f"{main_url}/hd-film-kategori/dram-filmleri?page=SAYFA" : "Dram",
|
|
22
|
+
f"{main_url}/hd-film-kategori/fantastik-filmler?page=SAYFA" : "Fantastik",
|
|
23
|
+
f"{main_url}/hd-film-kategori/gerilim?page=SAYFA" : "Gerilim",
|
|
24
|
+
f"{main_url}/hd-film-kategori/gizem-filmleri?page=SAYFA" : "Gizem",
|
|
25
|
+
f"{main_url}/hd-film-kategori/hd-hint-filmleri?page=SAYFA" : "Hint Filmleri",
|
|
26
|
+
f"{main_url}/hd-film-kategori/kisa-film?page=SAYFA" : "Kısa Film",
|
|
27
|
+
f"{main_url}/hd-film-kategori/hd-komedi-filmleri?page=SAYFA" : "Komedi",
|
|
28
|
+
f"{main_url}/hd-film-kategori/korku-filmleri?page=SAYFA" : "Korku",
|
|
29
|
+
f"{main_url}/hd-film-kategori/kult-filmler-izle?page=SAYFA" : "Kült Filmler",
|
|
30
|
+
f"{main_url}/hd-film-kategori/macera-filmleri?page=SAYFA" : "Macera",
|
|
31
|
+
f"{main_url}/hd-film-kategori/muzik?page=SAYFA" : "Müzik",
|
|
32
|
+
f"{main_url}/hd-film-kategori/odullu-filmler-izle?page=SAYFA" : "Oscar Ödüllü",
|
|
33
|
+
f"{main_url}/hd-film-kategori/romantik-filmler?page=SAYFA" : "Romantik",
|
|
34
|
+
f"{main_url}/hd-film-kategori/savas?page=SAYFA" : "Savaş",
|
|
35
|
+
f"{main_url}/hd-film-kategori/stand-up?page=SAYFA" : "Stand Up",
|
|
36
|
+
f"{main_url}/hd-film-kategori/suc-filmleri?page=SAYFA" : "Suç",
|
|
37
|
+
f"{main_url}/hd-film-kategori/tarih?page=SAYFA" : "Tarih",
|
|
38
|
+
f"{main_url}/hd-film-kategori/tavsiye-filmler?page=SAYFA" : "Tavsiye",
|
|
39
|
+
f"{main_url}/hd-film-kategori/tv-film?page=SAYFA" : "TV Film",
|
|
40
|
+
f"{main_url}/hd-film-kategori/vahsi-bati-filmleri?page=SAYFA" : "Vahşi Batı",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
44
|
+
istek = await self.cffi.get(url.replace("SAYFA", str(page)))
|
|
45
|
+
secici = Selector(istek.text)
|
|
46
|
+
|
|
47
|
+
return [
|
|
48
|
+
MainPageResult(
|
|
49
|
+
category = category,
|
|
50
|
+
title = veri.css("a::text").get(),
|
|
51
|
+
url = self.fix_url(veri.css("a::attr(href)").get()),
|
|
52
|
+
poster = self.fix_url(veri.css("picture img::attr(data-src)").get()),
|
|
53
|
+
)
|
|
54
|
+
for veri in secici.css("div.movie")
|
|
55
|
+
if veri.css("a::text").get()
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
59
|
+
istek = await self.cffi.get(f"{self.main_url}/film-ara?term={query}")
|
|
60
|
+
secici = Selector(istek.text)
|
|
61
|
+
|
|
62
|
+
return [
|
|
63
|
+
SearchResult(
|
|
64
|
+
title = veri.css("a::text").get(),
|
|
65
|
+
url = self.fix_url(veri.css("a::attr(href)").get()),
|
|
66
|
+
poster = self.fix_url(veri.css("picture img::attr(data-src)").get()),
|
|
67
|
+
)
|
|
68
|
+
for veri in secici.css("div.movie")
|
|
69
|
+
if veri.css("a::text").get()
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
async def load_item(self, url: str) -> MovieInfo:
|
|
73
|
+
istek = await self.cffi.get(url)
|
|
74
|
+
secici = Selector(istek.text)
|
|
75
|
+
|
|
76
|
+
org_title = secici.css("div.titles h1::text").get()
|
|
77
|
+
alt_title = secici.css("div.titles h2::text").get()
|
|
78
|
+
title = f"{org_title} - {alt_title}" if alt_title else org_title
|
|
79
|
+
|
|
80
|
+
return MovieInfo(
|
|
81
|
+
url = url,
|
|
82
|
+
poster = self.fix_url(secici.css("img.img-responsive::attr(src)").get()),
|
|
83
|
+
title = title,
|
|
84
|
+
description = secici.css("p[itemprop='description']::text").get(),
|
|
85
|
+
tags = [a.css("::text").get() for a in secici.css("a[href*='film-tur/']")],
|
|
86
|
+
year = secici.css("span[itemprop='dateCreated']::text").get(),
|
|
87
|
+
actors = [a.css("span::text").get() for a in secici.css("a[itemprop='actor']")],
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
91
|
+
istek = await self.cffi.get(url)
|
|
92
|
+
secici = Selector(istek.text)
|
|
93
|
+
|
|
94
|
+
results = []
|
|
95
|
+
|
|
96
|
+
for alternatif in secici.css("div.alternates a"):
|
|
97
|
+
alt_link = self.fix_url(alternatif.css("::attr(href)").get())
|
|
98
|
+
alt_name = alternatif.css("::text").get()
|
|
99
|
+
|
|
100
|
+
if alt_name == "Fragman" or not alt_link:
|
|
101
|
+
continue
|
|
102
|
+
|
|
103
|
+
alt_istek = await self.cffi.get(alt_link)
|
|
104
|
+
alt_text = alt_istek.text
|
|
105
|
+
|
|
106
|
+
vid_id = re.search(r"var videoId = '(.*)'", alt_text)
|
|
107
|
+
vid_type = re.search(r"var videoType = '(.*)'", alt_text)
|
|
108
|
+
|
|
109
|
+
if not vid_id or not vid_type:
|
|
110
|
+
continue
|
|
111
|
+
|
|
112
|
+
source_istek = await self.cffi.get(
|
|
113
|
+
f"{self.main_url}/get-source?movie_id={vid_id[1]}&type={vid_type[1]}"
|
|
114
|
+
)
|
|
115
|
+
source_data = source_istek.json()
|
|
116
|
+
|
|
117
|
+
if source_data.get("subtitle"):
|
|
118
|
+
subtitle_url = self.fix_url(source_data["subtitle"])
|
|
119
|
+
else:
|
|
120
|
+
subtitle_url = None
|
|
121
|
+
|
|
122
|
+
for source in source_data.get("sources", []):
|
|
123
|
+
results.append({
|
|
124
|
+
"name" : f"{self.name} | {alt_name} | {source.get('label', 'Bilinmiyor')}",
|
|
125
|
+
"url" : self.fix_url(source["src"]),
|
|
126
|
+
"referer" : f"{self.main_url}/",
|
|
127
|
+
"subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
return results
|
|
131
|
+
|
|
132
|
+
async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
|
|
133
|
+
extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
|
|
134
|
+
self.media_handler.title = 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)
|
|
@@ -8,7 +8,7 @@ import random, string, re
|
|
|
8
8
|
class HDFilmCehennemi(PluginBase):
|
|
9
9
|
name = "HDFilmCehennemi"
|
|
10
10
|
language = "tr"
|
|
11
|
-
main_url = "https://www.hdfilmcehennemi.
|
|
11
|
+
main_url = "https://www.hdfilmcehennemi.ws"
|
|
12
12
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
13
13
|
description = "Türkiye'nin en hızlı hd film izleme sitesi"
|
|
14
14
|
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
|
|
4
|
+
from parsel import Selector
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
class SinemaCX(PluginBase):
|
|
8
|
+
name = "SinemaCX"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://www.sinema.now"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
|
|
13
|
+
|
|
14
|
+
main_page = {
|
|
15
|
+
f"{main_url}/page/SAYFA" : "Son Eklenen Filmler",
|
|
16
|
+
f"{main_url}/izle/aile-filmleri/page/SAYFA" : "Aile Filmleri",
|
|
17
|
+
f"{main_url}/izle/aksiyon-filmleri/page/SAYFA" : "Aksiyon Filmleri",
|
|
18
|
+
f"{main_url}/izle/animasyon-filmleri/page/SAYFA" : "Animasyon Filmleri",
|
|
19
|
+
f"{main_url}/izle/belgesel/page/SAYFA" : "Belgesel Filmleri",
|
|
20
|
+
f"{main_url}/izle/bilim-kurgu-filmleri/page/SAYFA" : "Bilim Kurgu Filmler",
|
|
21
|
+
f"{main_url}/izle/biyografi/page/SAYFA" : "Biyografi Filmleri",
|
|
22
|
+
f"{main_url}/izle/fantastik-filmler/page/SAYFA" : "Fantastik Filmler",
|
|
23
|
+
f"{main_url}/izle/gizem-filmleri/page/SAYFA" : "Gizem Filmleri",
|
|
24
|
+
f"{main_url}/izle/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
|
|
25
|
+
f"{main_url}/izle/korku-filmleri/page/SAYFA" : "Korku Filmleri",
|
|
26
|
+
f"{main_url}/izle/macera-filmleri/page/SAYFA" : "Macera Filmleri",
|
|
27
|
+
f"{main_url}/izle/romantik-filmler/page/SAYFA" : "Romantik Filmler",
|
|
28
|
+
f"{main_url}/izle/erotik-filmler/page/SAYFA" : "Erotik Film",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
32
|
+
istek = await self.cffi.get(url.replace("SAYFA", str(page)))
|
|
33
|
+
secici = Selector(istek.text)
|
|
34
|
+
|
|
35
|
+
return [
|
|
36
|
+
MainPageResult(
|
|
37
|
+
category = category,
|
|
38
|
+
title = veri.css("div.yanac span::text").get(),
|
|
39
|
+
url = self.fix_url(veri.css("div.yanac a::attr(href)").get()),
|
|
40
|
+
poster = self.fix_url(veri.css("a.resim img::attr(data-src)").get() or veri.css("a.resim img::attr(src)").get()),
|
|
41
|
+
)
|
|
42
|
+
for veri in secici.css("div.son div.frag-k, div.icerik div.frag-k")
|
|
43
|
+
if veri.css("div.yanac span::text").get()
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
47
|
+
istek = await self.cffi.get(f"{self.main_url}/?s={query}")
|
|
48
|
+
secici = Selector(istek.text)
|
|
49
|
+
|
|
50
|
+
return [
|
|
51
|
+
SearchResult(
|
|
52
|
+
title = veri.css("div.yanac span::text").get(),
|
|
53
|
+
url = self.fix_url(veri.css("div.yanac a::attr(href)").get()),
|
|
54
|
+
poster = self.fix_url(veri.css("a.resim img::attr(data-src)").get() or veri.css("a.resim img::attr(src)").get()),
|
|
55
|
+
)
|
|
56
|
+
for veri in secici.css("div.icerik div.frag-k")
|
|
57
|
+
if veri.css("div.yanac span::text").get()
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
async def load_item(self, url: str) -> MovieInfo:
|
|
61
|
+
istek = await self.cffi.get(url)
|
|
62
|
+
secici = Selector(istek.text)
|
|
63
|
+
|
|
64
|
+
duration_match = re.search(r"Süre:.*?(\d+)\s*Dakika", istek.text)
|
|
65
|
+
description = secici.css("div.ackl div.scroll-liste::text").get()
|
|
66
|
+
|
|
67
|
+
return MovieInfo(
|
|
68
|
+
url = url,
|
|
69
|
+
poster = self.fix_url(secici.css("link[rel='image_src']::attr(href)").get()),
|
|
70
|
+
title = secici.css("div.f-bilgi h1::text").get(),
|
|
71
|
+
description = description.strip() if description else None,
|
|
72
|
+
tags = [a.css("::text").get() for a in secici.css("div.f-bilgi div.tur a")],
|
|
73
|
+
year = secici.css("div.f-bilgi ul.detay a[href*='yapim']::text").get(),
|
|
74
|
+
actors = [li.css("span.isim::text").get() for li in secici.css("li.oync li.oyuncu-k")],
|
|
75
|
+
duration = int(duration_match[1]) if duration_match else None,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
79
|
+
istek = await self.cffi.get(url)
|
|
80
|
+
secici = Selector(istek.text)
|
|
81
|
+
|
|
82
|
+
iframe_list = [iframe.css("::attr(data-vsrc)").get() for iframe in secici.css("iframe")]
|
|
83
|
+
iframe_list = [i for i in iframe_list if i]
|
|
84
|
+
|
|
85
|
+
# Sadece fragman varsa /2/ sayfasından dene
|
|
86
|
+
has_only_trailer = all(
|
|
87
|
+
"youtube" in (i or "").lower() or "fragman" in (i or "").lower() or "trailer" in (i or "").lower()
|
|
88
|
+
for i in iframe_list
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
if has_only_trailer:
|
|
92
|
+
alt_url = url.rstrip("/") + "/2/"
|
|
93
|
+
alt_istek = await self.cffi.get(alt_url)
|
|
94
|
+
alt_sec = Selector(alt_istek.text)
|
|
95
|
+
iframe_list = [iframe.css("::attr(data-vsrc)").get() for iframe in alt_sec.css("iframe")]
|
|
96
|
+
iframe_list = [i for i in iframe_list if i]
|
|
97
|
+
|
|
98
|
+
if not iframe_list:
|
|
99
|
+
return []
|
|
100
|
+
|
|
101
|
+
iframe = self.fix_url(iframe_list[0].split("?img=")[0])
|
|
102
|
+
if not iframe:
|
|
103
|
+
return []
|
|
104
|
+
|
|
105
|
+
results = []
|
|
106
|
+
|
|
107
|
+
# Altyazı kontrolü
|
|
108
|
+
self.cffi.headers.update({"Referer": f"{self.main_url}/"})
|
|
109
|
+
iframe_istek = await self.cffi.get(iframe)
|
|
110
|
+
iframe_text = iframe_istek.text
|
|
111
|
+
|
|
112
|
+
subtitles = []
|
|
113
|
+
sub_match = re.search(r'playerjsSubtitle\s*=\s*"(.+?)"', iframe_text)
|
|
114
|
+
if sub_match:
|
|
115
|
+
sub_section = sub_match[1]
|
|
116
|
+
for sub in re.finditer(r'\[(.*?)](https?://[^\s",]+)', sub_section):
|
|
117
|
+
subtitles.append(Subtitle(name=sub[1], url=self.fix_url(sub[2])))
|
|
118
|
+
|
|
119
|
+
# player.filmizle.in kontrolü
|
|
120
|
+
if "player.filmizle.in" in iframe.lower():
|
|
121
|
+
base_match = re.search(r"https?://([^/]+)", iframe)
|
|
122
|
+
if base_match:
|
|
123
|
+
base_url = base_match[1]
|
|
124
|
+
vid_id = iframe.split("/")[-1]
|
|
125
|
+
|
|
126
|
+
self.cffi.headers.update({"X-Requested-With": "XMLHttpRequest"})
|
|
127
|
+
vid_istek = await self.cffi.post(
|
|
128
|
+
f"https://{base_url}/player/index.php?data={vid_id}&do=getVideo",
|
|
129
|
+
)
|
|
130
|
+
vid_data = vid_istek.json()
|
|
131
|
+
|
|
132
|
+
if vid_data.get("securedLink"):
|
|
133
|
+
results.append({
|
|
134
|
+
"name" : f"{self.name}",
|
|
135
|
+
"url" : vid_data["securedLink"],
|
|
136
|
+
"referer" : iframe,
|
|
137
|
+
"subtitles" : subtitles
|
|
138
|
+
})
|
|
139
|
+
else:
|
|
140
|
+
# Extractor'a yönlendir
|
|
141
|
+
extractor = self.ex_manager.find_extractor(iframe)
|
|
142
|
+
results.append({
|
|
143
|
+
"name" : f"{extractor.name if extractor else self.name}",
|
|
144
|
+
"url" : iframe,
|
|
145
|
+
"referer" : f"{self.main_url}/",
|
|
146
|
+
"subtitles" : subtitles
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
return results
|
|
150
|
+
|
|
151
|
+
async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
|
|
152
|
+
extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
|
|
153
|
+
self.media_handler.title = name
|
|
154
|
+
if self.name not in self.media_handler.title:
|
|
155
|
+
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
156
|
+
|
|
157
|
+
self.media_handler.play_media(extract_result)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.2
|
|
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
|
|
@@ -13,7 +13,7 @@ KekikStream/Core/Media/MediaManager.py,sha256=9ItiUguOkk3wg3YY5uf3mrjfwLPCvggnP8
|
|
|
13
13
|
KekikStream/Core/Plugin/PluginBase.py,sha256=TjIRKBz_3R5TiD_qMch2fd0q68aK5cdC9yyiHiutZSA,3759
|
|
14
14
|
KekikStream/Core/Plugin/PluginLoader.py,sha256=yZxMug-OcJ5RBm4fQkoquKrZxcBU7Pvt4IcY-d0WU8g,3393
|
|
15
15
|
KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
|
|
16
|
-
KekikStream/Core/Plugin/PluginModels.py,sha256=
|
|
16
|
+
KekikStream/Core/Plugin/PluginModels.py,sha256=Aty3V4B3nPStVVSjYO9EIBmbUhavChQwQjC3l5TsrQI,2583
|
|
17
17
|
KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
|
|
18
18
|
KekikStream/Extractors/CloseLoad.py,sha256=yIWPNVYTHcBT8Yqjx9pYt8oIwvSplCMjxUaSGqZROqs,909
|
|
19
19
|
KekikStream/Extractors/ContentX.py,sha256=gDzMeIS3OYLbMlide8AJLZOSaSZt3WMIQWKQDn_8v6o,3040
|
|
@@ -43,19 +43,22 @@ KekikStream/Extractors/VidMolyMe.py,sha256=ogLiFUJVqFbhtzQrZ1gSB9me85DiHvntjWtSv
|
|
|
43
43
|
KekikStream/Extractors/VidMoxy.py,sha256=p1BpAUXtzBlZwmXROPsdvOQBgjMDungGDdvtsdc0NZE,1797
|
|
44
44
|
KekikStream/Extractors/VideoSeyred.py,sha256=LSSm1L_iWIeqoteU9aiVy3-BAoiGImPf0CzfsJCDDZ0,2006
|
|
45
45
|
KekikStream/Plugins/DiziBox.py,sha256=LNoZ6f2K8jM4YM20kNs5sqYhogssmY5sLri1PBMjwGo,10076
|
|
46
|
-
KekikStream/Plugins/
|
|
46
|
+
KekikStream/Plugins/DiziPal.py,sha256=RwiAKtWhYS54Z1V5D4Ao2AqOuzwde5gJwtLQ0HbqvyM,10183
|
|
47
|
+
KekikStream/Plugins/DiziYou.py,sha256=WNpATGRswsLwxErDHaK1zMDhBLF9CAZVc7_RhX9V3DU,8000
|
|
47
48
|
KekikStream/Plugins/Dizilla.py,sha256=Z2ah1Ha_wBaDQSxmrsqnSYC3IGao5_TxmgqAW6UIQ1o,7319
|
|
48
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
49
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=nmuAzgNaUEcN4qJa-ByDQlRN4eESL2BdKj3jeeAHz74,5311
|
|
50
|
+
KekikStream/Plugins/FilmModu.py,sha256=cPiiSj8nQOKAVS0uMjZjyX5Kc9GX2-A3lqRj3iZnZkE,6786
|
|
49
51
|
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=J7fFb_mfPTw0VqkMHcd8XWh2A1PW76ZCmNzUyyoIjD4,6278
|
|
50
|
-
KekikStream/Plugins/HDFilmCehennemi.py,sha256=
|
|
52
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=NwAZ9xkXpGyCfHH07MG0AZd9e-Bmfr5dHzkTU1TqFn0,9801
|
|
51
53
|
KekikStream/Plugins/JetFilmizle.py,sha256=3yB_EtsWD7O2iqN2j-VinmnJCSNoITxhWnVgGoFh1J0,5882
|
|
52
54
|
KekikStream/Plugins/RecTV.py,sha256=bRnWldNPRK3NG4hQAWVTCZ3XSuuujqE6orEig_6WkBs,7707
|
|
53
55
|
KekikStream/Plugins/SezonlukDizi.py,sha256=pkmZO0urmyMKTBFKn8RSJCx605hprJ4XC_oJBjzIKd4,6332
|
|
54
56
|
KekikStream/Plugins/SineWix.py,sha256=YIYmWB8ft2FfuVg-hHnCpNmQTHeCuHBnQPSjdSvf7cE,7575
|
|
57
|
+
KekikStream/Plugins/SinemaCX.py,sha256=YarpMcPSMw9smu4S08lRjvxtAepQrlhHGkQcnR6_0s0,7254
|
|
55
58
|
KekikStream/Plugins/UgurFilm.py,sha256=x1RuEe1jLCT8Ie_Kmp2IZCHFK558krewHoOJGrhAau8,4954
|
|
56
|
-
kekikstream-1.
|
|
57
|
-
kekikstream-1.
|
|
58
|
-
kekikstream-1.
|
|
59
|
-
kekikstream-1.
|
|
60
|
-
kekikstream-1.
|
|
61
|
-
kekikstream-1.
|
|
59
|
+
kekikstream-1.7.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
60
|
+
kekikstream-1.7.2.dist-info/METADATA,sha256=dk3APNy4TdsulucdGrx7ROAfKRukHYTjoNSA62bQ0eg,4962
|
|
61
|
+
kekikstream-1.7.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
62
|
+
kekikstream-1.7.2.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
63
|
+
kekikstream-1.7.2.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
64
|
+
kekikstream-1.7.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|