KekikStream 1.8.4__py3-none-any.whl → 1.8.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- KekikStream/Core/Extractor/ExtractorBase.py +2 -14
- KekikStream/Core/Plugin/PluginBase.py +2 -15
- KekikStream/Plugins/HDFilmCehennemi.py +10 -11
- KekikStream/Plugins/RoketDizi.py +5 -6
- KekikStream/requirements.txt +2 -3
- {kekikstream-1.8.4.dist-info → kekikstream-1.8.5.dist-info}/METADATA +1 -2
- {kekikstream-1.8.4.dist-info → kekikstream-1.8.5.dist-info}/RECORD +11 -11
- {kekikstream-1.8.4.dist-info → kekikstream-1.8.5.dist-info}/WHEEL +0 -0
- {kekikstream-1.8.4.dist-info → kekikstream-1.8.5.dist-info}/entry_points.txt +0 -0
- {kekikstream-1.8.4.dist-info → kekikstream-1.8.5.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-1.8.4.dist-info → kekikstream-1.8.5.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
|
-
from curl_cffi import AsyncSession
|
|
5
4
|
from cloudscraper import CloudScraper
|
|
6
5
|
from httpx import AsyncClient
|
|
7
6
|
from typing import Optional
|
|
@@ -12,7 +11,6 @@ class ExtractorBase(ABC):
|
|
|
12
11
|
# Çıkarıcının temel özellikleri
|
|
13
12
|
name = "Extractor"
|
|
14
13
|
main_url = ""
|
|
15
|
-
requires_cffi = False
|
|
16
14
|
|
|
17
15
|
def __init__(self):
|
|
18
16
|
# cloudscraper - for bypassing Cloudflare
|
|
@@ -21,19 +19,11 @@ class ExtractorBase(ABC):
|
|
|
21
19
|
# httpx - lightweight and safe for most HTTP requests
|
|
22
20
|
self.httpx = AsyncClient(
|
|
23
21
|
timeout = 3,
|
|
24
|
-
follow_redirects = True
|
|
22
|
+
follow_redirects = True
|
|
25
23
|
)
|
|
26
24
|
self.httpx.headers.update(self.cloudscraper.headers)
|
|
27
25
|
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
28
26
|
|
|
29
|
-
# curl_cffi - only initialize if needed for anti-bot bypass
|
|
30
|
-
self.cffi = None
|
|
31
|
-
|
|
32
|
-
if self.requires_cffi:
|
|
33
|
-
self.cffi = AsyncSession(impersonate="firefox135")
|
|
34
|
-
self.cffi.cookies.update(self.cloudscraper.cookies)
|
|
35
|
-
self.cffi.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
|
|
36
|
-
|
|
37
27
|
def can_handle_url(self, url: str) -> bool:
|
|
38
28
|
# URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
|
|
39
29
|
return self.main_url in url
|
|
@@ -44,10 +34,8 @@ class ExtractorBase(ABC):
|
|
|
44
34
|
pass
|
|
45
35
|
|
|
46
36
|
async def close(self):
|
|
47
|
-
"""Close
|
|
37
|
+
"""Close HTTP client."""
|
|
48
38
|
await self.httpx.aclose()
|
|
49
|
-
if self.cffi:
|
|
50
|
-
await self.cffi.close()
|
|
51
39
|
|
|
52
40
|
def fix_url(self, url: str) -> str:
|
|
53
41
|
# Eksik URL'leri düzelt ve tam URL formatına çevir
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
|
-
from curl_cffi import AsyncSession
|
|
5
4
|
from cloudscraper import CloudScraper
|
|
6
5
|
from httpx import AsyncClient
|
|
7
6
|
from .PluginModels import MainPageResult, SearchResult, MovieInfo
|
|
@@ -17,8 +16,6 @@ class PluginBase(ABC):
|
|
|
17
16
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
18
17
|
description = "No description provided."
|
|
19
18
|
|
|
20
|
-
requires_cffi = False
|
|
21
|
-
|
|
22
19
|
main_page = {}
|
|
23
20
|
|
|
24
21
|
async def url_update(self, new_url: str):
|
|
@@ -33,19 +30,11 @@ class PluginBase(ABC):
|
|
|
33
30
|
# httpx - lightweight and safe for most HTTP requests
|
|
34
31
|
self.httpx = AsyncClient(
|
|
35
32
|
timeout = 3,
|
|
36
|
-
follow_redirects = True
|
|
33
|
+
follow_redirects = True
|
|
37
34
|
)
|
|
38
35
|
self.httpx.headers.update(self.cloudscraper.headers)
|
|
39
36
|
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
40
37
|
|
|
41
|
-
# curl_cffi - only initialize if needed for anti-bot bypass
|
|
42
|
-
self.cffi = None
|
|
43
|
-
|
|
44
|
-
if self.requires_cffi:
|
|
45
|
-
self.cffi = AsyncSession(impersonate="firefox135")
|
|
46
|
-
self.cffi.cookies.update(self.cloudscraper.cookies)
|
|
47
|
-
self.cffi.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
|
|
48
|
-
|
|
49
38
|
self.media_handler = MediaHandler()
|
|
50
39
|
self.ex_manager = ExtractorManager()
|
|
51
40
|
|
|
@@ -90,10 +79,8 @@ class PluginBase(ABC):
|
|
|
90
79
|
pass
|
|
91
80
|
|
|
92
81
|
async def close(self):
|
|
93
|
-
"""Close
|
|
82
|
+
"""Close HTTP client."""
|
|
94
83
|
await self.httpx.aclose()
|
|
95
|
-
if self.cffi:
|
|
96
|
-
await self.cffi.close()
|
|
97
84
|
|
|
98
85
|
def fix_url(self, url: str) -> str:
|
|
99
86
|
if not url:
|
|
@@ -12,8 +12,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
12
12
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
13
13
|
description = "Türkiye'nin en hızlı hd film izleme sitesi"
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
requires_cffi = True
|
|
15
|
+
|
|
17
16
|
|
|
18
17
|
main_page = {
|
|
19
18
|
f"{main_url}" : "Yeni Eklenen Filmler",
|
|
@@ -33,7 +32,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
36
|
-
istek = await self.
|
|
35
|
+
istek = await self.httpx.get(f"{url}", follow_redirects=True)
|
|
37
36
|
secici = Selector(istek.text)
|
|
38
37
|
|
|
39
38
|
return [
|
|
@@ -47,7 +46,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
47
46
|
]
|
|
48
47
|
|
|
49
48
|
async def search(self, query: str) -> list[SearchResult]:
|
|
50
|
-
istek = await self.
|
|
49
|
+
istek = await self.httpx.get(
|
|
51
50
|
url = f"{self.main_url}/search/?q={query}",
|
|
52
51
|
headers = {
|
|
53
52
|
"Referer" : f"{self.main_url}/",
|
|
@@ -75,7 +74,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
75
74
|
return results
|
|
76
75
|
|
|
77
76
|
async def load_item(self, url: str) -> MovieInfo:
|
|
78
|
-
istek = await self.
|
|
77
|
+
istek = await self.httpx.get(url, headers = {"Referer": f"{self.main_url}/"})
|
|
79
78
|
secici = Selector(istek.text)
|
|
80
79
|
|
|
81
80
|
title = secici.css("h1.section-title::text").get().strip()
|
|
@@ -111,7 +110,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
111
110
|
async def cehennempass(self, video_id: str) -> list[dict]:
|
|
112
111
|
results = []
|
|
113
112
|
|
|
114
|
-
istek = await self.
|
|
113
|
+
istek = await self.httpx.post(
|
|
115
114
|
url = "https://cehennempass.pw/process_quality_selection.php",
|
|
116
115
|
headers = {
|
|
117
116
|
"Referer" : f"https://cehennempass.pw/download/{video_id}",
|
|
@@ -128,7 +127,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
128
127
|
"referer" : f"https://cehennempass.pw/download/{video_id}"
|
|
129
128
|
})
|
|
130
129
|
|
|
131
|
-
istek = await self.
|
|
130
|
+
istek = await self.httpx.post(
|
|
132
131
|
url = "https://cehennempass.pw/process_quality_selection.php",
|
|
133
132
|
headers = {
|
|
134
133
|
"Referer" : f"https://cehennempass.pw/download/{video_id}",
|
|
@@ -148,8 +147,8 @@ class HDFilmCehennemi(PluginBase):
|
|
|
148
147
|
return results
|
|
149
148
|
|
|
150
149
|
async def invoke_local_source(self, iframe: str, source: str, url: str):
|
|
151
|
-
self.
|
|
152
|
-
istek = await self.
|
|
150
|
+
self.httpx.headers.update({"Referer": f"{self.main_url}/"})
|
|
151
|
+
istek = await self.httpx.get(iframe)
|
|
153
152
|
|
|
154
153
|
try:
|
|
155
154
|
eval_func = re.compile(r'\s*(eval\(function[\s\S].*)\s*').findall(istek.text)[0]
|
|
@@ -178,7 +177,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
178
177
|
}]
|
|
179
178
|
|
|
180
179
|
async def load_links(self, url: str) -> list[dict]:
|
|
181
|
-
istek = await self.
|
|
180
|
+
istek = await self.httpx.get(url)
|
|
182
181
|
secici = Selector(istek.text)
|
|
183
182
|
|
|
184
183
|
results = []
|
|
@@ -189,7 +188,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
189
188
|
source = f"{link.css('::text').get().replace('(HDrip Xbet)', '').strip()} {lang_code}"
|
|
190
189
|
video_id = link.css("::attr(data-video)").get()
|
|
191
190
|
|
|
192
|
-
api_get = await self.
|
|
191
|
+
api_get = await self.httpx.get(
|
|
193
192
|
url = f"{self.main_url}/video/{video_id}/",
|
|
194
193
|
headers = {
|
|
195
194
|
"Content-Type" : "application/json",
|
KekikStream/Plugins/RoketDizi.py
CHANGED
|
@@ -11,8 +11,7 @@ class RoketDizi(PluginBase):
|
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
12
|
description = "Türkiye'nin en tatlış yabancı dizi izleme sitesi. Türkçe dublaj, altyazılı, eski ve yeni yabancı dizilerin yanı sıra kore (asya) dizileri izleyebilirsiniz."
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
requires_cffi = True
|
|
14
|
+
|
|
16
15
|
|
|
17
16
|
main_page = {
|
|
18
17
|
"dizi/tur/aksiyon" : "Aksiyon",
|
|
@@ -27,7 +26,7 @@ class RoketDizi(PluginBase):
|
|
|
27
26
|
|
|
28
27
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
29
28
|
full_url = f"{self.main_url}/{url}?&page={page}"
|
|
30
|
-
resp = await self.
|
|
29
|
+
resp = await self.httpx.get(full_url)
|
|
31
30
|
sel = Selector(resp.text)
|
|
32
31
|
|
|
33
32
|
results = []
|
|
@@ -55,7 +54,7 @@ class RoketDizi(PluginBase):
|
|
|
55
54
|
"Referer" : f"{self.main_url}/",
|
|
56
55
|
}
|
|
57
56
|
|
|
58
|
-
search_req = await self.
|
|
57
|
+
search_req = await self.httpx.post(post_url, headers=headers)
|
|
59
58
|
|
|
60
59
|
try:
|
|
61
60
|
resp_json = search_req.json()
|
|
@@ -99,7 +98,7 @@ class RoketDizi(PluginBase):
|
|
|
99
98
|
|
|
100
99
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
101
100
|
# Note: Handling both Movie and Series logic in one, returning SeriesInfo generally or MovieInfo
|
|
102
|
-
resp = await self.
|
|
101
|
+
resp = await self.httpx.get(url)
|
|
103
102
|
sel = Selector(resp.text)
|
|
104
103
|
|
|
105
104
|
title = sel.css("h1.text-white::text").get()
|
|
@@ -183,7 +182,7 @@ class RoketDizi(PluginBase):
|
|
|
183
182
|
)
|
|
184
183
|
|
|
185
184
|
async def load_links(self, url: str) -> list[dict]:
|
|
186
|
-
resp = await self.
|
|
185
|
+
resp = await self.httpx.get(url)
|
|
187
186
|
sel = Selector(resp.text)
|
|
188
187
|
|
|
189
188
|
next_data = sel.css("script#__NEXT_DATA__::text").get()
|
KekikStream/requirements.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.8.
|
|
3
|
+
Version: 1.8.5
|
|
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
|
|
@@ -17,7 +17,6 @@ Requires-Dist: setuptools
|
|
|
17
17
|
Requires-Dist: wheel
|
|
18
18
|
Requires-Dist: Kekik
|
|
19
19
|
Requires-Dist: httpx
|
|
20
|
-
Requires-Dist: curl-cffi
|
|
21
20
|
Requires-Dist: cloudscraper
|
|
22
21
|
Requires-Dist: parsel
|
|
23
22
|
Requires-Dist: pydantic
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
KekikStream/__init__.py,sha256=JcSKsLRyJM5ZPNHq4DLSaj4FzOjxSp8M8JuM3YN8Ye4,13456
|
|
2
2
|
KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
|
|
3
|
-
KekikStream/requirements.txt,sha256=
|
|
3
|
+
KekikStream/requirements.txt,sha256=0fO-7byqgLMr4NyJO7fQBFOnLv0zcAeqk7tLhHXqonk,76
|
|
4
4
|
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
|
5
5
|
KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElcii8,1487
|
|
6
6
|
KekikStream/Core/__init__.py,sha256=ar2MZQF83ryfLfydEXcfjdwNe4Too_HT6bP-D_4TopA,710
|
|
7
|
-
KekikStream/Core/Extractor/ExtractorBase.py,sha256=
|
|
7
|
+
KekikStream/Core/Extractor/ExtractorBase.py,sha256=Yj7CGvm2ZKxlvuUkZu0X1Pl0JMH250W7hyqv09duTmE,1637
|
|
8
8
|
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=7uxUXTAuF65KKkmbI6iRiCiUhx-IqrronB7ixhchcTU,4289
|
|
9
9
|
KekikStream/Core/Extractor/ExtractorManager.py,sha256=4L1H3jiTnf0kTq4W6uS7n95bBYHlKJ8_hh0og8z4erQ,1244
|
|
10
10
|
KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6XBOc0HS0tXGDwajI,445
|
|
11
11
|
KekikStream/Core/Media/MediaHandler.py,sha256=taLA3rXsN_VfNn7nIc_OZKaaif8kuEZznhH_EaOiQQk,6874
|
|
12
12
|
KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
|
|
13
|
-
KekikStream/Core/Plugin/PluginBase.py,sha256=
|
|
13
|
+
KekikStream/Core/Plugin/PluginBase.py,sha256=uzJb8DqJfXOteteSBhG9QWUrFgb4JTByV_GbODz-9gs,3872
|
|
14
14
|
KekikStream/Core/Plugin/PluginLoader.py,sha256=yZxMug-OcJ5RBm4fQkoquKrZxcBU7Pvt4IcY-d0WU8g,3393
|
|
15
15
|
KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
|
|
16
16
|
KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P8S0tRNhS6E,2476
|
|
@@ -64,11 +64,11 @@ KekikStream/Plugins/FilmMakinesi.py,sha256=izPKGbqQuA6AmLAnFjlBoe8iwnNOrr0Pcy5L2
|
|
|
64
64
|
KekikStream/Plugins/FilmModu.py,sha256=b27hchMoYZwG3I-kM1sveW7rHKOF5OuepdjPgKIehEM,6706
|
|
65
65
|
KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
|
|
66
66
|
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=FAacwtXo72DIl_1bHWgHPIxqmqBJAVPtNQ3yIZPYjlU,6152
|
|
67
|
-
KekikStream/Plugins/HDFilmCehennemi.py,sha256=
|
|
67
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=D2VvgNvCcHfjkitzSfA19OFp-mI0sgUm6OSVej0ZgTY,9544
|
|
68
68
|
KekikStream/Plugins/JetFilmizle.py,sha256=3tcx4ZT7oQs_xolhQeiqgirpWtknBjP7J7Qgy0bvIeM,5963
|
|
69
69
|
KekikStream/Plugins/KultFilmler.py,sha256=VZET3RUoOVYKE-C2YbkMW8oNcxz6zE2pR7a3z-B4nD4,8987
|
|
70
70
|
KekikStream/Plugins/RecTV.py,sha256=dF3Ogf7KE_zpfLQRjVcEJQMuWtBtHo6iB73_ECQEJ58,7544
|
|
71
|
-
KekikStream/Plugins/RoketDizi.py,sha256=
|
|
71
|
+
KekikStream/Plugins/RoketDizi.py,sha256=isVijJ6YRtsBQ6DVB2K3n6uV-1GXZahujLF7IWvBrqs,8472
|
|
72
72
|
KekikStream/Plugins/SelcukFlix.py,sha256=WYVtGMxngpqrXk7PX_B4ya6Pji7dOjQsXoukk30f2d0,12744
|
|
73
73
|
KekikStream/Plugins/SezonlukDizi.py,sha256=dT2xPPkdaYV43qsL4Le_5Yel8eoPkHtnXIOXqz-Ya-c,6326
|
|
74
74
|
KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
|
|
@@ -77,9 +77,9 @@ KekikStream/Plugins/SinemaCX.py,sha256=DUvYa7J4a2D5ivLO_sQiaStoV5FDxmz8onJyFwAid
|
|
|
77
77
|
KekikStream/Plugins/Sinezy.py,sha256=EttAZogKoKMP8RP_X1fSfi8vVxA2RWizwgnLkmnhERQ,5675
|
|
78
78
|
KekikStream/Plugins/SuperFilmGeldi.py,sha256=Ohm21BPsJH_S1tx5i2APEgAOD25k2NiwRP7rSgAKvRs,5289
|
|
79
79
|
KekikStream/Plugins/UgurFilm.py,sha256=eKGzmSi8k_QbXnYPWXZRdmCxxc32zZh4rynmdxCbm1o,4832
|
|
80
|
-
kekikstream-1.8.
|
|
81
|
-
kekikstream-1.8.
|
|
82
|
-
kekikstream-1.8.
|
|
83
|
-
kekikstream-1.8.
|
|
84
|
-
kekikstream-1.8.
|
|
85
|
-
kekikstream-1.8.
|
|
80
|
+
kekikstream-1.8.5.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
81
|
+
kekikstream-1.8.5.dist-info/METADATA,sha256=PA0T8ikorAFyFbYMnmhrz3dJIpkHYUQAc5DSXtvx0ek,4958
|
|
82
|
+
kekikstream-1.8.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
83
|
+
kekikstream-1.8.5.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
84
|
+
kekikstream-1.8.5.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
85
|
+
kekikstream-1.8.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|