KekikStream 1.6.8__tar.gz → 1.7.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 (69) hide show
  1. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Plugin/PluginModels.py +1 -0
  2. kekikstream-1.7.1/KekikStream/Plugins/DiziPal.py +246 -0
  3. kekikstream-1.7.1/KekikStream/Plugins/FilmModu.py +138 -0
  4. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/RecTV.py +1 -1
  5. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream.egg-info/PKG-INFO +1 -1
  6. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream.egg-info/SOURCES.txt +2 -0
  7. {kekikstream-1.6.8 → kekikstream-1.7.1}/PKG-INFO +1 -1
  8. {kekikstream-1.6.8 → kekikstream-1.7.1}/setup.py +1 -1
  9. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/CLI/__init__.py +0 -0
  10. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/CLI/pypi_kontrol.py +0 -0
  11. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  12. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  13. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  14. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  15. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Media/MediaHandler.py +0 -0
  16. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Media/MediaManager.py +0 -0
  17. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  18. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  19. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  20. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/UI/UIManager.py +0 -0
  21. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Core/__init__.py +0 -0
  22. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/CloseLoad.py +0 -0
  23. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/ContentX.py +0 -0
  24. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/FourCX.py +0 -0
  25. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/FourPichive.py +0 -0
  26. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/FourPlayRu.py +0 -0
  27. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/HDStreamAble.py +0 -0
  28. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/Hotlinger.py +0 -0
  29. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/MailRu.py +0 -0
  30. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/MixPlayHD.py +0 -0
  31. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/MolyStream.py +0 -0
  32. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  33. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  34. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/OkRuSSL.py +0 -0
  35. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  36. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/Pichive.py +0 -0
  37. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/PixelDrain.py +0 -0
  38. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/PlayRu.py +0 -0
  39. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/RapidVid.py +0 -0
  40. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/SibNet.py +0 -0
  41. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  42. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/TRsTX.py +0 -0
  43. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/TauVideo.py +0 -0
  44. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/TurboImgz.py +0 -0
  45. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/VidMoly.py +0 -0
  46. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/VidMolyMe.py +0 -0
  47. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/VidMoxy.py +0 -0
  48. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Extractors/VideoSeyred.py +0 -0
  49. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/DiziBox.py +0 -0
  50. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/DiziYou.py +0 -0
  51. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/Dizilla.py +0 -0
  52. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  53. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  54. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  55. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/JetFilmizle.py +0 -0
  56. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  57. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/SineWix.py +0 -0
  58. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/Plugins/UgurFilm.py +0 -0
  59. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/__init__.py +0 -0
  60. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/__main__.py +0 -0
  61. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream/requirements.txt +0 -0
  62. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream.egg-info/dependency_links.txt +0 -0
  63. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream.egg-info/entry_points.txt +0 -0
  64. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream.egg-info/requires.txt +0 -0
  65. {kekikstream-1.6.8 → kekikstream-1.7.1}/KekikStream.egg-info/top_level.txt +0 -0
  66. {kekikstream-1.6.8 → kekikstream-1.7.1}/LICENSE +0 -0
  67. {kekikstream-1.6.8 → kekikstream-1.7.1}/MANIFEST.in +0 -0
  68. {kekikstream-1.6.8 → kekikstream-1.7.1}/README.md +0 -0
  69. {kekikstream-1.6.8 → kekikstream-1.7.1}/setup.cfg +0 -0
@@ -66,6 +66,7 @@ class SeriesInfo(BaseModel):
66
66
  rating : Optional[str] = None
67
67
  year : Optional[str] = None
68
68
  actors : Optional[str] = None
69
+ duration : Optional[int] = None
69
70
  episodes : Optional[List[Episode]] = None
70
71
 
71
72
  @field_validator("tags", "actors", mode="before")
@@ -0,0 +1,246 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, Subtitle
4
+ from parsel import Selector
5
+ import re
6
+
7
+ class DiziPal(PluginBase):
8
+ name = "DiziPal"
9
+ language = "tr"
10
+ main_url = "https://dizipal1222.com"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Yabancı Dizi ve Film izle."
13
+
14
+ main_page = {
15
+ f"{main_url}/diziler/son-bolumler" : "Son Bölümler",
16
+ f"{main_url}/diziler" : "Yeni Diziler",
17
+ f"{main_url}/filmler" : "Yeni Filmler",
18
+ f"{main_url}/koleksiyon/netflix" : "Netflix",
19
+ f"{main_url}/koleksiyon/exxen" : "Exxen",
20
+ f"{main_url}/koleksiyon/blutv" : "BluTV",
21
+ f"{main_url}/koleksiyon/disney" : "Disney+",
22
+ f"{main_url}/koleksiyon/amazon-prime" : "Amazon Prime",
23
+ f"{main_url}/koleksiyon/tod-bein" : "TOD (beIN)",
24
+ f"{main_url}/koleksiyon/gain" : "Gain",
25
+ f"{main_url}/tur/mubi" : "Mubi",
26
+ }
27
+
28
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
29
+ istek = await self.cffi.get(url)
30
+ secici = Selector(istek.text)
31
+
32
+ results = []
33
+
34
+ if "/son-bolumler" in url:
35
+ for veri in secici.css("div.episode-item"):
36
+ name = veri.css("div.name::text").get()
37
+ episode = veri.css("div.episode::text").get()
38
+ href = veri.css("a::attr(href)").get()
39
+ poster = veri.css("img::attr(src)").get()
40
+
41
+ if name and href:
42
+ ep_text = episode.strip().replace(". Sezon ", "x").replace(". Bölüm", "") if episode else ""
43
+ title = f"{name} {ep_text}"
44
+ # Son bölümler linkini dizi sayfasına çevir
45
+ dizi_url = href.split("/sezon")[0] if "/sezon" in href else href
46
+
47
+ results.append(MainPageResult(
48
+ category = category,
49
+ title = title,
50
+ url = self.fix_url(dizi_url),
51
+ poster = self.fix_url(poster) if poster else None,
52
+ ))
53
+ else:
54
+ for veri in secici.css("article.type2 ul li"):
55
+ title = veri.css("span.title::text").get()
56
+ href = veri.css("a::attr(href)").get()
57
+ poster = veri.css("img::attr(src)").get()
58
+
59
+ if title and href:
60
+ results.append(MainPageResult(
61
+ category = category,
62
+ title = title,
63
+ url = self.fix_url(href),
64
+ poster = self.fix_url(poster) if poster else None,
65
+ ))
66
+
67
+ return results
68
+
69
+ async def search(self, query: str) -> list[SearchResult]:
70
+ self.cffi.headers.update({
71
+ "Accept" : "application/json, text/javascript, */*; q=0.01",
72
+ "X-Requested-With" : "XMLHttpRequest"
73
+ })
74
+
75
+ istek = await self.cffi.post(
76
+ url = f"{self.main_url}/api/search-autocomplete",
77
+ data = {"query": query}
78
+ )
79
+
80
+ try:
81
+ data = istek.json()
82
+ except Exception:
83
+ return []
84
+
85
+ results = []
86
+
87
+ # API bazen dict, bazen list döner
88
+ items = data.values() if isinstance(data, dict) else data
89
+
90
+ for item in items:
91
+ if not isinstance(item, dict):
92
+ continue
93
+
94
+ title = item.get("title")
95
+ url = item.get("url")
96
+ poster = item.get("poster")
97
+
98
+ if title and url:
99
+ results.append(SearchResult(
100
+ title = title,
101
+ url = f"{self.main_url}{url}",
102
+ poster = self.fix_url(poster) if poster else None,
103
+ ))
104
+
105
+ return results
106
+
107
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
108
+ # Reset headers to get HTML response
109
+ self.cffi.headers.update({
110
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
111
+ })
112
+ self.cffi.headers.pop("X-Requested-With", None)
113
+
114
+ istek = await self.cffi.get(url)
115
+ secici = Selector(text=istek.text, type="html")
116
+
117
+ poster = self.fix_url(secici.css("meta[property='og:image']::attr(content)").get())
118
+ year = secici.xpath("//div[text()='Yapım Yılı']//following-sibling::div/text()").get()
119
+ description = secici.css("div.summary p::text").get()
120
+ rating = secici.xpath("//div[text()='IMDB Puanı']//following-sibling::div/text()").get()
121
+ tags_raw = secici.xpath("//div[text()='Türler']//following-sibling::div/text()").get()
122
+ tags = [t.strip() for t in tags_raw.split() if t.strip()] if tags_raw else None
123
+
124
+ dur_text = secici.xpath("//div[text()='Ortalama Süre']//following-sibling::div/text()").get()
125
+ dur_match = re.search(r"(\d+)", dur_text or "")
126
+ duration = int(dur_match[1]) if dur_match else None
127
+
128
+ if "/dizi/" in url:
129
+ title = secici.css("div.cover h5::text").get()
130
+
131
+ episodes = []
132
+ for ep in secici.css("div.episode-item"):
133
+ ep_name = ep.css("div.name::text").get()
134
+ ep_href = ep.css("a::attr(href)").get()
135
+ ep_text = ep.css("div.episode::text").get() or ""
136
+ ep_parts = ep_text.strip().split(" ")
137
+
138
+ ep_season = None
139
+ ep_episode = None
140
+ if len(ep_parts) >= 4:
141
+ try:
142
+ ep_season = int(ep_parts[0].replace(".", ""))
143
+ ep_episode = int(ep_parts[2].replace(".", ""))
144
+ except ValueError:
145
+ pass
146
+
147
+ if ep_name and ep_href:
148
+ episodes.append(Episode(
149
+ season = ep_season,
150
+ episode = ep_episode,
151
+ title = ep_name.strip(),
152
+ url = self.fix_url(ep_href),
153
+ ))
154
+
155
+ return SeriesInfo(
156
+ url = url,
157
+ poster = poster,
158
+ title = title,
159
+ description = description.strip() if description else None,
160
+ tags = tags,
161
+ rating = rating.strip() if rating else None,
162
+ year = year.strip() if year else None,
163
+ duration = duration,
164
+ episodes = episodes if episodes else None,
165
+ )
166
+ else:
167
+ title = secici.xpath("//div[@class='g-title'][2]/div/text()").get()
168
+
169
+ return MovieInfo(
170
+ url = url,
171
+ poster = poster,
172
+ title = title.strip() if title else None,
173
+ description = description.strip() if description else None,
174
+ tags = tags,
175
+ rating = rating.strip() if rating else None,
176
+ year = year.strip() if year else None,
177
+ duration = duration,
178
+ )
179
+
180
+ async def load_links(self, url: str) -> list[dict]:
181
+ # Reset headers to get HTML response
182
+ self.cffi.headers.update({
183
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
184
+ })
185
+ self.cffi.headers.pop("X-Requested-With", None)
186
+
187
+ istek = await self.cffi.get(url)
188
+ secici = Selector(istek.text)
189
+
190
+ iframe = secici.css(".series-player-container iframe::attr(src)").get()
191
+ if not iframe:
192
+ iframe = secici.css("div#vast_new iframe::attr(src)").get()
193
+
194
+ if not iframe:
195
+ return []
196
+
197
+ results = []
198
+
199
+ self.cffi.headers.update({"Referer": f"{self.main_url}/"})
200
+ i_istek = await self.cffi.get(iframe)
201
+ i_text = i_istek.text
202
+
203
+ # m3u link çıkar
204
+ m3u_match = re.search(r'file:"([^"]+)"', i_text)
205
+ if m3u_match:
206
+ m3u_link = m3u_match[1]
207
+
208
+ # Altyazıları çıkar
209
+ subtitles = []
210
+ sub_match = re.search(r'"subtitle":"([^"]+)"', i_text)
211
+ if sub_match:
212
+ sub_text = sub_match[1]
213
+ if "," in sub_text:
214
+ for sub in sub_text.split(","):
215
+ lang = sub.split("[")[1].split("]")[0] if "[" in sub else "Türkçe"
216
+ sub_url = sub.replace(f"[{lang}]", "")
217
+ subtitles.append(Subtitle(name=lang, url=self.fix_url(sub_url)))
218
+ else:
219
+ lang = sub_text.split("[")[1].split("]")[0] if "[" in sub_text else "Türkçe"
220
+ sub_url = sub_text.replace(f"[{lang}]", "")
221
+ subtitles.append(Subtitle(name=lang, url=self.fix_url(sub_url)))
222
+
223
+ results.append({
224
+ "name" : self.name,
225
+ "url" : m3u_link,
226
+ "referer" : f"{self.main_url}/",
227
+ "subtitles" : subtitles
228
+ })
229
+ else:
230
+ # Extractor'a yönlendir
231
+ extractor = self.ex_manager.find_extractor(iframe)
232
+ results.append({
233
+ "name" : f"{extractor.name if extractor else self.name}",
234
+ "url" : iframe,
235
+ "referer" : f"{self.main_url}/",
236
+ })
237
+
238
+ return results
239
+
240
+ async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
241
+ extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
242
+ self.media_handler.title = name
243
+ if self.name not in self.media_handler.title:
244
+ self.media_handler.title = f"{self.name} | {self.media_handler.title}"
245
+
246
+ self.media_handler.play_media(extract_result)
@@ -0,0 +1,138 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
4
+ from parsel import Selector
5
+ import re
6
+
7
+ class FilmModu(PluginBase):
8
+ name = "FilmModu"
9
+ language = "tr"
10
+ main_url = "https://www.filmmodu.ws"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
13
+
14
+ main_page = {
15
+ f"{main_url}/hd-film-kategori/4k-film-izle?page=SAYFA" : "4K",
16
+ f"{main_url}/hd-film-kategori/aile-filmleri?page=SAYFA" : "Aile",
17
+ f"{main_url}/hd-film-kategori/aksiyon?page=SAYFA" : "Aksiyon",
18
+ f"{main_url}/hd-film-kategori/animasyon?page=SAYFA" : "Animasyon",
19
+ f"{main_url}/hd-film-kategori/belgeseller?page=SAYFA" : "Belgesel",
20
+ f"{main_url}/hd-film-kategori/bilim-kurgu-filmleri?page=SAYFA" : "Bilim-Kurgu",
21
+ f"{main_url}/hd-film-kategori/dram-filmleri?page=SAYFA" : "Dram",
22
+ f"{main_url}/hd-film-kategori/fantastik-filmler?page=SAYFA" : "Fantastik",
23
+ f"{main_url}/hd-film-kategori/gerilim?page=SAYFA" : "Gerilim",
24
+ f"{main_url}/hd-film-kategori/gizem-filmleri?page=SAYFA" : "Gizem",
25
+ f"{main_url}/hd-film-kategori/hd-hint-filmleri?page=SAYFA" : "Hint Filmleri",
26
+ f"{main_url}/hd-film-kategori/kisa-film?page=SAYFA" : "Kısa Film",
27
+ f"{main_url}/hd-film-kategori/hd-komedi-filmleri?page=SAYFA" : "Komedi",
28
+ f"{main_url}/hd-film-kategori/korku-filmleri?page=SAYFA" : "Korku",
29
+ f"{main_url}/hd-film-kategori/kult-filmler-izle?page=SAYFA" : "Kült Filmler",
30
+ f"{main_url}/hd-film-kategori/macera-filmleri?page=SAYFA" : "Macera",
31
+ f"{main_url}/hd-film-kategori/muzik?page=SAYFA" : "Müzik",
32
+ f"{main_url}/hd-film-kategori/odullu-filmler-izle?page=SAYFA" : "Oscar Ödüllü",
33
+ f"{main_url}/hd-film-kategori/romantik-filmler?page=SAYFA" : "Romantik",
34
+ f"{main_url}/hd-film-kategori/savas?page=SAYFA" : "Savaş",
35
+ f"{main_url}/hd-film-kategori/stand-up?page=SAYFA" : "Stand Up",
36
+ f"{main_url}/hd-film-kategori/suc-filmleri?page=SAYFA" : "Suç",
37
+ f"{main_url}/hd-film-kategori/tarih?page=SAYFA" : "Tarih",
38
+ f"{main_url}/hd-film-kategori/tavsiye-filmler?page=SAYFA" : "Tavsiye",
39
+ f"{main_url}/hd-film-kategori/tv-film?page=SAYFA" : "TV Film",
40
+ f"{main_url}/hd-film-kategori/vahsi-bati-filmleri?page=SAYFA" : "Vahşi Batı",
41
+ }
42
+
43
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
44
+ istek = await self.cffi.get(url.replace("SAYFA", str(page)))
45
+ secici = Selector(istek.text)
46
+
47
+ return [
48
+ MainPageResult(
49
+ category = category,
50
+ title = veri.css("a::text").get(),
51
+ url = self.fix_url(veri.css("a::attr(href)").get()),
52
+ poster = self.fix_url(veri.css("picture img::attr(data-src)").get()),
53
+ )
54
+ for veri in secici.css("div.movie")
55
+ if veri.css("a::text").get()
56
+ ]
57
+
58
+ async def search(self, query: str) -> list[SearchResult]:
59
+ istek = await self.cffi.get(f"{self.main_url}/film-ara?term={query}")
60
+ secici = Selector(istek.text)
61
+
62
+ return [
63
+ SearchResult(
64
+ title = veri.css("a::text").get(),
65
+ url = self.fix_url(veri.css("a::attr(href)").get()),
66
+ poster = self.fix_url(veri.css("picture img::attr(data-src)").get()),
67
+ )
68
+ for veri in secici.css("div.movie")
69
+ if veri.css("a::text").get()
70
+ ]
71
+
72
+ async def load_item(self, url: str) -> MovieInfo:
73
+ istek = await self.cffi.get(url)
74
+ secici = Selector(istek.text)
75
+
76
+ org_title = secici.css("div.titles h1::text").get()
77
+ alt_title = secici.css("div.titles h2::text").get()
78
+ title = f"{org_title} - {alt_title}" if alt_title else org_title
79
+
80
+ return MovieInfo(
81
+ url = url,
82
+ poster = self.fix_url(secici.css("img.img-responsive::attr(src)").get()),
83
+ title = title,
84
+ description = secici.css("p[itemprop='description']::text").get(),
85
+ tags = [a.css("::text").get() for a in secici.css("a[href*='film-tur/']")],
86
+ year = secici.css("span[itemprop='dateCreated']::text").get(),
87
+ actors = [a.css("span::text").get() for a in secici.css("a[itemprop='actor']")],
88
+ )
89
+
90
+ async def load_links(self, url: str) -> list[dict]:
91
+ istek = await self.cffi.get(url)
92
+ secici = Selector(istek.text)
93
+
94
+ results = []
95
+
96
+ for alternatif in secici.css("div.alternates a"):
97
+ alt_link = self.fix_url(alternatif.css("::attr(href)").get())
98
+ alt_name = alternatif.css("::text").get()
99
+
100
+ if alt_name == "Fragman" or not alt_link:
101
+ continue
102
+
103
+ alt_istek = await self.cffi.get(alt_link)
104
+ alt_text = alt_istek.text
105
+
106
+ vid_id = re.search(r"var videoId = '(.*)'", alt_text)
107
+ vid_type = re.search(r"var videoType = '(.*)'", alt_text)
108
+
109
+ if not vid_id or not vid_type:
110
+ continue
111
+
112
+ source_istek = await self.cffi.get(
113
+ f"{self.main_url}/get-source?movie_id={vid_id[1]}&type={vid_type[1]}"
114
+ )
115
+ source_data = source_istek.json()
116
+
117
+ if source_data.get("subtitle"):
118
+ subtitle_url = self.fix_url(source_data["subtitle"])
119
+ else:
120
+ subtitle_url = None
121
+
122
+ for source in source_data.get("sources", []):
123
+ results.append({
124
+ "name" : f"{self.name} | {alt_name} | {source.get('label', 'Bilinmiyor')}",
125
+ "url" : self.fix_url(source["src"]),
126
+ "referer" : f"{self.main_url}/",
127
+ "subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
128
+ })
129
+
130
+ return results
131
+
132
+ async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
133
+ extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
134
+ self.media_handler.title = name
135
+ if self.name not in self.media_handler.title:
136
+ self.media_handler.title = f"{self.name} | {self.media_handler.title}"
137
+
138
+ self.media_handler.play_media(extract_result)
@@ -7,7 +7,7 @@ import re
7
7
  class RecTV(PluginBase):
8
8
  name = "RecTV"
9
9
  language = "tr"
10
- main_url = "https://m.prectv50.sbs"
10
+ main_url = "https://m.prectv60.lol"
11
11
  favicon = "https://rectvapk.cc/wp-content/uploads/2023/02/Rec-TV.webp"
12
12
  description = "RecTv APK, Türkiye’deki en popüler Çevrimiçi Medya Akış platformlarından biridir. Filmlerin, Canlı Sporların, Web Dizilerinin ve çok daha fazlasının keyfini ücretsiz çıkarın."
13
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 1.6.8
3
+ Version: 1.7.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
@@ -53,9 +53,11 @@ KekikStream/Extractors/VidMolyMe.py
53
53
  KekikStream/Extractors/VidMoxy.py
54
54
  KekikStream/Extractors/VideoSeyred.py
55
55
  KekikStream/Plugins/DiziBox.py
56
+ KekikStream/Plugins/DiziPal.py
56
57
  KekikStream/Plugins/DiziYou.py
57
58
  KekikStream/Plugins/Dizilla.py
58
59
  KekikStream/Plugins/FilmMakinesi.py
60
+ KekikStream/Plugins/FilmModu.py
59
61
  KekikStream/Plugins/FullHDFilmizlesene.py
60
62
  KekikStream/Plugins/HDFilmCehennemi.py
61
63
  KekikStream/Plugins/JetFilmizle.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 1.6.8
3
+ Version: 1.7.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
@@ -6,7 +6,7 @@ from io import open
6
6
  setup(
7
7
  # ? Genel Bilgiler
8
8
  name = "KekikStream",
9
- version = "1.6.8",
9
+ version = "1.7.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"],
File without changes
File without changes
File without changes
File without changes