KekikStream 1.8.1__tar.gz → 1.8.6__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.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorBase.py +2 -14
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginBase.py +2 -15
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/DiziBox.py +2 -7
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/DiziPal.py +1 -1
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/DiziYou.py +41 -16
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/Dizilla.py +38 -27
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FilmBip.py +1 -1
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FilmMakinesi.py +1 -5
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FullHDFilmizlesene.py +1 -5
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/HDFilmCehennemi.py +11 -18
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/JetFilmizle.py +1 -5
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/RecTV.py +1 -5
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/RoketDizi.py +80 -42
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SelcukFlix.py +160 -67
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SezonlukDizi.py +1 -5
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SineWix.py +1 -5
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/Sinefy.py +72 -51
- kekikstream-1.8.6/KekikStream/Plugins/Sinezy.py +131 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/UgurFilm.py +1 -5
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/requirements.txt +2 -3
- kekikstream-1.8.6/KekikStream.egg-info/PKG-INFO +282 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/requires.txt +0 -1
- kekikstream-1.8.6/PKG-INFO +282 -0
- kekikstream-1.8.6/README.md +245 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/setup.py +1 -2
- kekikstream-1.8.1/KekikStream/Plugins/Sinezy.py +0 -99
- kekikstream-1.8.1/KekikStream.egg-info/PKG-INFO +0 -110
- kekikstream-1.8.1/PKG-INFO +0 -110
- kekikstream-1.8.1/README.md +0 -72
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FirePlayer.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/__init__.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream/__main__.py +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/LICENSE +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/MANIFEST.in +0 -0
- {kekikstream-1.8.1 → kekikstream-1.8.6}/setup.cfg +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:
|
|
@@ -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
|
|
@@ -9,7 +9,7 @@ class DiziPal(PluginBase):
|
|
|
9
9
|
language = "tr"
|
|
10
10
|
main_url = "https://dizipal1223.com"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
-
description = "
|
|
12
|
+
description = "dizipal güncel, dizipal yeni ve gerçek adresi. dizipal en yeni dizi ve filmleri güvenli ve hızlı şekilde sunar."
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
15
|
f"{main_url}/diziler/son-bolumler" : "Son Bölümler",
|
|
@@ -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)
|
|
@@ -53,18 +51,28 @@ class DiziYou(PluginBase):
|
|
|
53
51
|
SearchResult(
|
|
54
52
|
title = afis.css("div#categorytitle a::text").get().strip(),
|
|
55
53
|
url = self.fix_url(afis.css("div#categorytitle a::attr(href)").get()),
|
|
56
|
-
poster = self.fix_url(afis.css("img::attr(src)").get())
|
|
54
|
+
poster = self.fix_url(afis.css("img::attr(src)").get() or afis.css("img::attr(data-src)").get())
|
|
57
55
|
)
|
|
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)
|
|
65
62
|
|
|
66
|
-
title
|
|
67
|
-
|
|
63
|
+
# Title - div.title h1 içinde
|
|
64
|
+
title_raw = secici.css("div.title h1::text").get()
|
|
65
|
+
title = title_raw.strip() if title_raw else ""
|
|
66
|
+
|
|
67
|
+
# Fallback: Eğer title boşsa URL'den çıkar (telif kısıtlaması olan sayfalar için)
|
|
68
|
+
if not title:
|
|
69
|
+
# URL'den slug'ı al: https://www.diziyou.one/jasmine/ -> jasmine -> Jasmine
|
|
70
|
+
slug = url.rstrip('/').split('/')[-1]
|
|
71
|
+
title = slug.replace('-', ' ').title()
|
|
72
|
+
|
|
73
|
+
# Poster
|
|
74
|
+
poster_raw = secici.css("div.category_image img::attr(src)").get()
|
|
75
|
+
poster = self.fix_url(poster_raw) if poster_raw else ""
|
|
68
76
|
year = secici.xpath("//span[contains(., 'Yapım Yılı')]/following-sibling::text()[1]").get()
|
|
69
77
|
description = secici.css("div.diziyou_desc::text").get()
|
|
70
78
|
if description:
|
|
@@ -75,13 +83,21 @@ class DiziYou(PluginBase):
|
|
|
75
83
|
actors = [actor.strip() for actor in _actors.split(",")] if _actors else []
|
|
76
84
|
|
|
77
85
|
episodes = []
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
86
|
+
# Episodes - bolumust her bölüm için bir <a> içinde
|
|
87
|
+
# :has() parsel'de çalışmıyor, XPath kullanıyoruz
|
|
88
|
+
for link in secici.xpath('//a[div[@class="bolumust"]]'):
|
|
89
|
+
ep_name_raw = link.css("div.baslik::text").get()
|
|
90
|
+
if not ep_name_raw:
|
|
91
|
+
continue
|
|
92
|
+
ep_name = ep_name_raw.strip()
|
|
93
|
+
|
|
94
|
+
ep_href = self.fix_url(link.css("::attr(href)").get())
|
|
95
|
+
if not ep_href:
|
|
82
96
|
continue
|
|
83
97
|
|
|
84
|
-
|
|
98
|
+
# Bölüm ismi varsa al
|
|
99
|
+
ep_name_raw_clean = link.css("div.bolumismi::text").get()
|
|
100
|
+
ep_name_clean = ep_name_raw_clean.strip().replace("(", "").replace(")", "").strip() if ep_name_raw_clean else ep_name
|
|
85
101
|
|
|
86
102
|
ep_episode = re.search(r"(\d+)\. Bölüm", ep_name)[1]
|
|
87
103
|
ep_season = re.search(r"(\d+)\. Sezon", ep_name)[1]
|
|
@@ -107,14 +123,23 @@ class DiziYou(PluginBase):
|
|
|
107
123
|
actors = actors
|
|
108
124
|
)
|
|
109
125
|
|
|
110
|
-
#@kekik_cache(ttl=15*60)
|
|
111
126
|
async def load_links(self, url: str) -> list[dict]:
|
|
112
127
|
istek = await self.httpx.get(url)
|
|
113
128
|
secici = Selector(istek.text)
|
|
114
129
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
130
|
+
# Title ve episode name - None kontrolü ekle
|
|
131
|
+
item_title_raw = secici.css("div.title h1::text").get()
|
|
132
|
+
item_title = item_title_raw.strip() if item_title_raw else ""
|
|
133
|
+
|
|
134
|
+
ep_name_raw = secici.css("div#bolum-ismi::text").get()
|
|
135
|
+
ep_name = ep_name_raw.strip() if ep_name_raw else ""
|
|
136
|
+
|
|
137
|
+
# Player src'den item_id çıkar
|
|
138
|
+
player_src = secici.css("iframe#diziyouPlayer::attr(src)").get()
|
|
139
|
+
if not player_src:
|
|
140
|
+
return [] # Player bulunamadıysa boş liste döndür
|
|
141
|
+
|
|
142
|
+
item_id = player_src.split("/")[-1].replace(".html", "")
|
|
118
143
|
|
|
119
144
|
subtitles = []
|
|
120
145
|
stream_urls = []
|
|
@@ -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,36 +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}/
|
|
24
|
-
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",
|
|
25
34
|
}
|
|
26
35
|
|
|
27
|
-
#@kekik_cache(ttl=60*60)
|
|
28
36
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
29
|
-
istek = await self.httpx.get(url)
|
|
30
|
-
secici = Selector(istek.text)
|
|
31
|
-
|
|
32
37
|
ana_sayfa = []
|
|
33
38
|
|
|
34
|
-
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", [])
|
|
35
43
|
ana_sayfa.extend([
|
|
36
44
|
MainPageResult(
|
|
37
45
|
category = category,
|
|
38
|
-
title = veri.
|
|
39
|
-
url = self.fix_url(veri.
|
|
40
|
-
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")),
|
|
41
49
|
)
|
|
42
|
-
for veri in
|
|
50
|
+
for veri in veriler
|
|
43
51
|
])
|
|
44
52
|
else:
|
|
53
|
+
istek = await self.httpx.get(url.replace("SAYFA", str(page)))
|
|
54
|
+
secici = Selector(istek.text)
|
|
55
|
+
|
|
45
56
|
for veri in secici.css("div.tab-content > div.grid a"):
|
|
46
57
|
name = veri.css("h2::text").get()
|
|
47
58
|
ep_name = veri.xpath("normalize-space(//div[contains(@class, 'opacity-80')])").get()
|
|
@@ -88,7 +99,6 @@ class Dizilla(PluginBase):
|
|
|
88
99
|
# JSON decode
|
|
89
100
|
return loads(decrypted.decode("utf-8"))
|
|
90
101
|
|
|
91
|
-
#@kekik_cache(ttl=60*60)
|
|
92
102
|
async def search(self, query: str) -> list[SearchResult]:
|
|
93
103
|
arama_istek = await self.httpx.post(f"{self.main_url}/api/bg/searchcontent?searchterm={query}")
|
|
94
104
|
decrypted = await self.decrypt_response(arama_istek.json().get("response"))
|
|
@@ -103,7 +113,6 @@ class Dizilla(PluginBase):
|
|
|
103
113
|
for veri in arama_veri
|
|
104
114
|
]
|
|
105
115
|
|
|
106
|
-
#@kekik_cache(ttl=60*60)
|
|
107
116
|
async def url_base_degis(self, eski_url:str, yeni_base:str) -> str:
|
|
108
117
|
parsed_url = urlparse(eski_url)
|
|
109
118
|
parsed_yeni_base = urlparse(yeni_base)
|
|
@@ -114,22 +123,25 @@ class Dizilla(PluginBase):
|
|
|
114
123
|
|
|
115
124
|
return urlunparse(yeni_url)
|
|
116
125
|
|
|
117
|
-
#@kekik_cache(ttl=60*60)
|
|
118
126
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
119
127
|
istek = await self.httpx.get(url)
|
|
120
128
|
secici = Selector(istek.text)
|
|
121
129
|
veri = loads(secici.xpath("//script[@type='application/ld+json']/text()").getall()[-1])
|
|
122
130
|
|
|
123
|
-
title
|
|
131
|
+
title = veri.get("name")
|
|
124
132
|
if alt_title := veri.get("alternateName"):
|
|
125
133
|
title += f" - ({alt_title})"
|
|
126
134
|
|
|
127
135
|
poster = self.fix_url(veri.get("image"))
|
|
128
136
|
description = veri.get("description")
|
|
129
137
|
year = veri.get("datePublished").split("-")[0]
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
138
|
+
|
|
139
|
+
# Tags extraction from page content (h3 tag)
|
|
140
|
+
tags_raw = secici.css("h3.text-white.opacity-60::text").get()
|
|
141
|
+
tags = [t.strip() for t in tags_raw.split(",")] if tags_raw else []
|
|
142
|
+
|
|
143
|
+
rating = veri.get("aggregateRating", {}).get("ratingValue")
|
|
144
|
+
actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
|
|
133
145
|
|
|
134
146
|
bolumler = []
|
|
135
147
|
sezonlar = veri.get("containsSeason") if isinstance(veri.get("containsSeason"), list) else [veri.get("containsSeason")]
|
|
@@ -158,7 +170,6 @@ class Dizilla(PluginBase):
|
|
|
158
170
|
actors = actors
|
|
159
171
|
)
|
|
160
172
|
|
|
161
|
-
#@kekik_cache(ttl=15*60)
|
|
162
173
|
async def load_links(self, url: str) -> list[dict]:
|
|
163
174
|
istek = await self.httpx.get(url)
|
|
164
175
|
secici = Selector(istek.text)
|
|
@@ -181,4 +192,4 @@ class Dizilla(PluginBase):
|
|
|
181
192
|
"name" : f"{extractor.name if extractor else 'Main Player'} | {result.get('language_name')}",
|
|
182
193
|
})
|
|
183
194
|
|
|
184
|
-
return links
|
|
195
|
+
return links
|
|
@@ -8,7 +8,7 @@ class FilmBip(PluginBase):
|
|
|
8
8
|
language = "tr"
|
|
9
9
|
main_url = "https://filmbip.com"
|
|
10
10
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
11
|
-
description = "
|
|
11
|
+
description = "FilmBip adlı film sitemizde Full HD film izle. Yerli ve yabancı filmleri Türkçe dublaj veya altyazılı şekilde 1080p yüksek kalite film izle"
|
|
12
12
|
|
|
13
13
|
main_page = {
|
|
14
14
|
f"{main_url}/filmler/SAYFA" : "Yeni Filmler",
|
|
@@ -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
|
|
@@ -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",
|
|
@@ -32,9 +31,8 @@ class HDFilmCehennemi(PluginBase):
|
|
|
32
31
|
f"{main_url}/tur/romantik-filmleri-izle-1" : "Romantik Filmleri"
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
#@kekik_cache(ttl=60*60)
|
|
36
34
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
37
|
-
istek = await self.
|
|
35
|
+
istek = await self.httpx.get(f"{url}", follow_redirects=True)
|
|
38
36
|
secici = Selector(istek.text)
|
|
39
37
|
|
|
40
38
|
return [
|
|
@@ -47,9 +45,8 @@ class HDFilmCehennemi(PluginBase):
|
|
|
47
45
|
for veri in secici.css("div.section-content a.poster")
|
|
48
46
|
]
|
|
49
47
|
|
|
50
|
-
#@kekik_cache(ttl=60*60)
|
|
51
48
|
async def search(self, query: str) -> list[SearchResult]:
|
|
52
|
-
istek = await self.
|
|
49
|
+
istek = await self.httpx.get(
|
|
53
50
|
url = f"{self.main_url}/search/?q={query}",
|
|
54
51
|
headers = {
|
|
55
52
|
"Referer" : f"{self.main_url}/",
|
|
@@ -76,9 +73,8 @@ class HDFilmCehennemi(PluginBase):
|
|
|
76
73
|
|
|
77
74
|
return results
|
|
78
75
|
|
|
79
|
-
#@kekik_cache(ttl=60*60)
|
|
80
76
|
async def load_item(self, url: str) -> MovieInfo:
|
|
81
|
-
istek = await self.
|
|
77
|
+
istek = await self.httpx.get(url, headers = {"Referer": f"{self.main_url}/"})
|
|
82
78
|
secici = Selector(istek.text)
|
|
83
79
|
|
|
84
80
|
title = secici.css("h1.section-title::text").get().strip()
|
|
@@ -111,11 +107,10 @@ class HDFilmCehennemi(PluginBase):
|
|
|
111
107
|
def generate_random_cookie(self):
|
|
112
108
|
return "".join(random.choices(string.ascii_letters + string.digits, k=16))
|
|
113
109
|
|
|
114
|
-
#@kekik_cache(ttl=15*60)
|
|
115
110
|
async def cehennempass(self, video_id: str) -> list[dict]:
|
|
116
111
|
results = []
|
|
117
112
|
|
|
118
|
-
istek = await self.
|
|
113
|
+
istek = await self.httpx.post(
|
|
119
114
|
url = "https://cehennempass.pw/process_quality_selection.php",
|
|
120
115
|
headers = {
|
|
121
116
|
"Referer" : f"https://cehennempass.pw/download/{video_id}",
|
|
@@ -132,7 +127,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
132
127
|
"referer" : f"https://cehennempass.pw/download/{video_id}"
|
|
133
128
|
})
|
|
134
129
|
|
|
135
|
-
istek = await self.
|
|
130
|
+
istek = await self.httpx.post(
|
|
136
131
|
url = "https://cehennempass.pw/process_quality_selection.php",
|
|
137
132
|
headers = {
|
|
138
133
|
"Referer" : f"https://cehennempass.pw/download/{video_id}",
|
|
@@ -151,10 +146,9 @@ class HDFilmCehennemi(PluginBase):
|
|
|
151
146
|
|
|
152
147
|
return results
|
|
153
148
|
|
|
154
|
-
#@kekik_cache(ttl=15*60)
|
|
155
149
|
async def invoke_local_source(self, iframe: str, source: str, url: str):
|
|
156
|
-
self.
|
|
157
|
-
istek = await self.
|
|
150
|
+
self.httpx.headers.update({"Referer": f"{self.main_url}/"})
|
|
151
|
+
istek = await self.httpx.get(iframe)
|
|
158
152
|
|
|
159
153
|
try:
|
|
160
154
|
eval_func = re.compile(r'\s*(eval\(function[\s\S].*)\s*').findall(istek.text)[0]
|
|
@@ -182,9 +176,8 @@ class HDFilmCehennemi(PluginBase):
|
|
|
182
176
|
"subtitles" : subtitles
|
|
183
177
|
}]
|
|
184
178
|
|
|
185
|
-
#@kekik_cache(ttl=15*60)
|
|
186
179
|
async def load_links(self, url: str) -> list[dict]:
|
|
187
|
-
istek = await self.
|
|
180
|
+
istek = await self.httpx.get(url)
|
|
188
181
|
secici = Selector(istek.text)
|
|
189
182
|
|
|
190
183
|
results = []
|
|
@@ -195,7 +188,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
195
188
|
source = f"{link.css('::text').get().replace('(HDrip Xbet)', '').strip()} {lang_code}"
|
|
196
189
|
video_id = link.css("::attr(data-video)").get()
|
|
197
190
|
|
|
198
|
-
api_get = await self.
|
|
191
|
+
api_get = await self.httpx.get(
|
|
199
192
|
url = f"{self.main_url}/video/{video_id}/",
|
|
200
193
|
headers = {
|
|
201
194
|
"Content-Type" : "application/json",
|
|
@@ -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)
|