KekikStream 0.4.8__py3-none-any.whl → 0.5.0__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/Core/PluginModels.py +6 -16
- KekikStream/Managers/UIManager.py +3 -0
- KekikStream/Plugins/RecTV.py +111 -0
- KekikStream/__init__.py +2 -2
- {KekikStream-0.4.8.dist-info → KekikStream-0.5.0.dist-info}/METADATA +1 -1
- {KekikStream-0.4.8.dist-info → KekikStream-0.5.0.dist-info}/RECORD +10 -9
- {KekikStream-0.4.8.dist-info → KekikStream-0.5.0.dist-info}/LICENSE +0 -0
- {KekikStream-0.4.8.dist-info → KekikStream-0.5.0.dist-info}/WHEEL +0 -0
- {KekikStream-0.4.8.dist-info → KekikStream-0.5.0.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.4.8.dist-info → KekikStream-0.5.0.dist-info}/top_level.txt +0 -0
KekikStream/Core/PluginModels.py
CHANGED
@@ -23,17 +23,12 @@ class MovieInfo(BaseModel):
|
|
23
23
|
actors : Optional[str] = None
|
24
24
|
duration : Optional[int] = None
|
25
25
|
|
26
|
-
@field_validator("tags", mode="before")
|
26
|
+
@field_validator("tags", "actors", mode="before")
|
27
27
|
@classmethod
|
28
|
-
def
|
28
|
+
def convert_lists(cls, value):
|
29
29
|
return ", ".join(value) if isinstance(value, list) else value
|
30
30
|
|
31
|
-
@field_validator("
|
32
|
-
@classmethod
|
33
|
-
def convert_actors(cls, value):
|
34
|
-
return ", ".join(value) if isinstance(value, list) else value
|
35
|
-
|
36
|
-
@field_validator("rating", mode="before")
|
31
|
+
@field_validator("rating", "year", mode="before")
|
37
32
|
@classmethod
|
38
33
|
def ensure_string(cls, value):
|
39
34
|
return str(value) if value is not None else value
|
@@ -57,17 +52,12 @@ class SeriesInfo(BaseModel):
|
|
57
52
|
actors : Optional[str] = None
|
58
53
|
episodes : Optional[List[Episode]] = None
|
59
54
|
|
60
|
-
@field_validator("tags", mode="before")
|
61
|
-
@classmethod
|
62
|
-
def convert_tags(cls, value):
|
63
|
-
return ", ".join(value) if isinstance(value, list) else value
|
64
|
-
|
65
|
-
@field_validator("actors", mode="before")
|
55
|
+
@field_validator("tags", "actors", mode="before")
|
66
56
|
@classmethod
|
67
|
-
def
|
57
|
+
def convert_lists(cls, value):
|
68
58
|
return ", ".join(value) if isinstance(value, list) else value
|
69
59
|
|
70
|
-
@field_validator("rating", mode="before")
|
60
|
+
@field_validator("rating", "year", mode="before")
|
71
61
|
@classmethod
|
72
62
|
def ensure_string(cls, value):
|
73
63
|
return str(value) if value is not None else value
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.CLI import konsol
|
4
|
+
from KekikStream.Core import PluginBase, SearchResult, MovieInfo, Episode, SeriesInfo
|
5
|
+
from KekikStream.Core.ExtractorModels import ExtractResult, Subtitle
|
6
|
+
from httpx import AsyncClient
|
7
|
+
from json import dumps, loads
|
8
|
+
import re
|
9
|
+
|
10
|
+
|
11
|
+
class RecTV(PluginBase):
|
12
|
+
name = "RecTV"
|
13
|
+
main_url = "https://46c02262.delivery.rocketcdn.me"
|
14
|
+
|
15
|
+
sw_key = "4F5A9C3D9A86FA54EACEDDD635185/c3c5bd17-e37b-4b94-a944-8a3688a30452"
|
16
|
+
oturum = AsyncClient(http2=True)
|
17
|
+
oturum.headers.update({"user-agent": "okhttp/4.12.0"})
|
18
|
+
|
19
|
+
async def search(self, query: str) -> list[SearchResult]:
|
20
|
+
istek = await self.oturum.get(f"{self.main_url}/api/search/{query}/{self.sw_key}/")
|
21
|
+
|
22
|
+
kanallar = istek.json().get("channels")
|
23
|
+
kanallar = sorted(kanallar, key=lambda sozluk: sozluk["title"])
|
24
|
+
|
25
|
+
icerikler = istek.json().get("posters")
|
26
|
+
icerikler = sorted(icerikler, key=lambda sozluk: sozluk["title"])
|
27
|
+
|
28
|
+
return [
|
29
|
+
SearchResult(
|
30
|
+
title = veri.get("title"),
|
31
|
+
url = dumps(veri),
|
32
|
+
poster = self.fix_url(veri.get("image")),
|
33
|
+
)
|
34
|
+
for veri in [*kanallar, *icerikler]
|
35
|
+
]
|
36
|
+
|
37
|
+
async def load_item(self, url: str) -> MovieInfo:
|
38
|
+
veri = loads(url)
|
39
|
+
|
40
|
+
match veri.get("type"):
|
41
|
+
case "serie":
|
42
|
+
dizi_istek = await self.oturum.get(f"{self.main_url}/api/season/by/serie/{veri.get('id')}/{self.sw_key}/")
|
43
|
+
dizi_veri = dizi_istek.json()
|
44
|
+
|
45
|
+
episodes = []
|
46
|
+
for season in dizi_veri:
|
47
|
+
for episode in season.get("episodes"):
|
48
|
+
ep_model = Episode(
|
49
|
+
season = int(re.search(r"(\d+)\.S", season.get("title")).group(1)) if re.search(r"(\d+)\.S", season.get("title")) else 1,
|
50
|
+
episode = int(re.search(r"Bölüm (\d+)", episode.get("title")).group(1)) if re.search(r"Bölüm (\d+)", episode.get("title")) else 1,
|
51
|
+
title = episode.get("title"),
|
52
|
+
url = self.fix_url(episode.get("sources")[0].get("url")),
|
53
|
+
)
|
54
|
+
|
55
|
+
episodes.append(ep_model)
|
56
|
+
|
57
|
+
self._data[ep_model.url] = {
|
58
|
+
"name" : f"{veri.get('title')} | {ep_model.season}. Sezon {ep_model.episode}. Bölüm - {ep_model.title}",
|
59
|
+
"referer" : "https://twitter.com/",
|
60
|
+
"subtitles" : []
|
61
|
+
}
|
62
|
+
|
63
|
+
return SeriesInfo(
|
64
|
+
url = url,
|
65
|
+
poster = self.fix_url(veri.get("image")),
|
66
|
+
title = veri.get("title"),
|
67
|
+
description = veri.get("description"),
|
68
|
+
tags = [genre.get("title") for genre in veri.get("genres")] if veri.get("genres") else [],
|
69
|
+
rating = veri.get("imdb") or veri.get("rating"),
|
70
|
+
year = veri.get("year"),
|
71
|
+
actors = [],
|
72
|
+
episodes = episodes
|
73
|
+
)
|
74
|
+
case _:
|
75
|
+
return MovieInfo(
|
76
|
+
url = url,
|
77
|
+
poster = self.fix_url(veri.get("image")),
|
78
|
+
title = veri.get("title"),
|
79
|
+
description = veri.get("description"),
|
80
|
+
tags = [genre.get("title") for genre in veri.get("genres")] if veri.get("genres") else [],
|
81
|
+
rating = veri.get("imdb") or veri.get("rating"),
|
82
|
+
year = veri.get("year"),
|
83
|
+
actors = []
|
84
|
+
)
|
85
|
+
|
86
|
+
async def load_links(self, url: str) -> list[str]:
|
87
|
+
try:
|
88
|
+
veri = loads(url)
|
89
|
+
except Exception:
|
90
|
+
return [url]
|
91
|
+
|
92
|
+
videolar = []
|
93
|
+
if veri.get("sources"):
|
94
|
+
for kaynak in veri.get("sources"):
|
95
|
+
video_link = kaynak.get("url")
|
96
|
+
if "otolinkaff" in video_link:
|
97
|
+
continue
|
98
|
+
|
99
|
+
self._data[video_link] = {
|
100
|
+
"name" : veri.get("title"),
|
101
|
+
"referer" : "https://twitter.com/",
|
102
|
+
"subtitles" : []
|
103
|
+
}
|
104
|
+
videolar.append(video_link)
|
105
|
+
|
106
|
+
return videolar
|
107
|
+
|
108
|
+
async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
|
109
|
+
extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
|
110
|
+
self.media_handler.title = name
|
111
|
+
self.media_handler.play_media(extract_result)
|
KekikStream/__init__.py
CHANGED
@@ -135,8 +135,8 @@ class KekikStream:
|
|
135
135
|
medya_bilgi = None
|
136
136
|
for _ in range(3):
|
137
137
|
with suppress(Exception):
|
138
|
-
|
139
|
-
|
138
|
+
medya_bilgi = await self.suanki_eklenti.load_item(url)
|
139
|
+
break
|
140
140
|
if not medya_bilgi:
|
141
141
|
konsol.print("[bold red]Medya bilgileri yüklenemedi![/bold red]")
|
142
142
|
return await self.sonuc_bulunamadi()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.5.0
|
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=qj5yyeV1jANK-GDuzNXoURWms1lXzjCE3-Gc1p32vyg,10851
|
2
2
|
KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
|
3
3
|
KekikStream/requirements.txt,sha256=gS_TUUQx5A7FUmRGxj2dQedxheD7qA6AswdUb2y_Ub8,70
|
4
4
|
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
@@ -9,7 +9,7 @@ KekikStream/Core/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSE
|
|
9
9
|
KekikStream/Core/MediaHandler.py,sha256=eV0ugdIwxRlWQtgYt--XmfPJP8K9FL1Q0T1d04YUls0,4517
|
10
10
|
KekikStream/Core/PluginBase.py,sha256=ZQx6adxOKuX50TPN5pxE8oG9FD-ZjPXSHpSiW086QPQ,2479
|
11
11
|
KekikStream/Core/PluginLoader.py,sha256=5HQF8Em1TjvqMBPLKB7M_i2y6zPH6JZao-uekeacoSs,2574
|
12
|
-
KekikStream/Core/PluginModels.py,sha256=
|
12
|
+
KekikStream/Core/PluginModels.py,sha256=q8tjkt_-uiJ7uNxOThYR0FgTQLZglVAOAaM0Kske-28,2063
|
13
13
|
KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
|
14
14
|
KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
|
15
15
|
KekikStream/Extractors/ContentX.py,sha256=XPoAuA95LOTgCUGyioXxOFWR0nNKWWOHLkYMlzguIIE,2980
|
@@ -39,19 +39,20 @@ KekikStream/Extractors/VideoSeyred.py,sha256=otyGi1zdY_JPrXJjoZjesCQDiOkxFdaWiXQ
|
|
39
39
|
KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
|
40
40
|
KekikStream/Managers/MediaManager.py,sha256=SPO85LchT7bJKSecmXd1FzCjg0rUT8s3B1wulPa4SMw,519
|
41
41
|
KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
|
42
|
-
KekikStream/Managers/UIManager.py,sha256=
|
42
|
+
KekikStream/Managers/UIManager.py,sha256=_jJSUDCsOvrByw55KdZD0ioE2U2XmTBuw1KIaPpmm6o,1676
|
43
43
|
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
44
44
|
KekikStream/Plugins/DiziBox.py,sha256=ARzsao-r91c3PVV_3-NCLvNcVRSIxjlGdWl_3-1Q6Mo,5722
|
45
45
|
KekikStream/Plugins/Dizilla.py,sha256=D-gQ23rck3UjnYeYSYzokYWVL7lshzEk4vS3qsR_7Tk,3813
|
46
46
|
KekikStream/Plugins/FilmMakinesi.py,sha256=rz8TQeL41PJbeEmksgPHIhp6J-4vbSCBTeEH0ukExz4,2822
|
47
47
|
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=Fa0gRP_NoMfPC8HIKRxERjQVOv8Fyb-ayMJ2EooZ7BE,3080
|
48
48
|
KekikStream/Plugins/JetFilmizle.py,sha256=FXkMSQtjYoxwIonjRENFa91rC42L_8SYRhjhuSgsu60,3919
|
49
|
+
KekikStream/Plugins/RecTV.py,sha256=TvTxpLLmyv5WH1yIlZmyu0BPXorvKVT2e4P_2cho9Kk,4842
|
49
50
|
KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
|
50
51
|
KekikStream/Plugins/SineWix.py,sha256=iBtSl150N3GHWqHJDLVNFDSJff-00PHksQC1h2urR8w,4851
|
51
52
|
KekikStream/Plugins/UgurFilm.py,sha256=yYXee5uxwNnPqFJZ6s6cRkmUyqS3Vv8x-iesPalc4j4,2930
|
52
|
-
KekikStream-0.
|
53
|
-
KekikStream-0.
|
54
|
-
KekikStream-0.
|
55
|
-
KekikStream-0.
|
56
|
-
KekikStream-0.
|
57
|
-
KekikStream-0.
|
53
|
+
KekikStream-0.5.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
54
|
+
KekikStream-0.5.0.dist-info/METADATA,sha256=94quURJVqi08Gcv7m9HxIHKHBQsV_p4o0XHlWR6ckT8,3987
|
55
|
+
KekikStream-0.5.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
56
|
+
KekikStream-0.5.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
57
|
+
KekikStream-0.5.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
58
|
+
KekikStream-0.5.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|