KekikStream 2.1.7__tar.gz → 2.1.8__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-2.1.8/KekikStream/Extractors/Filemoon.py +78 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/RapidVid.py +15 -5
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/VidHide.py +11 -2
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream.egg-info/SOURCES.txt +1 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/PKG-INFO +1 -1
- {kekikstream-2.1.7 → kekikstream-2.1.8}/setup.py +1 -1
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/DonilasPlay.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/VCTPlay.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/YTDLP.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/BelgeselX.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/SetFilmIzle.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/__init__.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/__main__.py +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream/requirements.txt +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/LICENSE +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/MANIFEST.in +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/README.md +0 -0
- {kekikstream-2.1.7 → kekikstream-2.1.8}/setup.cfg +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
|
4
|
+
from Kekik.Sifreleme import Packer
|
|
5
|
+
from parsel import Selector
|
|
6
|
+
import re
|
|
7
|
+
|
|
8
|
+
class Filemoon(ExtractorBase):
|
|
9
|
+
name = "Filemoon"
|
|
10
|
+
main_url = "https://filemoon.to"
|
|
11
|
+
|
|
12
|
+
# Filemoon'un farklı domainlerini destekle
|
|
13
|
+
supported_domains = [
|
|
14
|
+
"filemoon.to",
|
|
15
|
+
"filemoon.in",
|
|
16
|
+
"filemoon.sx",
|
|
17
|
+
"filemoon.nl",
|
|
18
|
+
"filemoon.com"
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
def can_handle_url(self, url: str) -> bool:
|
|
22
|
+
return any(domain in url for domain in self.supported_domains)
|
|
23
|
+
|
|
24
|
+
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
25
|
+
headers = {
|
|
26
|
+
"Referer" : url,
|
|
27
|
+
"Sec-Fetch-Dest" : "iframe",
|
|
28
|
+
"Sec-Fetch-Mode" : "navigate",
|
|
29
|
+
"Sec-Fetch-Site" : "cross-site",
|
|
30
|
+
}
|
|
31
|
+
self.httpx.headers.update(headers)
|
|
32
|
+
|
|
33
|
+
# İlk sayfayı al
|
|
34
|
+
istek = await self.httpx.get(url)
|
|
35
|
+
response = istek.text
|
|
36
|
+
secici = Selector(response)
|
|
37
|
+
|
|
38
|
+
# Eğer iframe varsa, iframe'e git
|
|
39
|
+
iframe_src = secici.css("iframe::attr(src)").get()
|
|
40
|
+
if iframe_src:
|
|
41
|
+
iframe_url = self.fix_url(iframe_src)
|
|
42
|
+
self.httpx.headers.update({
|
|
43
|
+
"Accept-Language" : "en-US,en;q=0.5",
|
|
44
|
+
"Sec-Fetch-Dest" : "iframe"
|
|
45
|
+
})
|
|
46
|
+
istek = await self.httpx.get(iframe_url)
|
|
47
|
+
response = istek.text
|
|
48
|
+
|
|
49
|
+
# Packed script'i bul ve unpack et
|
|
50
|
+
m3u8_url = None
|
|
51
|
+
|
|
52
|
+
if Packer.detect_packed(response):
|
|
53
|
+
try:
|
|
54
|
+
unpacked = Packer.unpack(response)
|
|
55
|
+
# sources:[{file:"..." pattern'ını ara
|
|
56
|
+
if match := re.search(r'sources:\s*\[\s*\{\s*file:\s*"([^"]+)"', unpacked):
|
|
57
|
+
m3u8_url = match.group(1)
|
|
58
|
+
elif match := re.search(r'file:\s*"([^"]*?\.m3u8[^"]*)"', unpacked):
|
|
59
|
+
m3u8_url = match.group(1)
|
|
60
|
+
except Exception:
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
# Fallback: Doğrudan response'ta ara
|
|
64
|
+
if not m3u8_url:
|
|
65
|
+
if match := re.search(r'sources:\s*\[\s*\{\s*file:\s*"([^"]+)"', response):
|
|
66
|
+
m3u8_url = match.group(1)
|
|
67
|
+
elif match := re.search(r'file:\s*"([^"]*?\.m3u8[^"]*)"', response):
|
|
68
|
+
m3u8_url = match.group(1)
|
|
69
|
+
|
|
70
|
+
if not m3u8_url:
|
|
71
|
+
raise ValueError(f"Filemoon: Video URL bulunamadı. {url}")
|
|
72
|
+
|
|
73
|
+
return ExtractResult(
|
|
74
|
+
name = self.name,
|
|
75
|
+
url = self.fix_url(m3u8_url),
|
|
76
|
+
referer = f"{self.main_url}/",
|
|
77
|
+
subtitles = []
|
|
78
|
+
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
|
4
|
-
from Kekik.Sifreleme import Packer, HexCodec
|
|
4
|
+
from Kekik.Sifreleme import Packer, HexCodec, StreamDecoder
|
|
5
5
|
import re, base64
|
|
6
6
|
|
|
7
7
|
class RapidVid(ExtractorBase):
|
|
@@ -39,15 +39,25 @@ class RapidVid(ExtractorBase):
|
|
|
39
39
|
subtitles.append(Subtitle(name=decoded_lang, url=sub_url.replace("\\", "")))
|
|
40
40
|
|
|
41
41
|
try:
|
|
42
|
+
decoded_url = None
|
|
43
|
+
|
|
44
|
+
# Method 1: file": "..." pattern (HexCodec)
|
|
42
45
|
if extracted_value := re.search(r'file": "(.*)",', istek.text):
|
|
43
46
|
escaped_hex = extracted_value[1]
|
|
44
47
|
decoded_url = HexCodec.decode(escaped_hex)
|
|
45
|
-
else:
|
|
46
|
-
av_encoded = re.search(r"av\('([^']+)'\)", istek.text)
|
|
47
|
-
if not av_encoded:
|
|
48
|
-
raise ValueError("AV encoding not found.")
|
|
49
48
|
|
|
49
|
+
# Method 2: av('...') pattern
|
|
50
|
+
elif av_encoded := re.search(r"av\('([^']+)'\)", istek.text):
|
|
50
51
|
decoded_url = self.decode_secret(av_encoded[1])
|
|
52
|
+
|
|
53
|
+
# Method 3: Packed script with dc_* function (StreamDecoder)
|
|
54
|
+
elif Packer.detect_packed(istek.text):
|
|
55
|
+
unpacked = Packer.unpack(istek.text)
|
|
56
|
+
decoded_url = StreamDecoder.extract_stream_url(unpacked)
|
|
57
|
+
|
|
58
|
+
if not decoded_url:
|
|
59
|
+
raise ValueError("No valid video URL pattern found.")
|
|
60
|
+
|
|
51
61
|
except Exception as hata:
|
|
52
62
|
raise RuntimeError(f"Extraction failed: {hata}") from hata
|
|
53
63
|
|
|
@@ -9,6 +9,12 @@ class VidHide(ExtractorBase):
|
|
|
9
9
|
name = "VidHide"
|
|
10
10
|
main_url = "https://vidhidepro.com"
|
|
11
11
|
|
|
12
|
+
# Birden fazla domain destekle
|
|
13
|
+
supported_domains = ["vidhidepro.com", "vidhide.com", "rubyvidhub.com"]
|
|
14
|
+
|
|
15
|
+
def can_handle_url(self, url: str) -> bool:
|
|
16
|
+
return any(domain in url for domain in self.supported_domains)
|
|
17
|
+
|
|
12
18
|
def get_embed_url(self, url: str) -> str:
|
|
13
19
|
if "/d/" in url:
|
|
14
20
|
return url.replace("/d/", "/v/")
|
|
@@ -20,6 +26,9 @@ class VidHide(ExtractorBase):
|
|
|
20
26
|
return url.replace("/f/", "/v/")
|
|
21
27
|
|
|
22
28
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
29
|
+
# Dinamik base URL kullan
|
|
30
|
+
base_url = self.get_base_url(url)
|
|
31
|
+
|
|
23
32
|
if referer:
|
|
24
33
|
self.httpx.headers.update({"Referer": referer})
|
|
25
34
|
|
|
@@ -27,7 +36,7 @@ class VidHide(ExtractorBase):
|
|
|
27
36
|
"Sec-Fetch-Dest" : "empty",
|
|
28
37
|
"Sec-Fetch-Mode" : "cors",
|
|
29
38
|
"Sec-Fetch-Site" : "cross-site",
|
|
30
|
-
"Origin" :
|
|
39
|
+
"Origin" : base_url,
|
|
31
40
|
})
|
|
32
41
|
|
|
33
42
|
embed_url = self.get_embed_url(url)
|
|
@@ -66,7 +75,7 @@ class VidHide(ExtractorBase):
|
|
|
66
75
|
return ExtractResult(
|
|
67
76
|
name = self.name,
|
|
68
77
|
url = self.fix_url(m3u8_url),
|
|
69
|
-
referer = f"{
|
|
78
|
+
referer = f"{base_url}/",
|
|
70
79
|
user_agent = self.httpx.headers.get("User-Agent", ""),
|
|
71
80
|
subtitles = []
|
|
72
81
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.8
|
|
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
|
|
@@ -31,6 +31,7 @@ KekikStream/Extractors/ContentX.py
|
|
|
31
31
|
KekikStream/Extractors/DonilasPlay.py
|
|
32
32
|
KekikStream/Extractors/DzenRu.py
|
|
33
33
|
KekikStream/Extractors/ExPlay.py
|
|
34
|
+
KekikStream/Extractors/Filemoon.py
|
|
34
35
|
KekikStream/Extractors/HDPlayerSystem.py
|
|
35
36
|
KekikStream/Extractors/JetTv.py
|
|
36
37
|
KekikStream/Extractors/MailRu.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.8
|
|
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 = "2.1.
|
|
9
|
+
version = "2.1.8",
|
|
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"],
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|