KekikStream 1.1.7__py3-none-any.whl → 1.1.9__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.
@@ -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
@@ -7,7 +7,7 @@ from urllib.parse import urlparse, urlunparse
7
7
 
8
8
  class Dizilla(PluginBase):
9
9
  name = "Dizilla"
10
- main_url = "https://dizilla11.com"
10
+ main_url = "https://dizilla.club"
11
11
 
12
12
  async def search(self, query: str) -> list[SearchResult]:
13
13
  ilk_istek = await self.oturum.get(self.main_url)
@@ -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.7
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
@@ -3,17 +3,17 @@ KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
3
3
  KekikStream/requirements.txt,sha256=QWCXrrmKodIm7mGtIz9cWr9sks-lmL_TilKMrruWJn0,77
4
4
  KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
5
5
  KekikStream/CLI/pypi_kontrol.py,sha256=MchatOwCWCpFBtgt09yag9Rjal9XFyh2W_oVs2p7SNg,1518
6
- KekikStream/Core/__init__.py,sha256=2N0VFP4QsyDWn4pV77JX_5_XachD5qKzhuDor3klj58,657
6
+ KekikStream/Core/__init__.py,sha256=4ykq-DBlbbfjGAd5m2AZfuljTLBFYkI8DPLxV03AAcA,673
7
7
  KekikStream/Core/Extractor/ExtractorBase.py,sha256=ZyasO5m7iAsnh-mwhtlp-VXkZ4pIuWuHvCIskBX7FUg,1726
8
8
  KekikStream/Core/Extractor/ExtractorLoader.py,sha256=ecrfz9mYizlENCjbyfjdfnOrQorxQTF4ZFGhPpU6JHk,4193
9
9
  KekikStream/Core/Extractor/ExtractorManager.py,sha256=4L1H3jiTnf0kTq4W6uS7n95bBYHlKJ8_hh0og8z4erQ,1244
10
10
  KekikStream/Core/Extractor/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSEtOPlc0,456
11
11
  KekikStream/Core/Media/MediaHandler.py,sha256=AJNPTXgxWykfDMyZIyGSjWl3Vp0salT8lKDrfAwaga4,6936
12
12
  KekikStream/Core/Media/MediaManager.py,sha256=9ItiUguOkk3wg3YY5uf3mrjfwLPCvggnP8QviX0uiuE,526
13
- KekikStream/Core/Plugin/PluginBase.py,sha256=KuR89bkrChPAct4-PMjxbK4i6busXMMFeZjv-x4F1CQ,2521
13
+ KekikStream/Core/Plugin/PluginBase.py,sha256=nRAr85DUMx1068a3CS5dIizIXyGh6VtYl6Lx0-zx7VA,2750
14
14
  KekikStream/Core/Plugin/PluginLoader.py,sha256=2UM3gNcEgd7k-FxG-JB5nTIS0K_clzvFtzGjMA_Sx7Q,3379
15
15
  KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
16
- KekikStream/Core/Plugin/PluginModels.py,sha256=M4uZl0rG3tt8xnmDubgTYfxyzTIC5cwEA2Mv5i7Zsqk,2354
16
+ KekikStream/Core/Plugin/PluginModels.py,sha256=ZZJUXbC0G2k0DU7Wpbf0rwjn7spywpiaLIHE7kLajhk,2533
17
17
  KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
18
18
  KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
19
19
  KekikStream/Extractors/ContentX.py,sha256=XPoAuA95LOTgCUGyioXxOFWR0nNKWWOHLkYMlzguIIE,2980
@@ -44,18 +44,19 @@ KekikStream/Extractors/VidMoxy.py,sha256=_K6BA7Uo59DA3ty_tsayCUZjXmRoDBTghekVNXi
44
44
  KekikStream/Extractors/VideoSeyred.py,sha256=rgS940vHJjrhF-JH4B_8poL2OwmctVyWTzP9I8gdLGI,1980
45
45
  KekikStream/Plugins/DiziBox.py,sha256=zgC1om649DsDZ7x0gJzckWlBu51qtK8W45TWL9arWBc,6095
46
46
  KekikStream/Plugins/DiziYou.py,sha256=2WaQZKa8NlBiuGWu3jUTPslXD2l5ALCAY5qnXwozpes,5669
47
- KekikStream/Plugins/Dizilla.py,sha256=evWYvETw1c4RY0GB5P20cB_I_U7ZxzzvnG7RLNGJRPs,4258
47
+ KekikStream/Plugins/Dizilla.py,sha256=XYc5zAjLsiEgCNMi6x1XXy8PpV8BHLgEyLitMoq_5a0,4257
48
48
  KekikStream/Plugins/FilmMakinesi.py,sha256=rz8TQeL41PJbeEmksgPHIhp6J-4vbSCBTeEH0ukExz4,2822
49
49
  KekikStream/Plugins/FullHDFilmizlesene.py,sha256=Fa0gRP_NoMfPC8HIKRxERjQVOv8Fyb-ayMJ2EooZ7BE,3080
50
+ KekikStream/Plugins/HdFilmCehennemi.py,sha256=GR18SCiieTfepY5HKpJOie1xlGQ9bxId_kjeKvrfo8M,6689
50
51
  KekikStream/Plugins/JetFilmizle.py,sha256=v2R4iDm_9VWNO2HTpawvfNElVdOoOF_4iPIquziLvhc,3916
51
52
  KekikStream/Plugins/RecTV.py,sha256=TYpV6T7U8TkkHYB3XK0xqar0pKlULXdztvK4TDc9734,5106
52
53
  KekikStream/Plugins/SezonlukDizi.py,sha256=VUyKAu2SlUCV4uTQfIr2BLLTus2-LOXPFF4rDHG1rs8,4444
53
54
  KekikStream/Plugins/Shorten.py,sha256=kDQGmj7qvfdDyDkU__QGjx-FoGSgCOPxcA3veM2BGPk,8858
54
- KekikStream/Plugins/SineWix.py,sha256=EqezB8Fism2dugptFgCEpeauqsbvSEDRNozHxDIZNrQ,4997
55
+ KekikStream/Plugins/SineWix.py,sha256=P-5tOX_ySSSs8JbdUL4acIHZkFJDpyl6eMnYM99Eb00,6835
55
56
  KekikStream/Plugins/UgurFilm.py,sha256=rp6M7yjVljVWbGEAC9BB96W1wBsM-PdFbh5tcZ2ZhzI,2930
56
- KekikStream-1.1.7.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
57
- KekikStream-1.1.7.dist-info/METADATA,sha256=nT8Vsn-rSeK8FMjxwMmhsObFjWxf91qkHOlCiTjmnZQ,4508
58
- KekikStream-1.1.7.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
59
- KekikStream-1.1.7.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
60
- KekikStream-1.1.7.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
61
- KekikStream-1.1.7.dist-info/RECORD,,
57
+ kekikstream-1.1.9.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
58
+ kekikstream-1.1.9.dist-info/METADATA,sha256=GHhymNzmXQsEW63Syrv7CSuMgTIH_bGXfufG-1_x5zg,4508
59
+ kekikstream-1.1.9.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
60
+ kekikstream-1.1.9.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
61
+ kekikstream-1.1.9.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
62
+ kekikstream-1.1.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5