KekikStream 1.8.2__py3-none-any.whl → 1.8.4__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/Plugins/DiziBox.py +2 -7
- KekikStream/Plugins/DiziYou.py +1 -5
- KekikStream/Plugins/Dizilla.py +33 -25
- KekikStream/Plugins/FilmMakinesi.py +1 -5
- KekikStream/Plugins/FullHDFilmizlesene.py +1 -5
- KekikStream/Plugins/HDFilmCehennemi.py +1 -7
- KekikStream/Plugins/JetFilmizle.py +1 -5
- KekikStream/Plugins/RecTV.py +1 -5
- KekikStream/Plugins/SelcukFlix.py +160 -67
- KekikStream/Plugins/SezonlukDizi.py +1 -5
- KekikStream/Plugins/SineWix.py +1 -5
- KekikStream/Plugins/Sinefy.py +72 -51
- KekikStream/Plugins/Sinezy.py +74 -42
- KekikStream/Plugins/UgurFilm.py +1 -5
- {kekikstream-1.8.2.dist-info → kekikstream-1.8.4.dist-info}/METADATA +1 -1
- {kekikstream-1.8.2.dist-info → kekikstream-1.8.4.dist-info}/RECORD +20 -20
- {kekikstream-1.8.2.dist-info → kekikstream-1.8.4.dist-info}/WHEEL +0 -0
- {kekikstream-1.8.2.dist-info → kekikstream-1.8.4.dist-info}/entry_points.txt +0 -0
- {kekikstream-1.8.2.dist-info → kekikstream-1.8.4.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-1.8.2.dist-info → kekikstream-1.8.4.dist-info}/top_level.txt +0 -0
KekikStream/Plugins/DiziBox.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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
|
|
4
4
|
from Kekik.Sifreleme import CryptoJS
|
|
5
5
|
from parsel import Selector
|
|
6
6
|
import re, urllib.parse, base64, contextlib, asyncio, time
|
|
@@ -40,7 +40,6 @@ class DiziBox(PluginBase):
|
|
|
40
40
|
f"{main_url}/dizi-arsivi/page/SAYFA/?tur[0]=yarisma&yil&imdb" : "Yarışma"
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
#@kekik_cache(ttl=60*60)
|
|
44
43
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
45
44
|
self.httpx.cookies.update({
|
|
46
45
|
"isTrustedUser" : "true",
|
|
@@ -62,7 +61,6 @@ class DiziBox(PluginBase):
|
|
|
62
61
|
for veri in secici.css("article.detailed-article")
|
|
63
62
|
]
|
|
64
63
|
|
|
65
|
-
#@kekik_cache(ttl=60*60)
|
|
66
64
|
async def search(self, query: str) -> list[SearchResult]:
|
|
67
65
|
self.httpx.cookies.update({
|
|
68
66
|
"isTrustedUser" : "true",
|
|
@@ -80,7 +78,6 @@ class DiziBox(PluginBase):
|
|
|
80
78
|
for item in secici.css("article.detailed-article")
|
|
81
79
|
]
|
|
82
80
|
|
|
83
|
-
#@kekik_cache(ttl=60*60)
|
|
84
81
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
85
82
|
istek = await self.httpx.get(url)
|
|
86
83
|
secici = Selector(istek.text)
|
|
@@ -127,7 +124,6 @@ class DiziBox(PluginBase):
|
|
|
127
124
|
actors = actors,
|
|
128
125
|
)
|
|
129
126
|
|
|
130
|
-
#@kekik_cache(ttl=60*60)
|
|
131
127
|
async def _iframe_decode(self, name:str, iframe_link:str, referer:str) -> list[str]:
|
|
132
128
|
results = []
|
|
133
129
|
|
|
@@ -178,7 +174,6 @@ class DiziBox(PluginBase):
|
|
|
178
174
|
|
|
179
175
|
return results
|
|
180
176
|
|
|
181
|
-
#@kekik_cache(ttl=15*60)
|
|
182
177
|
async def load_links(self, url: str) -> list[dict]:
|
|
183
178
|
istek = await self.httpx.get(url)
|
|
184
179
|
secici = Selector(istek.text)
|
|
@@ -214,4 +209,4 @@ class DiziBox(PluginBase):
|
|
|
214
209
|
"name" : f"{extractor.name if extractor else alt_name}"
|
|
215
210
|
})
|
|
216
211
|
|
|
217
|
-
return results
|
|
212
|
+
return results
|
KekikStream/Plugins/DiziYou.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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -29,7 +29,6 @@ class DiziYou(PluginBase):
|
|
|
29
29
|
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Vah%C5%9Fi+Bat%C4%B1" : "Vahşi Batı"
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
#@kekik_cache(ttl=60*60)
|
|
33
32
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
34
33
|
istek = await self.httpx.get(f"{url.replace('SAYFA', str(page))}")
|
|
35
34
|
secici = Selector(istek.text)
|
|
@@ -44,7 +43,6 @@ class DiziYou(PluginBase):
|
|
|
44
43
|
for veri in secici.css("div.single-item")
|
|
45
44
|
]
|
|
46
45
|
|
|
47
|
-
#@kekik_cache(ttl=60*60)
|
|
48
46
|
async def search(self, query: str) -> list[SearchResult]:
|
|
49
47
|
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
50
48
|
secici = Selector(istek.text)
|
|
@@ -58,7 +56,6 @@ class DiziYou(PluginBase):
|
|
|
58
56
|
for afis in secici.css("div.incontent div#list-series")
|
|
59
57
|
]
|
|
60
58
|
|
|
61
|
-
#@kekik_cache(ttl=60*60)
|
|
62
59
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
63
60
|
istek = await self.httpx.get(url)
|
|
64
61
|
secici = Selector(istek.text)
|
|
@@ -126,7 +123,6 @@ class DiziYou(PluginBase):
|
|
|
126
123
|
actors = actors
|
|
127
124
|
)
|
|
128
125
|
|
|
129
|
-
#@kekik_cache(ttl=15*60)
|
|
130
126
|
async def load_links(self, url: str) -> list[dict]:
|
|
131
127
|
istek = await self.httpx.get(url)
|
|
132
128
|
secici = Selector(istek.text)
|
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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
from json import loads
|
|
6
6
|
from urllib.parse import urlparse, urlunparse
|
|
@@ -12,35 +12,47 @@ class Dizilla(PluginBase):
|
|
|
12
12
|
language = "tr"
|
|
13
13
|
main_url = "https://dizilla40.com"
|
|
14
14
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
15
|
-
description = "
|
|
15
|
+
description = "1080p yabancı dizi izle. Türkçe altyazılı veya dublaj seçenekleriyle 1080p çözünürlükte yabancı dizilere anında ulaş. Popüler dizileri kesintisiz izle."
|
|
16
16
|
|
|
17
17
|
main_page = {
|
|
18
|
-
f"{main_url}/tum-bolumler"
|
|
19
|
-
f"{main_url}/
|
|
20
|
-
f"{main_url}/
|
|
21
|
-
f"{main_url}/
|
|
22
|
-
f"{main_url}/
|
|
23
|
-
f"{main_url}/
|
|
18
|
+
f"{main_url}/tum-bolumler" : "Altyazılı Bölümler",
|
|
19
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=15&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Aile",
|
|
20
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=9&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Aksiyon",
|
|
21
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=17&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Animasyon",
|
|
22
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=5&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Bilim Kurgu",
|
|
23
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=2&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Dram",
|
|
24
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=12&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Fantastik",
|
|
25
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=18&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Gerilim",
|
|
26
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=3&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Gizem",
|
|
27
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=4&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Komedi",
|
|
28
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=8&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Korku",
|
|
29
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=24&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Macera",
|
|
30
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=7&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Romantik",
|
|
31
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=26&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Savaş",
|
|
32
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=1&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Suç",
|
|
33
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=11&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Western",
|
|
24
34
|
}
|
|
25
35
|
|
|
26
|
-
#@kekik_cache(ttl=60*60)
|
|
27
36
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
28
|
-
istek = await self.httpx.get(url)
|
|
29
|
-
secici = Selector(istek.text)
|
|
30
|
-
|
|
31
37
|
ana_sayfa = []
|
|
32
38
|
|
|
33
|
-
if "
|
|
39
|
+
if "api/bg" in url:
|
|
40
|
+
istek = await self.httpx.post(url.replace("SAYFA", str(page)))
|
|
41
|
+
decrypted = await self.decrypt_response(istek.json().get("response"))
|
|
42
|
+
veriler = decrypted.get("result", [])
|
|
34
43
|
ana_sayfa.extend([
|
|
35
44
|
MainPageResult(
|
|
36
45
|
category = category,
|
|
37
|
-
title = veri.
|
|
38
|
-
url = self.fix_url(veri.
|
|
39
|
-
poster = self.fix_url(veri.
|
|
46
|
+
title = veri.get("original_title"),
|
|
47
|
+
url = self.fix_url(f"{self.main_url}/{veri.get('used_slug')}"),
|
|
48
|
+
poster = self.fix_url(veri.get("object_poster_url")),
|
|
40
49
|
)
|
|
41
|
-
for veri in
|
|
50
|
+
for veri in veriler
|
|
42
51
|
])
|
|
43
52
|
else:
|
|
53
|
+
istek = await self.httpx.get(url.replace("SAYFA", str(page)))
|
|
54
|
+
secici = Selector(istek.text)
|
|
55
|
+
|
|
44
56
|
for veri in secici.css("div.tab-content > div.grid a"):
|
|
45
57
|
name = veri.css("h2::text").get()
|
|
46
58
|
ep_name = veri.xpath("normalize-space(//div[contains(@class, 'opacity-80')])").get()
|
|
@@ -87,7 +99,6 @@ class Dizilla(PluginBase):
|
|
|
87
99
|
# JSON decode
|
|
88
100
|
return loads(decrypted.decode("utf-8"))
|
|
89
101
|
|
|
90
|
-
#@kekik_cache(ttl=60*60)
|
|
91
102
|
async def search(self, query: str) -> list[SearchResult]:
|
|
92
103
|
arama_istek = await self.httpx.post(f"{self.main_url}/api/bg/searchcontent?searchterm={query}")
|
|
93
104
|
decrypted = await self.decrypt_response(arama_istek.json().get("response"))
|
|
@@ -102,7 +113,6 @@ class Dizilla(PluginBase):
|
|
|
102
113
|
for veri in arama_veri
|
|
103
114
|
]
|
|
104
115
|
|
|
105
|
-
#@kekik_cache(ttl=60*60)
|
|
106
116
|
async def url_base_degis(self, eski_url:str, yeni_base:str) -> str:
|
|
107
117
|
parsed_url = urlparse(eski_url)
|
|
108
118
|
parsed_yeni_base = urlparse(yeni_base)
|
|
@@ -113,13 +123,12 @@ class Dizilla(PluginBase):
|
|
|
113
123
|
|
|
114
124
|
return urlunparse(yeni_url)
|
|
115
125
|
|
|
116
|
-
#@kekik_cache(ttl=60*60)
|
|
117
126
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
118
127
|
istek = await self.httpx.get(url)
|
|
119
128
|
secici = Selector(istek.text)
|
|
120
129
|
veri = loads(secici.xpath("//script[@type='application/ld+json']/text()").getall()[-1])
|
|
121
130
|
|
|
122
|
-
title
|
|
131
|
+
title = veri.get("name")
|
|
123
132
|
if alt_title := veri.get("alternateName"):
|
|
124
133
|
title += f" - ({alt_title})"
|
|
125
134
|
|
|
@@ -131,8 +140,8 @@ class Dizilla(PluginBase):
|
|
|
131
140
|
tags_raw = secici.css("h3.text-white.opacity-60::text").get()
|
|
132
141
|
tags = [t.strip() for t in tags_raw.split(",")] if tags_raw else []
|
|
133
142
|
|
|
134
|
-
rating
|
|
135
|
-
actors
|
|
143
|
+
rating = veri.get("aggregateRating", {}).get("ratingValue")
|
|
144
|
+
actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
|
|
136
145
|
|
|
137
146
|
bolumler = []
|
|
138
147
|
sezonlar = veri.get("containsSeason") if isinstance(veri.get("containsSeason"), list) else [veri.get("containsSeason")]
|
|
@@ -161,7 +170,6 @@ class Dizilla(PluginBase):
|
|
|
161
170
|
actors = actors
|
|
162
171
|
)
|
|
163
172
|
|
|
164
|
-
#@kekik_cache(ttl=15*60)
|
|
165
173
|
async def load_links(self, url: str) -> list[dict]:
|
|
166
174
|
istek = await self.httpx.get(url)
|
|
167
175
|
secici = Selector(istek.text)
|
|
@@ -184,4 +192,4 @@ class Dizilla(PluginBase):
|
|
|
184
192
|
"name" : f"{extractor.name if extractor else 'Main Player'} | {result.get('language_name')}",
|
|
185
193
|
})
|
|
186
194
|
|
|
187
|
-
return links
|
|
195
|
+
return links
|
|
@@ -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
|
|
|
6
6
|
class FilmMakinesi(PluginBase):
|
|
@@ -34,7 +34,6 @@ class FilmMakinesi(PluginBase):
|
|
|
34
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
38
|
istek = self.cloudscraper.get(f"{url}{'' if page == 1 else f'page/{page}/'}")
|
|
40
39
|
secici = Selector(istek.text)
|
|
@@ -51,7 +50,6 @@ class FilmMakinesi(PluginBase):
|
|
|
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
54
|
istek = await self.httpx.get(f"{self.main_url}/arama/?s={query}")
|
|
57
55
|
secici = Selector(istek.text)
|
|
@@ -73,7 +71,6 @@ 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)
|
|
@@ -101,7 +98,6 @@ class FilmMakinesi(PluginBase):
|
|
|
101
98
|
duration = duration
|
|
102
99
|
)
|
|
103
100
|
|
|
104
|
-
#@kekik_cache(ttl=15*60)
|
|
105
101
|
async def load_links(self, url: str) -> list[dict]:
|
|
106
102
|
istek = await self.httpx.get(url)
|
|
107
103
|
secici = Selector(istek.text)
|
|
@@ -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
|
|
@@ -40,7 +40,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
40
40
|
f"{main_url}/filmizle/yerli-filmler-hd-izle/" : "Yerli Filmler"
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
#@kekik_cache(ttl=60*60)
|
|
44
43
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
45
44
|
istek = self.cloudscraper.get(f"{url}{page}")
|
|
46
45
|
secici = Selector(istek.text)
|
|
@@ -55,7 +54,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
55
54
|
for veri in secici.css("li.film")
|
|
56
55
|
]
|
|
57
56
|
|
|
58
|
-
#@kekik_cache(ttl=60*60)
|
|
59
57
|
async def search(self, query: str) -> list[SearchResult]:
|
|
60
58
|
istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
|
|
61
59
|
secici = Selector(istek.text)
|
|
@@ -77,7 +75,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
77
75
|
|
|
78
76
|
return results
|
|
79
77
|
|
|
80
|
-
#@kekik_cache(ttl=60*60)
|
|
81
78
|
async def load_item(self, url: str) -> MovieInfo:
|
|
82
79
|
istek = await self.httpx.get(url)
|
|
83
80
|
secici = Selector(istek.text)
|
|
@@ -103,7 +100,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
103
100
|
duration = duration
|
|
104
101
|
)
|
|
105
102
|
|
|
106
|
-
#@kekik_cache(ttl=15*60)
|
|
107
103
|
async def load_links(self, url: str) -> list[dict]:
|
|
108
104
|
istek = await self.httpx.get(url)
|
|
109
105
|
secici = Selector(istek.text)
|
|
@@ -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, ExtractResult, Subtitle
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
from Kekik.Sifreleme import Packer, StreamDecoder
|
|
6
6
|
import random, string, re
|
|
@@ -32,7 +32,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
32
32
|
f"{main_url}/tur/romantik-filmleri-izle-1" : "Romantik Filmleri"
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
#@kekik_cache(ttl=60*60)
|
|
36
35
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
37
36
|
istek = await self.cffi.get(f"{url}", allow_redirects=True)
|
|
38
37
|
secici = Selector(istek.text)
|
|
@@ -47,7 +46,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
47
46
|
for veri in secici.css("div.section-content a.poster")
|
|
48
47
|
]
|
|
49
48
|
|
|
50
|
-
#@kekik_cache(ttl=60*60)
|
|
51
49
|
async def search(self, query: str) -> list[SearchResult]:
|
|
52
50
|
istek = await self.cffi.get(
|
|
53
51
|
url = f"{self.main_url}/search/?q={query}",
|
|
@@ -76,7 +74,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
76
74
|
|
|
77
75
|
return results
|
|
78
76
|
|
|
79
|
-
#@kekik_cache(ttl=60*60)
|
|
80
77
|
async def load_item(self, url: str) -> MovieInfo:
|
|
81
78
|
istek = await self.cffi.get(url, headers = {"Referer": f"{self.main_url}/"})
|
|
82
79
|
secici = Selector(istek.text)
|
|
@@ -111,7 +108,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
111
108
|
def generate_random_cookie(self):
|
|
112
109
|
return "".join(random.choices(string.ascii_letters + string.digits, k=16))
|
|
113
110
|
|
|
114
|
-
#@kekik_cache(ttl=15*60)
|
|
115
111
|
async def cehennempass(self, video_id: str) -> list[dict]:
|
|
116
112
|
results = []
|
|
117
113
|
|
|
@@ -151,7 +147,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
151
147
|
|
|
152
148
|
return results
|
|
153
149
|
|
|
154
|
-
#@kekik_cache(ttl=15*60)
|
|
155
150
|
async def invoke_local_source(self, iframe: str, source: str, url: str):
|
|
156
151
|
self.cffi.headers.update({"Referer": f"{self.main_url}/"})
|
|
157
152
|
istek = await self.cffi.get(iframe)
|
|
@@ -182,7 +177,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
182
177
|
"subtitles" : subtitles
|
|
183
178
|
}]
|
|
184
179
|
|
|
185
|
-
#@kekik_cache(ttl=15*60)
|
|
186
180
|
async def load_links(self, url: str) -> list[dict]:
|
|
187
181
|
istek = await self.cffi.get(url)
|
|
188
182
|
secici = Selector(istek.text)
|
|
@@ -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
|
|
|
6
6
|
class JetFilmizle(PluginBase):
|
|
@@ -19,7 +19,6 @@ class JetFilmizle(PluginBase):
|
|
|
19
19
|
f"{main_url}/kategoriler/yesilcam-filmleri-izlee/page/" : "Yeşilçam Filmleri"
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
#@kekik_cache(ttl=60*60)
|
|
23
22
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
24
23
|
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
25
24
|
secici = Selector(istek.text)
|
|
@@ -34,7 +33,6 @@ class JetFilmizle(PluginBase):
|
|
|
34
33
|
for veri in secici.css("article.movie") if veri.css("h2 a::text, h3 a::text, h4 a::text, h5 a::text, h6 a::text").get()
|
|
35
34
|
]
|
|
36
35
|
|
|
37
|
-
#@kekik_cache(ttl=60*60)
|
|
38
36
|
async def search(self, query: str) -> list[SearchResult]:
|
|
39
37
|
istek = await self.httpx.post(
|
|
40
38
|
url = f"{self.main_url}/filmara.php",
|
|
@@ -60,7 +58,6 @@ class JetFilmizle(PluginBase):
|
|
|
60
58
|
|
|
61
59
|
return results
|
|
62
60
|
|
|
63
|
-
#@kekik_cache(ttl=60*60)
|
|
64
61
|
async def load_item(self, url: str) -> MovieInfo:
|
|
65
62
|
istek = await self.httpx.get(url)
|
|
66
63
|
secici = Selector(istek.text)
|
|
@@ -92,7 +89,6 @@ class JetFilmizle(PluginBase):
|
|
|
92
89
|
actors = actors
|
|
93
90
|
)
|
|
94
91
|
|
|
95
|
-
#@kekik_cache(ttl=15*60)
|
|
96
92
|
async def load_links(self, url: str) -> list[dict]:
|
|
97
93
|
istek = await self.httpx.get(url)
|
|
98
94
|
secici = Selector(istek.text)
|
KekikStream/Plugins/RecTV.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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
|
|
4
4
|
from json import dumps, loads
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -30,7 +30,6 @@ class RecTV(PluginBase):
|
|
|
30
30
|
f"{main_url}/api/movie/by/filtres/5/created/SAYFA/{sw_key}/" : "Romantik"
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
#@kekik_cache(ttl=60*60)
|
|
34
33
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
35
34
|
self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
|
|
36
35
|
istek = await self.httpx.get(f"{url.replace('SAYFA', str(int(page) - 1))}")
|
|
@@ -46,7 +45,6 @@ class RecTV(PluginBase):
|
|
|
46
45
|
for veri in veriler
|
|
47
46
|
]
|
|
48
47
|
|
|
49
|
-
#@kekik_cache(ttl=60*60)
|
|
50
48
|
async def search(self, query: str) -> list[SearchResult]:
|
|
51
49
|
self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
|
|
52
50
|
istek = await self.httpx.get(f"{self.main_url}/api/search/{query}/{self.sw_key}/")
|
|
@@ -67,7 +65,6 @@ class RecTV(PluginBase):
|
|
|
67
65
|
for veri in tum_veri
|
|
68
66
|
]
|
|
69
67
|
|
|
70
|
-
#@kekik_cache(ttl=60*60)
|
|
71
68
|
async def load_item(self, url: str) -> MovieInfo:
|
|
72
69
|
self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
|
|
73
70
|
veri = loads(url)
|
|
@@ -119,7 +116,6 @@ class RecTV(PluginBase):
|
|
|
119
116
|
actors = []
|
|
120
117
|
)
|
|
121
118
|
|
|
122
|
-
#@kekik_cache(ttl=15*60)
|
|
123
119
|
async def load_links(self, url: str) -> list[dict]:
|
|
124
120
|
try:
|
|
125
121
|
veri = loads(url)
|
|
@@ -5,109 +5,202 @@ from parsel import Selector
|
|
|
5
5
|
import re, base64, json, urllib.parse
|
|
6
6
|
|
|
7
7
|
class SelcukFlix(PluginBase):
|
|
8
|
-
name
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
name = "SelcukFlix"
|
|
9
|
+
lang = "tr"
|
|
10
|
+
main_url = "https://selcukflix.net"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Selcukflix'te her türden en yeni ve en popüler dizi ve filmleri izlemenin keyfini çıkarın. Aksiyondan romantiğe, bilim kurgudan dramaya, geniş kütüphanemizde herkes için bir şey var."
|
|
13
|
+
|
|
12
14
|
main_page = {
|
|
13
|
-
|
|
15
|
+
f"{main_url}/tum-bolumler" : "Yeni Eklenen Bölümler",
|
|
16
|
+
"" : "Yeni Diziler",
|
|
17
|
+
"" : "Kore Dizileri",
|
|
18
|
+
"" : "Yerli Diziler",
|
|
19
|
+
"15" : "Aile",
|
|
20
|
+
"17" : "Animasyon",
|
|
21
|
+
"9" : "Aksiyon",
|
|
22
|
+
"5" : "Bilim Kurgu",
|
|
23
|
+
"2" : "Dram",
|
|
24
|
+
"12" : "Fantastik",
|
|
25
|
+
"18" : "Gerilim",
|
|
26
|
+
"3" : "Gizem",
|
|
27
|
+
"8" : "Korku",
|
|
28
|
+
"4" : "Komedi",
|
|
29
|
+
"7" : "Romantik"
|
|
14
30
|
}
|
|
15
31
|
|
|
16
32
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
17
|
-
full_url = f"{self.main_url}/{url}"
|
|
18
|
-
resp = await self.httpx.get(full_url)
|
|
19
|
-
sel = Selector(resp.text)
|
|
20
|
-
|
|
21
33
|
results = []
|
|
22
34
|
if "tum-bolumler" in url:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
try:
|
|
36
|
+
resp = await self.httpx.get(url)
|
|
37
|
+
sel = Selector(resp.text)
|
|
38
|
+
|
|
39
|
+
for item in sel.css("div.col-span-3 a"):
|
|
40
|
+
name = item.css("h2::text").get()
|
|
41
|
+
ep_info = item.css("div.opacity-80::text").get()
|
|
42
|
+
href = item.css("::attr(href)").get()
|
|
43
|
+
poster = item.css("div.image img::attr(src)").get()
|
|
44
|
+
|
|
45
|
+
if name and href:
|
|
46
|
+
title = f"{name} - {ep_info}" if ep_info else name
|
|
47
|
+
final_url = self.fix_url(href)
|
|
48
|
+
|
|
49
|
+
if "/dizi/" in final_url and "/sezon-" in final_url:
|
|
50
|
+
final_url = final_url.split("/sezon-")[0]
|
|
51
|
+
|
|
52
|
+
results.append(MainPageResult(
|
|
53
|
+
category = category,
|
|
54
|
+
title = title,
|
|
55
|
+
url = final_url,
|
|
56
|
+
poster = self.fix_url(poster)
|
|
57
|
+
))
|
|
58
|
+
except Exception:
|
|
59
|
+
pass
|
|
60
|
+
return results
|
|
61
|
+
|
|
62
|
+
base_api = f"{self.main_url}/api/bg/findSeries"
|
|
63
|
+
|
|
64
|
+
params = {
|
|
65
|
+
"releaseYearStart" : "1900",
|
|
66
|
+
"releaseYearEnd" : "2026",
|
|
67
|
+
"imdbPointMin" : "1",
|
|
68
|
+
"imdbPointMax" : "10",
|
|
69
|
+
"categoryIdsComma" : "",
|
|
70
|
+
"countryIdsComma" : "",
|
|
71
|
+
"orderType" : "date_desc",
|
|
72
|
+
"languageId" : "-1",
|
|
73
|
+
"currentPage" : page,
|
|
74
|
+
"currentPageCount" : "24",
|
|
75
|
+
"queryStr" : "",
|
|
76
|
+
"categorySlugsComma" : "",
|
|
77
|
+
"countryCodesComma" : ""
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if "Yerli Diziler" in category:
|
|
81
|
+
params["imdbPointMin"] = "5"
|
|
82
|
+
params["countryIdsComma"] = "29"
|
|
83
|
+
elif "Kore Dizileri" in category:
|
|
84
|
+
params["countryIdsComma"] = "21"
|
|
85
|
+
params["countryCodesComma"] = "KR"
|
|
86
|
+
else:
|
|
87
|
+
params["categoryIdsComma"] = url
|
|
88
|
+
|
|
89
|
+
full_url = f"{base_api}?{urllib.parse.urlencode(params)}"
|
|
90
|
+
|
|
91
|
+
headers = {
|
|
92
|
+
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0",
|
|
93
|
+
"Accept" : "application/json, text/plain, */*",
|
|
94
|
+
"Accept-Language" : "en-US,en;q=0.5",
|
|
95
|
+
"X-Requested-With" : "XMLHttpRequest",
|
|
96
|
+
"Sec-Fetch-Site" : "same-origin",
|
|
97
|
+
"Sec-Fetch-Mode" : "cors",
|
|
98
|
+
"Sec-Fetch-Dest" : "empty",
|
|
99
|
+
"Referer" : f"{self.main_url}/"
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
post_resp = await self.httpx.post(full_url, headers=headers)
|
|
104
|
+
resp_json = post_resp.json()
|
|
105
|
+
response_data = resp_json.get("response")
|
|
106
|
+
|
|
107
|
+
raw_data = base64.b64decode(response_data)
|
|
108
|
+
try:
|
|
109
|
+
decoded_str = raw_data.decode('utf-8')
|
|
110
|
+
except UnicodeDecodeError:
|
|
111
|
+
decoded_str = raw_data.decode('iso-8859-1').encode('utf-8').decode('utf-8')
|
|
112
|
+
|
|
113
|
+
data = json.loads(decoded_str)
|
|
114
|
+
|
|
115
|
+
for item in data.get("result", []):
|
|
116
|
+
title = item.get("title")
|
|
117
|
+
slug = item.get("slug")
|
|
118
|
+
poster = item.get("poster")
|
|
119
|
+
|
|
120
|
+
if poster:
|
|
121
|
+
poster = self.clean_image_url(poster)
|
|
122
|
+
|
|
123
|
+
if slug:
|
|
35
124
|
results.append(MainPageResult(
|
|
36
|
-
category=category,
|
|
37
|
-
title=title,
|
|
38
|
-
url=
|
|
39
|
-
poster=
|
|
125
|
+
category = category,
|
|
126
|
+
title = title,
|
|
127
|
+
url = self.fix_url(slug),
|
|
128
|
+
poster = poster
|
|
40
129
|
))
|
|
41
|
-
|
|
130
|
+
|
|
131
|
+
except Exception:
|
|
132
|
+
pass
|
|
133
|
+
|
|
42
134
|
return results
|
|
43
135
|
|
|
44
136
|
async def search(self, query: str) -> list[SearchResult]:
|
|
45
137
|
search_url = f"{self.main_url}/api/bg/searchcontent?searchterm={query}"
|
|
46
|
-
|
|
138
|
+
|
|
47
139
|
headers = {
|
|
48
|
-
"Accept": "application/json, text/plain, */*",
|
|
49
|
-
"X-Requested-With": "XMLHttpRequest",
|
|
50
|
-
"Referer": f"{self.main_url}/"
|
|
140
|
+
"Accept" : "application/json, text/plain, */*",
|
|
141
|
+
"X-Requested-With" : "XMLHttpRequest",
|
|
142
|
+
"Referer" : f"{self.main_url}/"
|
|
51
143
|
}
|
|
52
|
-
|
|
144
|
+
|
|
53
145
|
post_resp = await self.httpx.post(search_url, headers=headers)
|
|
54
|
-
|
|
146
|
+
|
|
55
147
|
try:
|
|
56
|
-
resp_json
|
|
148
|
+
resp_json = post_resp.json()
|
|
57
149
|
response_data = resp_json.get("response")
|
|
58
|
-
|
|
59
|
-
raw_data = base64.b64decode(response_data)
|
|
150
|
+
raw_data = base64.b64decode(response_data)
|
|
60
151
|
try:
|
|
61
152
|
decoded_str = raw_data.decode('utf-8')
|
|
62
153
|
except UnicodeDecodeError:
|
|
63
154
|
decoded_str = raw_data.decode('iso-8859-1').encode('utf-8').decode('utf-8')
|
|
64
|
-
|
|
155
|
+
|
|
65
156
|
search_data = json.loads(decoded_str)
|
|
66
|
-
|
|
157
|
+
|
|
67
158
|
results = []
|
|
68
159
|
for item in search_data.get("result", []):
|
|
69
|
-
title
|
|
70
|
-
slug
|
|
160
|
+
title = item.get("title")
|
|
161
|
+
slug = item.get("slug")
|
|
71
162
|
poster = item.get("poster")
|
|
163
|
+
|
|
72
164
|
if poster:
|
|
73
165
|
poster = self.clean_image_url(poster)
|
|
74
|
-
|
|
166
|
+
|
|
75
167
|
if slug and "/seri-filmler/" not in slug:
|
|
76
168
|
results.append(SearchResult(
|
|
77
|
-
title=title,
|
|
78
|
-
url=self.fix_url(slug),
|
|
79
|
-
poster=poster
|
|
169
|
+
title = title,
|
|
170
|
+
url = self.fix_url(slug),
|
|
171
|
+
poster = poster
|
|
80
172
|
))
|
|
173
|
+
|
|
81
174
|
return results
|
|
82
|
-
|
|
175
|
+
|
|
83
176
|
except Exception:
|
|
84
177
|
return []
|
|
85
178
|
|
|
86
179
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
87
180
|
resp = await self.httpx.get(url)
|
|
88
181
|
sel = Selector(resp.text)
|
|
89
|
-
|
|
182
|
+
|
|
90
183
|
next_data = sel.css("script#__NEXT_DATA__::text").get()
|
|
91
184
|
if not next_data:
|
|
92
185
|
return None
|
|
93
|
-
|
|
94
|
-
data
|
|
95
|
-
secure_data
|
|
96
|
-
raw_data
|
|
186
|
+
|
|
187
|
+
data = json.loads(next_data)
|
|
188
|
+
secure_data = data["props"]["pageProps"]["secureData"]
|
|
189
|
+
raw_data = base64.b64decode(secure_data.replace('"', ''))
|
|
97
190
|
try:
|
|
98
191
|
decoded_str = raw_data.decode('utf-8')
|
|
99
192
|
except UnicodeDecodeError:
|
|
100
193
|
decoded_str = raw_data.decode('iso-8859-1') # .encode('utf-8').decode('utf-8') implied
|
|
101
|
-
|
|
194
|
+
|
|
102
195
|
content_details = json.loads(decoded_str)
|
|
103
|
-
item
|
|
104
|
-
|
|
105
|
-
title
|
|
106
|
-
poster
|
|
107
|
-
description
|
|
108
|
-
rating
|
|
109
|
-
|
|
110
|
-
series_data
|
|
196
|
+
item = content_details.get("contentItem", {})
|
|
197
|
+
|
|
198
|
+
title = item.get("original_title") or item.get("originalTitle")
|
|
199
|
+
poster = self.clean_image_url(item.get("poster_url") or item.get("posterUrl"))
|
|
200
|
+
description = item.get("description") or item.get("used_description")
|
|
201
|
+
rating = str(item.get("imdb_point") or item.get("imdbPoint", ""))
|
|
202
|
+
|
|
203
|
+
series_data = content_details.get("relatedData", {}).get("seriesData")
|
|
111
204
|
if not series_data and "RelatedResults" in content_details:
|
|
112
205
|
series_data = content_details["RelatedResults"].get("getSerieSeasonAndEpisodes", {}).get("result")
|
|
113
206
|
if series_data and isinstance(series_data, list):
|
|
@@ -127,19 +220,19 @@ class SelcukFlix(PluginBase):
|
|
|
127
220
|
ep_list = season.get("episodes", [])
|
|
128
221
|
for ep in ep_list:
|
|
129
222
|
episodes.append(Episode(
|
|
130
|
-
season
|
|
223
|
+
season = s_no,
|
|
131
224
|
episode = ep.get("episode_no") or ep.get("episodeNo"),
|
|
132
|
-
title
|
|
133
|
-
url
|
|
225
|
+
title = ep.get("ep_text") or ep.get("epText"),
|
|
226
|
+
url = self.fix_url(ep.get("used_slug") or ep.get("usedSlug"))
|
|
134
227
|
))
|
|
135
228
|
|
|
136
229
|
return SeriesInfo(
|
|
137
|
-
title=title,
|
|
138
|
-
url=url,
|
|
139
|
-
poster=poster,
|
|
140
|
-
description=description,
|
|
141
|
-
rating=rating,
|
|
142
|
-
episodes=episodes
|
|
230
|
+
title = title,
|
|
231
|
+
url = url,
|
|
232
|
+
poster = poster,
|
|
233
|
+
description = description,
|
|
234
|
+
rating = rating,
|
|
235
|
+
episodes = episodes
|
|
143
236
|
)
|
|
144
237
|
|
|
145
238
|
async def load_links(self, url: str) -> list[dict]:
|
|
@@ -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, SeriesInfo, Episode
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
|
|
6
6
|
class SezonlukDizi(PluginBase):
|
|
@@ -21,7 +21,6 @@ class SezonlukDizi(PluginBase):
|
|
|
21
21
|
f"{main_url}/diziler.asp?siralama_tipi=id&kat=6&s=" : "Belgeseller",
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
#@kekik_cache(ttl=60*60)
|
|
25
24
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
26
25
|
istek = await self.httpx.get(f"{url}{page}")
|
|
27
26
|
secici = Selector(istek.text)
|
|
@@ -36,7 +35,6 @@ class SezonlukDizi(PluginBase):
|
|
|
36
35
|
for veri in secici.css("div.afis a") if veri.css("div.description::text").get()
|
|
37
36
|
]
|
|
38
37
|
|
|
39
|
-
#@kekik_cache(ttl=60*60)
|
|
40
38
|
async def search(self, query: str) -> list[SearchResult]:
|
|
41
39
|
istek = await self.httpx.get(f"{self.main_url}/diziler.asp?adi={query}")
|
|
42
40
|
secici = Selector(istek.text)
|
|
@@ -50,7 +48,6 @@ class SezonlukDizi(PluginBase):
|
|
|
50
48
|
for afis in secici.css("div.afis a.column")
|
|
51
49
|
]
|
|
52
50
|
|
|
53
|
-
#@kekik_cache(ttl=60*60)
|
|
54
51
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
55
52
|
istek = await self.httpx.get(url)
|
|
56
53
|
secici = Selector(istek.text)
|
|
@@ -102,7 +99,6 @@ class SezonlukDizi(PluginBase):
|
|
|
102
99
|
actors = actors
|
|
103
100
|
)
|
|
104
101
|
|
|
105
|
-
#@kekik_cache(ttl=15*60)
|
|
106
102
|
async def load_links(self, url: str) -> list[dict]:
|
|
107
103
|
istek = await self.httpx.get(url)
|
|
108
104
|
secici = Selector(istek.text)
|
KekikStream/Plugins/SineWix.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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
|
|
4
4
|
import json
|
|
5
5
|
|
|
6
6
|
class SineWix(PluginBase):
|
|
@@ -35,7 +35,6 @@ class SineWix(PluginBase):
|
|
|
35
35
|
f"{main_url}/sinewix/movies/36" : "Tarih",
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
#@kekik_cache(ttl=60*60)
|
|
39
38
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
40
39
|
istek = await self.httpx.get(f"{url}/{page}")
|
|
41
40
|
veriler = istek.json()
|
|
@@ -50,7 +49,6 @@ class SineWix(PluginBase):
|
|
|
50
49
|
for veri in veriler.get("data")
|
|
51
50
|
]
|
|
52
51
|
|
|
53
|
-
#@kekik_cache(ttl=60*60)
|
|
54
52
|
async def search(self, query: str) -> list[SearchResult]:
|
|
55
53
|
istek = await self.httpx.get(f"{self.main_url}/sinewix/search/{query}")
|
|
56
54
|
|
|
@@ -63,7 +61,6 @@ class SineWix(PluginBase):
|
|
|
63
61
|
for veri in istek.json().get("search")
|
|
64
62
|
]
|
|
65
63
|
|
|
66
|
-
#@kekik_cache(ttl=60*60)
|
|
67
64
|
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
68
65
|
item_type = url.split("?type=")[-1].split("&id=")[0]
|
|
69
66
|
item_id = url.split("&id=")[-1]
|
|
@@ -126,7 +123,6 @@ class SineWix(PluginBase):
|
|
|
126
123
|
episodes = episodes,
|
|
127
124
|
)
|
|
128
125
|
|
|
129
|
-
#@kekik_cache(ttl=15*60)
|
|
130
126
|
async def load_links(self, url: str) -> list[dict]:
|
|
131
127
|
try:
|
|
132
128
|
veri = json.loads(url)
|
KekikStream/Plugins/Sinefy.py
CHANGED
|
@@ -5,74 +5,95 @@ from parsel import Selector
|
|
|
5
5
|
import re, json, urllib.parse
|
|
6
6
|
|
|
7
7
|
class Sinefy(PluginBase):
|
|
8
|
-
name
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
name = "Sinefy"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://sinefy3.com"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Yabancı film izle olarak vizyondaki en yeni yabancı filmleri türkçe dublaj ve altyazılı olarak en hızlı şekilde full hd olarak sizlere sunuyoruz."
|
|
13
|
+
|
|
12
14
|
main_page = {
|
|
13
|
-
"page/"
|
|
14
|
-
"en-yenifilmler"
|
|
15
|
-
"netflix-filmleri-izle"
|
|
16
|
-
"dizi-izle/netflix"
|
|
15
|
+
f"{main_url}/page/" : "Son Eklenenler",
|
|
16
|
+
f"{main_url}/en-yenifilmler" : "Yeni Filmler",
|
|
17
|
+
f"{main_url}/netflix-filmleri-izle" : "Netflix Filmleri",
|
|
18
|
+
f"{main_url}/dizi-izle/netflix" : "Netflix Dizileri",
|
|
19
|
+
f"{main_url}/gozat/filmler/animasyon" : "Animasyon",
|
|
20
|
+
f"{main_url}/gozat/filmler/komedi" : "Komedi",
|
|
21
|
+
f"{main_url}/gozat/filmler/suc" : "Suç",
|
|
22
|
+
f"{main_url}/gozat/filmler/aile" : "Aile",
|
|
23
|
+
f"{main_url}/gozat/filmler/aksiyon" : "Aksiyon",
|
|
24
|
+
f"{main_url}/gozat/filmler/macera" : "Macera",
|
|
25
|
+
f"{main_url}/gozat/filmler/fantastik" : "Fantastik",
|
|
26
|
+
f"{main_url}/gozat/filmler/korku" : "Korku",
|
|
27
|
+
f"{main_url}/gozat/filmler/romantik" : "Romantik",
|
|
28
|
+
f"{main_url}/gozat/filmler/savas" : "Savaş",
|
|
29
|
+
f"{main_url}/gozat/filmler/gerilim" : "Gerilim",
|
|
30
|
+
f"{main_url}/gozat/filmler/bilim-kurgu" : "Bilim Kurgu",
|
|
31
|
+
f"{main_url}/gozat/filmler/dram" : "Dram",
|
|
32
|
+
f"{main_url}/gozat/filmler/gizem" : "Gizem",
|
|
33
|
+
f"{main_url}/gozat/filmler/western" : "Western",
|
|
34
|
+
f"{main_url}/gozat/filmler/ulke/turkiye" : "Türk Filmleri",
|
|
35
|
+
f"{main_url}/gozat/filmler/ulke/kore" : "Kore Filmleri"
|
|
17
36
|
}
|
|
18
37
|
|
|
19
38
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
20
39
|
if "page/" in url:
|
|
21
|
-
full_url = f"{
|
|
40
|
+
full_url = f"{url}{page}"
|
|
22
41
|
elif "en-yenifilmler" in url or "netflix" in url:
|
|
23
|
-
full_url = f"{
|
|
42
|
+
full_url = f"{url}/{page}"
|
|
24
43
|
else:
|
|
25
|
-
full_url = f"{
|
|
26
|
-
|
|
44
|
+
full_url = f"{url}&page={page}"
|
|
45
|
+
|
|
27
46
|
resp = await self.httpx.get(full_url)
|
|
28
|
-
sel
|
|
29
|
-
|
|
47
|
+
sel = Selector(resp.text)
|
|
48
|
+
|
|
30
49
|
results = []
|
|
31
50
|
# Kotlin: div.poster-with-subject, div.dark-segment div.poster-md.poster
|
|
32
51
|
for item in sel.css("div.poster-with-subject, div.dark-segment div.poster-md.poster"):
|
|
33
|
-
title
|
|
34
|
-
href
|
|
35
|
-
poster= item.css("img::attr(data-srcset)").get()
|
|
52
|
+
title = item.css("h2::text").get()
|
|
53
|
+
href = item.css("a::attr(href)").get()
|
|
54
|
+
poster = item.css("img::attr(data-srcset)").get()
|
|
36
55
|
if poster:
|
|
37
56
|
poster = poster.split(",")[0].split(" ")[0]
|
|
38
|
-
|
|
57
|
+
|
|
39
58
|
if title and href:
|
|
40
59
|
results.append(MainPageResult(
|
|
41
|
-
category=category,
|
|
42
|
-
title=title,
|
|
43
|
-
url=self.fix_url(href),
|
|
44
|
-
poster=self.fix_url(poster)
|
|
60
|
+
category = category,
|
|
61
|
+
title = title,
|
|
62
|
+
url = self.fix_url(href),
|
|
63
|
+
poster = self.fix_url(poster)
|
|
45
64
|
))
|
|
65
|
+
|
|
46
66
|
return results
|
|
47
67
|
|
|
48
68
|
async def search(self, query: str) -> list[SearchResult]:
|
|
49
69
|
# Try to get dynamic keys from main page first
|
|
50
|
-
c_key
|
|
70
|
+
c_key = "ca1d4a53d0f4761a949b85e51e18f096"
|
|
51
71
|
c_value = "MTc0NzI2OTAwMDU3ZTEwYmZjMDViNWFmOWIwZDViODg0MjU4MjA1ZmYxOThmZTYwMDdjMWQzMzliNzY5NzFlZmViMzRhMGVmNjgwODU3MGIyZA=="
|
|
52
|
-
|
|
72
|
+
|
|
53
73
|
try:
|
|
54
74
|
resp = await self.httpx.get(self.main_url)
|
|
55
|
-
sel
|
|
56
|
-
cke
|
|
75
|
+
sel = Selector(resp.text)
|
|
76
|
+
cke = sel.css("input[name='cKey']::attr(value)").get()
|
|
57
77
|
cval = sel.css("input[name='cValue']::attr(value)").get()
|
|
58
78
|
if cke and cval:
|
|
59
|
-
c_key
|
|
79
|
+
c_key = cke
|
|
60
80
|
c_value = cval
|
|
81
|
+
|
|
61
82
|
except Exception:
|
|
62
83
|
pass
|
|
63
84
|
|
|
64
85
|
post_url = f"{self.main_url}/bg/searchcontent"
|
|
65
86
|
data = {
|
|
66
|
-
"cKey": c_key,
|
|
67
|
-
"cValue": c_value,
|
|
68
|
-
"searchTerm": query
|
|
87
|
+
"cKey" : c_key,
|
|
88
|
+
"cValue" : c_value,
|
|
89
|
+
"searchTerm" : query
|
|
69
90
|
}
|
|
70
91
|
|
|
71
92
|
headers = {
|
|
72
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
|
|
73
|
-
"Accept": "application/json, text/javascript, */*; q=0.01",
|
|
74
|
-
"X-Requested-With": "XMLHttpRequest",
|
|
75
|
-
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
|
|
93
|
+
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
|
|
94
|
+
"Accept" : "application/json, text/javascript, */*; q=0.01",
|
|
95
|
+
"X-Requested-With" : "XMLHttpRequest",
|
|
96
|
+
"Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8"
|
|
76
97
|
}
|
|
77
98
|
|
|
78
99
|
response = await self.httpx.post(post_url, data=data, headers=headers)
|
|
@@ -179,24 +200,24 @@ class Sinefy(PluginBase):
|
|
|
179
200
|
|
|
180
201
|
if episodes:
|
|
181
202
|
return SeriesInfo(
|
|
182
|
-
title=title,
|
|
183
|
-
url=url,
|
|
184
|
-
poster=self.fix_url(poster),
|
|
185
|
-
description=description,
|
|
186
|
-
rating=rating,
|
|
187
|
-
tags=tags,
|
|
188
|
-
actors=actors,
|
|
189
|
-
episodes=episodes
|
|
203
|
+
title = title,
|
|
204
|
+
url = url,
|
|
205
|
+
poster = self.fix_url(poster),
|
|
206
|
+
description = description,
|
|
207
|
+
rating = rating,
|
|
208
|
+
tags = tags,
|
|
209
|
+
actors = actors,
|
|
210
|
+
episodes = episodes
|
|
190
211
|
)
|
|
191
212
|
else:
|
|
192
213
|
return MovieInfo(
|
|
193
|
-
title=title,
|
|
194
|
-
url=url,
|
|
195
|
-
poster=self.fix_url(poster),
|
|
196
|
-
description=description,
|
|
197
|
-
rating=rating,
|
|
198
|
-
tags=tags,
|
|
199
|
-
actors=actors
|
|
214
|
+
title = title,
|
|
215
|
+
url = url,
|
|
216
|
+
poster = self.fix_url(poster),
|
|
217
|
+
description = description,
|
|
218
|
+
rating = rating,
|
|
219
|
+
tags = tags,
|
|
220
|
+
actors = actors
|
|
200
221
|
)
|
|
201
222
|
|
|
202
223
|
async def load_links(self, url: str) -> list[dict]:
|
|
@@ -208,7 +229,7 @@ class Sinefy(PluginBase):
|
|
|
208
229
|
iframe = self.fix_url(iframe)
|
|
209
230
|
extractor = self.ex_manager.find_extractor(iframe)
|
|
210
231
|
return [{
|
|
211
|
-
"url": iframe,
|
|
212
|
-
"name": extractor.name if extractor else "Iframe"
|
|
232
|
+
"url" : iframe,
|
|
233
|
+
"name" : extractor.name if extractor else "Iframe"
|
|
213
234
|
}]
|
|
214
235
|
return []
|
KekikStream/Plugins/Sinezy.py
CHANGED
|
@@ -5,95 +5,127 @@ from parsel import Selector
|
|
|
5
5
|
import re, base64
|
|
6
6
|
|
|
7
7
|
class Sinezy(PluginBase):
|
|
8
|
-
name
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
name = "Sinezy"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://sinezy.fit"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Yerli ve yabancı film izle! Türkçe Dublaj ve Alt Yazılı Seçenekleriyle full hd film izlemek için En çok tercih edilen adres!"
|
|
13
|
+
|
|
12
14
|
main_page = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
|
|
16
|
+
f"{main_url}/izle/en-yi-filmler/" : "En İyi Filmler",
|
|
17
|
+
f"{main_url}/izle/aksiyon-filmleri/" : "Aksiyon ",
|
|
18
|
+
f"{main_url}/izle/animasyon-filmleri/" : "Animasyon",
|
|
19
|
+
f"{main_url}/izle/belgesel-izle/" : "Belgesel",
|
|
20
|
+
f"{main_url}/izle/bilim-kurgu-filmleri/" : "Bilim Kurgu ",
|
|
21
|
+
f"{main_url}/izle/biyografi-filmleri/" : "Biyografi ",
|
|
22
|
+
f"{main_url}/izle/dram-filmleri/" : "Dram",
|
|
23
|
+
f"{main_url}/izle/erotik-film-izle/" : "Erotik ",
|
|
24
|
+
f"{main_url}/izle/fantastik-filmler/" : "Fantastik",
|
|
25
|
+
f"{main_url}/izle/gelecek-filmler/" : "Yakında",
|
|
26
|
+
f"{main_url}/izle/gerilim-filmleri/" : "Gerilim ",
|
|
27
|
+
f"{main_url}/izle/gizem-filmleri/" : "Gizem ",
|
|
28
|
+
f"{main_url}/izle/komedi-filmleri/" : "Komedi ",
|
|
29
|
+
f"{main_url}/izle/korku-filmleri/" : "Korku ",
|
|
30
|
+
f"{main_url}/izle/macera-filmleri/" : "Macera ",
|
|
31
|
+
f"{main_url}/izle/muzikal-izle/" : "Müzikal",
|
|
32
|
+
f"{main_url}/izle/romantik-film/" : "Romantik ",
|
|
33
|
+
f"{main_url}/izle/savas-filmleri/" : "Savaş ",
|
|
34
|
+
f"{main_url}/izle/spor-filmleri/" : "Spor ",
|
|
35
|
+
f"{main_url}/izle/suc-filmleri/" : "Suç ",
|
|
36
|
+
f"{main_url}/izle/tarih-filmleri/" : "Tarih ",
|
|
37
|
+
f"{main_url}/izle/turkce-altyazili-promo/" : "Altyazılı Pro",
|
|
38
|
+
f"{main_url}/izle/yabanci-dizi/" : "Yabancı Dizi",
|
|
39
|
+
f"{main_url}/izle/en-iyi-filmler/" : "En İyi Filmler",
|
|
40
|
+
f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
|
|
41
|
+
f"{main_url}/izle/yerli-filmler/" : "Yerli Filmler",
|
|
42
|
+
f"{main_url}/izle/yetiskin-film/" : "Yetişkin +18",
|
|
15
43
|
}
|
|
16
44
|
|
|
17
45
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
18
|
-
full_url = f"{
|
|
19
|
-
resp
|
|
20
|
-
sel
|
|
46
|
+
full_url = f"{url}page/{page}/"
|
|
47
|
+
resp = await self.httpx.get(full_url)
|
|
48
|
+
sel = Selector(resp.text)
|
|
21
49
|
|
|
22
50
|
results = []
|
|
23
51
|
for item in sel.css("div.container div.content div.movie_box.move_k"):
|
|
24
|
-
title
|
|
25
|
-
href
|
|
26
|
-
poster= item.css("img::attr(data-src)").get()
|
|
52
|
+
title = item.css("a::attr(title)").get()
|
|
53
|
+
href = item.css("a::attr(href)").get()
|
|
54
|
+
poster = item.css("img::attr(data-src)").get()
|
|
27
55
|
|
|
28
56
|
if title and href:
|
|
29
57
|
results.append(MainPageResult(
|
|
30
|
-
category=category,
|
|
31
|
-
title=title,
|
|
32
|
-
url=self.fix_url(href),
|
|
33
|
-
poster=self.fix_url(poster)
|
|
58
|
+
category = category,
|
|
59
|
+
title = title,
|
|
60
|
+
url = self.fix_url(href),
|
|
61
|
+
poster = self.fix_url(poster)
|
|
34
62
|
))
|
|
63
|
+
|
|
35
64
|
return results
|
|
36
65
|
|
|
37
66
|
async def search(self, query: str) -> list[SearchResult]:
|
|
38
|
-
url
|
|
67
|
+
url = f"{self.main_url}/arama/?s={query}"
|
|
39
68
|
resp = await self.httpx.get(url)
|
|
40
|
-
sel
|
|
41
|
-
|
|
69
|
+
sel = Selector(resp.text)
|
|
70
|
+
|
|
42
71
|
results = []
|
|
43
72
|
for item in sel.css("div.movie_box.move_k"):
|
|
44
|
-
title
|
|
45
|
-
href
|
|
46
|
-
poster= item.css("img::attr(data-src)").get()
|
|
47
|
-
|
|
73
|
+
title = item.css("a::attr(title)").get()
|
|
74
|
+
href = item.css("a::attr(href)").get()
|
|
75
|
+
poster = item.css("img::attr(data-src)").get()
|
|
76
|
+
|
|
48
77
|
if title and href:
|
|
49
78
|
results.append(SearchResult(
|
|
50
|
-
title=title,
|
|
51
|
-
url=self.fix_url(href),
|
|
52
|
-
poster=self.fix_url(poster)
|
|
79
|
+
title = title,
|
|
80
|
+
url = self.fix_url(href),
|
|
81
|
+
poster = self.fix_url(poster)
|
|
53
82
|
))
|
|
83
|
+
|
|
54
84
|
return results
|
|
55
85
|
|
|
56
86
|
async def load_item(self, url: str) -> MovieInfo:
|
|
57
87
|
resp = await self.httpx.get(url)
|
|
58
88
|
sel = Selector(resp.text)
|
|
59
|
-
|
|
89
|
+
|
|
60
90
|
title = sel.css("div.detail::attr(title)").get()
|
|
61
91
|
poster = sel.css("div.move_k img::attr(data-src)").get()
|
|
62
92
|
description = sel.css("div.desc.yeniscroll p::text").get()
|
|
63
93
|
rating = sel.css("span.info span.imdb::text").get()
|
|
64
|
-
|
|
65
|
-
tags
|
|
66
|
-
actors = sel.css("span.oyn p::text").getall()
|
|
67
|
-
|
|
94
|
+
|
|
95
|
+
tags = sel.css("div.detail span a::text").getall()
|
|
96
|
+
actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
|
|
97
|
+
|
|
68
98
|
return MovieInfo(
|
|
69
|
-
title=title,
|
|
70
|
-
url=url,
|
|
71
|
-
poster=self.fix_url(poster),
|
|
72
|
-
description=description,
|
|
73
|
-
tags=tags,
|
|
74
|
-
rating=rating,
|
|
75
|
-
actors=actors
|
|
99
|
+
title = title,
|
|
100
|
+
url = url,
|
|
101
|
+
poster = self.fix_url(poster),
|
|
102
|
+
description = description,
|
|
103
|
+
tags = tags,
|
|
104
|
+
rating = rating,
|
|
105
|
+
actors = actors
|
|
76
106
|
)
|
|
77
107
|
|
|
78
108
|
async def load_links(self, url: str) -> list[dict]:
|
|
79
109
|
resp = await self.httpx.get(url)
|
|
80
|
-
|
|
110
|
+
|
|
81
111
|
match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
|
|
82
112
|
if match:
|
|
83
113
|
encoded = match.group(1)
|
|
84
114
|
try:
|
|
85
115
|
decoded = base64.b64decode(encoded).decode('utf-8')
|
|
86
116
|
iframe_match = re.search(r'src="([^"]*)"', decoded)
|
|
117
|
+
|
|
87
118
|
if iframe_match:
|
|
88
119
|
iframe = iframe_match.group(1)
|
|
89
120
|
iframe = self.fix_url(iframe)
|
|
90
121
|
|
|
91
122
|
extractor = self.ex_manager.find_extractor(iframe)
|
|
123
|
+
|
|
92
124
|
return [{
|
|
93
|
-
"url": iframe,
|
|
94
|
-
"name": extractor.name if extractor else "Iframe"
|
|
125
|
+
"url" : iframe,
|
|
126
|
+
"name" : extractor.name if extractor else "Iframe"
|
|
95
127
|
}]
|
|
96
128
|
except Exception:
|
|
97
129
|
pass
|
|
98
|
-
|
|
130
|
+
|
|
99
131
|
return []
|
KekikStream/Plugins/UgurFilm.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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
|
|
6
6
|
class UgurFilm(PluginBase):
|
|
@@ -23,7 +23,6 @@ class UgurFilm(PluginBase):
|
|
|
23
23
|
f"{main_url}/category/erotik/page/" : "Erotik"
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
#@kekik_cache(ttl=60*60)
|
|
27
26
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
28
27
|
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
29
28
|
secici = Selector(istek.text)
|
|
@@ -38,7 +37,6 @@ class UgurFilm(PluginBase):
|
|
|
38
37
|
for veri in secici.css("div.icerik div") if veri.css("span:nth-child(1)::text").get()
|
|
39
38
|
]
|
|
40
39
|
|
|
41
|
-
#@kekik_cache(ttl=60*60)
|
|
42
40
|
async def search(self, query: str) -> list[SearchResult]:
|
|
43
41
|
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
44
42
|
secici = Selector(istek.text)
|
|
@@ -60,7 +58,6 @@ class UgurFilm(PluginBase):
|
|
|
60
58
|
|
|
61
59
|
return results
|
|
62
60
|
|
|
63
|
-
#@kekik_cache(ttl=60*60)
|
|
64
61
|
async def load_item(self, url: str) -> MovieInfo:
|
|
65
62
|
istek = await self.httpx.get(url)
|
|
66
63
|
secici = Selector(istek.text)
|
|
@@ -82,7 +79,6 @@ class UgurFilm(PluginBase):
|
|
|
82
79
|
actors = actors,
|
|
83
80
|
)
|
|
84
81
|
|
|
85
|
-
#@kekik_cache(ttl=15*60)
|
|
86
82
|
async def load_links(self, url: str) -> list[dict]:
|
|
87
83
|
istek = await self.httpx.get(url)
|
|
88
84
|
secici = Selector(istek.text)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.8.
|
|
3
|
+
Version: 1.8.4
|
|
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
|
|
@@ -55,31 +55,31 @@ KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0
|
|
|
55
55
|
KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
|
|
56
56
|
KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
|
|
57
57
|
KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
|
|
58
|
-
KekikStream/Plugins/DiziBox.py,sha256=
|
|
58
|
+
KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
|
|
59
59
|
KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
|
|
60
|
-
KekikStream/Plugins/DiziYou.py,sha256=
|
|
61
|
-
KekikStream/Plugins/Dizilla.py,sha256=
|
|
60
|
+
KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
|
|
61
|
+
KekikStream/Plugins/Dizilla.py,sha256=jDklWkUrrAGhDO9pMvgIXVcKdSHDHlguu0JgifM7Bx8,11546
|
|
62
62
|
KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
|
|
63
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
63
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=izPKGbqQuA6AmLAnFjlBoe8iwnNOrr0Pcy5L2dZfM78,5185
|
|
64
64
|
KekikStream/Plugins/FilmModu.py,sha256=b27hchMoYZwG3I-kM1sveW7rHKOF5OuepdjPgKIehEM,6706
|
|
65
65
|
KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
|
|
66
|
-
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=
|
|
67
|
-
KekikStream/Plugins/HDFilmCehennemi.py,sha256=
|
|
68
|
-
KekikStream/Plugins/JetFilmizle.py,sha256=
|
|
66
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=FAacwtXo72DIl_1bHWgHPIxqmqBJAVPtNQ3yIZPYjlU,6152
|
|
67
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=iPNAdwB5P4yVG3UJOfOad9NMeO8JNhov84JoZp_nLK0,9640
|
|
68
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=3tcx4ZT7oQs_xolhQeiqgirpWtknBjP7J7Qgy0bvIeM,5963
|
|
69
69
|
KekikStream/Plugins/KultFilmler.py,sha256=VZET3RUoOVYKE-C2YbkMW8oNcxz6zE2pR7a3z-B4nD4,8987
|
|
70
|
-
KekikStream/Plugins/RecTV.py,sha256=
|
|
70
|
+
KekikStream/Plugins/RecTV.py,sha256=dF3Ogf7KE_zpfLQRjVcEJQMuWtBtHo6iB73_ECQEJ58,7544
|
|
71
71
|
KekikStream/Plugins/RoketDizi.py,sha256=C6ID2sfEwf0Tw8_tO-pc1nx8TB0Ii_rCVRzlHA7E-oA,8547
|
|
72
|
-
KekikStream/Plugins/SelcukFlix.py,sha256=
|
|
73
|
-
KekikStream/Plugins/SezonlukDizi.py,sha256=
|
|
74
|
-
KekikStream/Plugins/SineWix.py,sha256=
|
|
75
|
-
KekikStream/Plugins/Sinefy.py,sha256=
|
|
72
|
+
KekikStream/Plugins/SelcukFlix.py,sha256=WYVtGMxngpqrXk7PX_B4ya6Pji7dOjQsXoukk30f2d0,12744
|
|
73
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=dT2xPPkdaYV43qsL4Le_5Yel8eoPkHtnXIOXqz-Ya-c,6326
|
|
74
|
+
KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
|
|
75
|
+
KekikStream/Plugins/Sinefy.py,sha256=YMwG7ykdjzAY_GEvV4xv9NJ6ubew7qeMLz4KkvYpaNk,9749
|
|
76
76
|
KekikStream/Plugins/SinemaCX.py,sha256=DUvYa7J4a2D5ivLO_sQiaStoV5FDxmz8onJyFwAidvY,7177
|
|
77
|
-
KekikStream/Plugins/Sinezy.py,sha256=
|
|
77
|
+
KekikStream/Plugins/Sinezy.py,sha256=EttAZogKoKMP8RP_X1fSfi8vVxA2RWizwgnLkmnhERQ,5675
|
|
78
78
|
KekikStream/Plugins/SuperFilmGeldi.py,sha256=Ohm21BPsJH_S1tx5i2APEgAOD25k2NiwRP7rSgAKvRs,5289
|
|
79
|
-
KekikStream/Plugins/UgurFilm.py,sha256=
|
|
80
|
-
kekikstream-1.8.
|
|
81
|
-
kekikstream-1.8.
|
|
82
|
-
kekikstream-1.8.
|
|
83
|
-
kekikstream-1.8.
|
|
84
|
-
kekikstream-1.8.
|
|
85
|
-
kekikstream-1.8.
|
|
79
|
+
KekikStream/Plugins/UgurFilm.py,sha256=eKGzmSi8k_QbXnYPWXZRdmCxxc32zZh4rynmdxCbm1o,4832
|
|
80
|
+
kekikstream-1.8.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
81
|
+
kekikstream-1.8.4.dist-info/METADATA,sha256=dmWG5qnauBIV5QUU-wFXlsHcF35UeyN-IvIJ35H8TMQ,4983
|
|
82
|
+
kekikstream-1.8.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
83
|
+
kekikstream-1.8.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
84
|
+
kekikstream-1.8.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
85
|
+
kekikstream-1.8.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|