KekikStream 1.4.4__py3-none-any.whl → 2.0.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/CLI/pypi_kontrol.py +6 -6
- KekikStream/Core/Extractor/ExtractorBase.py +13 -12
- KekikStream/Core/Extractor/ExtractorLoader.py +25 -17
- KekikStream/Core/Extractor/ExtractorManager.py +53 -9
- KekikStream/Core/Extractor/ExtractorModels.py +5 -7
- KekikStream/Core/Extractor/YTDLPCache.py +35 -0
- KekikStream/Core/Media/MediaHandler.py +52 -31
- KekikStream/Core/Media/MediaManager.py +0 -3
- KekikStream/Core/Plugin/PluginBase.py +47 -21
- KekikStream/Core/Plugin/PluginLoader.py +11 -7
- KekikStream/Core/Plugin/PluginModels.py +25 -25
- KekikStream/Core/__init__.py +1 -0
- KekikStream/Extractors/CloseLoad.py +6 -26
- KekikStream/Extractors/ContentX_.py +40 -0
- KekikStream/Extractors/DzenRu.py +38 -0
- KekikStream/Extractors/ExPlay.py +53 -0
- KekikStream/Extractors/FirePlayer.py +60 -0
- KekikStream/Extractors/HDPlayerSystem.py +41 -0
- KekikStream/Extractors/JetTv.py +45 -0
- KekikStream/Extractors/MailRu.py +2 -4
- KekikStream/Extractors/MixTiger.py +57 -0
- KekikStream/Extractors/MolyStream.py +25 -7
- KekikStream/Extractors/Odnoklassniki.py +16 -11
- KekikStream/Extractors/{OkRuHTTP.py → Odnoklassniki_.py} +5 -1
- KekikStream/Extractors/{HDStreamAble.py → PeaceMakerst_.py} +1 -1
- KekikStream/Extractors/PixelDrain.py +0 -1
- KekikStream/Extractors/PlayerFilmIzle.py +62 -0
- KekikStream/Extractors/RapidVid.py +30 -13
- KekikStream/Extractors/RapidVid_.py +7 -0
- KekikStream/Extractors/SetPlay.py +57 -0
- KekikStream/Extractors/SetPrime.py +45 -0
- KekikStream/Extractors/SibNet.py +0 -1
- KekikStream/Extractors/TurkeyPlayer.py +34 -0
- KekikStream/Extractors/VidHide.py +72 -0
- KekikStream/Extractors/VidMoly.py +20 -19
- KekikStream/Extractors/{VidMolyMe.py → VidMoly_.py} +1 -1
- KekikStream/Extractors/VidMoxy.py +0 -1
- KekikStream/Extractors/VidPapi.py +89 -0
- KekikStream/Extractors/YTDLP.py +177 -0
- KekikStream/Extractors/YildizKisaFilm.py +41 -0
- KekikStream/Plugins/DiziBox.py +28 -16
- KekikStream/Plugins/DiziPal.py +246 -0
- KekikStream/Plugins/DiziYou.py +58 -31
- KekikStream/Plugins/Dizilla.py +97 -68
- KekikStream/Plugins/FilmBip.py +145 -0
- KekikStream/Plugins/FilmMakinesi.py +61 -52
- KekikStream/Plugins/FilmModu.py +138 -0
- KekikStream/Plugins/FullHDFilm.py +164 -0
- KekikStream/Plugins/FullHDFilmizlesene.py +38 -37
- KekikStream/Plugins/HDFilmCehennemi.py +44 -54
- KekikStream/Plugins/JetFilmizle.py +68 -42
- KekikStream/Plugins/KultFilmler.py +219 -0
- KekikStream/Plugins/RecTV.py +41 -37
- KekikStream/Plugins/RoketDizi.py +232 -0
- KekikStream/Plugins/SelcukFlix.py +309 -0
- KekikStream/Plugins/SezonlukDizi.py +16 -14
- KekikStream/Plugins/SineWix.py +39 -30
- KekikStream/Plugins/Sinefy.py +238 -0
- KekikStream/Plugins/SinemaCX.py +157 -0
- KekikStream/Plugins/Sinezy.py +146 -0
- KekikStream/Plugins/SuperFilmGeldi.py +121 -0
- KekikStream/Plugins/UgurFilm.py +10 -10
- KekikStream/__init__.py +296 -319
- KekikStream/requirements.txt +3 -4
- kekikstream-2.0.2.dist-info/METADATA +309 -0
- kekikstream-2.0.2.dist-info/RECORD +82 -0
- {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info}/WHEEL +1 -1
- KekikStream/Extractors/FourCX.py +0 -7
- KekikStream/Extractors/FourPichive.py +0 -7
- KekikStream/Extractors/FourPlayRu.py +0 -7
- KekikStream/Extractors/Hotlinger.py +0 -7
- KekikStream/Extractors/OkRuSSL.py +0 -7
- KekikStream/Extractors/Pichive.py +0 -7
- KekikStream/Extractors/PlayRu.py +0 -7
- KekikStream/Helpers/Unpack.py +0 -75
- KekikStream/Plugins/Shorten.py +0 -225
- kekikstream-1.4.4.dist-info/METADATA +0 -108
- kekikstream-1.4.4.dist-info/RECORD +0 -63
- {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info}/entry_points.txt +0 -0
- {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info/licenses}/LICENSE +0 -0
- {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info}/top_level.txt +0 -0
|
@@ -1,65 +1,63 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
|
|
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
|
|
|
13
13
|
main_page = {
|
|
14
|
-
f"{main_url}/
|
|
15
|
-
f"{main_url}/
|
|
16
|
-
f"{main_url}/
|
|
17
|
-
f"{main_url}/
|
|
18
|
-
f"{main_url}/
|
|
19
|
-
f"{main_url}/
|
|
20
|
-
f"{main_url}/
|
|
21
|
-
f"{main_url}/
|
|
22
|
-
f"{main_url}/
|
|
23
|
-
f"{main_url}/
|
|
24
|
-
f"{main_url}/
|
|
25
|
-
f"{main_url}/
|
|
26
|
-
f"{main_url}/
|
|
27
|
-
f"{main_url}/
|
|
28
|
-
f"{main_url}/
|
|
29
|
-
f"{main_url}/
|
|
30
|
-
f"{main_url}/
|
|
31
|
-
f"{main_url}/
|
|
32
|
-
f"{main_url}/
|
|
33
|
-
f"{main_url}/
|
|
34
|
-
f"{main_url}/
|
|
14
|
+
f"{main_url}/filmler-1/" : "Son Filmler",
|
|
15
|
+
f"{main_url}/tur/aksiyon-fm1/film/" : "Aksiyon",
|
|
16
|
+
f"{main_url}/tur/aile-fm1/film/" : "Aile",
|
|
17
|
+
f"{main_url}/tur/animasyon-fm2/film/" : "Animasyon",
|
|
18
|
+
f"{main_url}/tur/belgesel/film/" : "Belgesel",
|
|
19
|
+
f"{main_url}/tur/biyografi/film/" : "Biyografi",
|
|
20
|
+
f"{main_url}/tur/bilim-kurgu-fm3/film/" : "Bilim Kurgu",
|
|
21
|
+
f"{main_url}/tur/dram-fm1/film/" : "Dram",
|
|
22
|
+
f"{main_url}/tur/fantastik-fm1/film/" : "Fantastik",
|
|
23
|
+
f"{main_url}/tur/gerilim-fm1/film/" : "Gerilim",
|
|
24
|
+
f"{main_url}/tur/gizem/film/" : "Gizem",
|
|
25
|
+
f"{main_url}/tur/komedi-fm1/film/" : "Komedi",
|
|
26
|
+
f"{main_url}/tur/korku-fm1/film/" : "Korku",
|
|
27
|
+
f"{main_url}/tur/macera-fm1/film/" : "Macera",
|
|
28
|
+
f"{main_url}/tur/muzik/film/" : "Müzik",
|
|
29
|
+
f"{main_url}/tur/polisiye/film/" : "Polisiye",
|
|
30
|
+
f"{main_url}/tur/romantik-fm1/film/" : "Romantik",
|
|
31
|
+
f"{main_url}/tur/savas-fm1/film/" : "Savaş",
|
|
32
|
+
f"{main_url}/tur/spor/film/" : "Spor",
|
|
33
|
+
f"{main_url}/tur/tarih/film/" : "Tarih",
|
|
34
|
+
f"{main_url}/tur/western-fm1/film/" : "Western"
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
@kekik_cache(ttl=60*60)
|
|
38
37
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
39
|
-
istek = self.cloudscraper.get(f"{url}{page}")
|
|
38
|
+
istek = self.cloudscraper.get(f"{url}{'' if page == 1 else f'page/{page}/'}")
|
|
40
39
|
secici = Selector(istek.text)
|
|
41
40
|
|
|
42
|
-
veriler = secici.css("
|
|
41
|
+
veriler = secici.css("div.item-relative")
|
|
43
42
|
|
|
44
43
|
return [
|
|
45
44
|
MainPageResult(
|
|
46
45
|
category = category,
|
|
47
|
-
title = veri.css("
|
|
48
|
-
url = self.fix_url(veri.css("
|
|
46
|
+
title = veri.css("div.title::text").get(),
|
|
47
|
+
url = self.fix_url(veri.css("a::attr(href)").get()),
|
|
49
48
|
poster = self.fix_url(veri.css("img::attr(data-src)").get() or veri.css("img::attr(src)").get()),
|
|
50
49
|
)
|
|
51
50
|
for veri in veriler
|
|
52
51
|
]
|
|
53
52
|
|
|
54
|
-
@kekik_cache(ttl=60*60)
|
|
55
53
|
async def search(self, query: str) -> list[SearchResult]:
|
|
56
|
-
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
54
|
+
istek = await self.httpx.get(f"{self.main_url}/arama/?s={query}")
|
|
57
55
|
secici = Selector(istek.text)
|
|
58
56
|
|
|
59
57
|
results = []
|
|
60
|
-
for article in secici.css("
|
|
61
|
-
title = article.css("
|
|
62
|
-
href = article.css("
|
|
58
|
+
for article in secici.css("div.item-relative"):
|
|
59
|
+
title = article.css("div.title::text").get()
|
|
60
|
+
href = article.css("a::attr(href)").get()
|
|
63
61
|
poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
|
|
64
62
|
|
|
65
63
|
if title and href:
|
|
@@ -73,40 +71,51 @@ class FilmMakinesi(PluginBase):
|
|
|
73
71
|
|
|
74
72
|
return results
|
|
75
73
|
|
|
76
|
-
@kekik_cache(ttl=60*60)
|
|
77
74
|
async def load_item(self, url: str) -> MovieInfo:
|
|
78
75
|
istek = await self.httpx.get(url)
|
|
79
76
|
secici = Selector(istek.text)
|
|
80
77
|
|
|
81
|
-
title = secici.css("h1.
|
|
82
|
-
poster = secici.css("
|
|
83
|
-
description = secici.css("
|
|
84
|
-
|
|
85
|
-
rating
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if duration
|
|
92
|
-
|
|
78
|
+
title = secici.css("h1.title::text").get().strip()
|
|
79
|
+
poster = secici.css("img.cover-img::attr(src)").get().strip()
|
|
80
|
+
description = secici.css("div.info-description p::text").get().strip()
|
|
81
|
+
rating = secici.css("div.score::text").get()
|
|
82
|
+
if rating:
|
|
83
|
+
rating = rating.strip().split()[0]
|
|
84
|
+
year = secici.css("span.date a::text").get().strip()
|
|
85
|
+
actors = secici.css("div.cast-name::text").getall()
|
|
86
|
+
tags = secici.css("div.genre a::text").getall()
|
|
87
|
+
duration = secici.css("div.time::text").get()
|
|
88
|
+
if duration:
|
|
89
|
+
duration = duration.split()[1].strip()
|
|
93
90
|
|
|
94
91
|
return MovieInfo(
|
|
95
92
|
url = url,
|
|
96
93
|
poster = self.fix_url(poster),
|
|
97
|
-
title = title,
|
|
94
|
+
title = self.clean_title(title),
|
|
98
95
|
description = description,
|
|
99
96
|
tags = tags,
|
|
100
97
|
rating = rating,
|
|
101
98
|
year = year,
|
|
102
99
|
actors = actors,
|
|
103
|
-
duration =
|
|
100
|
+
duration = duration
|
|
104
101
|
)
|
|
105
102
|
|
|
106
|
-
|
|
107
|
-
async def load_links(self, url: str) -> list[str]:
|
|
103
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
108
104
|
istek = await self.httpx.get(url)
|
|
109
105
|
secici = Selector(istek.text)
|
|
110
106
|
|
|
111
|
-
iframe_src = secici.css("
|
|
112
|
-
|
|
107
|
+
iframe_src = secici.css("iframe::attr(data-src)").get()
|
|
108
|
+
|
|
109
|
+
all_links = [iframe_src] if iframe_src else []
|
|
110
|
+
for link in secici.css("div.video-parts a[data-video_url]"):
|
|
111
|
+
all_links.append(link.attrib.get("data-video_url"))
|
|
112
|
+
|
|
113
|
+
response = []
|
|
114
|
+
for idx, link in enumerate(all_links):
|
|
115
|
+
extractor = self.ex_manager.find_extractor(link)
|
|
116
|
+
response.append({
|
|
117
|
+
"url" : link,
|
|
118
|
+
"name" : f"{extractor.name if extractor else f'Player {idx + 1}'}",
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
return response
|
|
@@ -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.httpx.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.httpx.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.httpx.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.httpx.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.httpx.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.httpx.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, **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)
|
|
@@ -0,0 +1,164 @@
|
|
|
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, base64
|
|
6
|
+
|
|
7
|
+
class FullHDFilm(PluginBase):
|
|
8
|
+
name = "FullHDFilm"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://hdfilm.us"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Full HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
|
|
13
|
+
|
|
14
|
+
main_page = {
|
|
15
|
+
f"{main_url}/tur/turkce-altyazili-film-izle" : "Altyazılı Filmler",
|
|
16
|
+
f"{main_url}/tur/netflix-filmleri-izle" : "Netflix",
|
|
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/komedi-filmleri-izle" : "Komedi",
|
|
28
|
+
f"{main_url}/category/korku-filmleri-izle" : "Korku",
|
|
29
|
+
f"{main_url}/category/macera-filmleri-izle" : "Macera",
|
|
30
|
+
f"{main_url}/category/romantik-filmler-izle" : "Romantik",
|
|
31
|
+
f"{main_url}/category/savas-filmleri-izle" : "Savaş",
|
|
32
|
+
f"{main_url}/category/suc-filmleri-izle" : "Suç",
|
|
33
|
+
f"{main_url}/tur/yerli-film-izle" : "Yerli Film",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
37
|
+
page_url = url if page == 1 else f"{url}/page/{page}"
|
|
38
|
+
|
|
39
|
+
self.httpx.headers.update({
|
|
40
|
+
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
|
|
41
|
+
"Referer" : f"{self.main_url}/"
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
istek = await self.httpx.get(page_url)
|
|
45
|
+
secici = Selector(istek.text)
|
|
46
|
+
|
|
47
|
+
return [
|
|
48
|
+
MainPageResult(
|
|
49
|
+
category = category,
|
|
50
|
+
title = veri.css("img::attr(alt)").get(),
|
|
51
|
+
url = self.fix_url(veri.css("a::attr(href)").get()),
|
|
52
|
+
poster = self.fix_url(veri.css("img::attr(src)").get()),
|
|
53
|
+
)
|
|
54
|
+
for veri in secici.css("div.movie-poster")
|
|
55
|
+
if veri.css("img::attr(alt)").get()
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
59
|
+
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
60
|
+
secici = Selector(istek.text)
|
|
61
|
+
|
|
62
|
+
return [
|
|
63
|
+
SearchResult(
|
|
64
|
+
title = veri.css("img::attr(alt)").get(),
|
|
65
|
+
url = self.fix_url(veri.css("a::attr(href)").get()),
|
|
66
|
+
poster = self.fix_url(veri.css("img::attr(src)").get()),
|
|
67
|
+
)
|
|
68
|
+
for veri in secici.css("div.movie-poster")
|
|
69
|
+
if veri.css("img::attr(alt)").get()
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
async def load_item(self, url: str) -> MovieInfo:
|
|
73
|
+
istek = await self.httpx.get(url)
|
|
74
|
+
secici = Selector(istek.text)
|
|
75
|
+
|
|
76
|
+
title = secici.css("h1::text").get()
|
|
77
|
+
poster = self.fix_url(secici.css("div.poster img::attr(src)").get())
|
|
78
|
+
description = secici.css("div#details div.text::text").get() or \
|
|
79
|
+
secici.css("div#details div::text").get()
|
|
80
|
+
|
|
81
|
+
actors_text = secici.css("div.oyuncular.info::text").get()
|
|
82
|
+
if actors_text:
|
|
83
|
+
actors_text = actors_text.replace("Oyuncular:", "").strip()
|
|
84
|
+
actors = [a.strip() for a in actors_text.split(",")]
|
|
85
|
+
else:
|
|
86
|
+
actors = []
|
|
87
|
+
|
|
88
|
+
year = secici.css("div.yayin-tarihi.info::text").re_first(r"(\d{4})")
|
|
89
|
+
tags = secici.css("div.tur.info a::text").getall()
|
|
90
|
+
rating = secici.css("div.imdb::text").re_first(r"IMDb\s*([\d\.]+)")
|
|
91
|
+
|
|
92
|
+
# Açıklama usually above .others
|
|
93
|
+
description = secici.xpath("//div[contains(@class, 'others')]/preceding-sibling::div[1]//text()").getall()
|
|
94
|
+
description = "".join(description).strip() if description else None
|
|
95
|
+
|
|
96
|
+
return MovieInfo(
|
|
97
|
+
url = url,
|
|
98
|
+
poster = poster,
|
|
99
|
+
title = self.clean_title(title) if title else "",
|
|
100
|
+
description = description,
|
|
101
|
+
tags = tags,
|
|
102
|
+
year = year,
|
|
103
|
+
actors = actors,
|
|
104
|
+
rating = rating.strip() if rating else None,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def _get_iframe(self, source_code: str) -> str:
|
|
108
|
+
"""Base64 kodlu iframe'i çözümle"""
|
|
109
|
+
match = re.search(r'<script[^>]*>(PCEtLWJhc2xpazp[^<]*)</script>', source_code)
|
|
110
|
+
if not match:
|
|
111
|
+
return ""
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
decoded_html = base64.b64decode(match[1]).decode("utf-8")
|
|
115
|
+
iframe_match = re.search(r'<iframe[^>]+src=["\']([^"\']+)["\']', decoded_html)
|
|
116
|
+
return self.fix_url(iframe_match[1]) if iframe_match else ""
|
|
117
|
+
except Exception:
|
|
118
|
+
return ""
|
|
119
|
+
|
|
120
|
+
def _extract_subtitle_url(self, source_code: str) -> str | None:
|
|
121
|
+
"""playerjsSubtitle değişkeninden .srt URL çıkar"""
|
|
122
|
+
patterns = [
|
|
123
|
+
r'var playerjsSubtitle = "\[Türkçe\](https?://[^\s"]+?\.srt)";',
|
|
124
|
+
r'var playerjsSubtitle = "(https?://[^\s"]+?\.srt)";',
|
|
125
|
+
r'subtitle:\s*"(https?://[^\s"]+?\.srt)"',
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
for pattern in patterns:
|
|
129
|
+
if match := re.search(pattern, source_code):
|
|
130
|
+
return match[1]
|
|
131
|
+
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
135
|
+
self.httpx.headers.update({
|
|
136
|
+
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
|
|
137
|
+
"Referer" : self.main_url
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
istek = await self.httpx.get(url)
|
|
141
|
+
source_code = istek.text
|
|
142
|
+
|
|
143
|
+
# Ana sayfadan altyazı URL'sini çek
|
|
144
|
+
subtitle_url = self._extract_subtitle_url(source_code)
|
|
145
|
+
|
|
146
|
+
# Iframe'den altyazı URL'sini çek
|
|
147
|
+
iframe_src = self._get_iframe(source_code)
|
|
148
|
+
|
|
149
|
+
if not subtitle_url and iframe_src:
|
|
150
|
+
iframe_istek = await self.httpx.get(iframe_src)
|
|
151
|
+
subtitle_url = self._extract_subtitle_url(iframe_istek.text)
|
|
152
|
+
|
|
153
|
+
results = []
|
|
154
|
+
|
|
155
|
+
if iframe_src:
|
|
156
|
+
extractor = self.ex_manager.find_extractor(iframe_src)
|
|
157
|
+
results.append({
|
|
158
|
+
"name" : extractor.name if extractor else "FullHDFilm Player",
|
|
159
|
+
"url" : iframe_src,
|
|
160
|
+
"referer" : self.main_url,
|
|
161
|
+
"subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
from Kekik.Sifreleme import StringCodec
|
|
6
6
|
import json, re
|
|
@@ -8,40 +8,38 @@ import json, re
|
|
|
8
8
|
class FullHDFilmizlesene(PluginBase):
|
|
9
9
|
name = "FullHDFilmizlesene"
|
|
10
10
|
language = "tr"
|
|
11
|
-
main_url = "https://www.fullhdfilmizlesene.
|
|
11
|
+
main_url = "https://www.fullhdfilmizlesene.tv"
|
|
12
12
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
13
13
|
description = "Sinema zevkini evinize kadar getirdik. Türkiye'nin lider Film sitesinde, en yeni filmleri Full HD izleyin."
|
|
14
14
|
|
|
15
15
|
main_page = {
|
|
16
|
-
f"{main_url}/en-cok-izlenen-filmler
|
|
17
|
-
f"{main_url}/filmizle/
|
|
18
|
-
f"{main_url}/filmizle/
|
|
19
|
-
f"{main_url}/filmizle/
|
|
20
|
-
f"{main_url}/filmizle/
|
|
21
|
-
f"{main_url}/filmizle/
|
|
22
|
-
f"{main_url}/filmizle/
|
|
23
|
-
f"{main_url}/filmizle/
|
|
24
|
-
f"{main_url}/filmizle/
|
|
25
|
-
f"{main_url}/filmizle/
|
|
26
|
-
f"{main_url}/filmizle/
|
|
27
|
-
f"{main_url}/filmizle/
|
|
28
|
-
f"{main_url}/filmizle/
|
|
29
|
-
f"{main_url}/filmizle/
|
|
30
|
-
f"{main_url}/filmizle/
|
|
31
|
-
f"{main_url}/filmizle/
|
|
32
|
-
f"{main_url}/filmizle/
|
|
33
|
-
f"{main_url}/filmizle/
|
|
34
|
-
f"{main_url}/filmizle/
|
|
35
|
-
f"{main_url}/filmizle/
|
|
36
|
-
f"{main_url}/filmizle/
|
|
37
|
-
f"{main_url}/filmizle/
|
|
38
|
-
f"{main_url}/filmizle/
|
|
39
|
-
f"{main_url}/filmizle/
|
|
40
|
-
f"{main_url}/filmizle/
|
|
41
|
-
f"{main_url}/filmizle/yerli-filmler-izle-3/" : "Yerli Filmler",
|
|
16
|
+
f"{main_url}/en-cok-izlenen-hd-filmler/" : "En Çok izlenen Filmler",
|
|
17
|
+
f"{main_url}/filmizle/aile-filmleri-hdf-izle/" : "Aile Filmleri",
|
|
18
|
+
f"{main_url}/filmizle/aksiyon-filmleri-hdf-izle/" : "Aksiyon Filmleri",
|
|
19
|
+
f"{main_url}/filmizle/animasyon-filmleri-izle/" : "Animasyon Filmleri",
|
|
20
|
+
f"{main_url}/filmizle/belgesel-filmleri-izle/" : "Belgeseller",
|
|
21
|
+
f"{main_url}/filmizle/bilim-kurgu-filmleri-izle-2/" : "Bilim Kurgu Filmleri",
|
|
22
|
+
f"{main_url}/filmizle/bluray-filmler-izle/" : "Blu Ray Filmler",
|
|
23
|
+
f"{main_url}/filmizle/cizgi-filmler-fhd-izle/" : "Çizgi Filmler",
|
|
24
|
+
f"{main_url}/filmizle/dram-filmleri-hd-izle/" : "Dram Filmleri",
|
|
25
|
+
f"{main_url}/filmizle/fantastik-filmler-hd-izle/" : "Fantastik Filmler",
|
|
26
|
+
f"{main_url}/filmizle/gerilim-filmleri-fhd-izle/" : "Gerilim Filmleri",
|
|
27
|
+
f"{main_url}/filmizle/gizem-filmleri-hd-izle/" : "Gizem Filmleri",
|
|
28
|
+
f"{main_url}/filmizle/hint-filmleri-fhd-izle/" : "Hint Filmleri",
|
|
29
|
+
f"{main_url}/filmizle/komedi-filmleri-fhd-izle/" : "Komedi Filmleri",
|
|
30
|
+
f"{main_url}/filmizle/korku-filmleri-izle-3/" : "Korku Filmleri",
|
|
31
|
+
f"{main_url}/filmizle/macera-filmleri-fhd-izle/" : "Macera Filmleri",
|
|
32
|
+
f"{main_url}/filmizle/muzikal-filmler-izle/" : "Müzikal Filmler",
|
|
33
|
+
f"{main_url}/filmizle/polisiye-filmleri-izle/" : "Polisiye Filmleri",
|
|
34
|
+
f"{main_url}/filmizle/psikolojik-filmler-izle/" : "Psikolojik Filmler",
|
|
35
|
+
f"{main_url}/filmizle/romantik-filmler-fhd-izle/" : "Romantik Filmler",
|
|
36
|
+
f"{main_url}/filmizle/savas-filmleri-fhd-izle/" : "Savaş Filmleri",
|
|
37
|
+
f"{main_url}/filmizle/suc-filmleri-izle/" : "Suç Filmleri",
|
|
38
|
+
f"{main_url}/filmizle/tarih-filmleri-fhd-izle/" : "Tarih Filmleri",
|
|
39
|
+
f"{main_url}/filmizle/western-filmler-hd-izle-3/" : "Western Filmler",
|
|
40
|
+
f"{main_url}/filmizle/yerli-filmler-hd-izle/" : "Yerli Filmler"
|
|
42
41
|
}
|
|
43
42
|
|
|
44
|
-
@kekik_cache(ttl=60*60)
|
|
45
43
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
46
44
|
istek = self.cloudscraper.get(f"{url}{page}")
|
|
47
45
|
secici = Selector(istek.text)
|
|
@@ -56,7 +54,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
56
54
|
for veri in secici.css("li.film")
|
|
57
55
|
]
|
|
58
56
|
|
|
59
|
-
@kekik_cache(ttl=60*60)
|
|
60
57
|
async def search(self, query: str) -> list[SearchResult]:
|
|
61
58
|
istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
|
|
62
59
|
secici = Selector(istek.text)
|
|
@@ -78,7 +75,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
78
75
|
|
|
79
76
|
return results
|
|
80
77
|
|
|
81
|
-
@kekik_cache(ttl=60*60)
|
|
82
78
|
async def load_item(self, url: str) -> MovieInfo:
|
|
83
79
|
istek = await self.httpx.get(url)
|
|
84
80
|
secici = Selector(istek.text)
|
|
@@ -104,8 +100,7 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
104
100
|
duration = duration
|
|
105
101
|
)
|
|
106
102
|
|
|
107
|
-
|
|
108
|
-
async def load_links(self, url: str) -> list[str]:
|
|
103
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
109
104
|
istek = await self.httpx.get(url)
|
|
110
105
|
secici = Selector(istek.text)
|
|
111
106
|
|
|
@@ -121,7 +116,13 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
121
116
|
if isinstance(t, dict):
|
|
122
117
|
link_list.extend(StringCodec.decode(v) for k, v in t.items())
|
|
123
118
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
119
|
+
response = []
|
|
120
|
+
for link in link_list:
|
|
121
|
+
link = f"https:{link}" if link.startswith("//") else link
|
|
122
|
+
extractor = self.ex_manager.find_extractor(link)
|
|
123
|
+
response.append({
|
|
124
|
+
"url" : link,
|
|
125
|
+
"name" : extractor.name if extractor else "Direct Link"
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
return response
|