KekikStream 1.3.0__tar.gz → 1.3.2__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.3.2/KekikStream/Extractors/CloseLoad.py +47 -0
- kekikstream-1.3.2/KekikStream/Helpers/Unpack.py +75 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/DiziYou.py +39 -3
- kekikstream-1.3.2/KekikStream/Plugins/FilmMakinesi.py +112 -0
- kekikstream-1.3.2/KekikStream/Plugins/FullHDFilmizlesene.py +127 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/SOURCES.txt +1 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/PKG-INFO +1 -1
- {kekikstream-1.3.0 → kekikstream-1.3.2}/setup.py +1 -1
- kekikstream-1.3.0/KekikStream/Extractors/CloseLoad.py +0 -31
- kekikstream-1.3.0/KekikStream/Plugins/FilmMakinesi.py +0 -68
- kekikstream-1.3.0/KekikStream/Plugins/FullHDFilmizlesene.py +0 -80
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/Shorten.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/__init__.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/__main__.py +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/requirements.txt +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/LICENSE +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/MANIFEST.in +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/README.md +0 -0
- {kekikstream-1.3.0 → kekikstream-1.3.2}/setup.cfg +0 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
from KekikStream.Helpers.Unpack import unpack
|
5
|
+
import re, base64
|
6
|
+
|
7
|
+
def get_m3u_link(data: str) -> str:
|
8
|
+
first = base64.b64decode(data)
|
9
|
+
first_reversed = first[::-1]
|
10
|
+
|
11
|
+
second = base64.b64decode(first_reversed)
|
12
|
+
|
13
|
+
parts = second.decode('utf-8').split("|")
|
14
|
+
if len(parts) < 2:
|
15
|
+
raise ValueError("Decoded data has an unexpected format.")
|
16
|
+
|
17
|
+
return parts[1]
|
18
|
+
|
19
|
+
def extract_data(raw_script: str) -> str:
|
20
|
+
pattern = re.compile(r'return result\}var .*?=.*?\("(.*?)"\)')
|
21
|
+
if match := pattern.search(raw_script):
|
22
|
+
return match[1]
|
23
|
+
else:
|
24
|
+
raise Exception("data not found")
|
25
|
+
|
26
|
+
class CloseLoadExtractor(ExtractorBase):
|
27
|
+
name = "CloseLoad"
|
28
|
+
main_url = "https://closeload.filmmakinesi.de"
|
29
|
+
|
30
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
31
|
+
if referer:
|
32
|
+
self.httpx.headers.update({"Referer": referer})
|
33
|
+
|
34
|
+
istek = await self.httpx.get(url)
|
35
|
+
istek.raise_for_status()
|
36
|
+
|
37
|
+
eval_func = re.compile(r'\s*(eval\(function[\s\S].*)\s*').findall(istek.text)[0]
|
38
|
+
m3u_link = get_m3u_link(extract_data(unpack(eval_func)))
|
39
|
+
print(m3u_link)
|
40
|
+
|
41
|
+
await self.close()
|
42
|
+
return ExtractResult(
|
43
|
+
name = self.name,
|
44
|
+
url = m3u_link,
|
45
|
+
referer = self.main_url,
|
46
|
+
subtitles = []
|
47
|
+
)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# ! https://github.com/keyiflerolsun/Kekik-cloudstream/blob/master/FilmMakinesi/src/main/kotlin/com/keyiflerolsun/CloseLoadUnpacker.kt
|
2
|
+
|
3
|
+
import re
|
4
|
+
|
5
|
+
packed_extract_regex = re.compile(
|
6
|
+
r"\}\('(.*)',\s*(\d+),\s*(\d+),\s*'(.*?)'\.split\('\|'\)",
|
7
|
+
re.IGNORECASE | re.MULTILINE
|
8
|
+
)
|
9
|
+
|
10
|
+
unpack_replace_regex = re.compile(
|
11
|
+
r"\b\w+\b",
|
12
|
+
re.IGNORECASE | re.MULTILINE
|
13
|
+
)
|
14
|
+
|
15
|
+
class Unbaser:
|
16
|
+
ALPHABET = {
|
17
|
+
52: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP",
|
18
|
+
54: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR",
|
19
|
+
62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
20
|
+
95: " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
|
21
|
+
}
|
22
|
+
|
23
|
+
def __init__(self, base: int):
|
24
|
+
self.base = base
|
25
|
+
|
26
|
+
if base > 62:
|
27
|
+
self.selector = 95
|
28
|
+
elif base > 54:
|
29
|
+
self.selector = 62
|
30
|
+
elif base > 52:
|
31
|
+
self.selector = 54
|
32
|
+
else:
|
33
|
+
self.selector = 52
|
34
|
+
|
35
|
+
self.dict = {char: idx for idx, char in enumerate(Unbaser.ALPHABET[self.selector])}
|
36
|
+
|
37
|
+
def unbase(self, value: str) -> int:
|
38
|
+
if 2 <= self.base <= 36:
|
39
|
+
try:
|
40
|
+
return int(value, self.base)
|
41
|
+
except ValueError:
|
42
|
+
return 0
|
43
|
+
else:
|
44
|
+
result = 0
|
45
|
+
|
46
|
+
for index, c in enumerate(reversed(value)):
|
47
|
+
digit = self.dict.get(c, 0)
|
48
|
+
result += digit * (self.base ** index)
|
49
|
+
|
50
|
+
return result
|
51
|
+
|
52
|
+
def unpack(script_block: str) -> str:
|
53
|
+
match = packed_extract_regex.search(script_block)
|
54
|
+
if not match:
|
55
|
+
raise ValueError("Packed script not found")
|
56
|
+
|
57
|
+
payload, radix_str, count_str, symtab_str = match.groups()
|
58
|
+
|
59
|
+
radix = int(radix_str)
|
60
|
+
count = int(count_str)
|
61
|
+
symtab = symtab_str.split('|')
|
62
|
+
|
63
|
+
if len(symtab) != count:
|
64
|
+
raise ValueError("there is an error in the packed script")
|
65
|
+
|
66
|
+
unbaser = Unbaser(radix)
|
67
|
+
|
68
|
+
def replacer(match_obj):
|
69
|
+
word = match_obj.group(0)
|
70
|
+
index = unbaser.unbase(word)
|
71
|
+
replacement = symtab[index] if index < len(symtab) else word
|
72
|
+
|
73
|
+
return replacement or word
|
74
|
+
|
75
|
+
return unpack_replace_regex.sub(replacer, payload)
|
@@ -1,12 +1,48 @@
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
2
|
|
3
|
-
from KekikStream.Core import kekik_cache, PluginBase, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
|
3
|
+
from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
|
4
4
|
from parsel import Selector
|
5
5
|
import re
|
6
6
|
|
7
7
|
class DiziYou(PluginBase):
|
8
|
-
name
|
9
|
-
|
8
|
+
name = "DiziYou"
|
9
|
+
language = "tr"
|
10
|
+
main_url = "https://www.diziyou1.com"
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
12
|
+
description = "Diziyou en kaliteli Türkçe dublaj ve altyazılı yabancı dizi izleme sitesidir. Güncel ve efsanevi dizileri 1080p Full HD kalitede izlemek için hemen tıkla!"
|
13
|
+
|
14
|
+
main_page = {
|
15
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Aile" : "Aile",
|
16
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Aksiyon" : "Aksiyon",
|
17
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Animasyon" : "Animasyon",
|
18
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Belgesel" : "Belgesel",
|
19
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Bilim+Kurgu" : "Bilim Kurgu",
|
20
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Dram" : "Dram",
|
21
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Fantazi" : "Fantazi",
|
22
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Gerilim" : "Gerilim",
|
23
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Gizem" : "Gizem",
|
24
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Komedi" : "Komedi",
|
25
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Korku" : "Korku",
|
26
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Macera" : "Macera",
|
27
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Sava%C5%9F" : "Savaş",
|
28
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Su%C3%A7" : "Suç",
|
29
|
+
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Vah%C5%9Fi+Bat%C4%B1" : "Vahşi Batı"
|
30
|
+
}
|
31
|
+
|
32
|
+
@kekik_cache(ttl=60*60)
|
33
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
34
|
+
istek = await self.httpx.get(f"{url.replace('SAYFA', str(page))}")
|
35
|
+
secici = Selector(istek.text)
|
36
|
+
|
37
|
+
return [
|
38
|
+
MainPageResult(
|
39
|
+
category = category,
|
40
|
+
title = veri.css("div#categorytitle a::text").get(),
|
41
|
+
url = self.fix_url(veri.css("div#categorytitle a::attr(href)").get()),
|
42
|
+
poster = self.fix_url(veri.css("img::attr(src)").get()),
|
43
|
+
)
|
44
|
+
for veri in secici.css("div.single-item")
|
45
|
+
]
|
10
46
|
|
11
47
|
@kekik_cache(ttl=60*60)
|
12
48
|
async def search(self, query: str) -> list[SearchResult]:
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
|
4
|
+
from parsel import Selector
|
5
|
+
|
6
|
+
class FilmMakinesi(PluginBase):
|
7
|
+
name = "FilmMakinesi"
|
8
|
+
language = "tr"
|
9
|
+
main_url = "https://filmmakinesi.de"
|
10
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
11
|
+
description = "Film Makinesi, en yeni ve en güncel filmleri sitemizde full HD kalite farkı ile izleyebilirsiniz. HD film izle denildiğinde akla gelen en kaliteli film izleme sitesi."
|
12
|
+
|
13
|
+
main_page = {
|
14
|
+
f"{main_url}/page/" : "Son Filmler",
|
15
|
+
f"{main_url}/film-izle/olmeden-izlenmesi-gerekenler/page/" : "Ölmeden İzle",
|
16
|
+
f"{main_url}/film-izle/aksiyon-filmleri-izle/page/" : "Aksiyon",
|
17
|
+
f"{main_url}/film-izle/bilim-kurgu-filmi-izle/page/" : "Bilim Kurgu",
|
18
|
+
f"{main_url}/film-izle/macera-filmleri/page/" : "Macera",
|
19
|
+
f"{main_url}/film-izle/komedi-filmi-izle/page/" : "Komedi",
|
20
|
+
f"{main_url}/film-izle/romantik-filmler-izle/page/" : "Romantik",
|
21
|
+
f"{main_url}/film-izle/belgesel/page/" : "Belgesel",
|
22
|
+
f"{main_url}/film-izle/fantastik-filmler-izle/page/" : "Fantastik",
|
23
|
+
f"{main_url}/film-izle/polisiye-filmleri-izle/page/" : "Polisiye Suç",
|
24
|
+
f"{main_url}/film-izle/korku-filmleri-izle-hd/page/" : "Korku",
|
25
|
+
f"{main_url}/film-izle/savas/page/" : "Tarihi ve Savaş",
|
26
|
+
f"{main_url}/film-izle/gerilim-filmleri-izle/page/" : "Gerilim Heyecan",
|
27
|
+
f"{main_url}/film-izle/gizemli/page/" : "Gizem",
|
28
|
+
f"{main_url}/film-izle/aile-filmleri/page/" : "Aile",
|
29
|
+
f"{main_url}/film-izle/animasyon-filmler/page/" : "Animasyon",
|
30
|
+
f"{main_url}/film-izle/western/page/" : "Western",
|
31
|
+
f"{main_url}/film-izle/biyografi/page/" : "Biyografik",
|
32
|
+
f"{main_url}/film-izle/dram/page/" : "Dram",
|
33
|
+
f"{main_url}/film-izle/muzik/page/" : "Müzik",
|
34
|
+
f"{main_url}/film-izle/spor/page/" : "Spor"
|
35
|
+
}
|
36
|
+
|
37
|
+
@kekik_cache(ttl=60*60)
|
38
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
39
|
+
istek = self.cloudscraper.get(f"{url}{page}")
|
40
|
+
secici = Selector(istek.text)
|
41
|
+
|
42
|
+
veriler = secici.css("section#film_posts article") if "/film-izle/" in url else secici.css("section#film_posts div.tooltip")
|
43
|
+
|
44
|
+
return [
|
45
|
+
MainPageResult(
|
46
|
+
category = category,
|
47
|
+
title = veri.css("h6 a::text").get(),
|
48
|
+
url = self.fix_url(veri.css("h6 a::attr(href)").get()),
|
49
|
+
poster = self.fix_url(veri.css("img::attr(data-src)").get() or veri.css("img::attr(src)").get()),
|
50
|
+
)
|
51
|
+
for veri in veriler
|
52
|
+
]
|
53
|
+
|
54
|
+
@kekik_cache(ttl=60*60)
|
55
|
+
async def search(self, query: str) -> list[SearchResult]:
|
56
|
+
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
57
|
+
secici = Selector(istek.text)
|
58
|
+
|
59
|
+
results = []
|
60
|
+
for article in secici.css("section#film_posts article"):
|
61
|
+
title = article.css("h6 a::text").get()
|
62
|
+
href = article.css("h6 a::attr(href)").get()
|
63
|
+
poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
|
64
|
+
|
65
|
+
if title and href:
|
66
|
+
results.append(
|
67
|
+
SearchResult(
|
68
|
+
title = title.strip(),
|
69
|
+
url = self.fix_url(href.strip()),
|
70
|
+
poster = self.fix_url(poster.strip()) if poster else None,
|
71
|
+
)
|
72
|
+
)
|
73
|
+
|
74
|
+
return results
|
75
|
+
|
76
|
+
@kekik_cache(ttl=60*60)
|
77
|
+
async def load_item(self, url: str) -> MovieInfo:
|
78
|
+
istek = await self.httpx.get(url)
|
79
|
+
secici = Selector(istek.text)
|
80
|
+
|
81
|
+
title = secici.css("h1.single_h1 a::text").get().strip()
|
82
|
+
poster = secici.css("[property='og:image']::attr(content)").get().strip()
|
83
|
+
description = secici.css("section#film_single article p:last-of-type::text").get().strip()
|
84
|
+
tags = secici.css("dt:contains('Tür:') + dd a::text").get().strip()
|
85
|
+
rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get().strip()
|
86
|
+
year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get().strip()
|
87
|
+
actors = secici.css("dt:contains('Oyuncular:') + dd::text").get().strip()
|
88
|
+
duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get().strip()
|
89
|
+
|
90
|
+
duration_minutes = 0
|
91
|
+
if duration and duration.startswith("PT") and duration.endswith("M"):
|
92
|
+
duration_minutes = int(duration[2:-1])
|
93
|
+
|
94
|
+
return MovieInfo(
|
95
|
+
url = url,
|
96
|
+
poster = self.fix_url(poster),
|
97
|
+
title = title,
|
98
|
+
description = description,
|
99
|
+
tags = tags,
|
100
|
+
rating = rating,
|
101
|
+
year = year,
|
102
|
+
actors = actors,
|
103
|
+
duration = duration_minutes
|
104
|
+
)
|
105
|
+
|
106
|
+
@kekik_cache(ttl=15*60)
|
107
|
+
async def load_links(self, url: str) -> list[str]:
|
108
|
+
istek = await self.httpx.get(url)
|
109
|
+
secici = Selector(istek.text)
|
110
|
+
|
111
|
+
iframe_src = secici.css("div.player-div iframe::attr(src)").get() or secici.css("div.player-div iframe::attr(data-src)").get()
|
112
|
+
return [self.fix_url(iframe_src)] if iframe_src else []
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
|
4
|
+
from parsel import Selector
|
5
|
+
from Kekik.Sifreleme import StringCodec
|
6
|
+
import json, re
|
7
|
+
|
8
|
+
class FullHDFilmizlesene(PluginBase):
|
9
|
+
name = "FullHDFilmizlesene"
|
10
|
+
language = "tr"
|
11
|
+
main_url = "https://www.fullhdfilmizlesene.de"
|
12
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
13
|
+
description = "Sinema zevkini evinize kadar getirdik. Türkiye'nin lider Film sitesinde, en yeni filmleri Full HD izleyin."
|
14
|
+
|
15
|
+
main_page = {
|
16
|
+
f"{main_url}/en-cok-izlenen-filmler-izle-hd/" : "En Çok izlenen Filmler",
|
17
|
+
f"{main_url}/filmizle/imdb-puani-yuksek-filmler-izle-1/" : "IMDB Puanı Yüksek Filmler",
|
18
|
+
f"{main_url}/filmizle/aile-filmleri-izle-2/" : "Aile Filmleri",
|
19
|
+
f"{main_url}/filmizle/aksiyon-filmler-izle-1/" : "Aksiyon Filmleri",
|
20
|
+
f"{main_url}/filmizle/animasyon-filmleri-izle-4/" : "Animasyon Filmleri",
|
21
|
+
f"{main_url}/filmizle/belgesel-filmleri-izle-2/" : "Belgeseller",
|
22
|
+
f"{main_url}/filmizle/bilim-kurgu-filmleri-izle-1/" : "Bilim Kurgu Filmleri",
|
23
|
+
f"{main_url}/filmizle/bluray-filmler-izle-1/" : "Blu Ray Filmler",
|
24
|
+
f"{main_url}/filmizle/cizgi-filmler-izle-1/" : "Çizgi Filmler",
|
25
|
+
f"{main_url}/filmizle/dram-filmleri-izle/" : "Dram Filmleri",
|
26
|
+
f"{main_url}/filmizle/fantastik-filmleri-izle-2/" : "Fantastik Filmler",
|
27
|
+
f"{main_url}/filmizle/gerilim-filmleri-izle-3/" : "Gerilim Filmleri",
|
28
|
+
f"{main_url}/filmizle/gizem-filmleri-izle/" : "Gizem Filmleri",
|
29
|
+
f"{main_url}/filmizle/hint-filmler-fh-hd-izle/" : "Hint Filmleri",
|
30
|
+
f"{main_url}/filmizle/komedi-filmleri-izle-2/" : "Komedi Filmleri",
|
31
|
+
f"{main_url}/filmizle/korku-filmleri-izle-2/" : "Korku Filmleri",
|
32
|
+
f"{main_url}/filmizle/macera-filmleri-izle-1/" : "Macera Filmleri",
|
33
|
+
f"{main_url}/filmizle/muzikal-filmleri-izle/" : "Müzikal Filmler",
|
34
|
+
f"{main_url}/filmizle/polisiye-filmleri-izle-1/" : "Polisiye Filmleri",
|
35
|
+
f"{main_url}/filmizle/psikolojik-filmleri-izle/" : "Psikolojik Filmler",
|
36
|
+
f"{main_url}/filmizle/romantik-filmler-izle-1/" : "Romantik Filmler",
|
37
|
+
f"{main_url}/filmizle/savas-filmleri-izle-2/" : "Savaş Filmleri",
|
38
|
+
f"{main_url}/filmizle/suc-filmleri-izle-3/" : "Suç Filmleri",
|
39
|
+
f"{main_url}/filmizle/tarih-filmleri-izle/" : "Tarih Filmleri",
|
40
|
+
f"{main_url}/filmizle/western-filmleri-izle/" : "Western Filmler",
|
41
|
+
f"{main_url}/filmizle/yerli-filmler-izle-3/" : "Yerli Filmler",
|
42
|
+
}
|
43
|
+
|
44
|
+
@kekik_cache(ttl=60*60)
|
45
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
46
|
+
istek = self.cloudscraper.get(f"{url}{page}")
|
47
|
+
secici = Selector(istek.text)
|
48
|
+
|
49
|
+
return [
|
50
|
+
MainPageResult(
|
51
|
+
category = category,
|
52
|
+
title = veri.css("span.film-title::text").get(),
|
53
|
+
url = self.fix_url(veri.css("a::attr(href)").get()),
|
54
|
+
poster = self.fix_url(veri.css("img::attr(data-src)").get()),
|
55
|
+
)
|
56
|
+
for veri in secici.css("li.film")
|
57
|
+
]
|
58
|
+
|
59
|
+
@kekik_cache(ttl=60*60)
|
60
|
+
async def search(self, query: str) -> list[SearchResult]:
|
61
|
+
istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
|
62
|
+
secici = Selector(istek.text)
|
63
|
+
|
64
|
+
results = []
|
65
|
+
for film in secici.css("li.film"):
|
66
|
+
title = film.css("span.film-title::text").get()
|
67
|
+
href = film.css("a::attr(href)").get()
|
68
|
+
poster = film.css("img::attr(data-src)").get()
|
69
|
+
|
70
|
+
if title and href:
|
71
|
+
results.append(
|
72
|
+
SearchResult(
|
73
|
+
title = title.strip(),
|
74
|
+
url = self.fix_url(href.strip()),
|
75
|
+
poster = self.fix_url(poster.strip()) if poster else None,
|
76
|
+
)
|
77
|
+
)
|
78
|
+
|
79
|
+
return results
|
80
|
+
|
81
|
+
@kekik_cache(ttl=60*60)
|
82
|
+
async def load_item(self, url: str) -> MovieInfo:
|
83
|
+
istek = await self.httpx.get(url)
|
84
|
+
secici = Selector(istek.text)
|
85
|
+
|
86
|
+
title = secici.xpath("normalize-space(//div[@class='izle-titles'])").get().strip()
|
87
|
+
poster = secici.css("div img::attr(data-src)").get().strip()
|
88
|
+
description = secici.css("div.ozet-ic p::text").get().strip()
|
89
|
+
tags = secici.css("a[rel='category tag']::text").getall()
|
90
|
+
rating = secici.xpath("normalize-space(//div[@class='puanx-puan'])").get().split()[-1]
|
91
|
+
year = secici.css("div.dd a.category::text").get().strip().split()[0]
|
92
|
+
actors = secici.css("div.film-info ul li:nth-child(2) a > span::text").getall()
|
93
|
+
duration = secici.css("span.sure::text").get("0 Dakika").split()[0]
|
94
|
+
|
95
|
+
return MovieInfo(
|
96
|
+
url = url,
|
97
|
+
poster = self.fix_url(poster),
|
98
|
+
title = title,
|
99
|
+
description = description,
|
100
|
+
tags = tags,
|
101
|
+
rating = rating,
|
102
|
+
year = year,
|
103
|
+
actors = actors,
|
104
|
+
duration = duration
|
105
|
+
)
|
106
|
+
|
107
|
+
@kekik_cache(ttl=15*60)
|
108
|
+
async def load_links(self, url: str) -> list[str]:
|
109
|
+
istek = await self.httpx.get(url)
|
110
|
+
secici = Selector(istek.text)
|
111
|
+
|
112
|
+
script = secici.xpath("(//script)[1]").get()
|
113
|
+
scx_data = json.loads(re.findall(r"scx = (.*?);", script)[0])
|
114
|
+
scx_keys = list(scx_data.keys())
|
115
|
+
|
116
|
+
link_list = []
|
117
|
+
for key in scx_keys:
|
118
|
+
t = scx_data[key]["sx"]["t"]
|
119
|
+
if isinstance(t, list):
|
120
|
+
link_list.extend(StringCodec.decode(elem) for elem in t)
|
121
|
+
if isinstance(t, dict):
|
122
|
+
link_list.extend(StringCodec.decode(v) for k, v in t.items())
|
123
|
+
|
124
|
+
return [
|
125
|
+
f"https:{link}" if link.startswith("//") else link
|
126
|
+
for link in link_list
|
127
|
+
]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 1.3.
|
3
|
+
Version: 1.3.2
|
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
|
@@ -52,6 +52,7 @@ KekikStream/Extractors/VidMoly.py
|
|
52
52
|
KekikStream/Extractors/VidMolyMe.py
|
53
53
|
KekikStream/Extractors/VidMoxy.py
|
54
54
|
KekikStream/Extractors/VideoSeyred.py
|
55
|
+
KekikStream/Helpers/Unpack.py
|
55
56
|
KekikStream/Plugins/DiziBox.py
|
56
57
|
KekikStream/Plugins/DiziYou.py
|
57
58
|
KekikStream/Plugins/Dizilla.py
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 1.3.
|
3
|
+
Version: 1.3.2
|
4
4
|
Summary: terminal üzerinden medya içeriği aramanızı ve VLC/MPV gibi popüler medya oynatıcılar aracılığıyla doğrudan izlemenizi sağlayan modüler ve genişletilebilir bir bıdı bıdı
|
5
5
|
Home-page: https://github.com/keyiflerolsun/KekikStream
|
6
6
|
Author: keyiflerolsun
|
@@ -6,7 +6,7 @@ from io import open
|
|
6
6
|
setup(
|
7
7
|
# ? Genel Bilgiler
|
8
8
|
name = "KekikStream",
|
9
|
-
version = "1.3.
|
9
|
+
version = "1.3.2",
|
10
10
|
url = "https://github.com/keyiflerolsun/KekikStream",
|
11
11
|
description = "terminal üzerinden medya içeriği aramanızı ve VLC/MPV gibi popüler medya oynatıcılar aracılığıyla doğrudan izlemenizi sağlayan modüler ve genişletilebilir bir bıdı bıdı",
|
12
12
|
keywords = ["KekikStream", "KekikAkademi", "keyiflerolsun"],
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
-
|
3
|
-
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
-
from parsel import Selector
|
5
|
-
from base64 import b64decode
|
6
|
-
|
7
|
-
class CloseLoadExtractor(ExtractorBase):
|
8
|
-
name = "CloseLoad"
|
9
|
-
main_url = "https://closeload.filmmakinesi.de"
|
10
|
-
|
11
|
-
async def extract(self, url, referer=None) -> ExtractResult:
|
12
|
-
if referer:
|
13
|
-
self.httpx.headers.update({"Referer": referer})
|
14
|
-
|
15
|
-
istek = await self.httpx.get(url)
|
16
|
-
istek.raise_for_status()
|
17
|
-
|
18
|
-
secici = Selector(istek.text)
|
19
|
-
atob = secici.re(r"aHR0[0-9a-zA-Z+/=]*")
|
20
|
-
if not atob:
|
21
|
-
raise ValueError("Base64 kodu bulunamadı.")
|
22
|
-
|
23
|
-
m3u_link = b64decode(f"{atob[0]}===").decode("utf-8")
|
24
|
-
|
25
|
-
await self.close()
|
26
|
-
return ExtractResult(
|
27
|
-
name = self.name,
|
28
|
-
url = m3u_link,
|
29
|
-
referer = self.main_url,
|
30
|
-
subtitles = []
|
31
|
-
)
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
-
|
3
|
-
from KekikStream.Core import kekik_cache, PluginBase, SearchResult, MovieInfo
|
4
|
-
from parsel import Selector
|
5
|
-
|
6
|
-
class FilmMakinesi(PluginBase):
|
7
|
-
name = "FilmMakinesi"
|
8
|
-
main_url = "https://filmmakinesi.de"
|
9
|
-
|
10
|
-
@kekik_cache(ttl=60*60)
|
11
|
-
async def search(self, query: str) -> list[SearchResult]:
|
12
|
-
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
13
|
-
secici = Selector(istek.text)
|
14
|
-
|
15
|
-
results = []
|
16
|
-
for article in secici.css("section#film_posts article"):
|
17
|
-
title = article.css("h6 a::text").get()
|
18
|
-
href = article.css("h6 a::attr(href)").get()
|
19
|
-
poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
|
20
|
-
|
21
|
-
if title and href:
|
22
|
-
results.append(
|
23
|
-
SearchResult(
|
24
|
-
title = title.strip(),
|
25
|
-
url = self.fix_url(href.strip()),
|
26
|
-
poster = self.fix_url(poster.strip()) if poster else None,
|
27
|
-
)
|
28
|
-
)
|
29
|
-
|
30
|
-
return results
|
31
|
-
|
32
|
-
@kekik_cache(ttl=60*60)
|
33
|
-
async def load_item(self, url: str) -> MovieInfo:
|
34
|
-
istek = await self.httpx.get(url)
|
35
|
-
secici = Selector(istek.text)
|
36
|
-
|
37
|
-
title = secici.css("h1.single_h1 a::text").get().strip()
|
38
|
-
poster = secici.css("[property='og:image']::attr(content)").get().strip()
|
39
|
-
description = secici.css("section#film_single article p:last-of-type::text").get().strip()
|
40
|
-
tags = secici.css("dt:contains('Tür:') + dd a::text").get().strip()
|
41
|
-
rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get().strip()
|
42
|
-
year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get().strip()
|
43
|
-
actors = secici.css("dt:contains('Oyuncular:') + dd::text").get().strip()
|
44
|
-
duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get().strip()
|
45
|
-
|
46
|
-
duration_minutes = 0
|
47
|
-
if duration and duration.startswith("PT") and duration.endswith("M"):
|
48
|
-
duration_minutes = int(duration[2:-1])
|
49
|
-
|
50
|
-
return MovieInfo(
|
51
|
-
url = url,
|
52
|
-
poster = self.fix_url(poster),
|
53
|
-
title = title,
|
54
|
-
description = description,
|
55
|
-
tags = tags,
|
56
|
-
rating = rating,
|
57
|
-
year = year,
|
58
|
-
actors = actors,
|
59
|
-
duration = duration_minutes
|
60
|
-
)
|
61
|
-
|
62
|
-
@kekik_cache(ttl=15*60)
|
63
|
-
async def load_links(self, url: str) -> list[str]:
|
64
|
-
istek = await self.httpx.get(url)
|
65
|
-
secici = Selector(istek.text)
|
66
|
-
|
67
|
-
iframe_src = secici.css("div.player-div iframe::attr(src)").get() or secici.css("div.player-div iframe::attr(data-src)").get()
|
68
|
-
return [self.fix_url(iframe_src)] if iframe_src else []
|
@@ -1,80 +0,0 @@
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
-
|
3
|
-
from KekikStream.Core import kekik_cache, PluginBase, SearchResult, MovieInfo
|
4
|
-
from parsel import Selector
|
5
|
-
from Kekik.Sifreleme import StringCodec
|
6
|
-
import json, re
|
7
|
-
|
8
|
-
class FullHDFilmizlesene(PluginBase):
|
9
|
-
name = "FullHDFilmizlesene"
|
10
|
-
main_url = "https://www.fullhdfilmizlesene.de"
|
11
|
-
|
12
|
-
@kekik_cache(ttl=60*60)
|
13
|
-
async def search(self, query: str) -> list[SearchResult]:
|
14
|
-
istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
|
15
|
-
secici = Selector(istek.text)
|
16
|
-
|
17
|
-
results = []
|
18
|
-
for film in secici.css("li.film"):
|
19
|
-
title = film.css("span.film-title::text").get()
|
20
|
-
href = film.css("a::attr(href)").get()
|
21
|
-
poster = film.css("img::attr(data-src)").get()
|
22
|
-
|
23
|
-
if title and href:
|
24
|
-
results.append(
|
25
|
-
SearchResult(
|
26
|
-
title = title.strip(),
|
27
|
-
url = self.fix_url(href.strip()),
|
28
|
-
poster = self.fix_url(poster.strip()) if poster else None,
|
29
|
-
)
|
30
|
-
)
|
31
|
-
|
32
|
-
return results
|
33
|
-
|
34
|
-
@kekik_cache(ttl=60*60)
|
35
|
-
async def load_item(self, url: str) -> MovieInfo:
|
36
|
-
istek = await self.httpx.get(url)
|
37
|
-
secici = Selector(istek.text)
|
38
|
-
|
39
|
-
title = secici.xpath("normalize-space(//div[@class='izle-titles'])").get().strip()
|
40
|
-
poster = secici.css("div img::attr(data-src)").get().strip()
|
41
|
-
description = secici.css("div.ozet-ic p::text").get().strip()
|
42
|
-
tags = secici.css("a[rel='category tag']::text").getall()
|
43
|
-
rating = secici.xpath("normalize-space(//div[@class='puanx-puan'])").get().split()[-1]
|
44
|
-
year = secici.css("div.dd a.category::text").get().strip().split()[0]
|
45
|
-
actors = secici.css("div.film-info ul li:nth-child(2) a > span::text").getall()
|
46
|
-
duration = secici.css("span.sure::text").get("0 Dakika").split()[0]
|
47
|
-
|
48
|
-
return MovieInfo(
|
49
|
-
url = url,
|
50
|
-
poster = self.fix_url(poster),
|
51
|
-
title = title,
|
52
|
-
description = description,
|
53
|
-
tags = tags,
|
54
|
-
rating = rating,
|
55
|
-
year = year,
|
56
|
-
actors = actors,
|
57
|
-
duration = duration
|
58
|
-
)
|
59
|
-
|
60
|
-
@kekik_cache(ttl=15*60)
|
61
|
-
async def load_links(self, url: str) -> list[str]:
|
62
|
-
istek = await self.httpx.get(url)
|
63
|
-
secici = Selector(istek.text)
|
64
|
-
|
65
|
-
script = secici.xpath("(//script)[1]").get()
|
66
|
-
scx_data = json.loads(re.findall(r"scx = (.*?);", script)[0])
|
67
|
-
scx_keys = list(scx_data.keys())
|
68
|
-
|
69
|
-
link_list = []
|
70
|
-
for key in scx_keys:
|
71
|
-
t = scx_data[key]["sx"]["t"]
|
72
|
-
if isinstance(t, list):
|
73
|
-
link_list.extend(StringCodec.decode(elem) for elem in t)
|
74
|
-
if isinstance(t, dict):
|
75
|
-
link_list.extend(StringCodec.decode(v) for k, v in t.items())
|
76
|
-
|
77
|
-
return [
|
78
|
-
f"https:{link}" if link.startswith("//") else link
|
79
|
-
for link in link_list
|
80
|
-
]
|
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
|