KekikStream 0.4.7__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.
@@ -59,14 +59,8 @@ class MediaHandler:
59
59
  if self.title:
60
60
  mpv_command.append(f"--force-media-title={self.title}")
61
61
 
62
- if "User-Agent" in self.headers:
63
- mpv_command.append(f"--http-header-fields=User-Agent: {self.headers.get('User-Agent')}")
64
-
65
- if "Referer" in self.headers:
66
- mpv_command.append(f"--http-header-fields=Referer: {self.headers.get('Referer')}")
67
-
68
- if "Cookie" in self.headers:
69
- mpv_command.append(f"--http-header-fields=Cookie: {self.headers.get('Cookie')}")
62
+ for key, value in self.headers.items():
63
+ mpv_command.append(f"--http-header-fields={key}: {value}")
70
64
 
71
65
  mpv_command.extend(
72
66
  f"--sub-file={subtitle.url}" for subtitle in extract_data.subtitles
@@ -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 convert_tags(cls, value):
28
+ def convert_lists(cls, value):
29
29
  return ", ".join(value) if isinstance(value, list) else value
30
30
 
31
- @field_validator("actors", mode="before")
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 convert_actors(cls, value):
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
@@ -41,6 +41,9 @@ class UIManager:
41
41
  continue
42
42
 
43
43
  if value:
44
+ if '",' in value:
45
+ continue
46
+
44
47
  table.add_row(f"[bold cyan]{key.capitalize()}[/bold cyan]", str(value))
45
48
 
46
49
  konsol.print(Panel(table, title=f"[bold green]{plugin_name}[/bold green]", expand=False))
@@ -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
- medya_bilgi = await self.suanki_eklenti.load_item(url)
139
- break
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.4.7
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=18tJQJjoRtYO_nUVLylJRPQ_zctn7VdUF-O67zty-kc,10849
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
@@ -6,10 +6,10 @@ KekikStream/CLI/pypi_kontrol.py,sha256=MchatOwCWCpFBtgt09yag9Rjal9XFyh2W_oVs2p7S
6
6
  KekikStream/Core/ExtractorBase.py,sha256=wmGl-Xiem4s5M7baVOxYLba7UdygCDAXggo6Up8pFJE,1409
7
7
  KekikStream/Core/ExtractorLoader.py,sha256=rrll3F2CyVmx3foa57PG0FocQMrFuMpdlG0Uf0-2Fz4,3915
8
8
  KekikStream/Core/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSEtOPlc0,456
9
- KekikStream/Core/MediaHandler.py,sha256=u017_oRe5ZIWSTvXEZQqekI47vs4PiwBW0jHkGYAhG8,4821
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=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
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=OrGxzbhRPTCqiLEXjipLb8ChF7saV3fvFIUXLKT9w6Q,1612
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.4.7.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
53
- KekikStream-0.4.7.dist-info/METADATA,sha256=aISEL7PU7DmX1pXHOVwT9iMlP0986UP-mjRLcEZvoMk,3987
54
- KekikStream-0.4.7.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
55
- KekikStream-0.4.7.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
56
- KekikStream-0.4.7.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
57
- KekikStream-0.4.7.dist-info/RECORD,,
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,,