KekikStream 1.8.3__tar.gz → 1.8.4__tar.gz
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-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/DiziBox.py +0 -1
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/DiziYou.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/Dizilla.py +0 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FilmMakinesi.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FullHDFilmizlesene.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/HDFilmCehennemi.py +1 -4
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/JetFilmizle.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/RecTV.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SelcukFlix.py +160 -67
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SezonlukDizi.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SineWix.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/Sinefy.py +72 -51
- kekikstream-1.8.4/KekikStream/Plugins/Sinezy.py +131 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/UgurFilm.py +1 -2
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-1.8.3 → kekikstream-1.8.4}/PKG-INFO +1 -1
- {kekikstream-1.8.3 → kekikstream-1.8.4}/setup.py +1 -1
- kekikstream-1.8.3/KekikStream/Plugins/Sinezy.py +0 -99
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FirePlayer.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/__init__.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/__main__.py +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/requirements.txt +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/LICENSE +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/MANIFEST.in +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/README.md +0 -0
- {kekikstream-1.8.3 → kekikstream-1.8.4}/setup.cfg +0 -0
|
@@ -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
|
|
|
@@ -123,7 +123,6 @@ class DiziYou(PluginBase):
|
|
|
123
123
|
actors = actors
|
|
124
124
|
)
|
|
125
125
|
|
|
126
|
-
#@kekik_cache(ttl=15*60)
|
|
127
126
|
async def load_links(self, url: str) -> list[dict]:
|
|
128
127
|
istek = await self.httpx.get(url)
|
|
129
128
|
secici = Selector(istek.text)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from Kekik.cli import konsol
|
|
4
3
|
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
|
|
5
4
|
from parsel import Selector
|
|
6
5
|
from json import loads
|
|
@@ -171,7 +170,6 @@ class Dizilla(PluginBase):
|
|
|
171
170
|
actors = actors
|
|
172
171
|
)
|
|
173
172
|
|
|
174
|
-
#@kekik_cache(ttl=15*60)
|
|
175
173
|
async def load_links(self, url: str) -> list[dict]:
|
|
176
174
|
istek = await self.httpx.get(url)
|
|
177
175
|
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 FilmMakinesi(PluginBase):
|
|
@@ -98,7 +98,6 @@ class FilmMakinesi(PluginBase):
|
|
|
98
98
|
duration = duration
|
|
99
99
|
)
|
|
100
100
|
|
|
101
|
-
#@kekik_cache(ttl=15*60)
|
|
102
101
|
async def load_links(self, url: str) -> list[dict]:
|
|
103
102
|
istek = await self.httpx.get(url)
|
|
104
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
|
|
@@ -100,7 +100,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
100
100
|
duration = duration
|
|
101
101
|
)
|
|
102
102
|
|
|
103
|
-
#@kekik_cache(ttl=15*60)
|
|
104
103
|
async def load_links(self, url: str) -> list[dict]:
|
|
105
104
|
istek = await self.httpx.get(url)
|
|
106
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
|
|
@@ -108,7 +108,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
108
108
|
def generate_random_cookie(self):
|
|
109
109
|
return "".join(random.choices(string.ascii_letters + string.digits, k=16))
|
|
110
110
|
|
|
111
|
-
#@kekik_cache(ttl=15*60)
|
|
112
111
|
async def cehennempass(self, video_id: str) -> list[dict]:
|
|
113
112
|
results = []
|
|
114
113
|
|
|
@@ -148,7 +147,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
148
147
|
|
|
149
148
|
return results
|
|
150
149
|
|
|
151
|
-
#@kekik_cache(ttl=15*60)
|
|
152
150
|
async def invoke_local_source(self, iframe: str, source: str, url: str):
|
|
153
151
|
self.cffi.headers.update({"Referer": f"{self.main_url}/"})
|
|
154
152
|
istek = await self.cffi.get(iframe)
|
|
@@ -179,7 +177,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
179
177
|
"subtitles" : subtitles
|
|
180
178
|
}]
|
|
181
179
|
|
|
182
|
-
#@kekik_cache(ttl=15*60)
|
|
183
180
|
async def load_links(self, url: str) -> list[dict]:
|
|
184
181
|
istek = await self.cffi.get(url)
|
|
185
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):
|
|
@@ -89,7 +89,6 @@ class JetFilmizle(PluginBase):
|
|
|
89
89
|
actors = actors
|
|
90
90
|
)
|
|
91
91
|
|
|
92
|
-
#@kekik_cache(ttl=15*60)
|
|
93
92
|
async def load_links(self, url: str) -> list[dict]:
|
|
94
93
|
istek = await self.httpx.get(url)
|
|
95
94
|
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, Episode, SeriesInfo, ExtractResult, Subtitle
|
|
4
4
|
from json import dumps, loads
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -116,7 +116,6 @@ class RecTV(PluginBase):
|
|
|
116
116
|
actors = []
|
|
117
117
|
)
|
|
118
118
|
|
|
119
|
-
#@kekik_cache(ttl=15*60)
|
|
120
119
|
async def load_links(self, url: str) -> list[dict]:
|
|
121
120
|
try:
|
|
122
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):
|
|
@@ -99,7 +99,6 @@ class SezonlukDizi(PluginBase):
|
|
|
99
99
|
actors = actors
|
|
100
100
|
)
|
|
101
101
|
|
|
102
|
-
#@kekik_cache(ttl=15*60)
|
|
103
102
|
async def load_links(self, url: str) -> list[dict]:
|
|
104
103
|
istek = await self.httpx.get(url)
|
|
105
104
|
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, Episode, SeriesInfo, ExtractResult, Subtitle
|
|
4
4
|
import json
|
|
5
5
|
|
|
6
6
|
class SineWix(PluginBase):
|
|
@@ -123,7 +123,6 @@ class SineWix(PluginBase):
|
|
|
123
123
|
episodes = episodes,
|
|
124
124
|
)
|
|
125
125
|
|
|
126
|
-
#@kekik_cache(ttl=15*60)
|
|
127
126
|
async def load_links(self, url: str) -> list[dict]:
|
|
128
127
|
try:
|
|
129
128
|
veri = json.loads(url)
|
|
@@ -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 []
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
4
|
+
from parsel import Selector
|
|
5
|
+
import re, base64
|
|
6
|
+
|
|
7
|
+
class Sinezy(PluginBase):
|
|
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
|
+
|
|
14
|
+
main_page = {
|
|
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",
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
46
|
+
full_url = f"{url}page/{page}/"
|
|
47
|
+
resp = await self.httpx.get(full_url)
|
|
48
|
+
sel = Selector(resp.text)
|
|
49
|
+
|
|
50
|
+
results = []
|
|
51
|
+
for item in sel.css("div.container div.content div.movie_box.move_k"):
|
|
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()
|
|
55
|
+
|
|
56
|
+
if title and href:
|
|
57
|
+
results.append(MainPageResult(
|
|
58
|
+
category = category,
|
|
59
|
+
title = title,
|
|
60
|
+
url = self.fix_url(href),
|
|
61
|
+
poster = self.fix_url(poster)
|
|
62
|
+
))
|
|
63
|
+
|
|
64
|
+
return results
|
|
65
|
+
|
|
66
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
67
|
+
url = f"{self.main_url}/arama/?s={query}"
|
|
68
|
+
resp = await self.httpx.get(url)
|
|
69
|
+
sel = Selector(resp.text)
|
|
70
|
+
|
|
71
|
+
results = []
|
|
72
|
+
for item in sel.css("div.movie_box.move_k"):
|
|
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
|
+
|
|
77
|
+
if title and href:
|
|
78
|
+
results.append(SearchResult(
|
|
79
|
+
title = title,
|
|
80
|
+
url = self.fix_url(href),
|
|
81
|
+
poster = self.fix_url(poster)
|
|
82
|
+
))
|
|
83
|
+
|
|
84
|
+
return results
|
|
85
|
+
|
|
86
|
+
async def load_item(self, url: str) -> MovieInfo:
|
|
87
|
+
resp = await self.httpx.get(url)
|
|
88
|
+
sel = Selector(resp.text)
|
|
89
|
+
|
|
90
|
+
title = sel.css("div.detail::attr(title)").get()
|
|
91
|
+
poster = sel.css("div.move_k img::attr(data-src)").get()
|
|
92
|
+
description = sel.css("div.desc.yeniscroll p::text").get()
|
|
93
|
+
rating = sel.css("span.info span.imdb::text").get()
|
|
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
|
+
|
|
98
|
+
return MovieInfo(
|
|
99
|
+
title = title,
|
|
100
|
+
url = url,
|
|
101
|
+
poster = self.fix_url(poster),
|
|
102
|
+
description = description,
|
|
103
|
+
tags = tags,
|
|
104
|
+
rating = rating,
|
|
105
|
+
actors = actors
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
109
|
+
resp = await self.httpx.get(url)
|
|
110
|
+
|
|
111
|
+
match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
|
|
112
|
+
if match:
|
|
113
|
+
encoded = match.group(1)
|
|
114
|
+
try:
|
|
115
|
+
decoded = base64.b64decode(encoded).decode('utf-8')
|
|
116
|
+
iframe_match = re.search(r'src="([^"]*)"', decoded)
|
|
117
|
+
|
|
118
|
+
if iframe_match:
|
|
119
|
+
iframe = iframe_match.group(1)
|
|
120
|
+
iframe = self.fix_url(iframe)
|
|
121
|
+
|
|
122
|
+
extractor = self.ex_manager.find_extractor(iframe)
|
|
123
|
+
|
|
124
|
+
return [{
|
|
125
|
+
"url" : iframe,
|
|
126
|
+
"name" : extractor.name if extractor else "Iframe"
|
|
127
|
+
}]
|
|
128
|
+
except Exception:
|
|
129
|
+
pass
|
|
130
|
+
|
|
131
|
+
return []
|
|
@@ -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):
|
|
@@ -79,7 +79,6 @@ class UgurFilm(PluginBase):
|
|
|
79
79
|
actors = actors,
|
|
80
80
|
)
|
|
81
81
|
|
|
82
|
-
#@kekik_cache(ttl=15*60)
|
|
83
82
|
async def load_links(self, url: str) -> list[dict]:
|
|
84
83
|
istek = await self.httpx.get(url)
|
|
85
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
|
|
@@ -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
|
|
@@ -6,7 +6,7 @@ from io import open
|
|
|
6
6
|
setup(
|
|
7
7
|
# ? Genel Bilgiler
|
|
8
8
|
name = "KekikStream",
|
|
9
|
-
version = "1.8.
|
|
9
|
+
version = "1.8.4",
|
|
10
10
|
url = "https://github.com/keyiflerolsun/KekikStream",
|
|
11
11
|
description = "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ı",
|
|
12
12
|
keywords = ["KekikStream", "KekikAkademi", "keyiflerolsun"],
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
-
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
4
|
-
from parsel import Selector
|
|
5
|
-
import re, base64
|
|
6
|
-
|
|
7
|
-
class Sinezy(PluginBase):
|
|
8
|
-
name = "Sinezy"
|
|
9
|
-
main_url = "https://sinezy.site"
|
|
10
|
-
lang = "tr"
|
|
11
|
-
|
|
12
|
-
main_page = {
|
|
13
|
-
"izle/en-yeni-filmler/" : "Yeni Filmler",
|
|
14
|
-
"izle/en-yi-filmler/" : "En İyi Filmler"
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
18
|
-
full_url = f"{self.main_url}/{url}page/{page}/"
|
|
19
|
-
resp = await self.httpx.get(full_url)
|
|
20
|
-
sel = Selector(resp.text)
|
|
21
|
-
|
|
22
|
-
results = []
|
|
23
|
-
for item in sel.css("div.container div.content div.movie_box.move_k"):
|
|
24
|
-
title = item.css("a::attr(title)").get()
|
|
25
|
-
href = item.css("a::attr(href)").get()
|
|
26
|
-
poster= item.css("img::attr(data-src)").get()
|
|
27
|
-
|
|
28
|
-
if title and href:
|
|
29
|
-
results.append(MainPageResult(
|
|
30
|
-
category=category,
|
|
31
|
-
title=title,
|
|
32
|
-
url=self.fix_url(href),
|
|
33
|
-
poster=self.fix_url(poster)
|
|
34
|
-
))
|
|
35
|
-
return results
|
|
36
|
-
|
|
37
|
-
async def search(self, query: str) -> list[SearchResult]:
|
|
38
|
-
url = f"{self.main_url}/arama/?s={query}"
|
|
39
|
-
resp = await self.httpx.get(url)
|
|
40
|
-
sel = Selector(resp.text)
|
|
41
|
-
|
|
42
|
-
results = []
|
|
43
|
-
for item in sel.css("div.movie_box.move_k"):
|
|
44
|
-
title = item.css("a::attr(title)").get()
|
|
45
|
-
href = item.css("a::attr(href)").get()
|
|
46
|
-
poster= item.css("img::attr(data-src)").get()
|
|
47
|
-
|
|
48
|
-
if title and href:
|
|
49
|
-
results.append(SearchResult(
|
|
50
|
-
title=title,
|
|
51
|
-
url=self.fix_url(href),
|
|
52
|
-
poster=self.fix_url(poster)
|
|
53
|
-
))
|
|
54
|
-
return results
|
|
55
|
-
|
|
56
|
-
async def load_item(self, url: str) -> MovieInfo:
|
|
57
|
-
resp = await self.httpx.get(url)
|
|
58
|
-
sel = Selector(resp.text)
|
|
59
|
-
|
|
60
|
-
title = sel.css("div.detail::attr(title)").get()
|
|
61
|
-
poster = sel.css("div.move_k img::attr(data-src)").get()
|
|
62
|
-
description = sel.css("div.desc.yeniscroll p::text").get()
|
|
63
|
-
rating = sel.css("span.info span.imdb::text").get()
|
|
64
|
-
|
|
65
|
-
tags = sel.css("div.detail span a::text").getall()
|
|
66
|
-
actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
|
|
67
|
-
|
|
68
|
-
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
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
async def load_links(self, url: str) -> list[dict]:
|
|
79
|
-
resp = await self.httpx.get(url)
|
|
80
|
-
|
|
81
|
-
match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
|
|
82
|
-
if match:
|
|
83
|
-
encoded = match.group(1)
|
|
84
|
-
try:
|
|
85
|
-
decoded = base64.b64decode(encoded).decode('utf-8')
|
|
86
|
-
iframe_match = re.search(r'src="([^"]*)"', decoded)
|
|
87
|
-
if iframe_match:
|
|
88
|
-
iframe = iframe_match.group(1)
|
|
89
|
-
iframe = self.fix_url(iframe)
|
|
90
|
-
|
|
91
|
-
extractor = self.ex_manager.find_extractor(iframe)
|
|
92
|
-
return [{
|
|
93
|
-
"url": iframe,
|
|
94
|
-
"name": extractor.name if extractor else "Iframe"
|
|
95
|
-
}]
|
|
96
|
-
except Exception:
|
|
97
|
-
pass
|
|
98
|
-
|
|
99
|
-
return []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|