KekikStream 2.0.3__py3-none-any.whl → 2.0.4__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.
- KekikStream/Extractors/ContentX_.py +25 -10
- KekikStream/Plugins/Dizilla.py +22 -14
- KekikStream/Plugins/FilmMakinesi.py +1 -1
- KekikStream/Plugins/FilmModu.py +6 -2
- KekikStream/Plugins/FullHDFilmizlesene.py +1 -1
- KekikStream/Plugins/HDFilmCehennemi.py +1 -1
- KekikStream/Plugins/JetFilmizle.py +1 -1
- KekikStream/Plugins/KultFilmler.py +1 -1
- KekikStream/Plugins/RecTV.py +1 -1
- KekikStream/Plugins/RoketDizi.py +17 -24
- KekikStream/Plugins/SelcukFlix.py +51 -52
- KekikStream/Plugins/SezonlukDizi.py +28 -7
- KekikStream/Plugins/Sinefy.py +11 -8
- KekikStream/Plugins/SinemaCX.py +3 -7
- KekikStream/Plugins/SuperFilmGeldi.py +1 -1
- KekikStream/Plugins/UgurFilm.py +1 -1
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.4.dist-info}/METADATA +1 -1
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.4.dist-info}/RECORD +22 -22
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.4.dist-info}/WHEEL +0 -0
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.4.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.4.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.4.dist-info}/top_level.txt +0 -0
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from KekikStream.Extractors.ContentX import ContentX
|
|
4
4
|
|
|
5
|
-
# DPlayer82 Family - https://dplayer82.site subdomains
|
|
6
5
|
class SNDPlayer(ContentX):
|
|
7
6
|
name = "SNDPlayer"
|
|
8
7
|
main_url = "https://sn.dplayer82.site"
|
|
@@ -15,26 +14,42 @@ class ORGDPlayer(ContentX):
|
|
|
15
14
|
name = "ORGDPlayer"
|
|
16
15
|
main_url = "https://org.dplayer82.site"
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
class SNDPlayer74(ContentX):
|
|
18
|
+
name = "SNDPlayer74"
|
|
19
|
+
main_url = "https://sn.dplayer74.site"
|
|
20
|
+
|
|
19
21
|
class Hotlinger(ContentX):
|
|
20
22
|
name = "Hotlinger"
|
|
21
23
|
main_url = "https://hotlinger.com"
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
class SNHotlinger(ContentX):
|
|
26
|
+
name = "SNHotlinger"
|
|
27
|
+
main_url = "https://sn.hotlinger.com"
|
|
28
|
+
|
|
29
|
+
class PlayRu(ContentX):
|
|
30
|
+
name = "PlayRu"
|
|
31
|
+
main_url = "https://playru.net"
|
|
32
|
+
|
|
33
|
+
class FourPlayRu(ContentX):
|
|
34
|
+
name = "FourPlayRu"
|
|
35
|
+
main_url = "https://four.playru.net"
|
|
36
|
+
|
|
24
37
|
class Pichive(ContentX):
|
|
25
38
|
name = "Pichive"
|
|
39
|
+
main_url = "https://pichive.online"
|
|
40
|
+
|
|
41
|
+
class PichiveMe(ContentX):
|
|
42
|
+
name = "PichiveMe"
|
|
26
43
|
main_url = "https://pichive.me"
|
|
27
44
|
|
|
28
|
-
class
|
|
45
|
+
class FourPichiveOnline(ContentX):
|
|
46
|
+
name = "FourPichiveOnline"
|
|
47
|
+
main_url = "https://four.pichive.online"
|
|
48
|
+
|
|
49
|
+
class FourPichiveMe(ContentX):
|
|
29
50
|
name = "FourPichive"
|
|
30
51
|
main_url = "https://four.pichive.me"
|
|
31
52
|
|
|
32
|
-
# PlayRu Family
|
|
33
|
-
class FourPlayRu(ContentX):
|
|
34
|
-
name = "FourPlayRu"
|
|
35
|
-
main_url = "https://four.playru.net"
|
|
36
|
-
|
|
37
|
-
# CX Family
|
|
38
53
|
class FourCX(ContentX):
|
|
39
54
|
name = "FourCX"
|
|
40
55
|
main_url = "https://four.contentx.me"
|
KekikStream/Plugins/Dizilla.py
CHANGED
|
@@ -179,17 +179,25 @@ class Dizilla(PluginBase):
|
|
|
179
179
|
decrypted = await self.decrypt_response(secure_data)
|
|
180
180
|
results = decrypted.get("RelatedResults", {}).get("getEpisodeSources", {}).get("result", [])
|
|
181
181
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
182
|
+
if not results:
|
|
183
|
+
return []
|
|
184
|
+
|
|
185
|
+
# Get first source (matching Kotlin)
|
|
186
|
+
first_result = results[0]
|
|
187
|
+
source_content = first_result.get("source_content", "")
|
|
188
|
+
|
|
189
|
+
# Clean the source_content string (matching Kotlin: .replace("\"", "").replace("\\", ""))
|
|
190
|
+
cleaned_source = source_content.replace('"', '').replace('\\', '')
|
|
191
|
+
|
|
192
|
+
# Parse cleaned HTML
|
|
193
|
+
iframe_src = Selector(cleaned_source).css("iframe::attr(src)").get()
|
|
194
|
+
iframe_url = self.fix_url(iframe_src)
|
|
195
|
+
|
|
196
|
+
if not iframe_url:
|
|
197
|
+
return []
|
|
198
|
+
|
|
199
|
+
extractor = self.ex_manager.find_extractor(iframe_url)
|
|
200
|
+
return [{
|
|
201
|
+
"url" : iframe_url,
|
|
202
|
+
"name" : f"{extractor.name if extractor else 'Main Player'} | {first_result.get('language_name', 'Unknown')}",
|
|
203
|
+
}]
|
|
@@ -8,7 +8,7 @@ class FilmMakinesi(PluginBase):
|
|
|
8
8
|
language = "tr"
|
|
9
9
|
main_url = "https://filmmakinesi.to"
|
|
10
10
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
11
|
-
description = "Film Makinesi
|
|
11
|
+
description = "Film Makinesi ile en yeni ve güncel filmleri Full HD kalite farkı ile izleyebilirsiniz. Film izle denildiğinde akla gelen en kaliteli film sitesi."
|
|
12
12
|
|
|
13
13
|
main_page = {
|
|
14
14
|
f"{main_url}/filmler-1/" : "Son Filmler",
|
KekikStream/Plugins/FilmModu.py
CHANGED
|
@@ -9,7 +9,7 @@ class FilmModu(PluginBase):
|
|
|
9
9
|
language = "tr"
|
|
10
10
|
main_url = "https://www.filmmodu.ws"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
-
description = "
|
|
12
|
+
description = "Film modun geldiyse yüksek kalitede yeni filmleri izle, 1080p izleyebileceğiniz reklamsız tek film sitesi."
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
15
|
f"{main_url}/hd-film-kategori/4k-film-izle?page=SAYFA" : "4K",
|
|
@@ -91,9 +91,13 @@ class FilmModu(PluginBase):
|
|
|
91
91
|
istek = await self.httpx.get(url)
|
|
92
92
|
secici = Selector(istek.text)
|
|
93
93
|
|
|
94
|
+
alternates = secici.css("div.alternates a")
|
|
95
|
+
if not alternates:
|
|
96
|
+
return [] # No alternates available
|
|
97
|
+
|
|
94
98
|
results = []
|
|
95
99
|
|
|
96
|
-
for alternatif in
|
|
100
|
+
for alternatif in alternates:
|
|
97
101
|
alt_link = self.fix_url(alternatif.css("::attr(href)").get())
|
|
98
102
|
alt_name = alternatif.css("::text").get()
|
|
99
103
|
|
|
@@ -10,7 +10,7 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
10
10
|
language = "tr"
|
|
11
11
|
main_url = "https://www.fullhdfilmizlesene.tv"
|
|
12
12
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
13
|
-
description = "
|
|
13
|
+
description = "Türkiye'nin ilk ve lider HD film izleme platformu, kaliteli ve sorunsuz hizmetiyle sinema keyfini zirveye taşır."
|
|
14
14
|
|
|
15
15
|
main_page = {
|
|
16
16
|
f"{main_url}/en-cok-izlenen-hd-filmler/" : "En Çok izlenen Filmler",
|
|
@@ -10,7 +10,7 @@ class HDFilmCehennemi(PluginBase):
|
|
|
10
10
|
language = "tr"
|
|
11
11
|
main_url = "https://www.hdfilmcehennemi.ws"
|
|
12
12
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
13
|
-
description = "Türkiye'nin en hızlı hd film izleme sitesi"
|
|
13
|
+
description = "Türkiye'nin en hızlı hd film izleme sitesi. Tek ve gerçek hdfilmcehennemi sitesi."
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
@@ -8,7 +8,7 @@ class JetFilmizle(PluginBase):
|
|
|
8
8
|
language = "tr"
|
|
9
9
|
main_url = "https://jetfilmizle.website"
|
|
10
10
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
11
|
-
description = "
|
|
11
|
+
description = "Film izle, Yerli, Yabancı film izle, Türkçe dublaj, alt yazılı seçenekleriyle ödül almış filmleri Full HD kalitesiyle ve jetfilmizle hızıyla donmadan ücretsizce izleyebilirsiniz."
|
|
12
12
|
|
|
13
13
|
main_page = {
|
|
14
14
|
f"{main_url}/page/" : "Son Filmler",
|
|
@@ -9,7 +9,7 @@ class KultFilmler(PluginBase):
|
|
|
9
9
|
language = "tr"
|
|
10
10
|
main_url = "https://kultfilmler.net"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
-
description = "Kült
|
|
12
|
+
description = "Kült Filmler özenle en iyi filmleri derler ve iyi bir altyazılı film izleme deneyimi sunmayı amaçlar. Reklamsız 1080P Altyazılı Film izle..."
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
15
|
f"{main_url}/category/aile-filmleri-izle" : "Aile",
|
KekikStream/Plugins/RecTV.py
CHANGED
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
class RecTV(PluginBase):
|
|
8
8
|
name = "RecTV"
|
|
9
9
|
language = "tr"
|
|
10
|
-
main_url = "https://m.
|
|
10
|
+
main_url = "https://m.prectv50.sbs"
|
|
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
|
|
KekikStream/Plugins/RoketDizi.py
CHANGED
|
@@ -185,6 +185,7 @@ class RoketDizi(PluginBase):
|
|
|
185
185
|
# secureData içindeki RelatedResults -> getEpisodeSources -> result dizisini al
|
|
186
186
|
sources = decoded_json.get("RelatedResults", {}).get("getEpisodeSources", {}).get("result", [])
|
|
187
187
|
|
|
188
|
+
seen_urls = set()
|
|
188
189
|
results = []
|
|
189
190
|
for source in sources:
|
|
190
191
|
source_content = source.get("source_content", "")
|
|
@@ -195,35 +196,27 @@ class RoketDizi(PluginBase):
|
|
|
195
196
|
continue
|
|
196
197
|
|
|
197
198
|
iframe_url = iframe_match.group(1)
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
199
|
+
|
|
200
|
+
# Fix URL protocol
|
|
201
|
+
if not iframe_url.startswith("http"):
|
|
202
|
+
if iframe_url.startswith("//"):
|
|
203
|
+
iframe_url = "https:" + iframe_url
|
|
204
|
+
else:
|
|
205
|
+
iframe_url = "https://" + iframe_url
|
|
206
|
+
|
|
207
|
+
iframe_url = self.fix_url(iframe_url)
|
|
208
|
+
|
|
209
|
+
# Deduplicate
|
|
210
|
+
if iframe_url in seen_urls:
|
|
211
|
+
continue
|
|
212
|
+
seen_urls.add(iframe_url)
|
|
203
213
|
|
|
204
214
|
# Check extractor
|
|
205
215
|
extractor = self.ex_manager.find_extractor(iframe_url)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
# Metadata'dan bilgileri al
|
|
209
|
-
source_name = source.get("source_name", "")
|
|
210
|
-
language_name = source.get("language_name", "")
|
|
211
|
-
quality_name = source.get("quality_name", "")
|
|
212
|
-
|
|
213
|
-
# İsmi oluştur
|
|
214
|
-
name_parts = []
|
|
215
|
-
if source_name:
|
|
216
|
-
name_parts.append(source_name)
|
|
217
|
-
if ext_name:
|
|
218
|
-
name_parts.append(ext_name)
|
|
219
|
-
if language_name:
|
|
220
|
-
name_parts.append(language_name)
|
|
221
|
-
if quality_name:
|
|
222
|
-
name_parts.append(quality_name)
|
|
223
|
-
|
|
216
|
+
|
|
224
217
|
results.append({
|
|
225
218
|
"url" : iframe_url,
|
|
226
|
-
"name" :
|
|
219
|
+
"name" : extractor.name if extractor else "Player"
|
|
227
220
|
})
|
|
228
221
|
|
|
229
222
|
return results
|
|
@@ -9,7 +9,7 @@ class SelcukFlix(PluginBase):
|
|
|
9
9
|
lang = "tr"
|
|
10
10
|
main_url = "https://selcukflix.net"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
-
description = "Selcukflix
|
|
12
|
+
description = "Selcukflix'te her türden en yeni ve en popüler dizi ve filmleri izlemenin keyfini çıkarın. Aksiyondan romantiğe, bilim kurgudan dramaya, geniş kütüphanemizde herkes için bir şey var."
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
15
|
f"{main_url}/tum-bolumler" : "Yeni Eklenen Bölümler",
|
|
@@ -240,60 +240,59 @@ class SelcukFlix(PluginBase):
|
|
|
240
240
|
sel = Selector(resp.text)
|
|
241
241
|
|
|
242
242
|
next_data = sel.css("script#__NEXT_DATA__::text").get()
|
|
243
|
-
if not next_data:
|
|
243
|
+
if not next_data:
|
|
244
|
+
return []
|
|
244
245
|
|
|
245
246
|
try:
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
247
|
+
data = json.loads(next_data)
|
|
248
|
+
secure_data = data["props"]["pageProps"]["secureData"]
|
|
249
|
+
raw_data = base64.b64decode(secure_data.replace('"', ''))
|
|
250
|
+
|
|
251
|
+
# Try UTF-8 first, fallback to ISO-8859-1 (matching Kotlin)
|
|
252
|
+
try:
|
|
253
|
+
decoded_str = raw_data.decode('utf-8')
|
|
254
|
+
except UnicodeDecodeError:
|
|
255
|
+
decoded_str = raw_data.decode('iso-8859-1')
|
|
253
256
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
"name": extractor.name if extractor else "Iframe"
|
|
294
|
-
})
|
|
295
|
-
|
|
296
|
-
return results
|
|
257
|
+
content_details = json.loads(decoded_str)
|
|
258
|
+
related_data = content_details.get("relatedData", {})
|
|
259
|
+
|
|
260
|
+
source_content = None
|
|
261
|
+
|
|
262
|
+
# Check if Series (episode) or Movie
|
|
263
|
+
if "/dizi/" in url:
|
|
264
|
+
if related_data.get("episodeSources", {}).get("state"):
|
|
265
|
+
res = related_data["episodeSources"].get("result", [])
|
|
266
|
+
if res:
|
|
267
|
+
source_content = res[0].get("sourceContent")
|
|
268
|
+
else:
|
|
269
|
+
# Movie
|
|
270
|
+
if related_data.get("movieParts", {}).get("state"):
|
|
271
|
+
movie_parts = related_data["movieParts"].get("result", [])
|
|
272
|
+
if movie_parts:
|
|
273
|
+
first_part_id = movie_parts[0].get("id")
|
|
274
|
+
# RelatedResults -> getMoviePartSourcesById_ID
|
|
275
|
+
rr = content_details.get("RelatedResults", {})
|
|
276
|
+
key = f"getMoviePartSourcesById_{first_part_id}"
|
|
277
|
+
if key in rr:
|
|
278
|
+
res = rr[key].get("result", [])
|
|
279
|
+
if res:
|
|
280
|
+
source_content = res[0].get("source_content")
|
|
281
|
+
|
|
282
|
+
if source_content:
|
|
283
|
+
iframe_sel = Selector(source_content)
|
|
284
|
+
iframe_src = iframe_sel.css("iframe::attr(src)").get()
|
|
285
|
+
if iframe_src:
|
|
286
|
+
iframe_src = self.fix_url(iframe_src)
|
|
287
|
+
extractor = self.ex_manager.find_extractor(iframe_src)
|
|
288
|
+
|
|
289
|
+
if extractor: # Only return if extractor found
|
|
290
|
+
return [{
|
|
291
|
+
"url" : iframe_src,
|
|
292
|
+
"name" : extractor.name
|
|
293
|
+
}]
|
|
294
|
+
|
|
295
|
+
return []
|
|
297
296
|
|
|
298
297
|
except Exception:
|
|
299
298
|
return []
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
|
|
4
4
|
from parsel import Selector
|
|
5
|
+
import re
|
|
5
6
|
|
|
6
7
|
class SezonlukDizi(PluginBase):
|
|
7
8
|
name = "SezonlukDizi"
|
|
@@ -99,6 +100,20 @@ class SezonlukDizi(PluginBase):
|
|
|
99
100
|
actors = actors
|
|
100
101
|
)
|
|
101
102
|
|
|
103
|
+
async def get_asp_data(self) -> tuple[str, str]:
|
|
104
|
+
"""Fetch dynamic ASP version numbers from site.min.js"""
|
|
105
|
+
try:
|
|
106
|
+
js_content = await self.httpx.get(f"{self.main_url}/js/site.min.js")
|
|
107
|
+
alternatif_match = re.search(r'dataAlternatif(.*?)\.asp', js_content.text)
|
|
108
|
+
embed_match = re.search(r'dataEmbed(.*?)\.asp', js_content.text)
|
|
109
|
+
|
|
110
|
+
alternatif_ver = alternatif_match.group(1) if alternatif_match else "22"
|
|
111
|
+
embed_ver = embed_match.group(1) if embed_match else "22"
|
|
112
|
+
|
|
113
|
+
return (alternatif_ver, embed_ver)
|
|
114
|
+
except Exception:
|
|
115
|
+
return ("22", "22") # Fallback to default versions
|
|
116
|
+
|
|
102
117
|
async def load_links(self, url: str) -> list[dict]:
|
|
103
118
|
istek = await self.httpx.get(url)
|
|
104
119
|
secici = Selector(istek.text)
|
|
@@ -107,10 +122,13 @@ class SezonlukDizi(PluginBase):
|
|
|
107
122
|
if not bid:
|
|
108
123
|
return []
|
|
109
124
|
|
|
125
|
+
# Get dynamic ASP versions
|
|
126
|
+
alternatif_ver, embed_ver = await self.get_asp_data()
|
|
127
|
+
|
|
110
128
|
results = []
|
|
111
129
|
for dil, label in [("1", "Altyazı"), ("0", "Dublaj")]:
|
|
112
130
|
dil_istek = await self.httpx.post(
|
|
113
|
-
url = f"{self.main_url}/ajax/
|
|
131
|
+
url = f"{self.main_url}/ajax/dataAlternatif{alternatif_ver}.asp",
|
|
114
132
|
headers = {"X-Requested-With": "XMLHttpRequest"},
|
|
115
133
|
data = {"bid": bid, "dil": dil},
|
|
116
134
|
)
|
|
@@ -123,7 +141,7 @@ class SezonlukDizi(PluginBase):
|
|
|
123
141
|
if dil_json.get("status") == "success":
|
|
124
142
|
for idx, veri in enumerate(dil_json.get("data", [])):
|
|
125
143
|
veri_response = await self.httpx.post(
|
|
126
|
-
url = f"{self.main_url}/ajax/
|
|
144
|
+
url = f"{self.main_url}/ajax/dataEmbed{embed_ver}.asp",
|
|
127
145
|
headers = {"X-Requested-With": "XMLHttpRequest"},
|
|
128
146
|
data = {"id": veri.get("id")},
|
|
129
147
|
)
|
|
@@ -133,10 +151,13 @@ class SezonlukDizi(PluginBase):
|
|
|
133
151
|
if "link.asp" in iframe:
|
|
134
152
|
continue
|
|
135
153
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
154
|
+
iframe_url = self.fix_url(iframe)
|
|
155
|
+
extractor = self.ex_manager.find_extractor(iframe_url)
|
|
156
|
+
|
|
157
|
+
if extractor: # Only add if extractor found
|
|
158
|
+
results.append({
|
|
159
|
+
"url" : iframe_url,
|
|
160
|
+
"name" : f"{extractor.name} | {label}"
|
|
161
|
+
})
|
|
141
162
|
|
|
142
163
|
return results
|
KekikStream/Plugins/Sinefy.py
CHANGED
|
@@ -228,11 +228,14 @@ class Sinefy(PluginBase):
|
|
|
228
228
|
sel = Selector(resp.text)
|
|
229
229
|
|
|
230
230
|
iframe = sel.css("iframe::attr(src)").get()
|
|
231
|
-
if iframe:
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
return [
|
|
231
|
+
if not iframe:
|
|
232
|
+
return []
|
|
233
|
+
|
|
234
|
+
iframe_url = self.fix_url(iframe)
|
|
235
|
+
|
|
236
|
+
# Always return iframe (matching Kotlin - no extractor check)
|
|
237
|
+
# loadExtractor in Kotlin handles extraction internally
|
|
238
|
+
return [{
|
|
239
|
+
"url" : iframe_url,
|
|
240
|
+
"name" : "Sinefy Player"
|
|
241
|
+
}]
|
KekikStream/Plugins/SinemaCX.py
CHANGED
|
@@ -9,7 +9,7 @@ class SinemaCX(PluginBase):
|
|
|
9
9
|
language = "tr"
|
|
10
10
|
main_url = "https://www.sinema.fit"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
-
description = "
|
|
12
|
+
description = "Türkiye'nin en iyi film platformu Sinema.cc! 2026'nın en yeni ve popüler yabancı yapımları, Türkçe dublaj ve altyazılı HD kalitede, reklamsız ve ücretsiz olarak seni bekliyor. Şimdi izle!"
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
15
|
f"{main_url}/page/SAYFA" : "Son Eklenen Filmler",
|
|
@@ -139,12 +139,8 @@ class SinemaCX(PluginBase):
|
|
|
139
139
|
else:
|
|
140
140
|
# Extractor'a yönlendir
|
|
141
141
|
extractor = self.ex_manager.find_extractor(iframe)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
"url" : iframe,
|
|
145
|
-
"referer" : f"{self.main_url}/",
|
|
146
|
-
"subtitles" : subtitles
|
|
147
|
-
})
|
|
142
|
+
data = await extractor.extract(iframe, referer=f"{self.main_url}/")
|
|
143
|
+
results.append(data.to_dict())
|
|
148
144
|
|
|
149
145
|
return results
|
|
150
146
|
|
|
@@ -9,7 +9,7 @@ class SuperFilmGeldi(PluginBase):
|
|
|
9
9
|
language = "tr"
|
|
10
10
|
main_url = "https://www.superfilmgeldi13.art"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
-
description = "
|
|
12
|
+
description = "Hd film izliyerek arkadaşlarınızla ve sevdiklerinizle iyi bir vakit geçirmek istiyorsanız açın bir film eğlenmeye bakın. Bilim kurgu filmleri, aşk drama vahşet aşk romantik sıradışı korku filmlerini izle."
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
15
|
f"{main_url}/page/SAYFA" : "Son Eklenenler",
|
KekikStream/Plugins/UgurFilm.py
CHANGED
|
@@ -8,7 +8,7 @@ class UgurFilm(PluginBase):
|
|
|
8
8
|
language = "tr"
|
|
9
9
|
main_url = "https://ugurfilm3.xyz"
|
|
10
10
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
11
|
-
description = "
|
|
11
|
+
description = "Uğur Film ile film izle! En yeni ve güncel filmleri, Türk yerli filmleri Full HD 1080p kalitede Türkçe Altyazılı olarak izle."
|
|
12
12
|
|
|
13
13
|
main_page = {
|
|
14
14
|
f"{main_url}/turkce-altyazili-filmler/page/" : "Türkçe Altyazılı Filmler",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.4
|
|
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
|
|
@@ -18,7 +18,7 @@ KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P
|
|
|
18
18
|
KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
|
|
19
19
|
KekikStream/Extractors/CloseLoad.py,sha256=rc1lYy32ThB4ApC1hZdqVQ3cAVHvRGHOMdjomWeDgaQ,884
|
|
20
20
|
KekikStream/Extractors/ContentX.py,sha256=u1sDdM79MNx9OdPTPcAA0OQDS7537IO8aJlffxhMi8c,2976
|
|
21
|
-
KekikStream/Extractors/ContentX_.py,sha256=
|
|
21
|
+
KekikStream/Extractors/ContentX_.py,sha256=2JjSm6mNFNwvJA68HH-YYDg-m_Cx7nNx1SgGcqKZCUk,1405
|
|
22
22
|
KekikStream/Extractors/DzenRu.py,sha256=X0Rhm1-W4YjQwVrJs8YFqVcCxMaZi8rsKiLhK_ZsYlU,1185
|
|
23
23
|
KekikStream/Extractors/ExPlay.py,sha256=EJNVKAbaIxlbOsCx7J9aLfNHKOFoqSLZZUw7W4QYeH0,1827
|
|
24
24
|
KekikStream/Extractors/FirePlayer.py,sha256=HlJjFgii0fGZK7cgwpoZAIoajabl7IQX6ZrAQT1fBIw,2188
|
|
@@ -55,28 +55,28 @@ KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B
|
|
|
55
55
|
KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
|
|
56
56
|
KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
|
|
57
57
|
KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
|
|
58
|
-
KekikStream/Plugins/Dizilla.py,sha256=
|
|
58
|
+
KekikStream/Plugins/Dizilla.py,sha256=ssoSZgT7RWO8ENYmdNeh-4pvY84yrRWDZ-qskdo8Lmg,11852
|
|
59
59
|
KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
|
|
60
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
61
|
-
KekikStream/Plugins/FilmModu.py,sha256=
|
|
60
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=xKI7iw3xvmIgyI2oir3bAWXVMFbaEDo6JrqhVRPm1vE,5260
|
|
61
|
+
KekikStream/Plugins/FilmModu.py,sha256=0qFkpX7zuH3GCwmseoKpXLved5Yg243oJb8N7DySrCQ,6871
|
|
62
62
|
KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
|
|
63
|
-
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=
|
|
64
|
-
KekikStream/Plugins/HDFilmCehennemi.py,sha256
|
|
65
|
-
KekikStream/Plugins/JetFilmizle.py,sha256=
|
|
66
|
-
KekikStream/Plugins/KultFilmler.py,sha256=
|
|
67
|
-
KekikStream/Plugins/RecTV.py,sha256=
|
|
68
|
-
KekikStream/Plugins/RoketDizi.py,sha256=
|
|
69
|
-
KekikStream/Plugins/SelcukFlix.py,sha256=
|
|
70
|
-
KekikStream/Plugins/SezonlukDizi.py,sha256=
|
|
63
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=8ozxyuJnivFe1Cu_Fb8HjVPH-ptKCSWawYzGFcA1B98,6160
|
|
64
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=-PV2u4ep6TvpuycaivkmaWie60k99T-rNtqfg5n7k5M,9584
|
|
65
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=Jm2cYEgV_bRXVjrDtnLTelvyxGHVAUCZkKmP3lUkEA8,6631
|
|
66
|
+
KekikStream/Plugins/KultFilmler.py,sha256=fABm74yQhEUsvuWRSEK0jiy0VJflxtFZ5p65UDC_NP0,9103
|
|
67
|
+
KekikStream/Plugins/RecTV.py,sha256=hsOmH4xharsscSnJMGZfvAxSJ37akfUPl1RlO0te1jA,7544
|
|
68
|
+
KekikStream/Plugins/RoketDizi.py,sha256=PY9Cf6X0I21FdMj0K48WwvwRPtznoqI3mMsctXAeLHs,8672
|
|
69
|
+
KekikStream/Plugins/SelcukFlix.py,sha256=rajt0BbdiJDFvihD5HmjwizNdgmOXb3BN8c4Ju7aRkc,12533
|
|
70
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=vW-Mvk63Y9sAJmPnY1IdFwBzCMEB2tF03zwHVETZTtI,7262
|
|
71
71
|
KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
|
|
72
|
-
KekikStream/Plugins/Sinefy.py,sha256=
|
|
73
|
-
KekikStream/Plugins/SinemaCX.py,sha256=
|
|
72
|
+
KekikStream/Plugins/Sinefy.py,sha256=riB2lgSSG5MkgxnVtX1OlApBcHG6vVjfiHyJ6h8_6DM,9965
|
|
73
|
+
KekikStream/Plugins/SinemaCX.py,sha256=dIJUOOtWSyMx7vGOE1NjrsCeW1n5DHh40--KSiW0kFA,7200
|
|
74
74
|
KekikStream/Plugins/Sinezy.py,sha256=gdszlee5QpUka0qMzGMbBoXwJCtZbe5hlA5o9FJQI1o,6226
|
|
75
|
-
KekikStream/Plugins/SuperFilmGeldi.py,sha256=
|
|
76
|
-
KekikStream/Plugins/UgurFilm.py,sha256=
|
|
77
|
-
kekikstream-2.0.
|
|
78
|
-
kekikstream-2.0.
|
|
79
|
-
kekikstream-2.0.
|
|
80
|
-
kekikstream-2.0.
|
|
81
|
-
kekikstream-2.0.
|
|
82
|
-
kekikstream-2.0.
|
|
75
|
+
KekikStream/Plugins/SuperFilmGeldi.py,sha256=4kgdWpYCLBSAn2XfL1usFG33LsTtDvo28fmDecwNA_U,5480
|
|
76
|
+
KekikStream/Plugins/UgurFilm.py,sha256=sQatQ2zb9NER8J52DRLI5K9EnYFv4I1ZgZ22HtauX3Q,4813
|
|
77
|
+
kekikstream-2.0.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
78
|
+
kekikstream-2.0.4.dist-info/METADATA,sha256=irIRhTOfz2XbPRVYyIlgpxioS8Dq1urrnsLFyLcBsSQ,10090
|
|
79
|
+
kekikstream-2.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
80
|
+
kekikstream-2.0.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
81
|
+
kekikstream-2.0.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
82
|
+
kekikstream-2.0.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|