KekikStream 0.3.2__py3-none-any.whl → 0.3.3__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/CLI/__init__.py +1 -1
- KekikStream/CLI/pypi_kontrol.py +29 -0
- KekikStream/Core/ExtractorBase.py +1 -1
- KekikStream/Core/ExtractorLoader.py +1 -2
- KekikStream/Core/ExtractorModels.py +2 -0
- KekikStream/Core/MediaHandler.py +1 -2
- KekikStream/Core/PluginBase.py +2 -5
- KekikStream/Core/PluginLoader.py +1 -3
- KekikStream/Extractors/ContentX.py +9 -10
- KekikStream/Extractors/MixPlayHD.py +15 -16
- KekikStream/Extractors/Odnoklassniki.py +13 -16
- KekikStream/Extractors/PeaceMakerst.py +3 -5
- KekikStream/Extractors/PixelDrain.py +1 -1
- KekikStream/Extractors/RapidVid.py +7 -8
- KekikStream/Extractors/SibNet.py +1 -1
- KekikStream/Extractors/Sobreatsesuyp.py +2 -3
- KekikStream/Extractors/TRsTX.py +2 -3
- KekikStream/Extractors/TauVideo.py +5 -6
- KekikStream/Extractors/TurboImgz.py +9 -12
- KekikStream/Extractors/VidMoly.py +6 -13
- KekikStream/Extractors/VidMoxy.py +1 -1
- KekikStream/Extractors/VideoSeyred.py +23 -29
- KekikStream/Plugins/DiziBox.py +11 -12
- KekikStream/Plugins/FilmMakinesi.py +8 -8
- KekikStream/Plugins/UgurFilm.py +3 -3
- KekikStream/__init__.py +3 -5
- {KekikStream-0.3.2.dist-info → KekikStream-0.3.3.dist-info}/METADATA +1 -1
- KekikStream-0.3.3.dist-info/RECORD +56 -0
- KekikStream/CLI/check_update.py +0 -33
- KekikStream-0.3.2.dist-info/RECORD +0 -56
- {KekikStream-0.3.2.dist-info → KekikStream-0.3.3.dist-info}/LICENSE +0 -0
- {KekikStream-0.3.2.dist-info → KekikStream-0.3.3.dist-info}/WHEEL +0 -0
- {KekikStream-0.3.2.dist-info → KekikStream-0.3.3.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.3.2.dist-info → KekikStream-0.3.3.dist-info}/top_level.txt +0 -0
KekikStream/CLI/__init__.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
2
|
|
3
3
|
from Kekik.cli import konsol, cikis_yap, hata_salla, log_salla, hata_yakala, bellek_temizle, temizle
|
4
|
-
from .
|
4
|
+
from .pypi_kontrol import pypi_kontrol_guncelle
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from . import konsol
|
4
|
+
from rich.panel import Panel
|
5
|
+
from pkg_resources import get_distribution
|
6
|
+
from requests import get
|
7
|
+
from subprocess import check_call
|
8
|
+
import sys
|
9
|
+
|
10
|
+
def pypi_kontrol_guncelle(paket_adi: str):
|
11
|
+
try:
|
12
|
+
mevcut_surum = get_distribution(paket_adi).version
|
13
|
+
konsol.print(Panel(f"[cyan]Yüklü sürüm:[/cyan] [bold yellow]{mevcut_surum}[/bold yellow]"))
|
14
|
+
|
15
|
+
istek = get(f"https://pypi.org/pypi/{paket_adi}/json")
|
16
|
+
if istek.status_code == 200:
|
17
|
+
son_surum = istek.json()["info"]["version"]
|
18
|
+
konsol.print(Panel(f"[cyan]En son sürüm:[/cyan] [bold green]{son_surum}[/bold green]"))
|
19
|
+
|
20
|
+
if mevcut_surum != son_surum:
|
21
|
+
konsol.print(f"[bold red]{paket_adi} güncelleniyor...[/bold red]")
|
22
|
+
check_call([sys.executable, "-m", "pip", "install", "--upgrade", paket_adi, "--break-system-packages"])
|
23
|
+
konsol.print(f"[bold green]{paket_adi} güncellendi![/bold green]")
|
24
|
+
else:
|
25
|
+
konsol.print(f"[bold green]{paket_adi} zaten güncel.[/bold green]")
|
26
|
+
else:
|
27
|
+
konsol.print("[bold red]PyPI'ye erişilemiyor. Güncelleme kontrolü atlanıyor.[/bold red]")
|
28
|
+
except Exception as hata:
|
29
|
+
konsol.print(f"[bold red]Güncelleme kontrolü sırasında hata oluştu: {hata}[/bold red]")
|
@@ -15,7 +15,7 @@ class ExtractorBase(ABC):
|
|
15
15
|
"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)",
|
16
16
|
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
17
17
|
},
|
18
|
-
timeout = Timeout(10.0)
|
18
|
+
timeout = Timeout(10.0)
|
19
19
|
)
|
20
20
|
|
21
21
|
def can_handle_url(self, url: str) -> bool:
|
@@ -3,11 +3,13 @@
|
|
3
3
|
from pydantic import BaseModel
|
4
4
|
from typing import List, Optional
|
5
5
|
|
6
|
+
|
6
7
|
class Subtitle(BaseModel):
|
7
8
|
"""Altyazı modeli."""
|
8
9
|
name : str
|
9
10
|
url : str
|
10
11
|
|
12
|
+
|
11
13
|
class ExtractResult(BaseModel):
|
12
14
|
"""Extractor'ın döndürmesi gereken sonuç modeli."""
|
13
15
|
name : str
|
KekikStream/Core/MediaHandler.py
CHANGED
@@ -2,8 +2,7 @@
|
|
2
2
|
|
3
3
|
from ..CLI import konsol
|
4
4
|
from .ExtractorModels import ExtractResult
|
5
|
-
import subprocess
|
6
|
-
import os
|
5
|
+
import subprocess, os
|
7
6
|
|
8
7
|
class MediaHandler:
|
9
8
|
def __init__(self, title: str = "KekikStream", headers: dict = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"}):
|
KekikStream/Core/PluginBase.py
CHANGED
@@ -47,14 +47,11 @@ class PluginBase(ABC):
|
|
47
47
|
def fix_url(self, url: str) -> str:
|
48
48
|
if not url:
|
49
49
|
return ""
|
50
|
-
|
50
|
+
|
51
51
|
if url.startswith("http") or url.startswith("{\""):
|
52
52
|
return url
|
53
53
|
|
54
|
-
if url.startswith("//")
|
55
|
-
return f"https:{url}"
|
56
|
-
|
57
|
-
return urljoin(self.main_url, url)
|
54
|
+
return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
|
58
55
|
|
59
56
|
@staticmethod
|
60
57
|
def clean_title(title: str) -> str:
|
KekikStream/Core/PluginLoader.py
CHANGED
@@ -17,18 +17,18 @@ class ContentX(ExtractorBase):
|
|
17
17
|
|
18
18
|
i_extract = re.search(r"window\.openPlayer\('([^']+)'\)", i_source)
|
19
19
|
if not i_extract:
|
20
|
-
raise ValueError("
|
21
|
-
i_extract_value = i_extract
|
20
|
+
raise ValueError("i_extract is null")
|
21
|
+
i_extract_value = i_extract[1]
|
22
22
|
|
23
23
|
subtitles = []
|
24
|
-
sub_urls
|
24
|
+
sub_urls = set()
|
25
25
|
for match in re.finditer(r'"file":"([^"]+)","label":"([^"]+)"', i_source):
|
26
26
|
sub_url, sub_lang = match.groups()
|
27
27
|
|
28
28
|
if sub_url in sub_urls:
|
29
29
|
continue
|
30
|
-
sub_urls.add(sub_url)
|
31
30
|
|
31
|
+
sub_urls.add(sub_url)
|
32
32
|
subtitles.append(
|
33
33
|
Subtitle(
|
34
34
|
name = sub_lang.replace("\\u0131", "ı")
|
@@ -46,9 +46,9 @@ class ContentX(ExtractorBase):
|
|
46
46
|
vid_extract = re.search(r'file":"([^"]+)"', vid_source)
|
47
47
|
if not vid_extract:
|
48
48
|
raise ValueError("vidExtract is null")
|
49
|
-
m3u_link = vid_extract.group(1).replace("\\", "")
|
50
49
|
|
51
|
-
|
50
|
+
m3u_link = vid_extract[1].replace("\\", "")
|
51
|
+
results = [
|
52
52
|
ExtractResult(
|
53
53
|
name = self.name,
|
54
54
|
url = m3u_link,
|
@@ -57,9 +57,8 @@ class ContentX(ExtractorBase):
|
|
57
57
|
)
|
58
58
|
]
|
59
59
|
|
60
|
-
i_dublaj
|
61
|
-
|
62
|
-
dublaj_value = i_dublaj.group(1)
|
60
|
+
if i_dublaj := re.search(r',\"([^"]+)\",\"Türkçe"', i_source):
|
61
|
+
dublaj_value = i_dublaj[1]
|
63
62
|
dublaj_source_request = await self.oturum.get(f"{self.main_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or self.main_url})
|
64
63
|
dublaj_source_request.raise_for_status()
|
65
64
|
|
@@ -67,8 +66,8 @@ class ContentX(ExtractorBase):
|
|
67
66
|
dublaj_extract = re.search(r'file":"([^"]+)"', dublaj_source)
|
68
67
|
if not dublaj_extract:
|
69
68
|
raise ValueError("dublajExtract is null")
|
70
|
-
dublaj_link = dublaj_extract.group(1).replace("\\", "")
|
71
69
|
|
70
|
+
dublaj_link = dublaj_extract[1].replace("\\", "")
|
72
71
|
results.append(
|
73
72
|
ExtractResult(
|
74
73
|
name = f"{self.name} Türkçe Dublaj",
|
@@ -2,8 +2,7 @@
|
|
2
2
|
|
3
3
|
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
4
|
from Kekik.Sifreleme import AESManager
|
5
|
-
import re
|
6
|
-
import json
|
5
|
+
import re, json
|
7
6
|
|
8
7
|
class MixPlayHD(ExtractorBase):
|
9
8
|
name = "MixPlayHD"
|
@@ -20,8 +19,8 @@ class MixPlayHD(ExtractorBase):
|
|
20
19
|
if not be_player_match:
|
21
20
|
raise ValueError("bePlayer not found in the response.")
|
22
21
|
|
23
|
-
be_player_pass = be_player_match
|
24
|
-
be_player_data = be_player_match
|
22
|
+
be_player_pass = be_player_match[1]
|
23
|
+
be_player_data = be_player_match[2]
|
25
24
|
|
26
25
|
try:
|
27
26
|
decrypted_data = AESManager.decrypt(be_player_data, be_player_pass).replace("\\", "")
|
@@ -29,15 +28,15 @@ class MixPlayHD(ExtractorBase):
|
|
29
28
|
except Exception as e:
|
30
29
|
raise RuntimeError(f"Decryption failed: {e}")
|
31
30
|
|
32
|
-
video_url_match
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
31
|
+
if video_url_match := re.search(
|
32
|
+
pattern = r'"video_location":"([^"]+)"',
|
33
|
+
string = decrypted_json.get("schedule", {}).get("client", ""),
|
34
|
+
):
|
35
|
+
return ExtractResult(
|
36
|
+
name = self.name,
|
37
|
+
url = video_url_match[1],
|
38
|
+
referer = self.main_url,
|
39
|
+
subtitles = []
|
40
|
+
)
|
41
|
+
else:
|
42
|
+
raise ValueError("M3U8 video URL not found in the decrypted data.")
|
@@ -1,9 +1,7 @@
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
2
|
|
3
|
-
from KekikStream.CLI import konsol
|
4
3
|
from KekikStream.Core import ExtractorBase, ExtractResult
|
5
|
-
import re
|
6
|
-
import json
|
4
|
+
import re, json
|
7
5
|
|
8
6
|
class Odnoklassniki(ExtractorBase):
|
9
7
|
name = "Odnoklassniki"
|
@@ -33,7 +31,7 @@ class Odnoklassniki(ExtractorBase):
|
|
33
31
|
)
|
34
32
|
response_text = re.sub(
|
35
33
|
r"\\u([0-9A-Fa-f]{4})",
|
36
|
-
lambda match: chr(int(match
|
34
|
+
lambda match: chr(int(match[1], 16)),
|
37
35
|
response_text
|
38
36
|
)
|
39
37
|
|
@@ -41,9 +39,8 @@ class Odnoklassniki(ExtractorBase):
|
|
41
39
|
if not videos_match:
|
42
40
|
raise ValueError("No video data found in the response.")
|
43
41
|
|
44
|
-
videos_str = videos_match.group(1)
|
45
42
|
try:
|
46
|
-
videos = json.loads(
|
43
|
+
videos = json.loads(videos_match[1])
|
47
44
|
except json.JSONDecodeError:
|
48
45
|
raise ValueError("Failed to parse video data.")
|
49
46
|
|
@@ -92,18 +89,18 @@ class Odnoklassniki(ExtractorBase):
|
|
92
89
|
redirects = 0
|
93
90
|
while redirects < max_redirects:
|
94
91
|
istek = await self.oturum.get(url, follow_redirects=False)
|
95
|
-
|
96
|
-
if istek.status_code in [301, 302]:
|
97
|
-
redirected_url = istek.headers.get("Location")
|
98
|
-
print(redirected_url)
|
99
|
-
if not redirected_url:
|
100
|
-
raise ValueError("Redirect location not found.")
|
101
|
-
|
102
|
-
url = redirected_url if redirected_url.startswith("http") else f"https://{redirected_url}"
|
103
|
-
redirects += 1
|
104
|
-
else:
|
92
|
+
|
93
|
+
if istek.status_code not in [301, 302]:
|
105
94
|
break # Yönlendirme yoksa çık
|
106
95
|
|
96
|
+
redirected_url = istek.headers.get("Location")
|
97
|
+
if not redirected_url:
|
98
|
+
raise ValueError("Redirect location not found.")
|
99
|
+
|
100
|
+
url = redirected_url if redirected_url.startswith("http") else f"https://{redirected_url}"
|
101
|
+
redirects += 1
|
102
|
+
|
107
103
|
if redirects == max_redirects:
|
108
104
|
raise RuntimeError(f"Max redirects ({max_redirects}) reached.")
|
105
|
+
|
109
106
|
return istek
|
@@ -1,8 +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
|
4
|
-
import re
|
5
|
-
import json
|
4
|
+
import re, json
|
6
5
|
|
7
6
|
class PeaceMakerst(ExtractorBase):
|
8
7
|
name = "PeaceMakerst"
|
@@ -31,7 +30,7 @@ class PeaceMakerst(ExtractorBase):
|
|
31
30
|
m3u_link = None
|
32
31
|
|
33
32
|
if "teve2.com.tr\\/embed\\/" in response_text:
|
34
|
-
teve2_id = re.search(r"teve2\.com\.tr\\\/embed\\\/(\d+)", response_text)
|
33
|
+
teve2_id = re.search(r"teve2\.com\.tr\\\/embed\\\/(\d+)", response_text)[1]
|
35
34
|
teve2_url = f"https://www.teve2.com.tr/action/media/{teve2_id}"
|
36
35
|
|
37
36
|
teve2_response = await self.oturum.get(teve2_url, headers={"Referer": f"https://www.teve2.com.tr/embed/{teve2_id}"})
|
@@ -42,8 +41,7 @@ class PeaceMakerst(ExtractorBase):
|
|
42
41
|
else:
|
43
42
|
try:
|
44
43
|
video_response = response.json()
|
45
|
-
video_sources
|
46
|
-
if video_sources:
|
44
|
+
if video_sources := video_response.get("videoSources", []):
|
47
45
|
m3u_link = video_sources[-1]["file"]
|
48
46
|
except (json.JSONDecodeError, KeyError):
|
49
47
|
raise ValueError("Peace response is invalid or null.")
|
@@ -15,7 +15,7 @@ class PixelDrain(ExtractorBase):
|
|
15
15
|
if not pixel_id_match:
|
16
16
|
raise ValueError("PixelDrain bağlantısından ID çıkarılamadı.")
|
17
17
|
|
18
|
-
pixel_id = pixel_id_match
|
18
|
+
pixel_id = pixel_id_match[1]
|
19
19
|
download_link = f"{self.main_url}/api/file/{pixel_id}?download"
|
20
20
|
referer_link = f"{self.main_url}/u/{pixel_id}?download"
|
21
21
|
|
@@ -22,8 +22,8 @@ class RapidVid(ExtractorBase):
|
|
22
22
|
for sub_url, sub_lang in subtitle_matches:
|
23
23
|
if sub_url in seen_subtitles:
|
24
24
|
continue
|
25
|
-
seen_subtitles.add(sub_url)
|
26
25
|
|
26
|
+
seen_subtitles.add(sub_url)
|
27
27
|
decoded_lang = (
|
28
28
|
sub_lang.replace("\\u0131", "ı")
|
29
29
|
.replace("\\u0130", "İ")
|
@@ -33,21 +33,20 @@ class RapidVid(ExtractorBase):
|
|
33
33
|
subtitles.append(Subtitle(name=decoded_lang, url=sub_url.replace("\\", "")))
|
34
34
|
|
35
35
|
try:
|
36
|
-
extracted_value
|
37
|
-
|
38
|
-
escaped_hex = extracted_value.group(1)
|
36
|
+
if extracted_value := re.search(r'file": "(.*)",', istek.text):
|
37
|
+
escaped_hex = extracted_value[1]
|
39
38
|
decoded_url = HexCodec.decode(escaped_hex)
|
40
39
|
else:
|
41
40
|
eval_jwsetup = re.search(r'\};\s*(eval\(function[\s\S]*?)var played = \d+;', istek.text)
|
42
41
|
if not eval_jwsetup:
|
43
42
|
raise ValueError("JWPlayer setup not found.")
|
44
|
-
|
45
|
-
unpacked_jwsetup = Packer.unpack(Packer.unpack(eval_jwsetup
|
43
|
+
|
44
|
+
unpacked_jwsetup = Packer.unpack(Packer.unpack(eval_jwsetup[1]))
|
46
45
|
extracted_value = re.search(r'file":"(.*)","label', unpacked_jwsetup)
|
47
46
|
if not extracted_value:
|
48
47
|
raise ValueError("File URL not found in unpacked JWPlayer setup.")
|
49
|
-
|
50
|
-
escaped_hex = extracted_value
|
48
|
+
|
49
|
+
escaped_hex = extracted_value[1].replace("\\\\x", "")
|
51
50
|
decoded_url = bytes.fromhex(escaped_hex).decode("utf-8")
|
52
51
|
except Exception as e:
|
53
52
|
raise RuntimeError(f"Extraction failed: {e}")
|
KekikStream/Extractors/SibNet.py
CHANGED
@@ -1,8 +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
|
4
|
-
import re
|
5
|
-
import json
|
4
|
+
import re, json
|
6
5
|
|
7
6
|
class Sobreatsesuyp(ExtractorBase):
|
8
7
|
name = "Sobreatsesuyp"
|
@@ -19,7 +18,7 @@ class Sobreatsesuyp(ExtractorBase):
|
|
19
18
|
if not file_match:
|
20
19
|
raise ValueError("File not found in response.")
|
21
20
|
|
22
|
-
file_path = file_match
|
21
|
+
file_path = file_match[1].replace("\\", "")
|
23
22
|
post_link = f"{self.main_url}/{file_path}"
|
24
23
|
|
25
24
|
post_istek = await self.oturum.post(post_link)
|
KekikStream/Extractors/TRsTX.py
CHANGED
@@ -1,8 +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
|
4
|
-
import re
|
5
|
-
import json
|
4
|
+
import re, json
|
6
5
|
|
7
6
|
class TRsTX(ExtractorBase):
|
8
7
|
name = "TRsTX"
|
@@ -19,7 +18,7 @@ class TRsTX(ExtractorBase):
|
|
19
18
|
if not file_match:
|
20
19
|
raise ValueError("File not found in response.")
|
21
20
|
|
22
|
-
file_path = file_match
|
21
|
+
file_path = file_match[1].replace("\\", "")
|
23
22
|
post_link = f"{self.main_url}/{file_path}"
|
24
23
|
|
25
24
|
post_istek = await self.oturum.post(post_link)
|
@@ -21,13 +21,12 @@ class TauVideo(ExtractorBase):
|
|
21
21
|
if "urls" not in api_data:
|
22
22
|
raise ValueError("API yanıtında 'urls' bulunamadı.")
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
results.append(ExtractResult(
|
24
|
+
return [
|
25
|
+
ExtractResult(
|
27
26
|
name = f"{self.name} - {video['label']}",
|
28
27
|
url = video["url"],
|
29
28
|
referer = referer or self.main_url,
|
30
29
|
subtitles = []
|
31
|
-
)
|
32
|
-
|
33
|
-
|
30
|
+
)
|
31
|
+
for video in api_data["urls"]
|
32
|
+
]
|
@@ -14,15 +14,12 @@ class TurboImgz(ExtractorBase):
|
|
14
14
|
istek = await self.oturum.get(url)
|
15
15
|
istek.raise_for_status()
|
16
16
|
|
17
|
-
video_match
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
referer = referer or self.main_url,
|
27
|
-
subtitles = []
|
28
|
-
)
|
17
|
+
if video_match := re.search(r'file: "(.*)",', istek.text):
|
18
|
+
return ExtractResult(
|
19
|
+
name = self.name,
|
20
|
+
url = video_match[1],
|
21
|
+
referer = referer or self.main_url,
|
22
|
+
subtitles = []
|
23
|
+
)
|
24
|
+
else:
|
25
|
+
raise ValueError("File not found in response.")
|
@@ -2,9 +2,7 @@
|
|
2
2
|
# ! https://github.com/recloudstream/cloudstream/blob/master/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vidmoly.kt
|
3
3
|
|
4
4
|
from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
5
|
-
import re
|
6
|
-
import asyncio
|
7
|
-
import json
|
5
|
+
import re, asyncio, contextlib, json
|
8
6
|
|
9
7
|
class VidMoly(ExtractorBase):
|
10
8
|
name = "VidMoly"
|
@@ -31,7 +29,7 @@ class VidMoly(ExtractorBase):
|
|
31
29
|
response.raise_for_status()
|
32
30
|
|
33
31
|
script_match = re.search(r"sources:\s*\[(.*?)\],", response.text, re.DOTALL)
|
34
|
-
script_content = script_match
|
32
|
+
script_content = script_match[1] if script_match else None
|
35
33
|
if not script_content:
|
36
34
|
await asyncio.sleep(0.5)
|
37
35
|
|
@@ -47,13 +45,12 @@ class VidMoly(ExtractorBase):
|
|
47
45
|
|
48
46
|
# Altyazı kaynaklarını ayrıştır
|
49
47
|
subtitles = []
|
50
|
-
subtitle_match
|
51
|
-
|
52
|
-
subtitle_data = self._add_marks(subtitle_match.group(1), "file")
|
48
|
+
if subtitle_match := re.search(r"tracks:\s*\[(.*?)\]", response.text, re.DOTALL):
|
49
|
+
subtitle_data = self._add_marks(subtitle_match[1], "file")
|
53
50
|
subtitle_data = self._add_marks(subtitle_data, "label")
|
54
51
|
subtitle_data = self._add_marks(subtitle_data, "kind")
|
55
52
|
|
56
|
-
|
53
|
+
with contextlib.suppress(json.JSONDecodeError):
|
57
54
|
subtitle_sources = json.loads(f"[{subtitle_data}]")
|
58
55
|
subtitles = [
|
59
56
|
Subtitle(
|
@@ -63,14 +60,10 @@ class VidMoly(ExtractorBase):
|
|
63
60
|
for sub in subtitle_sources
|
64
61
|
if sub.get("kind") == "captions"
|
65
62
|
]
|
66
|
-
except json.JSONDecodeError:
|
67
|
-
pass
|
68
|
-
|
69
63
|
# İlk video kaynağını al
|
70
64
|
video_url = None
|
71
65
|
for source in video_sources:
|
72
|
-
file_url
|
73
|
-
if file_url:
|
66
|
+
if file_url := source.get("file"):
|
74
67
|
video_url = file_url
|
75
68
|
break
|
76
69
|
|
@@ -22,8 +22,8 @@ class VidMoxy(ExtractorBase):
|
|
22
22
|
for sub_url, sub_lang in subtitle_matches:
|
23
23
|
if sub_url in seen_subtitles:
|
24
24
|
continue
|
25
|
-
seen_subtitles.add(sub_url)
|
26
25
|
|
26
|
+
seen_subtitles.add(sub_url)
|
27
27
|
decoded_lang = (
|
28
28
|
sub_lang.replace("\\u0131", "ı")
|
29
29
|
.replace("\\u0130", "İ")
|
@@ -11,43 +11,37 @@ class VideoSeyred(ExtractorBase):
|
|
11
11
|
if referer:
|
12
12
|
self.oturum.headers.update({"Referer": referer})
|
13
13
|
|
14
|
-
video_id
|
14
|
+
video_id = url.split("embed/")[1].split("?")[0]
|
15
15
|
video_url = f"{self.main_url}/playlist/{video_id}.json"
|
16
16
|
|
17
17
|
response = await self.oturum.get(video_url)
|
18
18
|
response.raise_for_status()
|
19
19
|
|
20
20
|
try:
|
21
|
-
response_list
|
22
|
-
|
21
|
+
if response_list := json.loads(response.text):
|
22
|
+
response_data = response_list[0]
|
23
|
+
else:
|
23
24
|
raise ValueError("Empty response from VideoSeyred.")
|
24
|
-
|
25
|
+
|
25
26
|
except (json.JSONDecodeError, IndexError) as e:
|
26
27
|
raise RuntimeError(f"Failed to parse response: {e}")
|
27
28
|
|
28
|
-
subtitles = [
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
-
)
|
29
|
+
subtitles = [
|
30
|
+
Subtitle(name=track["label"], url=self.fix_url(track["file"]))
|
31
|
+
for track in response_data.get("tracks", [])
|
32
|
+
if track.get("kind") == "captions" and track.get("label")
|
33
|
+
]
|
34
|
+
|
35
|
+
if video_links := [
|
36
|
+
ExtractResult(
|
37
|
+
name = self.name,
|
38
|
+
url = self.fix_url(source["file"]),
|
39
|
+
referer = self.main_url,
|
40
|
+
subtitles = subtitles,
|
47
41
|
)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
42
|
+
for source in response_data.get("sources", [])
|
43
|
+
]:
|
44
|
+
# En yüksek kaliteli videoyu döndür (varsayılan olarak ilk video)
|
45
|
+
return video_links[0] if len(video_links) == 1 else video_links
|
46
|
+
else:
|
47
|
+
raise ValueError("No video links found in the response.")
|
KekikStream/Plugins/DiziBox.py
CHANGED
@@ -24,7 +24,7 @@ class DiziBox(PluginBase):
|
|
24
24
|
url = self.fix_url(item.css("h3 a::attr(href)").get()),
|
25
25
|
poster = self.fix_url(item.css("img::attr(src)").get()),
|
26
26
|
)
|
27
|
-
|
27
|
+
for item in secici.css("article.detailed-article")
|
28
28
|
]
|
29
29
|
|
30
30
|
async def load_item(self, url: str) -> SeriesInfo:
|
@@ -46,10 +46,12 @@ class DiziBox(PluginBase):
|
|
46
46
|
sezon_secici = Selector(sezon_istek.text)
|
47
47
|
|
48
48
|
for bolum in sezon_secici.css("article.grid-box"):
|
49
|
-
|
49
|
+
ep_secici = bolum.css("div.post-title a::text")
|
50
|
+
|
51
|
+
ep_title = ep_secici.get()
|
50
52
|
ep_href = self.fix_url(bolum.css("div.post-title a::attr(href)").get())
|
51
|
-
ep_season =
|
52
|
-
ep_episode =
|
53
|
+
ep_season = ep_secici.re_first(r"(\d+)\. ?Sezon")
|
54
|
+
ep_episode = ep_secici.re_first(r"(\d+)\. ?Bölüm")
|
53
55
|
|
54
56
|
if ep_title and ep_href:
|
55
57
|
episodes.append(Episode(
|
@@ -85,8 +87,8 @@ class DiziBox(PluginBase):
|
|
85
87
|
self.oturum.headers.update({"Referer": self.main_url})
|
86
88
|
istek = await self.oturum.get(iframe)
|
87
89
|
|
88
|
-
crypt_data = re.search(r"CryptoJS\.AES\.decrypt\(\"(.*)\",\"", istek.text)
|
89
|
-
crypt_pass = re.search(r"\",\"(.*)\"\);", istek.text)
|
90
|
+
crypt_data = re.search(r"CryptoJS\.AES\.decrypt\(\"(.*)\",\"", istek.text)[1]
|
91
|
+
crypt_pass = re.search(r"\",\"(.*)\"\);", istek.text)[1]
|
90
92
|
|
91
93
|
results.append(CryptoJS.decrypt(crypt_pass, crypt_data))
|
92
94
|
|
@@ -96,7 +98,7 @@ class DiziBox(PluginBase):
|
|
96
98
|
istek = await self.oturum.get(iframe_link)
|
97
99
|
|
98
100
|
if atob_data := re.search(r"unescape\(\"(.*)\"\)", istek.text):
|
99
|
-
decoded_atob = urllib.parse.unquote(atob_data
|
101
|
+
decoded_atob = urllib.parse.unquote(atob_data[1])
|
100
102
|
str_atob = base64.b64decode(decoded_atob).decode('utf-8')
|
101
103
|
|
102
104
|
if iframe := Selector(str_atob).css("div#Player iframe::attr(src)").get():
|
@@ -113,8 +115,7 @@ class DiziBox(PluginBase):
|
|
113
115
|
secici = Selector(istek.text)
|
114
116
|
|
115
117
|
iframes = []
|
116
|
-
main_iframe
|
117
|
-
if main_iframe:
|
118
|
+
if main_iframe := secici.css("div#video-area iframe::attr(src)").get():
|
118
119
|
if decoded := await self._iframe_decode(self.name, main_iframe, url):
|
119
120
|
iframes.extend(decoded)
|
120
121
|
|
@@ -130,9 +131,7 @@ class DiziBox(PluginBase):
|
|
130
131
|
alt_istek.raise_for_status()
|
131
132
|
|
132
133
|
alt_secici = Selector(alt_istek.text)
|
133
|
-
alt_iframe
|
134
|
-
|
135
|
-
if alt_iframe:
|
134
|
+
if alt_iframe := alt_secici.css("div#video-area iframe::attr(src)").get():
|
136
135
|
if decoded := await self._iframe_decode(alt_name, alt_iframe, url):
|
137
136
|
iframes.extend(decoded)
|
138
137
|
|
@@ -32,14 +32,14 @@ class FilmMakinesi(PluginBase):
|
|
32
32
|
istek = await self.oturum.get(url)
|
33
33
|
secici = Selector(istek.text)
|
34
34
|
|
35
|
-
title = secici.css("h1.single_h1 a::text").get(
|
36
|
-
poster = secici.css("[property='og:image']::attr(content)").get(
|
37
|
-
description = secici.css("section#film_single article p:last-of-type::text").get(
|
38
|
-
tags = secici.css("dt:contains('Tür:') + dd a::text").get(
|
39
|
-
rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get(
|
40
|
-
year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get(
|
41
|
-
actors = secici.css("dt:contains('Oyuncular:') + dd::text").get(
|
42
|
-
duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get(
|
35
|
+
title = secici.css("h1.single_h1 a::text").get().strip()
|
36
|
+
poster = secici.css("[property='og:image']::attr(content)").get().strip()
|
37
|
+
description = secici.css("section#film_single article p:last-of-type::text").get().strip()
|
38
|
+
tags = secici.css("dt:contains('Tür:') + dd a::text").get().strip()
|
39
|
+
rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get().strip()
|
40
|
+
year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get().strip()
|
41
|
+
actors = secici.css("dt:contains('Oyuncular:') + dd::text").get().strip()
|
42
|
+
duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get().strip()
|
43
43
|
|
44
44
|
duration_minutes = 0
|
45
45
|
if duration and duration.startswith("PT") and duration.endswith("M"):
|
KekikStream/Plugins/UgurFilm.py
CHANGED
@@ -32,9 +32,9 @@ class UgurFilm(PluginBase):
|
|
32
32
|
istek = await self.oturum.get(url)
|
33
33
|
secici = Selector(istek.text)
|
34
34
|
|
35
|
-
title = secici.css("div.bilgi h2::text").get(
|
36
|
-
poster = secici.css("div.resim img::attr(src)").get(
|
37
|
-
description = secici.css("div.slayt-aciklama::text").get(
|
35
|
+
title = secici.css("div.bilgi h2::text").get().strip()
|
36
|
+
poster = secici.css("div.resim img::attr(src)").get().strip()
|
37
|
+
description = secici.css("div.slayt-aciklama::text").get().strip()
|
38
38
|
tags = secici.css("p.tur a[href*='/category/']::text").getall()
|
39
39
|
year = secici.css("a[href*='/yil/']::text").re_first(r"\d+")
|
40
40
|
actors = [actor.css("span::text").get() for actor in secici.css("li.oyuncu-k")]
|
KekikStream/__init__.py
CHANGED
@@ -239,19 +239,17 @@ class KekikStream:
|
|
239
239
|
for res in results
|
240
240
|
]
|
241
241
|
|
242
|
-
|
242
|
+
return await self.ui_manager.select_from_fuzzy(
|
243
243
|
message = "Arama sonuçlarından bir içerik seçin:",
|
244
244
|
choices = choices
|
245
245
|
)
|
246
246
|
|
247
|
-
|
248
|
-
|
249
|
-
from .CLI import check_and_update_package
|
247
|
+
from .CLI import pypi_kontrol_guncelle
|
250
248
|
|
251
249
|
def basla():
|
252
250
|
try:
|
253
251
|
konsol.print("[bold cyan]Güncelleme kontrol ediliyor...[/bold cyan]")
|
254
|
-
|
252
|
+
pypi_kontrol_guncelle("KekikStream")
|
255
253
|
|
256
254
|
app = KekikStream()
|
257
255
|
run(app.run())
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.3
|
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
|
@@ -0,0 +1,56 @@
|
|
1
|
+
KekikStream/__init__.py,sha256=nzsNRqo1iXjS_rqf7Ct8cC7TPjcTofZcpYZ3FlDC0Zs,10354
|
2
|
+
KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
|
3
|
+
KekikStream/requirements.txt,sha256=gS_TUUQx5A7FUmRGxj2dQedxheD7qA6AswdUb2y_Ub8,70
|
4
|
+
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
5
|
+
KekikStream/CLI/pypi_kontrol.py,sha256=K5EPhpAu4XYqhFsXKK27mUoiN7iiFRktR43XZmYKzzM,1423
|
6
|
+
KekikStream/Core/ExtractorBase.py,sha256=-3jadehq2wIa4jwwn38ojkGHay2qAYgweSYIBqVGwNU,1068
|
7
|
+
KekikStream/Core/ExtractorLoader.py,sha256=rrll3F2CyVmx3foa57PG0FocQMrFuMpdlG0Uf0-2Fz4,3915
|
8
|
+
KekikStream/Core/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSEtOPlc0,456
|
9
|
+
KekikStream/Core/MediaHandler.py,sha256=hEnJpLAAMRDhFda4k8iaZlApFysZLxIHU-6Wfy4zK0A,3253
|
10
|
+
KekikStream/Core/PluginBase.py,sha256=ZQx6adxOKuX50TPN5pxE8oG9FD-ZjPXSHpSiW086QPQ,2479
|
11
|
+
KekikStream/Core/PluginLoader.py,sha256=4gucz-9RKIGYiwvcvxqHNf4NVRGVwEj9sg1rKX3LZ58,2584
|
12
|
+
KekikStream/Core/PluginModels.py,sha256=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
|
13
|
+
KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
|
14
|
+
KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
|
15
|
+
KekikStream/Extractors/ContentX.py,sha256=0u2Tz80q_k6deLb9t4Q8uYabj_uWFfFftRnbpRL84dU,2945
|
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
|
21
|
+
KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
|
22
|
+
KekikStream/Extractors/MixPlayHD.py,sha256=pfqtbrSz4JbEFROcCLhfZ-24XuV9KsQQZ6-ALhm53KU,1538
|
23
|
+
KekikStream/Extractors/Odnoklassniki.py,sha256=N8qPDAoMj8UV3TmFRHNiUng4agjRzIAUkKl0Hk4Ghp0,3559
|
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=c9D2IUYR04nJ6WnRMPIJpUvJ7JDHgDrDe5tSVdPbKSc,2082
|
27
|
+
KekikStream/Extractors/Pichive.py,sha256=BSVYFwL3Ax6yGoS1WkpOWtngxNyuZLoKzpPwjibpu2s,221
|
28
|
+
KekikStream/Extractors/PixelDrain.py,sha256=1kf1kKKxcYwLVPo_8Fg1Za3E2kOplqqVFM41xBT52KY,992
|
29
|
+
KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
|
30
|
+
KekikStream/Extractors/RapidVid.py,sha256=MEffqeSsg6RK-KAWtNOXEw99LVisXgM-obQo8rKE-Ls,2353
|
31
|
+
KekikStream/Extractors/SibNet.py,sha256=Jrl93OdKwEhssG348-F2BKaj-XUS7v-Qw3dKMh_ZMRQ,878
|
32
|
+
KekikStream/Extractors/Sobreatsesuyp.py,sha256=MZTdRPx1i4O56pL3Q2QfakCHTUQ1v2lBN6ek-MkgsDw,1941
|
33
|
+
KekikStream/Extractors/TRsTX.py,sha256=KxcQsJ-sby90DdS1HtE-pQ0VygolvJUwp_192NWvQV0,2093
|
34
|
+
KekikStream/Extractors/TauVideo.py,sha256=ID-QwdPnl62wTECSzTFA8Z0P7Rv9LELd6xdvBz5ALiQ,1018
|
35
|
+
KekikStream/Extractors/TurboImgz.py,sha256=VXx9vZZRTdQiVNER0LcXm2nsv2OaXnxuPpslG-sEKD0,826
|
36
|
+
KekikStream/Extractors/VidMoly.py,sha256=m8a_doZiTYaTQTevAQ1mJh7LogYK9uWRIsoa841Zfx8,3350
|
37
|
+
KekikStream/Extractors/VidMoxy.py,sha256=_K6BA7Uo59DA3ty_tsayCUZjXmRoDBTghekVNXiuZ7g,1800
|
38
|
+
KekikStream/Extractors/VideoSeyred.py,sha256=FCTVKeQfivklVRljymg7CkdHR_FQgB9zHN-p3Diphfw,1764
|
39
|
+
KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
|
40
|
+
KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
|
41
|
+
KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
|
42
|
+
KekikStream/Managers/UIManager.py,sha256=OrGxzbhRPTCqiLEXjipLb8ChF7saV3fvFIUXLKT9w6Q,1612
|
43
|
+
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
44
|
+
KekikStream/Plugins/DiziBox.py,sha256=RXw83392Nv-1F1wBC60fEakxo87CQP0CAuEhBNZoRig,5722
|
45
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=rz8TQeL41PJbeEmksgPHIhp6J-4vbSCBTeEH0ukExz4,2822
|
46
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
|
47
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
|
48
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
49
|
+
KekikStream/Plugins/SineWix.py,sha256=ZtcIwPW0ONGkSjT7Ye8b71RWdHZMUZefX-JTWu6uGSs,4854
|
50
|
+
KekikStream/Plugins/UgurFilm.py,sha256=yYXee5uxwNnPqFJZ6s6cRkmUyqS3Vv8x-iesPalc4j4,2930
|
51
|
+
KekikStream-0.3.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
52
|
+
KekikStream-0.3.3.dist-info/METADATA,sha256=Mmln1g9uoz9U-N5qGAZ_w26MHGhhWElLZNhqv9HFuyU,3987
|
53
|
+
KekikStream-0.3.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
54
|
+
KekikStream-0.3.3.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
55
|
+
KekikStream-0.3.3.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
56
|
+
KekikStream-0.3.3.dist-info/RECORD,,
|
KekikStream/CLI/check_update.py
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
-
|
3
|
-
from . import konsol
|
4
|
-
from rich.panel import Panel
|
5
|
-
from pkg_resources import get_distribution
|
6
|
-
from requests import get
|
7
|
-
from subprocess import check_call
|
8
|
-
import sys
|
9
|
-
|
10
|
-
def check_and_update_package(package_name: str):
|
11
|
-
"""Paketi kontrol et ve gerekirse güncelle."""
|
12
|
-
try:
|
13
|
-
# Mevcut sürümü al
|
14
|
-
current_version = get_distribution(package_name).version
|
15
|
-
konsol.print(Panel(f"[cyan]Yüklü sürüm:[/cyan] [bold yellow]{current_version}[/bold yellow]"))
|
16
|
-
|
17
|
-
# PyPI'den en son sürümü al
|
18
|
-
response = get(f"https://pypi.org/pypi/{package_name}/json")
|
19
|
-
if response.status_code == 200:
|
20
|
-
latest_version = response.json()["info"]["version"]
|
21
|
-
konsol.print(Panel(f"[cyan]En son sürüm:[/cyan] [bold green]{latest_version}[/bold green]"))
|
22
|
-
|
23
|
-
# Eğer güncel değilse güncelle
|
24
|
-
if current_version != latest_version:
|
25
|
-
konsol.print(f"[bold red]{package_name} güncelleniyor...[/bold red]")
|
26
|
-
check_call([sys.executable, "-m", "pip", "install", "--upgrade", package_name, "--break-system-packages"])
|
27
|
-
konsol.print(f"[bold green]{package_name} güncellendi![/bold green]")
|
28
|
-
else:
|
29
|
-
konsol.print(f"[bold green]{package_name} zaten güncel.[/bold green]")
|
30
|
-
else:
|
31
|
-
konsol.print("[bold red]PyPI'ye erişilemiyor. Güncelleme kontrolü atlanıyor.[/bold red]")
|
32
|
-
except Exception as e:
|
33
|
-
konsol.print(f"[bold red]Güncelleme kontrolü sırasında hata oluştu: {e}[/bold red]")
|
@@ -1,56 +0,0 @@
|
|
1
|
-
KekikStream/__init__.py,sha256=S2TTJyUscAT3AZJ8Kowe3U8HcbOxM2rcUpm7s40TRJs,10403
|
2
|
-
KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
|
3
|
-
KekikStream/requirements.txt,sha256=gS_TUUQx5A7FUmRGxj2dQedxheD7qA6AswdUb2y_Ub8,70
|
4
|
-
KekikStream/CLI/__init__.py,sha256=9YlF135BVff85y492hX4sq2WY2CNqa4BuVzF9hIIaKE,233
|
5
|
-
KekikStream/CLI/check_update.py,sha256=rOa16bO9sGN-p78yaTRaccFoNfhHWEfDgGZNavpcwNI,1642
|
6
|
-
KekikStream/Core/ExtractorBase.py,sha256=SPXKZPfpzvgkJeMds-USzgpm8-qb0vgZjjLDs58NfGU,1069
|
7
|
-
KekikStream/Core/ExtractorLoader.py,sha256=1S0XaZDJnpFX9dUC4eoqRXx9la6Nlxk6EemJvvSknPA,3921
|
8
|
-
KekikStream/Core/ExtractorModels.py,sha256=vJeh4qd05K7nbqdCCGU29UkGQpce6jXfsCm7LuDL1G8,454
|
9
|
-
KekikStream/Core/MediaHandler.py,sha256=6n83qnM9C38xC4dp1Z8IjLM7gCBbuO84NYn78zeXbZE,3259
|
10
|
-
KekikStream/Core/PluginBase.py,sha256=44sJRS8LqkOo0Ul7lE8R4A464wxyym4UplqkpMUJXqY,2511
|
11
|
-
KekikStream/Core/PluginLoader.py,sha256=og5EPfnVqrb2kUkeGU65AY0fU43IbiUo_h3ix6ZiINY,2596
|
12
|
-
KekikStream/Core/PluginModels.py,sha256=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
|
13
|
-
KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
|
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
|
21
|
-
KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
|
22
|
-
KekikStream/Extractors/MixPlayHD.py,sha256=4sSHingB3gquakFesnbC0LmkJZWW2Jvv5F4kOdo58tA,1528
|
23
|
-
KekikStream/Extractors/Odnoklassniki.py,sha256=xt8gWi750ykkWVkFiP6o7HQc-0RwrSx1FxxuoNUU-Js,3765
|
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
|
28
|
-
KekikStream/Extractors/PixelDrain.py,sha256=JLNaTdFJfXj5ExB_OjjyjwBZBD_gCOmL3fO_TWbHe90,998
|
29
|
-
KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
|
30
|
-
KekikStream/Extractors/RapidVid.py,sha256=HmSXDWhE1EXZRhNCxrqqEBbyJKbqFtTFRtq-zYg3G2c,2430
|
31
|
-
KekikStream/Extractors/SibNet.py,sha256=w0Rv1cYB_Ho6M9Aho9n38Thp6mAfKPNe-eKFC_DbGuE,884
|
32
|
-
KekikStream/Extractors/Sobreatsesuyp.py,sha256=7JUbqHLMWFkHuzH3NG2ogaV53e9fUmGvAr7h83yRtxs,1953
|
33
|
-
KekikStream/Extractors/TRsTX.py,sha256=jhPcQq7KPxL0SPvEFL4MG7oDXDpBbt6Qh8vRJ_bLQMU,2105
|
34
|
-
KekikStream/Extractors/TauVideo.py,sha256=bBjrZFSi4QqSJhRB0sDWMA0Saio-zpoAb6Ss4QZmBeY,1045
|
35
|
-
KekikStream/Extractors/TurboImgz.py,sha256=0d9t6bj4prVt1_LIbzwcfuqrSRB7SMvc4RKvE25BtW4,851
|
36
|
-
KekikStream/Extractors/VidMoly.py,sha256=uzYArLNLTI8mZpMsOABWUOhJtT3FaY6GBrDnQ3Oyl90,3424
|
37
|
-
KekikStream/Extractors/VidMoxy.py,sha256=UnVrCEI4XNiONE2aLV9dGUhRqQ9ELJTnYVXyG81N11A,1800
|
38
|
-
KekikStream/Extractors/VideoSeyred.py,sha256=Sx1qHNBMboGgU_bXHVgx3MlxtyKpR_LBJIQWX3nKxb4,1937
|
39
|
-
KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
|
40
|
-
KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
|
41
|
-
KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
|
42
|
-
KekikStream/Managers/UIManager.py,sha256=OrGxzbhRPTCqiLEXjipLb8ChF7saV3fvFIUXLKT9w6Q,1612
|
43
|
-
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
44
|
-
KekikStream/Plugins/DiziBox.py,sha256=9iCAnHsbNdoz08CHrT_aBZiyj8j6THoXvwHGd3ikrMo,5791
|
45
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=g4LRDP5Atn97PqbgnEdm0-wjVdXaJIVk1Ru0F8B66Ws,2902
|
46
|
-
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
|
47
|
-
KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
|
48
|
-
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
49
|
-
KekikStream/Plugins/SineWix.py,sha256=ZtcIwPW0ONGkSjT7Ye8b71RWdHZMUZefX-JTWu6uGSs,4854
|
50
|
-
KekikStream/Plugins/UgurFilm.py,sha256=U7ryNWpjSZJWuYlMGX1Be9uuyiM3SfuI9VJcEiXedNs,2960
|
51
|
-
KekikStream-0.3.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
52
|
-
KekikStream-0.3.2.dist-info/METADATA,sha256=ZRDMx0m7PJl83lq61EERHlJR6U6TlB1Y6u0MFLhxtAo,3987
|
53
|
-
KekikStream-0.3.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
54
|
-
KekikStream-0.3.2.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
55
|
-
KekikStream-0.3.2.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
56
|
-
KekikStream-0.3.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|