KekikStream 0.2.4__py3-none-any.whl → 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- KekikStream/Extractors/ContentX.py +81 -0
- KekikStream/Extractors/FourCX.py +7 -0
- KekikStream/Extractors/FourPichive.py +7 -0
- KekikStream/Extractors/FourPlayRu.py +7 -0
- KekikStream/Extractors/HDStreamAble.py +7 -0
- KekikStream/Extractors/Hotlinger.py +7 -0
- KekikStream/Extractors/MixPlayHD.py +43 -0
- KekikStream/Extractors/Odnoklassniki.py +94 -0
- KekikStream/Extractors/OkRuHTTP.py +7 -0
- KekikStream/Extractors/OkRuSSL.py +7 -0
- KekikStream/Extractors/PeaceMakerst.py +59 -0
- KekikStream/Extractors/Pichive.py +7 -0
- KekikStream/Extractors/PlayRu.py +7 -0
- KekikStream/Extractors/VidMoly.py +17 -18
- KekikStream/Extractors/VideoSeyred.py +53 -0
- KekikStream/Managers/UIManager.py +2 -2
- KekikStream/Plugins/SineWix.py +3 -0
- KekikStream/__init__.py +21 -2
- {KekikStream-0.2.4.dist-info → KekikStream-0.2.6.dist-info}/METADATA +1 -1
- {KekikStream-0.2.4.dist-info → KekikStream-0.2.6.dist-info}/RECORD +24 -10
- {KekikStream-0.2.4.dist-info → KekikStream-0.2.6.dist-info}/LICENSE +0 -0
- {KekikStream-0.2.4.dist-info → KekikStream-0.2.6.dist-info}/WHEEL +0 -0
- {KekikStream-0.2.4.dist-info → KekikStream-0.2.6.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.2.4.dist-info → KekikStream-0.2.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
4
|
+
import re
|
5
|
+
|
6
|
+
class ContentX(ExtractorBase):
|
7
|
+
name = "ContentX"
|
8
|
+
main_url = "https://contentx.me"
|
9
|
+
|
10
|
+
async def extract(self, url, referer=None) -> list[ExtractResult]:
|
11
|
+
if referer:
|
12
|
+
self.oturum.headers.update({"Referer": referer})
|
13
|
+
|
14
|
+
istek = await self.oturum.get(url)
|
15
|
+
istek.raise_for_status()
|
16
|
+
i_source = istek.text
|
17
|
+
|
18
|
+
i_extract = re.search(r"window\.openPlayer\('([^']+)'\)", i_source)
|
19
|
+
if not i_extract:
|
20
|
+
raise ValueError("iExtract is null")
|
21
|
+
i_extract_value = i_extract.group(1)
|
22
|
+
|
23
|
+
subtitles = []
|
24
|
+
sub_urls = set()
|
25
|
+
for match in re.finditer(r'"file":"([^"]+)","label":"([^"]+)"', i_source):
|
26
|
+
sub_url, sub_lang = match.groups()
|
27
|
+
|
28
|
+
if sub_url in sub_urls:
|
29
|
+
continue
|
30
|
+
sub_urls.add(sub_url)
|
31
|
+
|
32
|
+
subtitles.append(
|
33
|
+
Subtitle(
|
34
|
+
name = sub_lang.replace("\\u0131", "ı")
|
35
|
+
.replace("\\u0130", "İ")
|
36
|
+
.replace("\\u00fc", "ü")
|
37
|
+
.replace("\\u00e7", "ç"),
|
38
|
+
url = self.fix_url(sub_url.replace("\\", ""))
|
39
|
+
)
|
40
|
+
)
|
41
|
+
|
42
|
+
vid_source_request = await self.oturum.get(f"{self.main_url}/source2.php?v={i_extract_value}", headers={"Referer": referer or self.main_url})
|
43
|
+
vid_source_request.raise_for_status()
|
44
|
+
|
45
|
+
vid_source = vid_source_request.text
|
46
|
+
vid_extract = re.search(r'file":"([^"]+)"', vid_source)
|
47
|
+
if not vid_extract:
|
48
|
+
raise ValueError("vidExtract is null")
|
49
|
+
m3u_link = vid_extract.group(1).replace("\\", "")
|
50
|
+
|
51
|
+
results = [
|
52
|
+
ExtractResult(
|
53
|
+
name = self.name,
|
54
|
+
url = m3u_link,
|
55
|
+
referer = url,
|
56
|
+
subtitles = subtitles
|
57
|
+
)
|
58
|
+
]
|
59
|
+
|
60
|
+
i_dublaj = re.search(r',\"([^"]+)\",\"Türkçe"', i_source)
|
61
|
+
if i_dublaj:
|
62
|
+
dublaj_value = i_dublaj.group(1)
|
63
|
+
dublaj_source_request = await self.oturum.get(f"{self.main_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or self.main_url})
|
64
|
+
dublaj_source_request.raise_for_status()
|
65
|
+
|
66
|
+
dublaj_source = dublaj_source_request.text
|
67
|
+
dublaj_extract = re.search(r'file":"([^"]+)"', dublaj_source)
|
68
|
+
if not dublaj_extract:
|
69
|
+
raise ValueError("dublajExtract is null")
|
70
|
+
dublaj_link = dublaj_extract.group(1).replace("\\", "")
|
71
|
+
|
72
|
+
results.append(
|
73
|
+
ExtractResult(
|
74
|
+
name = f"{self.name} Türkçe Dublaj",
|
75
|
+
url = dublaj_link,
|
76
|
+
referer = url,
|
77
|
+
subtitles = []
|
78
|
+
)
|
79
|
+
)
|
80
|
+
|
81
|
+
return results
|
@@ -0,0 +1,43 @@
|
|
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 AESManager
|
5
|
+
import re
|
6
|
+
import json
|
7
|
+
|
8
|
+
class MixPlayHD(ExtractorBase):
|
9
|
+
name = "MixPlayHD"
|
10
|
+
main_url = "https://mixplayhd.com"
|
11
|
+
|
12
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
13
|
+
if referer:
|
14
|
+
self.oturum.headers.update({"Referer": referer})
|
15
|
+
|
16
|
+
istek = await self.oturum.get(url)
|
17
|
+
istek.raise_for_status()
|
18
|
+
|
19
|
+
be_player_match = re.search(r"bePlayer\('([^']+)',\s*'(\{[^\}]+\})'\);", istek.text)
|
20
|
+
if not be_player_match:
|
21
|
+
raise ValueError("bePlayer not found in the response.")
|
22
|
+
|
23
|
+
be_player_pass = be_player_match.group(1)
|
24
|
+
be_player_data = be_player_match.group(2)
|
25
|
+
|
26
|
+
try:
|
27
|
+
decrypted_data = AESManager.decrypt(be_player_data, be_player_pass).replace("\\", "")
|
28
|
+
decrypted_json = json.loads(decrypted_data)
|
29
|
+
except Exception as e:
|
30
|
+
raise RuntimeError(f"Decryption failed: {e}")
|
31
|
+
|
32
|
+
video_url_match = re.search(r'"video_location":"([^"]+)"', decrypted_json.get("schedule", {}).get("client", ""))
|
33
|
+
if not video_url_match:
|
34
|
+
raise ValueError("M3U8 video URL not found in the decrypted data.")
|
35
|
+
|
36
|
+
video_url = video_url_match.group(1)
|
37
|
+
|
38
|
+
return ExtractResult(
|
39
|
+
name = self.name,
|
40
|
+
url = video_url,
|
41
|
+
referer = self.main_url,
|
42
|
+
subtitles = []
|
43
|
+
)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
import re
|
5
|
+
import json
|
6
|
+
|
7
|
+
class Odnoklassniki(ExtractorBase):
|
8
|
+
name = "Odnoklassniki"
|
9
|
+
main_url = "https://odnoklassniki.ru"
|
10
|
+
|
11
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
12
|
+
if referer:
|
13
|
+
self.oturum.headers.update({"Referer": referer})
|
14
|
+
|
15
|
+
self.oturum.headers.update({
|
16
|
+
"User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"
|
17
|
+
})
|
18
|
+
|
19
|
+
try:
|
20
|
+
# İlk isteği yap, ancak yönlendirmeyi manuel olarak kontrol et.
|
21
|
+
istek = await self.oturum.get(url, follow_redirects=False)
|
22
|
+
if istek.status_code == 302: # Yönlendirme varsa
|
23
|
+
redirected_url = istek.headers.get("Location")
|
24
|
+
if not redirected_url:
|
25
|
+
raise ValueError("Redirect location not found.")
|
26
|
+
|
27
|
+
# Yönlendirilmiş URL'yi kullanarak isteği yeniden yap.
|
28
|
+
url = redirected_url if redirected_url.startswith("http") else f"https://{redirected_url}"
|
29
|
+
istek = await self.oturum.get(url)
|
30
|
+
|
31
|
+
istek.raise_for_status()
|
32
|
+
except Exception as e:
|
33
|
+
raise RuntimeError(f"Failed to fetch the URL: {url}, Error: {e}")
|
34
|
+
|
35
|
+
response_text = (
|
36
|
+
istek.text.replace("\\"", "\"")
|
37
|
+
.replace("\\\\", "\\")
|
38
|
+
.replace(r"\\u", "\\u")
|
39
|
+
)
|
40
|
+
response_text = re.sub(
|
41
|
+
r"\\u([0-9A-Fa-f]{4})",
|
42
|
+
lambda match: chr(int(match.group(1), 16)),
|
43
|
+
response_text
|
44
|
+
)
|
45
|
+
|
46
|
+
videos_match = re.search(r'"videos":(\[.*?\])', response_text)
|
47
|
+
if not videos_match:
|
48
|
+
raise ValueError("No video data found in the response.")
|
49
|
+
|
50
|
+
videos_str = videos_match.group(1)
|
51
|
+
try:
|
52
|
+
videos = json.loads(videos_str)
|
53
|
+
except json.JSONDecodeError:
|
54
|
+
raise ValueError("Failed to parse video data.")
|
55
|
+
|
56
|
+
quality_order = {
|
57
|
+
"ULTRA": 6, # 4K veya daha yüksek
|
58
|
+
"QUAD": 5, # 1440p
|
59
|
+
"FULL": 4, # 1080p
|
60
|
+
"HD": 3, # 720p
|
61
|
+
"SD": 2, # 480p
|
62
|
+
"LOW": 1, # 360p
|
63
|
+
"MOBILE": 0 # 144p
|
64
|
+
}
|
65
|
+
|
66
|
+
# Kaliteye göre en iyi videoyu seçme
|
67
|
+
best_video = None
|
68
|
+
best_quality_score = -1
|
69
|
+
|
70
|
+
for video in videos:
|
71
|
+
video_url = video.get("url")
|
72
|
+
quality_name = video.get("name", "").upper()
|
73
|
+
|
74
|
+
if not video_url or not quality_name:
|
75
|
+
continue
|
76
|
+
|
77
|
+
# Kalite sıralamasına göre puanla
|
78
|
+
quality_score = quality_order.get(quality_name, -1)
|
79
|
+
if quality_score > best_quality_score:
|
80
|
+
best_quality_score = quality_score
|
81
|
+
best_video = video_url
|
82
|
+
|
83
|
+
if not best_video:
|
84
|
+
raise ValueError("No valid video URLs found.")
|
85
|
+
|
86
|
+
if best_video.startswith("//"):
|
87
|
+
best_video = f"https:{best_video}"
|
88
|
+
|
89
|
+
return ExtractResult(
|
90
|
+
name = self.name,
|
91
|
+
url = best_video,
|
92
|
+
referer = self.main_url,
|
93
|
+
subtitles = []
|
94
|
+
)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
import re
|
5
|
+
import json
|
6
|
+
|
7
|
+
class PeaceMakerst(ExtractorBase):
|
8
|
+
name = "PeaceMakerst"
|
9
|
+
main_url = "https://peacemakerst.com"
|
10
|
+
|
11
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
12
|
+
if referer:
|
13
|
+
self.oturum.headers.update({"Referer": referer})
|
14
|
+
|
15
|
+
self.oturum.headers.update({
|
16
|
+
"Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",
|
17
|
+
"X-Requested-With" : "XMLHttpRequest"
|
18
|
+
})
|
19
|
+
|
20
|
+
response = await self.oturum.post(
|
21
|
+
url = f"{url}?do=getVideo",
|
22
|
+
data = {
|
23
|
+
"hash" : url.split("video/")[-1],
|
24
|
+
"r" : referer or "",
|
25
|
+
"s" : ""
|
26
|
+
}
|
27
|
+
)
|
28
|
+
response.raise_for_status()
|
29
|
+
|
30
|
+
response_text = response.text
|
31
|
+
m3u_link = None
|
32
|
+
|
33
|
+
if "teve2.com.tr\\/embed\\/" in response_text:
|
34
|
+
teve2_id = re.search(r"teve2\.com\.tr\\\/embed\\\/(\d+)", response_text).group(1)
|
35
|
+
teve2_url = f"https://www.teve2.com.tr/action/media/{teve2_id}"
|
36
|
+
|
37
|
+
teve2_response = await self.oturum.get(teve2_url, headers={"Referer": f"https://www.teve2.com.tr/embed/{teve2_id}"})
|
38
|
+
teve2_response.raise_for_status()
|
39
|
+
teve2_json = teve2_response.json()
|
40
|
+
|
41
|
+
m3u_link = f"{teve2_json['Media']['Link']['ServiceUrl']}//{teve2_json['Media']['Link']['SecurePath']}"
|
42
|
+
else:
|
43
|
+
try:
|
44
|
+
video_response = response.json()
|
45
|
+
video_sources = video_response.get("videoSources", [])
|
46
|
+
if video_sources:
|
47
|
+
m3u_link = video_sources[-1]["file"]
|
48
|
+
except (json.JSONDecodeError, KeyError):
|
49
|
+
raise ValueError("Peace response is invalid or null.")
|
50
|
+
|
51
|
+
if not m3u_link:
|
52
|
+
raise ValueError("m3u link not found.")
|
53
|
+
|
54
|
+
return ExtractResult(
|
55
|
+
name = self.name,
|
56
|
+
url = m3u_link,
|
57
|
+
referer = url,
|
58
|
+
subtitles = []
|
59
|
+
)
|
@@ -14,24 +14,23 @@ class VidMoly(ExtractorBase):
|
|
14
14
|
if referer:
|
15
15
|
self.oturum.headers.update({"Referer": referer})
|
16
16
|
|
17
|
-
headers
|
18
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
19
|
-
"Sec-Fetch-Dest": "iframe",
|
20
|
-
}
|
17
|
+
self.oturum.headers.update({
|
18
|
+
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
19
|
+
"Sec-Fetch-Dest" : "iframe",
|
20
|
+
})
|
21
21
|
|
22
22
|
# Embed URL oluştur
|
23
|
-
embed_url
|
24
|
-
url.replace("/w/", "/embed-") + "-920x360.html" if "/w/" in url else url
|
25
|
-
)
|
23
|
+
embed_url = url.replace("/w/", "/embed-") + "-920x360.html" if "/w/" in url else url
|
26
24
|
script_content = None
|
27
|
-
attempts
|
25
|
+
attempts = 0
|
28
26
|
|
29
27
|
# Script verisini almak için deneme yap
|
30
28
|
while attempts < 10 and not script_content:
|
31
29
|
attempts += 1
|
32
|
-
response = await self.oturum.get(embed_url
|
30
|
+
response = await self.oturum.get(embed_url)
|
33
31
|
response.raise_for_status()
|
34
|
-
|
32
|
+
|
33
|
+
script_match = re.search(r"sources:\s*\[(.*?)\],", response.text, re.DOTALL)
|
35
34
|
script_content = script_match.group(1) if script_match else None
|
36
35
|
if not script_content:
|
37
36
|
await asyncio.sleep(0.5)
|
@@ -58,11 +57,11 @@ class VidMoly(ExtractorBase):
|
|
58
57
|
subtitle_sources = json.loads(f"[{subtitle_data}]")
|
59
58
|
subtitles = [
|
60
59
|
Subtitle(
|
61
|
-
name=sub.get("label"),
|
62
|
-
url=self.fix_url(sub.get("file")),
|
60
|
+
name = sub.get("label"),
|
61
|
+
url = self.fix_url(sub.get("file")),
|
63
62
|
)
|
64
|
-
|
65
|
-
|
63
|
+
for sub in subtitle_sources
|
64
|
+
if sub.get("kind") == "captions"
|
66
65
|
]
|
67
66
|
except json.JSONDecodeError:
|
68
67
|
pass
|
@@ -80,10 +79,10 @@ class VidMoly(ExtractorBase):
|
|
80
79
|
|
81
80
|
await self.close()
|
82
81
|
return ExtractResult(
|
83
|
-
name=self.name,
|
84
|
-
url=video_url,
|
85
|
-
referer=self.main_url,
|
86
|
-
subtitles=subtitles
|
82
|
+
name = self.name,
|
83
|
+
url = video_url,
|
84
|
+
referer = self.main_url,
|
85
|
+
subtitles = subtitles
|
87
86
|
)
|
88
87
|
|
89
88
|
def _add_marks(self, text: str, field: str) -> str:
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
4
|
+
import json
|
5
|
+
|
6
|
+
class VideoSeyred(ExtractorBase):
|
7
|
+
name = "VideoSeyred"
|
8
|
+
main_url = "https://videoseyred.in"
|
9
|
+
|
10
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
11
|
+
if referer:
|
12
|
+
self.oturum.headers.update({"Referer": referer})
|
13
|
+
|
14
|
+
video_id = url.split("embed/")[1].split("?")[0]
|
15
|
+
video_url = f"{self.main_url}/playlist/{video_id}.json"
|
16
|
+
|
17
|
+
response = await self.oturum.get(video_url)
|
18
|
+
response.raise_for_status()
|
19
|
+
|
20
|
+
try:
|
21
|
+
response_list = json.loads(response.text)
|
22
|
+
if not response_list:
|
23
|
+
raise ValueError("Empty response from VideoSeyred.")
|
24
|
+
response_data = response_list[0]
|
25
|
+
except (json.JSONDecodeError, IndexError) as e:
|
26
|
+
raise RuntimeError(f"Failed to parse response: {e}")
|
27
|
+
|
28
|
+
subtitles = []
|
29
|
+
for track in response_data.get("tracks", []):
|
30
|
+
if track.get("kind") == "captions" and track.get("label"):
|
31
|
+
subtitles.append(
|
32
|
+
Subtitle(
|
33
|
+
name = track["label"],
|
34
|
+
url = self.fix_url(track["file"])
|
35
|
+
)
|
36
|
+
)
|
37
|
+
|
38
|
+
video_links = []
|
39
|
+
for source in response_data.get("sources", []):
|
40
|
+
video_links.append(
|
41
|
+
ExtractResult(
|
42
|
+
name = self.name,
|
43
|
+
url = self.fix_url(source["file"]),
|
44
|
+
referer = self.main_url,
|
45
|
+
subtitles = subtitles
|
46
|
+
)
|
47
|
+
)
|
48
|
+
|
49
|
+
if not video_links:
|
50
|
+
raise ValueError("No video links found in the response.")
|
51
|
+
|
52
|
+
# En yüksek kaliteli videoyu döndür (varsayılan olarak ilk video)
|
53
|
+
return video_links[0] if len(video_links) == 1 else video_links
|
@@ -13,7 +13,7 @@ class UIManager:
|
|
13
13
|
|
14
14
|
@staticmethod
|
15
15
|
async def select_from_list(message, choices):
|
16
|
-
return await inquirer.select(message=message, choices=choices, max_height="
|
16
|
+
return await inquirer.select(message=message, choices=choices, max_height="75%").execute_async()
|
17
17
|
|
18
18
|
@staticmethod
|
19
19
|
async def select_from_fuzzy(message, choices):
|
@@ -22,7 +22,7 @@ class UIManager:
|
|
22
22
|
choices = choices,
|
23
23
|
validate = lambda result: result in [choice if isinstance(choice, str) else choice["value"] for choice in choices],
|
24
24
|
filter = lambda result: result,
|
25
|
-
max_height = "
|
25
|
+
max_height = "75%"
|
26
26
|
).execute_async()
|
27
27
|
|
28
28
|
@staticmethod
|
KekikStream/Plugins/SineWix.py
CHANGED
@@ -50,6 +50,9 @@ class SineWix(PluginBase):
|
|
50
50
|
episodes = []
|
51
51
|
for season in veri.get("seasons"):
|
52
52
|
for episode in season.get("episodes"):
|
53
|
+
if not episode.get("videos"):
|
54
|
+
continue
|
55
|
+
|
53
56
|
ep_model = Episode(
|
54
57
|
season = season.get("season_number"),
|
55
58
|
episode = episode.get("episode_number"),
|
KekikStream/__init__.py
CHANGED
@@ -25,6 +25,20 @@ class KekikStream:
|
|
25
25
|
finally:
|
26
26
|
await self.plugin_manager.close_plugins()
|
27
27
|
|
28
|
+
async def handle_no_results(self):
|
29
|
+
action = await self.ui_manager.select_from_list(
|
30
|
+
message = "Ne yapmak istersiniz?",
|
31
|
+
choices = ["Geri Git", "Ana Menü", "Çıkış"]
|
32
|
+
)
|
33
|
+
|
34
|
+
match action:
|
35
|
+
case "Geri Git":
|
36
|
+
await self.search_all()
|
37
|
+
case "Ana Menü":
|
38
|
+
await self.run()
|
39
|
+
case "Çıkış":
|
40
|
+
cikis_yap(False)
|
41
|
+
|
28
42
|
async def select_plugin(self):
|
29
43
|
plugin_name = await self.ui_manager.select_from_fuzzy(
|
30
44
|
message = "Arama yapılacak eklentiyi seçin:",
|
@@ -113,6 +127,10 @@ class KekikStream:
|
|
113
127
|
await self.show_options(links)
|
114
128
|
|
115
129
|
async def show_options(self, links):
|
130
|
+
if not links:
|
131
|
+
konsol.print("[bold red]Hiçbir bağlantı bulunamadı![/bold red]")
|
132
|
+
return await self.handle_no_results()
|
133
|
+
|
116
134
|
mapping = self.extractor_manager.map_links_to_extractors(links)
|
117
135
|
has_play_method = hasattr(self.current_plugin, "play") and callable(getattr(self.current_plugin, "play", None))
|
118
136
|
# ! DEBUG
|
@@ -120,7 +138,7 @@ class KekikStream:
|
|
120
138
|
if not mapping and not has_play_method:
|
121
139
|
konsol.print("[bold red]Hiçbir Extractor bulunamadı![/bold red]")
|
122
140
|
konsol.print(links)
|
123
|
-
return
|
141
|
+
return await self.handle_no_results()
|
124
142
|
|
125
143
|
if not mapping:
|
126
144
|
selected_link = await self.ui_manager.select_from_list(
|
@@ -146,7 +164,7 @@ class KekikStream:
|
|
146
164
|
await self.play_media(selected_link)
|
147
165
|
|
148
166
|
case "Geri Git":
|
149
|
-
await self.
|
167
|
+
await self.search_all()
|
150
168
|
|
151
169
|
case _:
|
152
170
|
await self.run()
|
@@ -203,6 +221,7 @@ class KekikStream:
|
|
203
221
|
|
204
222
|
if not all_results:
|
205
223
|
konsol.print("[bold red]Hiçbir sonuç bulunamadı![/bold red]")
|
224
|
+
await self.handle_no_results()
|
206
225
|
return []
|
207
226
|
|
208
227
|
return all_results
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.6
|
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
|
@@ -1,4 +1,4 @@
|
|
1
|
-
KekikStream/__init__.py,sha256=
|
1
|
+
KekikStream/__init__.py,sha256=9oTVlq0MbL5E5w_mSPjuC3Fi4dYn_Mgzww3fld3zjiQ,9993
|
2
2
|
KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
|
3
3
|
KekikStream/requirements.txt,sha256=Kh3E0NzIkAmhVODtIwRVffVOHLiElO6Ua9kIgjbocPE,57
|
4
4
|
KekikStream/CLI/__init__.py,sha256=9YlF135BVff85y492hX4sq2WY2CNqa4BuVzF9hIIaKE,233
|
@@ -12,30 +12,44 @@ KekikStream/Core/PluginLoader.py,sha256=og5EPfnVqrb2kUkeGU65AY0fU43IbiUo_h3ix6Zi
|
|
12
12
|
KekikStream/Core/PluginModels.py,sha256=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
|
13
13
|
KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
|
14
14
|
KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
|
15
|
+
KekikStream/Extractors/ContentX.py,sha256=t6E36ZB2qXUKqY5VSceTrUdw2s-Uv9LF3yjGt48Xfmc,2982
|
16
|
+
KekikStream/Extractors/FourCX.py,sha256=4FrMj1IZBBpN_g1P6S3A-8eUu7QFwlt4fJXzJ7vfe0Q,221
|
17
|
+
KekikStream/Extractors/FourPichive.py,sha256=iq3BCUbih1UVF4y4BIWO--0hX5jP2nxqesNx3MGP3kQ,234
|
18
|
+
KekikStream/Extractors/FourPlayRu.py,sha256=wq1ylxKpsO_IBoYr_ALzB2dVrQpJ-jY9lf2zPhcAZX8,228
|
19
|
+
KekikStream/Extractors/HDStreamAble.py,sha256=66n5EvIdX_or5cdnlJ_Uqmzi50n4rl9c5VCw8kBqhQk,245
|
20
|
+
KekikStream/Extractors/Hotlinger.py,sha256=NFMRgUmb6BCrJfa7Hi0VarDNYvCeVknBWEk24FKBBa0,224
|
15
21
|
KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
|
22
|
+
KekikStream/Extractors/MixPlayHD.py,sha256=4sSHingB3gquakFesnbC0LmkJZWW2Jvv5F4kOdo58tA,1528
|
23
|
+
KekikStream/Extractors/Odnoklassniki.py,sha256=rP9jzJ42PGyguoEckpm-9nMtfqyXTN2lVzWgG-WYVaI,3296
|
24
|
+
KekikStream/Extractors/OkRuHTTP.py,sha256=L-B0i_i_Vnm61GvUfd6cGIW-o_H4M-C7DO_cdw2rQPU,228
|
25
|
+
KekikStream/Extractors/OkRuSSL.py,sha256=FHJ5XZ1dO5ED3mIku3e3vnq8K0slrcr0jqhaUnHmfVk,227
|
26
|
+
KekikStream/Extractors/PeaceMakerst.py,sha256=1l5Y5AQB_P53upVqgBuJTnjNV7nHVMr56tp673Q8omU,2123
|
27
|
+
KekikStream/Extractors/Pichive.py,sha256=BSVYFwL3Ax6yGoS1WkpOWtngxNyuZLoKzpPwjibpu2s,221
|
16
28
|
KekikStream/Extractors/PixelDrain.py,sha256=JLNaTdFJfXj5ExB_OjjyjwBZBD_gCOmL3fO_TWbHe90,998
|
29
|
+
KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
|
17
30
|
KekikStream/Extractors/RapidVid.py,sha256=HmSXDWhE1EXZRhNCxrqqEBbyJKbqFtTFRtq-zYg3G2c,2430
|
18
31
|
KekikStream/Extractors/SibNet.py,sha256=w0Rv1cYB_Ho6M9Aho9n38Thp6mAfKPNe-eKFC_DbGuE,884
|
19
32
|
KekikStream/Extractors/Sobreatsesuyp.py,sha256=7JUbqHLMWFkHuzH3NG2ogaV53e9fUmGvAr7h83yRtxs,1953
|
20
33
|
KekikStream/Extractors/TRsTX.py,sha256=jhPcQq7KPxL0SPvEFL4MG7oDXDpBbt6Qh8vRJ_bLQMU,2105
|
21
34
|
KekikStream/Extractors/TauVideo.py,sha256=bBjrZFSi4QqSJhRB0sDWMA0Saio-zpoAb6Ss4QZmBeY,1045
|
22
35
|
KekikStream/Extractors/TurboImgz.py,sha256=0d9t6bj4prVt1_LIbzwcfuqrSRB7SMvc4RKvE25BtW4,851
|
23
|
-
KekikStream/Extractors/VidMoly.py,sha256=
|
36
|
+
KekikStream/Extractors/VidMoly.py,sha256=uzYArLNLTI8mZpMsOABWUOhJtT3FaY6GBrDnQ3Oyl90,3424
|
24
37
|
KekikStream/Extractors/VidMoxy.py,sha256=UnVrCEI4XNiONE2aLV9dGUhRqQ9ELJTnYVXyG81N11A,1800
|
38
|
+
KekikStream/Extractors/VideoSeyred.py,sha256=Sx1qHNBMboGgU_bXHVgx3MlxtyKpR_LBJIQWX3nKxb4,1937
|
25
39
|
KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
|
26
40
|
KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
|
27
41
|
KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
|
28
|
-
KekikStream/Managers/UIManager.py,sha256=
|
42
|
+
KekikStream/Managers/UIManager.py,sha256=PmGabWjHACnaOZLyIfOd0j4cfqpuV34RO58QeeIbF6E,1590
|
29
43
|
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
30
44
|
KekikStream/Plugins/FilmMakinesi.py,sha256=g4LRDP5Atn97PqbgnEdm0-wjVdXaJIVk1Ru0F8B66Ws,2902
|
31
45
|
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
|
32
46
|
KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
|
33
47
|
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
34
|
-
KekikStream/Plugins/SineWix.py,sha256=
|
48
|
+
KekikStream/Plugins/SineWix.py,sha256=ZtcIwPW0ONGkSjT7Ye8b71RWdHZMUZefX-JTWu6uGSs,4854
|
35
49
|
KekikStream/Plugins/UgurFilm.py,sha256=U7ryNWpjSZJWuYlMGX1Be9uuyiM3SfuI9VJcEiXedNs,2960
|
36
|
-
KekikStream-0.2.
|
37
|
-
KekikStream-0.2.
|
38
|
-
KekikStream-0.2.
|
39
|
-
KekikStream-0.2.
|
40
|
-
KekikStream-0.2.
|
41
|
-
KekikStream-0.2.
|
50
|
+
KekikStream-0.2.6.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
51
|
+
KekikStream-0.2.6.dist-info/METADATA,sha256=nK2CRluVQ5_BU8FG7jfDzFkQRWOQrmsE580vh_-Mvzc,3959
|
52
|
+
KekikStream-0.2.6.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
53
|
+
KekikStream-0.2.6.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
54
|
+
KekikStream-0.2.6.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
55
|
+
KekikStream-0.2.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|