KekikStream 1.1.8__tar.gz → 1.1.9__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 (68) hide show
  1. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Plugin/PluginBase.py +10 -4
  2. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Plugin/PluginModels.py +7 -0
  3. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/__init__.py +1 -1
  4. kekikstream-1.1.9/KekikStream/Plugins/HdFilmCehennemi.py +160 -0
  5. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/SineWix.py +41 -2
  6. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream.egg-info/PKG-INFO +1 -1
  7. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream.egg-info/SOURCES.txt +1 -0
  8. {kekikstream-1.1.8 → kekikstream-1.1.9}/PKG-INFO +1 -1
  9. {kekikstream-1.1.8 → kekikstream-1.1.9}/setup.py +1 -1
  10. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/CLI/__init__.py +0 -0
  11. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/CLI/pypi_kontrol.py +0 -0
  12. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  13. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  14. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  15. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  16. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Media/MediaHandler.py +0 -0
  17. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Media/MediaManager.py +0 -0
  18. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  19. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  20. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Core/UI/UIManager.py +0 -0
  21. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/CloseLoad.py +0 -0
  22. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/ContentX.py +0 -0
  23. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/FourCX.py +0 -0
  24. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/FourPichive.py +0 -0
  25. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/FourPlayRu.py +0 -0
  26. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/HDStreamAble.py +0 -0
  27. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/Hotlinger.py +0 -0
  28. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/MailRu.py +0 -0
  29. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/MixPlayHD.py +0 -0
  30. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/MolyStream.py +0 -0
  31. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  32. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  33. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/OkRuSSL.py +0 -0
  34. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  35. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/Pichive.py +0 -0
  36. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/PixelDrain.py +0 -0
  37. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/PlayRu.py +0 -0
  38. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/RapidVid.py +0 -0
  39. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/SibNet.py +0 -0
  40. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  41. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/TRsTX.py +0 -0
  42. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/TauVideo.py +0 -0
  43. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/TurboImgz.py +0 -0
  44. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/VidMoly.py +0 -0
  45. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/VidMolyMe.py +0 -0
  46. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/VidMoxy.py +0 -0
  47. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Extractors/VideoSeyred.py +0 -0
  48. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/DiziBox.py +0 -0
  49. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/DiziYou.py +0 -0
  50. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/Dizilla.py +0 -0
  51. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  52. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  53. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/JetFilmizle.py +0 -0
  54. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/RecTV.py +0 -0
  55. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  56. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/Shorten.py +0 -0
  57. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/Plugins/UgurFilm.py +0 -0
  58. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/__init__.py +0 -0
  59. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/__main__.py +0 -0
  60. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream/requirements.txt +0 -0
  61. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream.egg-info/dependency_links.txt +0 -0
  62. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream.egg-info/entry_points.txt +0 -0
  63. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream.egg-info/requires.txt +0 -0
  64. {kekikstream-1.1.8 → kekikstream-1.1.9}/KekikStream.egg-info/top_level.txt +0 -0
  65. {kekikstream-1.1.8 → kekikstream-1.1.9}/LICENSE +0 -0
  66. {kekikstream-1.1.8 → kekikstream-1.1.9}/MANIFEST.in +0 -0
  67. {kekikstream-1.1.8 → kekikstream-1.1.9}/README.md +0 -0
  68. {kekikstream-1.1.8 → kekikstream-1.1.9}/setup.cfg +0 -0
@@ -3,15 +3,16 @@
3
3
  from abc import ABC, abstractmethod
4
4
  from httpx import AsyncClient, Timeout
5
5
  from cloudscraper import CloudScraper
6
- from .PluginModels import SearchResult, MovieInfo
6
+ from .PluginModels import MainPageResult, SearchResult, MovieInfo
7
7
  from ..Media.MediaHandler import MediaHandler
8
8
  from urllib.parse import urljoin
9
9
  import re
10
10
 
11
11
  class PluginBase(ABC):
12
- name = "Plugin"
13
- main_url = "https://example.com"
14
- _data = {}
12
+ name = "Plugin"
13
+ main_url = "https://example.com"
14
+ _data = {}
15
+ _main_page = {}
15
16
 
16
17
  def __init__(self):
17
18
  self.oturum = AsyncClient(
@@ -26,6 +27,11 @@ class PluginBase(ABC):
26
27
  self.oturum.headers.update(self.cloudscraper.headers)
27
28
  self.oturum.cookies.update(self.cloudscraper.cookies)
28
29
 
30
+ @abstractmethod
31
+ async def main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
32
+ """Ana sayfadaki popüler içerikleri döndürür."""
33
+ pass
34
+
29
35
  @abstractmethod
30
36
  async def search(self, query: str) -> list[SearchResult]:
31
37
  """Kullanıcı arama sorgusuna göre sonuç döndürür."""
@@ -3,6 +3,13 @@
3
3
  from pydantic import BaseModel, field_validator, model_validator
4
4
  from typing import List, Optional
5
5
 
6
+ class MainPageResult(BaseModel):
7
+ """Ana sayfa sonucunda dönecek veri modeli."""
8
+ category : str
9
+ title : str
10
+ url : str
11
+ poster : Optional[str] = None
12
+
6
13
 
7
14
  class SearchResult(BaseModel):
8
15
  """Arama sonucunda dönecek veri modeli."""
@@ -5,7 +5,7 @@ from .UI.UIManager import UIManager
5
5
  from .Plugin.PluginManager import PluginManager
6
6
  from .Plugin.PluginBase import PluginBase
7
7
  from .Plugin.PluginLoader import PluginLoader
8
- from .Plugin.PluginModels import SearchResult, MovieInfo, Episode, SeriesInfo
8
+ from .Plugin.PluginModels import MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo
9
9
 
10
10
  from .Extractor.ExtractorManager import ExtractorManager
11
11
  from .Extractor.ExtractorBase import ExtractorBase
@@ -0,0 +1,160 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, SearchResult, MovieInfo, ExtractResult, Subtitle
4
+ from Kekik.Sifreleme import Packer, HexCodec
5
+ from parsel import Selector
6
+ import re, base64, random, string
7
+
8
+ class HdFilmCehennemi(PluginBase):
9
+ name = "HdFilmCehennemi"
10
+ main_url = "https://www.hdfilmcehennemi.nl"
11
+
12
+
13
+ async def search(self, query: str) -> list[SearchResult]:
14
+ istek = await self.oturum.get(
15
+ url = f"{self.main_url}/search?q={query}",
16
+ headers = {"Referer": f"{self.main_url}/", "X-Requested-With": "fetch", "authority": f"{self.main_url}"}
17
+ )
18
+
19
+ secici = Selector(istek.text)
20
+
21
+ results = []
22
+ for veri in istek.json().get("results"):
23
+ secici = Selector(veri)
24
+ title = secici.css("h4.title::text").get()
25
+ href = secici.css("a::attr(href)").get()
26
+ poster = secici.css("img::attr(data-src)").get() or secici.css("img::attr(src)").get()
27
+
28
+ if title and href:
29
+ results.append(
30
+ SearchResult(
31
+ title = title.strip(),
32
+ url = self.fix_url(href.strip()),
33
+ poster = self.fix_url(poster.strip()) if poster else None,
34
+ )
35
+ )
36
+
37
+ return results
38
+
39
+ async def load_item(self, url: str) -> MovieInfo:
40
+ istek = await self.oturum.get(url, headers = {"Referer": f"{self.main_url}/"})
41
+ secici = Selector(istek.text)
42
+
43
+ title = secici.css("h1.section-title::text").get().strip()
44
+ poster = secici.css("aside.post-info-poster img.lazyload::attr(data-src)").get().strip()
45
+ description = secici.css("article.post-info-content > p::text").get().strip()
46
+ tags = secici.css("div.post-info-genres a::text").getall()
47
+ rating = secici.css("div.post-info-imdb-rating span::text").get().strip()
48
+ year = secici.css("div.post-info-year-country a::text").get().strip()
49
+ actors = secici.css("div.post-info-cast a > strong::text").getall()
50
+ duration = secici.css("div.post-info-duration::text").get().replace("dakika", "").strip()
51
+
52
+ duration_minutes = 0
53
+ try:
54
+ duration_minutes = int(duration[2:-1])
55
+ except Exception as ex:
56
+ pass
57
+
58
+ return MovieInfo(
59
+ url = url,
60
+ poster = self.fix_url(poster),
61
+ title = title,
62
+ description = description,
63
+ tags = tags,
64
+ rating = rating,
65
+ year = year,
66
+ actors = actors,
67
+ duration = duration_minutes
68
+ )
69
+
70
+ def generate_random_cookie(self):
71
+ return ''.join(random.choices(string.ascii_letters + string.digits, k=16))
72
+
73
+ async def load_links(self, url: str) -> list[str]:
74
+ self._data.clear()
75
+
76
+ istek = await self.oturum.get(url)
77
+ secici = Selector(istek.text)
78
+
79
+ lang_code = secici.css("div.alternative-links::attr(data-lang)").get().upper()
80
+ buttons = secici.css("div.alternative-links > button")
81
+
82
+ link_list = []
83
+
84
+ for button in buttons:
85
+ source = button.css("button.alternative-link::text").get().replace("(HDrip Xbet)", "").strip() + " " + lang_code
86
+ video_id = button.css("button.alternative-link::attr(data-video)").get()
87
+
88
+ istek = await self.oturum.get(
89
+ url = f"{self.main_url}/video/{video_id}/",
90
+ headers = {"Referer": f"{self.main_url}/",
91
+ "X-Requested-With": "fetch",
92
+ "authority": f"{self.main_url}"}
93
+ )
94
+
95
+ data = istek.json().get("data")
96
+ secici = Selector(data["html"])
97
+ iframe_url = secici.css("iframe::attr(src)").get() or secici.css("iframe::attr(data-src)").get()
98
+
99
+ if "?rapidrame_id=" in iframe_url:
100
+ # https://hdfilmcehennemi.mobi/video/embed/uQcCR9nhaNz/?rapidrame_id=j4b4kvc0s24l\
101
+ video_id = iframe_url.split('=')[1]
102
+ else:
103
+ # https://www.hdfilmcehennemi.nl/rplayer/j4b4kvc0s24l/
104
+ video_id = iframe_url.split('/')[-1]
105
+
106
+ print(video_id)
107
+ if(video_id):
108
+ break
109
+
110
+ # selected_quality: low
111
+ random_cookie = self.generate_random_cookie()
112
+ istek = await self.oturum.post(
113
+ url = f"https://cehennempass.pw/process_quality_selection.php",
114
+ headers = {"Referer": f"https://cehennempass.pw/download/{video_id}",
115
+ "X-Requested-With": "fetch",
116
+ "authority": "cehennempass.pw",
117
+ 'Cookie': f'PHPSESSID={random_cookie}'},
118
+ data = {"video_id": video_id, "selected_quality": "low"},
119
+ )
120
+
121
+ video_url = istek.json().get("download_link")
122
+ # print(video_url)
123
+
124
+ self._data[self.fix_url(video_url)] = {
125
+ "ext_name" : self.name,
126
+ "name" : "Düşük Kalite",
127
+ "referer" : f"https://cehennempass.pw/download/{video_id}",
128
+ "subtitles" : []
129
+ }
130
+
131
+ # selected_quality: high
132
+ random_cookie = self.generate_random_cookie()
133
+ istek = await self.oturum.post(
134
+ url = f"https://cehennempass.pw/process_quality_selection.php",
135
+ headers = {"Referer": f"https://cehennempass.pw/download/{video_id}",
136
+ "X-Requested-With": "fetch",
137
+ "authority": "cehennempass.pw",
138
+ 'Cookie': f'PHPSESSID={random_cookie}'},
139
+ data = {"video_id": video_id, "selected_quality": "high"},
140
+ )
141
+
142
+ video_url = istek.json().get("download_link")
143
+ # print(video_url)
144
+
145
+ self._data[self.fix_url(video_url)] = {
146
+ "ext_name" : self.name,
147
+ "name" : "Yüksek Kalite",
148
+ "referer" : f"https://cehennempass.pw/download/{video_id}",
149
+ "subtitles" : []
150
+ }
151
+
152
+ return list(self._data.keys())
153
+
154
+ async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
155
+ extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
156
+ self.media_handler.title = name
157
+ if self.name not in self.media_handler.title:
158
+ self.media_handler.title = f"{self.name} | {self.media_handler.title}"
159
+
160
+ self.media_handler.play_media(extract_result)
@@ -1,11 +1,50 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
4
4
 
5
5
  class SineWix(PluginBase):
6
6
  name = "SineWix"
7
7
  main_url = "https://ythls.kekikakademi.org"
8
8
 
9
+ _main_page = {
10
+ f"{main_url}/sinewix/movies" : "Filmler",
11
+ f"{main_url}/sinewix/series" : "Diziler",
12
+ f"{main_url}/sinewix/animes" : "Animeler",
13
+ f"{main_url}/sinewix/movies/10751" : "Aile",
14
+ f"{main_url}/sinewix/movies/28" : "Aksiyon",
15
+ f"{main_url}/sinewix/movies/16" : "Animasyon",
16
+ f"{main_url}/sinewix/movies/99" : "Belgesel",
17
+ f"{main_url}/sinewix/movies/10765" : "Bilim Kurgu & Fantazi",
18
+ f"{main_url}/sinewix/movies/878" : "Bilim-Kurgu",
19
+ f"{main_url}/sinewix/movies/18" : "Dram",
20
+ f"{main_url}/sinewix/movies/14" : "Fantastik",
21
+ f"{main_url}/sinewix/movies/53" : "Gerilim",
22
+ f"{main_url}/sinewix/movies/9648" : "Gizem",
23
+ f"{main_url}/sinewix/movies/35" : "Komedi",
24
+ f"{main_url}/sinewix/movies/27" : "Korku",
25
+ f"{main_url}/sinewix/movies/12" : "Macera",
26
+ f"{main_url}/sinewix/movies/10402" : "Müzik",
27
+ f"{main_url}/sinewix/movies/10749" : "Romantik",
28
+ f"{main_url}/sinewix/movies/10752" : "Savaş",
29
+ f"{main_url}/sinewix/movies/80" : "Suç",
30
+ f"{main_url}/sinewix/movies/10770" : "TV film",
31
+ f"{main_url}/sinewix/movies/36" : "Tarih",
32
+ }
33
+
34
+ async def main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
35
+ istek = await self.oturum.get(f"{url}/{page}")
36
+ veriler = istek.json()
37
+
38
+ return [
39
+ MainPageResult(
40
+ category = category,
41
+ title = veri.get("title"),
42
+ url = f"?type={veri.get('type')}&id={veri.get('id')}",
43
+ poster = self.fix_url(veri.get("poster_path")),
44
+ )
45
+ for veri in veriler.get("data")
46
+ ]
47
+
9
48
  async def search(self, query: str) -> list[SearchResult]:
10
49
  istek = await self.oturum.get(f"{self.main_url}/sinewix/search/{query}")
11
50
 
@@ -18,7 +57,7 @@ class SineWix(PluginBase):
18
57
  for veri in istek.json().get("search")
19
58
  ]
20
59
 
21
- async def load_item(self, url: str) -> MovieInfo:
60
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
22
61
  item_type = url.split("?type=")[-1].split("&id=")[0]
23
62
  item_id = url.split("&id=")[-1]
24
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.1.8
3
+ Version: 1.1.9
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
@@ -57,6 +57,7 @@ KekikStream/Plugins/DiziYou.py
57
57
  KekikStream/Plugins/Dizilla.py
58
58
  KekikStream/Plugins/FilmMakinesi.py
59
59
  KekikStream/Plugins/FullHDFilmizlesene.py
60
+ KekikStream/Plugins/HdFilmCehennemi.py
60
61
  KekikStream/Plugins/JetFilmizle.py
61
62
  KekikStream/Plugins/RecTV.py
62
63
  KekikStream/Plugins/SezonlukDizi.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.1.8
3
+ Version: 1.1.9
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
@@ -6,7 +6,7 @@ from io import open
6
6
  setup(
7
7
  # ? Genel Bilgiler
8
8
  name = "KekikStream",
9
- version = "1.1.8",
9
+ version = "1.1.9",
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"],
File without changes
File without changes
File without changes
File without changes