KekikStream 1.7.3__tar.gz → 1.7.5__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.7.3 → kekikstream-1.7.5}/KekikStream/Core/Extractor/ExtractorBase.py +23 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Plugin/PluginBase.py +29 -8
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/CloseLoad.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/ContentX.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/DzenRu.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/ExPlay.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/FirePlayer.py +1 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/HDPlayerSystem.py +1 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/JetTv.py +4 -5
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/MailRu.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/MixPlayHD.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/MixTiger.py +1 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/Odnoklassniki.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/PeaceMakerst.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/PixelDrain.py +1 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/PlayerFilmIzle.py +6 -7
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/RapidVid.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/SetPlay.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/SetPrime.py +1 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/SibNet.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/Sobreatsesuyp.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/TRsTX.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/TauVideo.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/TurboImgz.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/TurkeyPlayer.py +5 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/VidHide.py +6 -7
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/VidMoly.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/VidMoxy.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/VidPapi.py +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/VideoSeyred.py +3 -3
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/YildizKisaFilm.py +1 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/DiziBox.py +15 -15
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/DiziPal.py +11 -11
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/DiziYou.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/Dizilla.py +5 -5
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/FilmBip.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/FilmMakinesi.py +3 -3
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/FilmModu.py +6 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/FullHDFilm.py +7 -7
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/FullHDFilmizlesene.py +3 -3
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/HDFilmCehennemi.py +3 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/JetFilmizle.py +6 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/KultFilmler.py +6 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/RecTV.py +6 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/RoketDizi.py +6 -3
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/SelcukFlix.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/SezonlukDizi.py +8 -8
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/SineWix.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/Sinefy.py +6 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/SinemaCX.py +9 -9
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/Sinezy.py +4 -4
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/SuperFilmGeldi.py +5 -5
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Plugins/UgurFilm.py +6 -6
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/requirements.txt +2 -2
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream.egg-info/PKG-INFO +2 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream.egg-info/SOURCES.txt +0 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream.egg-info/requires.txt +1 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/PKG-INFO +2 -1
- {kekikstream-1.7.3 → kekikstream-1.7.5}/setup.py +2 -1
- kekikstream-1.7.3/KekikStream/Extractors/VidStack.py +0 -75
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/__init__.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream/__main__.py +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/LICENSE +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/MANIFEST.in +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/README.md +0 -0
- {kekikstream-1.7.3 → kekikstream-1.7.5}/setup.cfg +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from curl_cffi import AsyncSession
|
|
5
5
|
from cloudscraper import CloudScraper
|
|
6
|
+
from httpx import AsyncClient
|
|
6
7
|
from typing import Optional
|
|
7
8
|
from .ExtractorModels import ExtractResult
|
|
8
9
|
from urllib.parse import urljoin
|
|
@@ -11,13 +12,27 @@ class ExtractorBase(ABC):
|
|
|
11
12
|
# Çıkarıcının temel özellikleri
|
|
12
13
|
name = "Extractor"
|
|
13
14
|
main_url = ""
|
|
15
|
+
requires_cffi = False
|
|
14
16
|
|
|
15
17
|
def __init__(self):
|
|
16
|
-
#
|
|
17
|
-
self.cffi = AsyncSession(impersonate="firefox135")
|
|
18
|
+
# cloudscraper - for bypassing Cloudflare
|
|
18
19
|
self.cloudscraper = CloudScraper()
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
|
|
21
|
+
# httpx - lightweight and safe for most HTTP requests
|
|
22
|
+
self.httpx = AsyncClient(
|
|
23
|
+
timeout = 3,
|
|
24
|
+
follow_redirects = True,
|
|
25
|
+
)
|
|
26
|
+
self.httpx.headers.update(self.cloudscraper.headers)
|
|
27
|
+
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
28
|
+
|
|
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"})
|
|
21
36
|
|
|
22
37
|
def can_handle_url(self, url: str) -> bool:
|
|
23
38
|
# URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
|
|
@@ -29,8 +44,10 @@ class ExtractorBase(ABC):
|
|
|
29
44
|
pass
|
|
30
45
|
|
|
31
46
|
async def close(self):
|
|
32
|
-
|
|
33
|
-
await self.
|
|
47
|
+
"""Close both HTTP clients if they exist."""
|
|
48
|
+
await self.httpx.aclose()
|
|
49
|
+
if self.cffi:
|
|
50
|
+
await self.cffi.close()
|
|
34
51
|
|
|
35
52
|
def fix_url(self, url: str) -> str:
|
|
36
53
|
# Eksik URL'leri düzelt ve tam URL formatına çevir
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from curl_cffi import AsyncSession
|
|
5
5
|
from cloudscraper import CloudScraper
|
|
6
|
+
from httpx import AsyncClient
|
|
6
7
|
from .PluginModels import MainPageResult, SearchResult, MovieInfo
|
|
7
8
|
from ..Media.MediaHandler import MediaHandler
|
|
8
9
|
from ..Extractor.ExtractorManager import ExtractorManager
|
|
@@ -16,6 +17,8 @@ class PluginBase(ABC):
|
|
|
16
17
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
17
18
|
description = "No description provided."
|
|
18
19
|
|
|
20
|
+
requires_cffi = False
|
|
21
|
+
|
|
19
22
|
main_page = {}
|
|
20
23
|
|
|
21
24
|
async def url_update(self, new_url: str):
|
|
@@ -24,17 +27,32 @@ class PluginBase(ABC):
|
|
|
24
27
|
self.main_url = new_url
|
|
25
28
|
|
|
26
29
|
def __init__(self):
|
|
27
|
-
|
|
30
|
+
# cloudscraper - for bypassing Cloudflare
|
|
28
31
|
self.cloudscraper = CloudScraper()
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
|
|
33
|
+
# httpx - lightweight and safe for most HTTP requests
|
|
34
|
+
self.httpx = AsyncClient(
|
|
35
|
+
timeout = 3,
|
|
36
|
+
follow_redirects = True,
|
|
37
|
+
)
|
|
38
|
+
self.httpx.headers.update(self.cloudscraper.headers)
|
|
39
|
+
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
40
|
+
|
|
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
|
+
|
|
31
49
|
self.media_handler = MediaHandler()
|
|
32
50
|
self.ex_manager = ExtractorManager()
|
|
33
51
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
52
|
+
@abstractmethod
|
|
53
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
54
|
+
"""Ana sayfadaki popüler içerikleri döndürür."""
|
|
55
|
+
pass
|
|
38
56
|
|
|
39
57
|
@abstractmethod
|
|
40
58
|
async def search(self, query: str) -> list[SearchResult]:
|
|
@@ -72,7 +90,10 @@ class PluginBase(ABC):
|
|
|
72
90
|
pass
|
|
73
91
|
|
|
74
92
|
async def close(self):
|
|
75
|
-
|
|
93
|
+
"""Close both HTTP clients if they exist."""
|
|
94
|
+
await self.httpx.aclose()
|
|
95
|
+
if self.cffi:
|
|
96
|
+
await self.cffi.close()
|
|
76
97
|
|
|
77
98
|
def fix_url(self, url: str) -> str:
|
|
78
99
|
if not url:
|
|
@@ -10,9 +10,9 @@ class CloseLoadExtractor(ExtractorBase):
|
|
|
10
10
|
|
|
11
11
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
12
12
|
if referer:
|
|
13
|
-
self.
|
|
13
|
+
self.httpx.headers.update({"Referer": referer})
|
|
14
14
|
|
|
15
|
-
istek = await self.
|
|
15
|
+
istek = await self.httpx.get(url)
|
|
16
16
|
istek.raise_for_status()
|
|
17
17
|
|
|
18
18
|
eval_func = re.compile(r'\s*(eval\(function[\s\S].*)\s*').findall(istek.text)[0]
|
|
@@ -9,9 +9,9 @@ class ContentX(ExtractorBase):
|
|
|
9
9
|
|
|
10
10
|
async def extract(self, url, referer=None) -> list[ExtractResult]:
|
|
11
11
|
if referer:
|
|
12
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
13
13
|
|
|
14
|
-
istek = await self.
|
|
14
|
+
istek = await self.httpx.get(url)
|
|
15
15
|
istek.raise_for_status()
|
|
16
16
|
i_source = istek.text
|
|
17
17
|
|
|
@@ -39,7 +39,7 @@ class ContentX(ExtractorBase):
|
|
|
39
39
|
)
|
|
40
40
|
)
|
|
41
41
|
|
|
42
|
-
vid_source_request = await self.
|
|
42
|
+
vid_source_request = await self.httpx.get(f"{self.main_url}/source2.php?v={i_extract_value}", headers={"Referer": referer or self.main_url})
|
|
43
43
|
vid_source_request.raise_for_status()
|
|
44
44
|
|
|
45
45
|
vid_source = vid_source_request.text
|
|
@@ -60,7 +60,7 @@ class ContentX(ExtractorBase):
|
|
|
60
60
|
|
|
61
61
|
if i_dublaj := re.search(r',\"([^"]+)\",\"Türkçe"', i_source):
|
|
62
62
|
dublaj_value = i_dublaj[1]
|
|
63
|
-
dublaj_source_request = await self.
|
|
63
|
+
dublaj_source_request = await self.httpx.get(f"{self.main_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or self.main_url})
|
|
64
64
|
dublaj_source_request.raise_for_status()
|
|
65
65
|
|
|
66
66
|
dublaj_source = dublaj_source_request.text
|
|
@@ -12,9 +12,9 @@ class DzenRu(ExtractorBase):
|
|
|
12
12
|
video_url = f"{self.main_url}/embed/{video_key}"
|
|
13
13
|
|
|
14
14
|
if referer:
|
|
15
|
-
self.
|
|
15
|
+
self.httpx.headers.update({"Referer": referer})
|
|
16
16
|
|
|
17
|
-
istek = await self.
|
|
17
|
+
istek = await self.httpx.get(video_url)
|
|
18
18
|
istek.raise_for_status()
|
|
19
19
|
|
|
20
20
|
# okcdn.ru linklerini bul
|
|
@@ -18,9 +18,9 @@ class ExPlay(ExtractorBase):
|
|
|
18
18
|
clean_url = url.split("?partKey=")[0]
|
|
19
19
|
|
|
20
20
|
if referer:
|
|
21
|
-
self.
|
|
21
|
+
self.httpx.headers.update({"Referer": referer})
|
|
22
22
|
|
|
23
|
-
istek = await self.
|
|
23
|
+
istek = await self.httpx.get(clean_url)
|
|
24
24
|
istek.raise_for_status()
|
|
25
25
|
|
|
26
26
|
# videoUrl çıkar
|
|
@@ -16,7 +16,7 @@ class HDPlayerSystem(ExtractorBase):
|
|
|
16
16
|
|
|
17
17
|
post_url = f"{self.main_url}/player/index.php?data={vid_id}&do=getVideo"
|
|
18
18
|
|
|
19
|
-
response = await self.
|
|
19
|
+
response = await self.httpx.post(
|
|
20
20
|
url = post_url,
|
|
21
21
|
data = {"hash": vid_id, "r": ext_ref},
|
|
22
22
|
headers = {
|
|
@@ -4,12 +4,11 @@ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
|
|
4
4
|
import re, json
|
|
5
5
|
|
|
6
6
|
class JetTv(ExtractorBase):
|
|
7
|
-
name
|
|
8
|
-
main_url
|
|
9
|
-
requires_referer = False
|
|
7
|
+
name = "JetTv"
|
|
8
|
+
main_url = "https://jetv.xyz"
|
|
10
9
|
|
|
11
10
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
12
|
-
istek = await self.
|
|
11
|
+
istek = await self.httpx.get(url)
|
|
13
12
|
document = istek.text
|
|
14
13
|
|
|
15
14
|
# 1. Yöntem: API üzerinden alma
|
|
@@ -21,7 +20,7 @@ class JetTv(ExtractorBase):
|
|
|
21
20
|
api_url = f"https://jetv.xyz/apollo/get_video.php?id={vid_id}"
|
|
22
21
|
try:
|
|
23
22
|
# Referer olarak video sayfasının kendisi gönderilmeli
|
|
24
|
-
api_resp = await self.
|
|
23
|
+
api_resp = await self.httpx.get(api_url, headers={"Referer": url})
|
|
25
24
|
api_json = api_resp.json()
|
|
26
25
|
|
|
27
26
|
if api_json.get("success"):
|
|
@@ -11,9 +11,9 @@ class MailRuExtractor(ExtractorBase):
|
|
|
11
11
|
video_meta_url = f"{self.main_url}/+/video/meta/{vid_id}"
|
|
12
12
|
|
|
13
13
|
if referer:
|
|
14
|
-
self.
|
|
14
|
+
self.httpx.headers.update({"Referer": referer})
|
|
15
15
|
|
|
16
|
-
istek = await self.
|
|
16
|
+
istek = await self.httpx.get(video_meta_url)
|
|
17
17
|
istek.raise_for_status()
|
|
18
18
|
|
|
19
19
|
video_key = istek.cookies.get("video_key")
|
|
@@ -10,9 +10,9 @@ class MixPlayHD(ExtractorBase):
|
|
|
10
10
|
|
|
11
11
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
12
12
|
if referer:
|
|
13
|
-
self.
|
|
13
|
+
self.httpx.headers.update({"Referer": referer})
|
|
14
14
|
|
|
15
|
-
istek = await self.
|
|
15
|
+
istek = await self.httpx.get(url)
|
|
16
16
|
istek.raise_for_status()
|
|
17
17
|
|
|
18
18
|
be_player_match = re.search(r"bePlayer\('([^']+)',\s*'(\{[^\}]+\})'\);", istek.text)
|
|
@@ -11,7 +11,7 @@ class MixTiger(ExtractorBase):
|
|
|
11
11
|
post_url = f"{url}?do=getVideo"
|
|
12
12
|
vid_id = url.split("video/")[-1] if "video/" in url else ""
|
|
13
13
|
|
|
14
|
-
response = await self.
|
|
14
|
+
response = await self.httpx.post(
|
|
15
15
|
url = post_url,
|
|
16
16
|
data = {"hash": vid_id, "r": ext_ref, "s": ""},
|
|
17
17
|
headers = {
|
|
@@ -20,7 +20,7 @@ class Odnoklassniki(ExtractorBase):
|
|
|
20
20
|
"Origin" : self.main_url,
|
|
21
21
|
"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0",
|
|
22
22
|
}
|
|
23
|
-
self.
|
|
23
|
+
self.httpx.headers.update(headers)
|
|
24
24
|
|
|
25
25
|
try:
|
|
26
26
|
istek = await self.fetch_with_redirects(url)
|
|
@@ -93,7 +93,7 @@ class Odnoklassniki(ExtractorBase):
|
|
|
93
93
|
"""Yönlendirmeleri takip eden bir fonksiyon"""
|
|
94
94
|
redirects = 0
|
|
95
95
|
while redirects < max_redirects:
|
|
96
|
-
istek = await self.
|
|
96
|
+
istek = await self.httpx.get(url, allow_redirects=False)
|
|
97
97
|
|
|
98
98
|
if istek.status_code not in [301, 302]:
|
|
99
99
|
break # Yönlendirme yoksa çık
|
|
@@ -9,14 +9,14 @@ class PeaceMakerst(ExtractorBase):
|
|
|
9
9
|
|
|
10
10
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
11
11
|
if referer:
|
|
12
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
13
13
|
|
|
14
|
-
self.
|
|
14
|
+
self.httpx.headers.update({
|
|
15
15
|
"Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",
|
|
16
16
|
"X-Requested-With" : "XMLHttpRequest"
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
-
response = await self.
|
|
19
|
+
response = await self.httpx.post(
|
|
20
20
|
url = f"{url}?do=getVideo",
|
|
21
21
|
data = {
|
|
22
22
|
"hash" : url.split("video/")[-1],
|
|
@@ -33,7 +33,7 @@ class PeaceMakerst(ExtractorBase):
|
|
|
33
33
|
teve2_id = re.search(r"teve2\.com\.tr\\\/embed\\\/(\d+)", response_text)[1]
|
|
34
34
|
teve2_url = f"https://www.teve2.com.tr/action/media/{teve2_id}"
|
|
35
35
|
|
|
36
|
-
teve2_response = await self.
|
|
36
|
+
teve2_response = await self.httpx.get(teve2_url, headers={"Referer": f"https://www.teve2.com.tr/embed/{teve2_id}"})
|
|
37
37
|
teve2_response.raise_for_status()
|
|
38
38
|
teve2_json = teve2_response.json()
|
|
39
39
|
|
|
@@ -9,7 +9,7 @@ class PixelDrain(ExtractorBase):
|
|
|
9
9
|
|
|
10
10
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
11
11
|
if referer:
|
|
12
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
13
13
|
|
|
14
14
|
pixel_id_match = re.search(r"/u/([^/?]+)|([^\/]+)(?=\?download)", url)
|
|
15
15
|
if not pixel_id_match:
|
|
@@ -4,16 +4,15 @@ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
|
|
4
4
|
import re, json
|
|
5
5
|
|
|
6
6
|
class PlayerFilmIzle(ExtractorBase):
|
|
7
|
-
name
|
|
8
|
-
main_url
|
|
9
|
-
requires_referer = True
|
|
7
|
+
name = "PlayerFilmIzle"
|
|
8
|
+
main_url = "https://player.filmizle.in"
|
|
10
9
|
|
|
11
10
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
12
11
|
# Kotlin tarafında referer mainUrl olarak zorlanmış
|
|
13
12
|
ext_ref = self.main_url
|
|
14
|
-
self.
|
|
13
|
+
self.httpx.headers.update({"Referer": ext_ref})
|
|
15
14
|
|
|
16
|
-
istek = await self.
|
|
15
|
+
istek = await self.httpx.get(url)
|
|
17
16
|
video_req = istek.text
|
|
18
17
|
|
|
19
18
|
subtitles = []
|
|
@@ -44,7 +43,7 @@ class PlayerFilmIzle(ExtractorBase):
|
|
|
44
43
|
# Kotlin'de post data: "hash" -> data, "r" -> ""
|
|
45
44
|
post_data = {"hash": data_val, "r": ""}
|
|
46
45
|
|
|
47
|
-
response = await self.
|
|
46
|
+
response = await self.httpx.post(url_post, data=post_data, headers=post_headers)
|
|
48
47
|
get_url = response.text.replace("\\", "")
|
|
49
48
|
|
|
50
49
|
m3u8_url = ""
|
|
@@ -58,6 +57,6 @@ class PlayerFilmIzle(ExtractorBase):
|
|
|
58
57
|
name = self.name,
|
|
59
58
|
url = m3u8_url,
|
|
60
59
|
referer = ext_ref,
|
|
61
|
-
headers = dict(self.
|
|
60
|
+
headers = dict(self.httpx.headers),
|
|
62
61
|
subtitles = subtitles
|
|
63
62
|
)
|
|
@@ -10,9 +10,9 @@ class RapidVid(ExtractorBase):
|
|
|
10
10
|
|
|
11
11
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
12
12
|
if referer:
|
|
13
|
-
self.
|
|
13
|
+
self.httpx.headers.update({"Referer": referer})
|
|
14
14
|
|
|
15
|
-
istek = await self.
|
|
15
|
+
istek = await self.httpx.get(url)
|
|
16
16
|
istek.raise_for_status()
|
|
17
17
|
|
|
18
18
|
subtitles = []
|
|
@@ -11,9 +11,9 @@ class SetPlay(ExtractorBase):
|
|
|
11
11
|
ext_ref = referer or ""
|
|
12
12
|
|
|
13
13
|
if referer:
|
|
14
|
-
self.
|
|
14
|
+
self.httpx.headers.update({"Referer": referer})
|
|
15
15
|
|
|
16
|
-
istek = await self.
|
|
16
|
+
istek = await self.httpx.get(url)
|
|
17
17
|
istek.raise_for_status()
|
|
18
18
|
|
|
19
19
|
# videoUrl çıkar
|
|
@@ -18,7 +18,7 @@ class SetPrime(ExtractorBase):
|
|
|
18
18
|
# POST URL: embed?i= -> embed/get?i=
|
|
19
19
|
post_url = clean_url.replace("embed?i=", "embed/get?i=")
|
|
20
20
|
|
|
21
|
-
response = await self.
|
|
21
|
+
response = await self.httpx.post(
|
|
22
22
|
url = post_url,
|
|
23
23
|
headers = {"Referer": clean_url}
|
|
24
24
|
)
|
|
@@ -9,9 +9,9 @@ class SibNet(ExtractorBase):
|
|
|
9
9
|
|
|
10
10
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
11
11
|
if referer:
|
|
12
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
13
13
|
|
|
14
|
-
response = await self.
|
|
14
|
+
response = await self.httpx.get(url)
|
|
15
15
|
response.raise_for_status()
|
|
16
16
|
|
|
17
17
|
match = re.search(r'player\.src\(\[\{src: \"([^\"]+)\"', response.text)
|
|
@@ -9,9 +9,9 @@ class Sobreatsesuyp(ExtractorBase):
|
|
|
9
9
|
|
|
10
10
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
11
11
|
if referer:
|
|
12
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
13
13
|
|
|
14
|
-
istek = await self.
|
|
14
|
+
istek = await self.httpx.get(url)
|
|
15
15
|
istek.raise_for_status()
|
|
16
16
|
|
|
17
17
|
file_match = re.search(r'file\":\"([^\"]+)', istek.text)
|
|
@@ -21,7 +21,7 @@ class Sobreatsesuyp(ExtractorBase):
|
|
|
21
21
|
file_path = file_match[1].replace("\\", "")
|
|
22
22
|
post_link = f"{self.main_url}/{file_path}"
|
|
23
23
|
|
|
24
|
-
post_istek = await self.
|
|
24
|
+
post_istek = await self.httpx.post(post_link)
|
|
25
25
|
post_istek.raise_for_status()
|
|
26
26
|
|
|
27
27
|
try:
|
|
@@ -41,7 +41,7 @@ class Sobreatsesuyp(ExtractorBase):
|
|
|
41
41
|
continue
|
|
42
42
|
|
|
43
43
|
playlist_url = f"{self.main_url}/playlist/{file.lstrip('/')}.txt"
|
|
44
|
-
playlist_request = await self.
|
|
44
|
+
playlist_request = await self.httpx.post(playlist_url, headers={"Referer": referer or self.main_url})
|
|
45
45
|
playlist_request.raise_for_status()
|
|
46
46
|
|
|
47
47
|
all_results.append(
|
|
@@ -9,9 +9,9 @@ class TRsTX(ExtractorBase):
|
|
|
9
9
|
|
|
10
10
|
async def extract(self, url, referer=None) -> list[ExtractResult]:
|
|
11
11
|
if referer:
|
|
12
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
13
13
|
|
|
14
|
-
istek = await self.
|
|
14
|
+
istek = await self.httpx.get(url)
|
|
15
15
|
istek.raise_for_status()
|
|
16
16
|
|
|
17
17
|
file_match = re.search(r'file\":\"([^\"]+)', istek.text)
|
|
@@ -21,7 +21,7 @@ class TRsTX(ExtractorBase):
|
|
|
21
21
|
file_path = file_match[1].replace("\\", "")
|
|
22
22
|
post_link = f"{self.main_url}/{file_path}"
|
|
23
23
|
|
|
24
|
-
post_istek = await self.
|
|
24
|
+
post_istek = await self.httpx.post(post_link)
|
|
25
25
|
post_istek.raise_for_status()
|
|
26
26
|
|
|
27
27
|
try:
|
|
@@ -42,7 +42,7 @@ class TRsTX(ExtractorBase):
|
|
|
42
42
|
continue
|
|
43
43
|
|
|
44
44
|
playlist_url = f"{self.main_url}/playlist/{file.lstrip('/')}.txt"
|
|
45
|
-
playlist_request = await self.
|
|
45
|
+
playlist_request = await self.httpx.post(playlist_url, headers={"Referer": referer or self.main_url})
|
|
46
46
|
playlist_request.raise_for_status()
|
|
47
47
|
|
|
48
48
|
video_data = playlist_request.text
|
|
@@ -8,12 +8,12 @@ class TauVideo(ExtractorBase):
|
|
|
8
8
|
|
|
9
9
|
async def extract(self, url, referer=None) -> list[ExtractResult]:
|
|
10
10
|
if referer:
|
|
11
|
-
self.
|
|
11
|
+
self.httpx.headers.update({"Referer": referer})
|
|
12
12
|
|
|
13
13
|
video_key = url.split("/")[-1]
|
|
14
14
|
api_url = f"{self.main_url}/api/video/{video_key}"
|
|
15
15
|
|
|
16
|
-
response = await self.
|
|
16
|
+
response = await self.httpx.get(api_url)
|
|
17
17
|
response.raise_for_status()
|
|
18
18
|
|
|
19
19
|
api_data = response.json()
|
|
@@ -9,9 +9,9 @@ class TurboImgz(ExtractorBase):
|
|
|
9
9
|
|
|
10
10
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
11
11
|
if referer:
|
|
12
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
13
13
|
|
|
14
|
-
istek = await self.
|
|
14
|
+
istek = await self.httpx.get(url)
|
|
15
15
|
istek.raise_for_status()
|
|
16
16
|
|
|
17
17
|
if video_match := re.search(r'file: "(.*)",', istek.text):
|
|
@@ -4,15 +4,14 @@ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
|
|
4
4
|
import re, json
|
|
5
5
|
|
|
6
6
|
class TurkeyPlayer(ExtractorBase):
|
|
7
|
-
name
|
|
8
|
-
main_url
|
|
9
|
-
requires_referer = True
|
|
7
|
+
name = "TurkeyPlayer"
|
|
8
|
+
main_url = "https://watch.turkeyplayer.com/"
|
|
10
9
|
|
|
11
10
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
12
11
|
if referer:
|
|
13
|
-
self.
|
|
12
|
+
self.httpx.headers.update({"Referer": referer})
|
|
14
13
|
|
|
15
|
-
istek = await self.
|
|
14
|
+
istek = await self.httpx.get(url)
|
|
16
15
|
page_content = istek.text
|
|
17
16
|
|
|
18
17
|
video_json_match = re.search(r'var\s+video\s*=\s*(\{.*?\});', page_content, re.DOTALL)
|
|
@@ -30,6 +29,6 @@ class TurkeyPlayer(ExtractorBase):
|
|
|
30
29
|
name = self.name,
|
|
31
30
|
url = master_url,
|
|
32
31
|
referer = referer or url,
|
|
33
|
-
headers = dict(self.
|
|
32
|
+
headers = dict(self.httpx.headers),
|
|
34
33
|
subtitles = []
|
|
35
34
|
)
|
|
@@ -6,9 +6,8 @@ from parsel import Selector
|
|
|
6
6
|
import re
|
|
7
7
|
|
|
8
8
|
class VidHide(ExtractorBase):
|
|
9
|
-
name
|
|
10
|
-
main_url
|
|
11
|
-
requires_referer = True
|
|
9
|
+
name = "VidHide"
|
|
10
|
+
main_url = "https://vidhidepro.com"
|
|
12
11
|
|
|
13
12
|
def get_embed_url(self, url: str) -> str:
|
|
14
13
|
if "/d/" in url:
|
|
@@ -22,9 +21,9 @@ class VidHide(ExtractorBase):
|
|
|
22
21
|
|
|
23
22
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
24
23
|
if referer:
|
|
25
|
-
self.
|
|
24
|
+
self.httpx.headers.update({"Referer": referer})
|
|
26
25
|
|
|
27
|
-
self.
|
|
26
|
+
self.httpx.headers.update({
|
|
28
27
|
"Sec-Fetch-Dest" : "empty",
|
|
29
28
|
"Sec-Fetch-Mode" : "cors",
|
|
30
29
|
"Sec-Fetch-Site" : "cross-site",
|
|
@@ -32,7 +31,7 @@ class VidHide(ExtractorBase):
|
|
|
32
31
|
})
|
|
33
32
|
|
|
34
33
|
embed_url = self.get_embed_url(url)
|
|
35
|
-
istek = await self.
|
|
34
|
+
istek = await self.httpx.get(embed_url)
|
|
36
35
|
response = istek.text
|
|
37
36
|
|
|
38
37
|
script = None
|
|
@@ -68,6 +67,6 @@ class VidHide(ExtractorBase):
|
|
|
68
67
|
name = self.name,
|
|
69
68
|
url = self.fix_url(m3u8_url),
|
|
70
69
|
referer = f"{self.main_url}/",
|
|
71
|
-
headers = dict(self.
|
|
70
|
+
headers = dict(self.httpx.headers),
|
|
72
71
|
subtitles = []
|
|
73
72
|
)
|
|
@@ -11,9 +11,9 @@ class VidMoly(ExtractorBase):
|
|
|
11
11
|
|
|
12
12
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
13
13
|
if referer:
|
|
14
|
-
self.
|
|
14
|
+
self.httpx.headers.update({"Referer": referer})
|
|
15
15
|
|
|
16
|
-
self.
|
|
16
|
+
self.httpx.headers.update({
|
|
17
17
|
"Sec-Fetch-Dest" : "iframe",
|
|
18
18
|
})
|
|
19
19
|
|
|
@@ -21,10 +21,10 @@ class VidMoly(ExtractorBase):
|
|
|
21
21
|
self.main_url = self.main_url.replace(".me", ".net")
|
|
22
22
|
url = url.replace(".me", ".net")
|
|
23
23
|
|
|
24
|
-
response = await self.
|
|
24
|
+
response = await self.httpx.get(url)
|
|
25
25
|
if "Select number" in response.text:
|
|
26
26
|
secici = Selector(response.text)
|
|
27
|
-
response = await self.
|
|
27
|
+
response = await self.httpx.post(
|
|
28
28
|
url = url,
|
|
29
29
|
data = {
|
|
30
30
|
"op" : secici.css("input[name='op']::attr(value)").get(),
|
|
@@ -10,9 +10,9 @@ class VidMoxy(ExtractorBase):
|
|
|
10
10
|
|
|
11
11
|
async def extract(self, url, referer=None) -> ExtractResult:
|
|
12
12
|
if referer:
|
|
13
|
-
self.
|
|
13
|
+
self.httpx.headers.update({"Referer": referer})
|
|
14
14
|
|
|
15
|
-
istek = await self.
|
|
15
|
+
istek = await self.httpx.get(url)
|
|
16
16
|
istek.raise_for_status()
|
|
17
17
|
|
|
18
18
|
subtitles = []
|
|
@@ -27,7 +27,7 @@ class VidPapi(ExtractorBase):
|
|
|
27
27
|
|
|
28
28
|
subtitles = []
|
|
29
29
|
try:
|
|
30
|
-
sub_istek = await self.
|
|
30
|
+
sub_istek = await self.httpx.post(
|
|
31
31
|
url = sub_url,
|
|
32
32
|
headers = sub_headers,
|
|
33
33
|
data = {"hash": vid_id, "r": "https://kultfilmler.pro/"}
|
|
@@ -62,7 +62,7 @@ class VidPapi(ExtractorBase):
|
|
|
62
62
|
video_url = f"{self.main_url}/player/index.php?data={vid_id}&do=getVideo"
|
|
63
63
|
video_headers = sub_headers.copy()
|
|
64
64
|
|
|
65
|
-
response = await self.
|
|
65
|
+
response = await self.httpx.post(
|
|
66
66
|
url = video_url,
|
|
67
67
|
headers = video_headers,
|
|
68
68
|
data = {"hash": vid_id, "r": "https://kultfilmler.pro/"}
|