KekikStream 0.4.8__tar.gz → 0.5.1__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.
Files changed (64) hide show
  1. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/PluginModels.py +6 -16
  2. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Managers/UIManager.py +3 -0
  3. kekikstream-0.5.1/KekikStream/Plugins/RecTV.py +111 -0
  4. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/__init__.py +2 -2
  5. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/requirements.txt +1 -1
  6. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream.egg-info/PKG-INFO +2 -2
  7. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream.egg-info/SOURCES.txt +1 -0
  8. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream.egg-info/requires.txt +1 -1
  9. {kekikstream-0.4.8 → kekikstream-0.5.1}/PKG-INFO +2 -2
  10. {kekikstream-0.4.8 → kekikstream-0.5.1}/setup.py +2 -2
  11. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/CLI/__init__.py +0 -0
  12. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/CLI/pypi_kontrol.py +0 -0
  13. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/ExtractorBase.py +0 -0
  14. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/ExtractorLoader.py +0 -0
  15. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/ExtractorModels.py +0 -0
  16. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/MediaHandler.py +0 -0
  17. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/PluginBase.py +0 -0
  18. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/PluginLoader.py +0 -0
  19. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Core/__init__.py +0 -0
  20. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/CloseLoad.py +0 -0
  21. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/ContentX.py +0 -0
  22. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/FourCX.py +0 -0
  23. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/FourPichive.py +0 -0
  24. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/FourPlayRu.py +0 -0
  25. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/HDStreamAble.py +0 -0
  26. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/Hotlinger.py +0 -0
  27. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/MailRu.py +0 -0
  28. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/MixPlayHD.py +0 -0
  29. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  30. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  31. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/OkRuSSL.py +0 -0
  32. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  33. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/Pichive.py +0 -0
  34. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/PixelDrain.py +0 -0
  35. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/PlayRu.py +0 -0
  36. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/RapidVid.py +0 -0
  37. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/SibNet.py +0 -0
  38. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  39. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/TRsTX.py +0 -0
  40. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/TauVideo.py +0 -0
  41. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/TurboImgz.py +0 -0
  42. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/VidMoly.py +0 -0
  43. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/VidMoxy.py +0 -0
  44. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Extractors/VideoSeyred.py +0 -0
  45. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Managers/ExtractorManager.py +0 -0
  46. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Managers/MediaManager.py +0 -0
  47. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Managers/PluginManager.py +0 -0
  48. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Managers/__init__.py +0 -0
  49. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/DiziBox.py +0 -0
  50. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/Dizilla.py +0 -0
  51. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  52. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  53. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/JetFilmizle.py +0 -0
  54. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  55. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/SineWix.py +0 -0
  56. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/Plugins/UgurFilm.py +0 -0
  57. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream/__main__.py +0 -0
  58. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream.egg-info/dependency_links.txt +0 -0
  59. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream.egg-info/entry_points.txt +0 -0
  60. {kekikstream-0.4.8 → kekikstream-0.5.1}/KekikStream.egg-info/top_level.txt +0 -0
  61. {kekikstream-0.4.8 → kekikstream-0.5.1}/LICENSE +0 -0
  62. {kekikstream-0.4.8 → kekikstream-0.5.1}/MANIFEST.in +0 -0
  63. {kekikstream-0.4.8 → kekikstream-0.5.1}/README.md +0 -0
  64. {kekikstream-0.4.8 → kekikstream-0.5.1}/setup.cfg +0 -0
@@ -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)
@@ -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()
@@ -2,7 +2,7 @@ setuptools
2
2
  wheel
3
3
 
4
4
  Kekik
5
- httpx
5
+ httpx[http2]
6
6
  cloudscraper
7
7
  parsel
8
8
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: KekikStream
3
- Version: 0.4.8
3
+ Version: 0.5.1
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
@@ -16,7 +16,7 @@ License-File: LICENSE
16
16
  Requires-Dist: setuptools
17
17
  Requires-Dist: wheel
18
18
  Requires-Dist: Kekik
19
- Requires-Dist: httpx
19
+ Requires-Dist: httpx[http2]
20
20
  Requires-Dist: cloudscraper
21
21
  Requires-Dist: parsel
22
22
  Requires-Dist: pydantic
@@ -56,6 +56,7 @@ KekikStream/Plugins/Dizilla.py
56
56
  KekikStream/Plugins/FilmMakinesi.py
57
57
  KekikStream/Plugins/FullHDFilmizlesene.py
58
58
  KekikStream/Plugins/JetFilmizle.py
59
+ KekikStream/Plugins/RecTV.py
59
60
  KekikStream/Plugins/SezonlukDizi.py
60
61
  KekikStream/Plugins/SineWix.py
61
62
  KekikStream/Plugins/UgurFilm.py
@@ -1,7 +1,7 @@
1
1
  setuptools
2
2
  wheel
3
3
  Kekik
4
- httpx
4
+ httpx[http2]
5
5
  cloudscraper
6
6
  parsel
7
7
  pydantic
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: KekikStream
3
- Version: 0.4.8
3
+ Version: 0.5.1
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
@@ -16,7 +16,7 @@ License-File: LICENSE
16
16
  Requires-Dist: setuptools
17
17
  Requires-Dist: wheel
18
18
  Requires-Dist: Kekik
19
- Requires-Dist: httpx
19
+ Requires-Dist: httpx[http2]
20
20
  Requires-Dist: cloudscraper
21
21
  Requires-Dist: parsel
22
22
  Requires-Dist: pydantic
@@ -6,7 +6,7 @@ from io import open
6
6
  setup(
7
7
  # ? Genel Bilgiler
8
8
  name = "KekikStream",
9
- version = "0.4.8",
9
+ version = "0.5.1",
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"],
@@ -28,7 +28,7 @@ setup(
28
28
  "setuptools",
29
29
  "wheel",
30
30
  "Kekik",
31
- "httpx",
31
+ "httpx[http2]",
32
32
  "cloudscraper",
33
33
  "parsel",
34
34
  "pydantic",
File without changes
File without changes
File without changes
File without changes