KekikStream 2.0.8__py3-none-any.whl → 2.1.0__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/Core/Extractor/ExtractorBase.py +7 -2
- KekikStream/Core/Plugin/PluginBase.py +50 -1
- KekikStream/Extractors/ContentX.py +6 -2
- KekikStream/Extractors/PlayerFilmIzle.py +8 -5
- KekikStream/Extractors/SetPlay.py +6 -3
- KekikStream/Plugins/BelgeselX.py +0 -8
- KekikStream/Plugins/DiziBox.py +6 -10
- KekikStream/Plugins/DiziPal.py +4 -15
- KekikStream/Plugins/DiziYou.py +2 -10
- KekikStream/Plugins/Dizilla.py +2 -5
- KekikStream/Plugins/FilmBip.py +3 -6
- KekikStream/Plugins/FilmMakinesi.py +4 -6
- KekikStream/Plugins/FilmModu.py +1 -9
- KekikStream/Plugins/FullHDFilm.py +4 -7
- KekikStream/Plugins/FullHDFilmizlesene.py +3 -5
- KekikStream/Plugins/HDFilmCehennemi.py +3 -13
- KekikStream/Plugins/JetFilmizle.py +6 -10
- KekikStream/Plugins/KultFilmler.py +4 -7
- KekikStream/Plugins/RecTV.py +2 -10
- KekikStream/Plugins/RoketDizi.py +4 -7
- KekikStream/Plugins/SelcukFlix.py +3 -7
- KekikStream/Plugins/SetFilmIzle.py +3 -10
- KekikStream/Plugins/SezonlukDizi.py +3 -7
- KekikStream/Plugins/SineWix.py +1 -9
- KekikStream/Plugins/SinemaCX.py +4 -12
- KekikStream/Plugins/Sinezy.py +3 -6
- KekikStream/Plugins/SuperFilmGeldi.py +6 -8
- KekikStream/Plugins/UgurFilm.py +4 -6
- KekikStream/__init__.py +2 -21
- {kekikstream-2.0.8.dist-info → kekikstream-2.1.0.dist-info}/METADATA +1 -1
- {kekikstream-2.0.8.dist-info → kekikstream-2.1.0.dist-info}/RECORD +35 -36
- KekikStream/Extractors/FirePlayer.py +0 -60
- {kekikstream-2.0.8.dist-info → kekikstream-2.1.0.dist-info}/WHEEL +0 -0
- {kekikstream-2.0.8.dist-info → kekikstream-2.1.0.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.0.8.dist-info → kekikstream-2.1.0.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.0.8.dist-info → kekikstream-2.1.0.dist-info}/top_level.txt +0 -0
|
@@ -5,7 +5,7 @@ from cloudscraper import CloudScraper
|
|
|
5
5
|
from httpx import AsyncClient
|
|
6
6
|
from typing import Optional
|
|
7
7
|
from .ExtractorModels import ExtractResult
|
|
8
|
-
from urllib.parse import urljoin
|
|
8
|
+
from urllib.parse import urljoin, urlparse
|
|
9
9
|
|
|
10
10
|
class ExtractorBase(ABC):
|
|
11
11
|
# Çıkarıcının temel özellikleri
|
|
@@ -29,6 +29,11 @@ class ExtractorBase(ABC):
|
|
|
29
29
|
# URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
|
|
30
30
|
return self.main_url in url
|
|
31
31
|
|
|
32
|
+
def get_base_url(self, url: str) -> str:
|
|
33
|
+
"""URL'den base URL'i çıkar (scheme + netloc)"""
|
|
34
|
+
parsed = urlparse(url)
|
|
35
|
+
return f"{parsed.scheme}://{parsed.netloc}"
|
|
36
|
+
|
|
32
37
|
@abstractmethod
|
|
33
38
|
async def extract(self, url: str, referer: Optional[str] = None) -> ExtractResult:
|
|
34
39
|
# Alt sınıflar tarafından uygulanacak medya çıkarma fonksiyonu
|
|
@@ -46,4 +51,4 @@ class ExtractorBase(ABC):
|
|
|
46
51
|
if url.startswith("http") or url.startswith("{\""):
|
|
47
52
|
return url
|
|
48
53
|
|
|
49
|
-
return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
|
|
54
|
+
return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
+
from ...CLI import konsol
|
|
3
4
|
from abc import ABC, abstractmethod
|
|
4
5
|
from cloudscraper import CloudScraper
|
|
5
6
|
from httpx import AsyncClient
|
|
6
7
|
from .PluginModels import MainPageResult, SearchResult, MovieInfo
|
|
7
8
|
from ..Media.MediaHandler import MediaHandler
|
|
8
9
|
from ..Extractor.ExtractorManager import ExtractorManager
|
|
10
|
+
from ..Extractor.ExtractorModels import ExtractResult
|
|
9
11
|
from urllib.parse import urljoin
|
|
10
12
|
import re
|
|
11
13
|
|
|
@@ -95,6 +97,41 @@ class PluginBase(ABC):
|
|
|
95
97
|
|
|
96
98
|
return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
|
|
97
99
|
|
|
100
|
+
async def extract(self, url: str, referer: str = None, prefix: str | None = None) -> dict | None:
|
|
101
|
+
"""
|
|
102
|
+
Extractor ile video URL'sini çıkarır.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
url: Iframe veya video URL'si
|
|
106
|
+
referer: Referer header (varsayılan: plugin main_url)
|
|
107
|
+
prefix: İsmin başına eklenecek opsiyonel etiket (örn: "Türkçe Dublaj")
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
dict: Extractor sonucu (name prefix ile birleştirilmiş) veya None
|
|
111
|
+
|
|
112
|
+
Extractor bulunamadığında veya hata oluştuğunda uyarı verir.
|
|
113
|
+
"""
|
|
114
|
+
if referer is None:
|
|
115
|
+
referer = f"{self.main_url}/"
|
|
116
|
+
|
|
117
|
+
extractor = self.ex_manager.find_extractor(url)
|
|
118
|
+
if not extractor:
|
|
119
|
+
konsol.log(f"[magenta][?] {self.name} » Extractor bulunamadı: {url}")
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
data = await extractor.extract(url, referer=referer)
|
|
124
|
+
result = data.dict()
|
|
125
|
+
|
|
126
|
+
# prefix varsa name'e ekle
|
|
127
|
+
if prefix and result.get("name"):
|
|
128
|
+
result["name"] = f"{prefix} | {result['name']}"
|
|
129
|
+
|
|
130
|
+
return result
|
|
131
|
+
except Exception as hata:
|
|
132
|
+
konsol.log(f"[red][!] {self.name} » Extractor hatası ({extractor.name}): {hata}")
|
|
133
|
+
return None
|
|
134
|
+
|
|
98
135
|
@staticmethod
|
|
99
136
|
def clean_title(title: str) -> str:
|
|
100
137
|
suffixes = [
|
|
@@ -119,4 +156,16 @@ class PluginBase(ABC):
|
|
|
119
156
|
for suffix in suffixes:
|
|
120
157
|
cleaned_title = re.sub(f"{re.escape(suffix)}.*$", "", cleaned_title, flags=re.IGNORECASE).strip()
|
|
121
158
|
|
|
122
|
-
return cleaned_title
|
|
159
|
+
return cleaned_title
|
|
160
|
+
|
|
161
|
+
async def play(self, **kwargs):
|
|
162
|
+
"""
|
|
163
|
+
Varsayılan oynatma metodu.
|
|
164
|
+
Tüm pluginlerde ortak kullanılır.
|
|
165
|
+
"""
|
|
166
|
+
extract_result = ExtractResult(**kwargs)
|
|
167
|
+
self.media_handler.title = kwargs.get("name")
|
|
168
|
+
if self.name not in self.media_handler.title:
|
|
169
|
+
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
170
|
+
|
|
171
|
+
self.media_handler.play_media(extract_result)
|
|
@@ -24,6 +24,9 @@ class ContentX(ExtractorBase):
|
|
|
24
24
|
if referer:
|
|
25
25
|
self.httpx.headers.update({"Referer": referer})
|
|
26
26
|
|
|
27
|
+
# Dinamik base URL kullan
|
|
28
|
+
base_url = self.get_base_url(url)
|
|
29
|
+
|
|
27
30
|
istek = await self.httpx.get(url)
|
|
28
31
|
istek.raise_for_status()
|
|
29
32
|
i_source = istek.text
|
|
@@ -52,7 +55,8 @@ class ContentX(ExtractorBase):
|
|
|
52
55
|
)
|
|
53
56
|
)
|
|
54
57
|
|
|
55
|
-
|
|
58
|
+
# base_url kullan (contentx.me yerine)
|
|
59
|
+
vid_source_request = await self.httpx.get(f"{base_url}/source2.php?v={i_extract_value}", headers={"Referer": referer or base_url})
|
|
56
60
|
vid_source_request.raise_for_status()
|
|
57
61
|
|
|
58
62
|
vid_source = vid_source_request.text
|
|
@@ -72,7 +76,7 @@ class ContentX(ExtractorBase):
|
|
|
72
76
|
|
|
73
77
|
if i_dublaj := re.search(r',\"([^"]+)\",\"Türkçe"', i_source):
|
|
74
78
|
dublaj_value = i_dublaj[1]
|
|
75
|
-
dublaj_source_request = await self.httpx.get(f"{
|
|
79
|
+
dublaj_source_request = await self.httpx.get(f"{base_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or base_url})
|
|
76
80
|
dublaj_source_request.raise_for_status()
|
|
77
81
|
|
|
78
82
|
dublaj_source = dublaj_source_request.text
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
|
4
|
-
import re
|
|
4
|
+
import re
|
|
5
5
|
|
|
6
6
|
class PlayerFilmIzle(ExtractorBase):
|
|
7
7
|
name = "PlayerFilmIzle"
|
|
8
8
|
main_url = "https://player.filmizle.in"
|
|
9
9
|
|
|
10
|
+
def can_handle_url(self, url: str) -> bool:
|
|
11
|
+
return "filmizle.in" in url or "fireplayer" in url.lower()
|
|
12
|
+
|
|
10
13
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
11
14
|
# Kotlin tarafında referer mainUrl olarak zorlanmış
|
|
12
15
|
ext_ref = self.main_url
|
|
@@ -29,20 +32,20 @@ class PlayerFilmIzle(ExtractorBase):
|
|
|
29
32
|
# Data yakalama: FirePlayer|DATA|...
|
|
30
33
|
data_match = re.search(r'FirePlayer\|([^|]+)\|', video_req, re.IGNORECASE)
|
|
31
34
|
data_val = data_match.group(1) if data_match else None
|
|
32
|
-
|
|
35
|
+
|
|
33
36
|
if not data_val:
|
|
34
37
|
raise ValueError("PlayerFilmIzle: Data bulunamadı")
|
|
35
38
|
|
|
36
39
|
url_post = f"{self.main_url}/player/index.php?data={data_val}&do=getVideo"
|
|
37
|
-
|
|
40
|
+
|
|
38
41
|
post_headers = {
|
|
39
42
|
"Referer": ext_ref,
|
|
40
43
|
"X-Requested-With": "XMLHttpRequest"
|
|
41
44
|
}
|
|
42
|
-
|
|
45
|
+
|
|
43
46
|
# Kotlin'de post data: "hash" -> data, "r" -> ""
|
|
44
47
|
post_data = {"hash": data_val, "r": ""}
|
|
45
|
-
|
|
48
|
+
|
|
46
49
|
response = await self.httpx.post(url_post, data=post_data, headers=post_headers)
|
|
47
50
|
get_url = response.text.replace("\\", "")
|
|
48
51
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from KekikStream.Core import ExtractorBase, ExtractResult
|
|
4
|
+
from urllib.parse import urlparse, parse_qs
|
|
4
5
|
import re
|
|
5
6
|
|
|
6
7
|
class SetPlay(ExtractorBase):
|
|
@@ -19,6 +20,9 @@ class SetPlay(ExtractorBase):
|
|
|
19
20
|
if referer:
|
|
20
21
|
self.httpx.headers.update({"Referer": referer})
|
|
21
22
|
|
|
23
|
+
# Dinamik base URL kullan
|
|
24
|
+
base_url = self.get_base_url(url)
|
|
25
|
+
|
|
22
26
|
istek = await self.httpx.get(url)
|
|
23
27
|
istek.raise_for_status()
|
|
24
28
|
|
|
@@ -39,7 +43,6 @@ class SetPlay(ExtractorBase):
|
|
|
39
43
|
title_base = title_match[1].split(".")[-1] if title_match else "Unknown"
|
|
40
44
|
|
|
41
45
|
# partKey logic
|
|
42
|
-
from urllib.parse import urlparse, parse_qs
|
|
43
46
|
parsed = urlparse(url)
|
|
44
47
|
params = parse_qs(parsed.query)
|
|
45
48
|
part_key = params.get("partKey", [""])[0]
|
|
@@ -52,8 +55,8 @@ class SetPlay(ExtractorBase):
|
|
|
52
55
|
else:
|
|
53
56
|
name_suffix = title_base
|
|
54
57
|
|
|
55
|
-
# M3U8 link oluştur
|
|
56
|
-
m3u_link = f"{
|
|
58
|
+
# M3U8 link oluştur - base_url kullan (main_url yerine)
|
|
59
|
+
m3u_link = f"{base_url}{video_url}?s={video_server}"
|
|
57
60
|
|
|
58
61
|
return ExtractResult(
|
|
59
62
|
name = f"{self.name} - {name_suffix}",
|
KekikStream/Plugins/BelgeselX.py
CHANGED
|
@@ -194,11 +194,3 @@ class BelgeselX(PluginBase):
|
|
|
194
194
|
})
|
|
195
195
|
|
|
196
196
|
return links
|
|
197
|
-
|
|
198
|
-
async def play(self, **kwargs):
|
|
199
|
-
extract_result = ExtractResult(**kwargs)
|
|
200
|
-
self.media_handler.title = kwargs.get("name")
|
|
201
|
-
if self.name not in self.media_handler.title:
|
|
202
|
-
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
203
|
-
|
|
204
|
-
self.media_handler.play_media(extract_result)
|
KekikStream/Plugins/DiziBox.py
CHANGED
|
@@ -182,11 +182,9 @@ class DiziBox(PluginBase):
|
|
|
182
182
|
if main_iframe := secici.css("div#video-area iframe::attr(src)").get():
|
|
183
183
|
if decoded := await self._iframe_decode(self.name, main_iframe, url):
|
|
184
184
|
for iframe in decoded:
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
"name" : f"{extractor.name if extractor else 'Main Player'}"
|
|
189
|
-
})
|
|
185
|
+
data = await self.extract(iframe)
|
|
186
|
+
if data:
|
|
187
|
+
results.append(data)
|
|
190
188
|
|
|
191
189
|
for alternatif in secici.css("div.video-toolbar option[value]"):
|
|
192
190
|
alt_name = alternatif.css("::text").get()
|
|
@@ -203,10 +201,8 @@ class DiziBox(PluginBase):
|
|
|
203
201
|
if alt_iframe := alt_secici.css("div#video-area iframe::attr(src)").get():
|
|
204
202
|
if decoded := await self._iframe_decode(alt_name, alt_iframe, url):
|
|
205
203
|
for iframe in decoded:
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
"name" : f"{extractor.name if extractor else alt_name}"
|
|
210
|
-
})
|
|
204
|
+
data = await self.extract(iframe, prefix=alt_name)
|
|
205
|
+
if data:
|
|
206
|
+
results.append(data)
|
|
211
207
|
|
|
212
208
|
return results
|
KekikStream/Plugins/DiziPal.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode,
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, Subtitle
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -228,19 +228,8 @@ class DiziPal(PluginBase):
|
|
|
228
228
|
})
|
|
229
229
|
else:
|
|
230
230
|
# Extractor'a yönlendir
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
"url" : iframe,
|
|
235
|
-
"referer" : f"{self.main_url}/",
|
|
236
|
-
})
|
|
231
|
+
data = await self.extract(iframe)
|
|
232
|
+
if data:
|
|
233
|
+
results.append(data)
|
|
237
234
|
|
|
238
235
|
return results
|
|
239
|
-
|
|
240
|
-
async def play(self, **kwargs):
|
|
241
|
-
extract_result = ExtractResult(**kwargs)
|
|
242
|
-
self.media_handler.title = kwargs.get("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)
|
KekikStream/Plugins/DiziYou.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -186,12 +186,4 @@ class DiziYou(PluginBase):
|
|
|
186
186
|
"subtitles" : subtitles
|
|
187
187
|
})
|
|
188
188
|
|
|
189
|
-
return results
|
|
190
|
-
|
|
191
|
-
async def play(self, **kwargs):
|
|
192
|
-
extract_result = ExtractResult(**kwargs)
|
|
193
|
-
self.media_handler.title = kwargs.get("name")
|
|
194
|
-
if self.name not in self.media_handler.title:
|
|
195
|
-
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
196
|
-
|
|
197
|
-
self.media_handler.play_media(extract_result)
|
|
189
|
+
return results
|
KekikStream/Plugins/Dizilla.py
CHANGED
|
@@ -196,8 +196,5 @@ class Dizilla(PluginBase):
|
|
|
196
196
|
if not iframe_url:
|
|
197
197
|
return []
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
return [
|
|
201
|
-
"url" : iframe_url,
|
|
202
|
-
"name" : f"{extractor.name if extractor else 'Main Player'} | {first_result.get('language_name', 'Unknown')}",
|
|
203
|
-
}]
|
|
199
|
+
data = await self.extract(iframe_url, prefix=first_result.get('language_name', 'Unknown'))
|
|
200
|
+
return [data] if data else []
|
KekikStream/Plugins/FilmBip.py
CHANGED
|
@@ -135,11 +135,8 @@ class FilmBip(PluginBase):
|
|
|
135
135
|
iframe = self.fix_url(player.css("iframe::attr(src)").get())
|
|
136
136
|
|
|
137
137
|
if iframe:
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
"url" : iframe,
|
|
142
|
-
"referer" : f"{self.main_url}/"
|
|
143
|
-
})
|
|
138
|
+
data = await self.extract(iframe)
|
|
139
|
+
if data:
|
|
140
|
+
results.append(data)
|
|
144
141
|
|
|
145
142
|
return results
|
|
@@ -111,11 +111,9 @@ class FilmMakinesi(PluginBase):
|
|
|
111
111
|
all_links.append(link.attrib.get("data-video_url"))
|
|
112
112
|
|
|
113
113
|
response = []
|
|
114
|
-
for
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"name" : f"{extractor.name if extractor else f'Player {idx + 1}'}",
|
|
119
|
-
})
|
|
114
|
+
for link in all_links:
|
|
115
|
+
data = await self.extract(link)
|
|
116
|
+
if data:
|
|
117
|
+
response.append(data)
|
|
120
118
|
|
|
121
119
|
return response
|
KekikStream/Plugins/FilmModu.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo,
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -132,11 +132,3 @@ class FilmModu(PluginBase):
|
|
|
132
132
|
})
|
|
133
133
|
|
|
134
134
|
return results
|
|
135
|
-
|
|
136
|
-
async def play(self, **kwargs):
|
|
137
|
-
extract_result = ExtractResult(**kwargs)
|
|
138
|
-
self.media_handler.title = kwargs.get("name")
|
|
139
|
-
if self.name not in self.media_handler.title:
|
|
140
|
-
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
141
|
-
|
|
142
|
-
self.media_handler.play_media(extract_result)
|
|
@@ -153,12 +153,9 @@ class FullHDFilm(PluginBase):
|
|
|
153
153
|
results = []
|
|
154
154
|
|
|
155
155
|
if iframe_src:
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
"
|
|
159
|
-
|
|
160
|
-
"referer" : self.main_url,
|
|
161
|
-
"subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
|
|
162
|
-
})
|
|
156
|
+
data = await self.extract(iframe_src)
|
|
157
|
+
if data:
|
|
158
|
+
data["subtitles"] = [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
|
|
159
|
+
results.append(data)
|
|
163
160
|
|
|
164
161
|
return results
|
|
@@ -119,10 +119,8 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
119
119
|
response = []
|
|
120
120
|
for link in link_list:
|
|
121
121
|
link = f"https:{link}" if link.startswith("//") else link
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
"name" : extractor.name if extractor else "Direct Link"
|
|
126
|
-
})
|
|
122
|
+
data = await self.extract(link)
|
|
123
|
+
if data:
|
|
124
|
+
response.append(data)
|
|
127
125
|
|
|
128
126
|
return response
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo,
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
from Kekik.Sifreleme import Packer, StreamDecoder
|
|
6
|
-
import random, string, re
|
|
6
|
+
import random, string, re
|
|
7
7
|
|
|
8
8
|
class HDFilmCehennemi(PluginBase):
|
|
9
9
|
name = "HDFilmCehennemi"
|
|
@@ -11,8 +11,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
11
11
|
main_url = "https://www.hdfilmcehennemi.ws"
|
|
12
12
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
13
13
|
description = "Türkiye'nin en hızlı hd film izleme sitesi. Tek ve gerçek hdfilmcehennemi sitesi."
|
|
14
|
-
|
|
15
|
-
|
|
16
14
|
|
|
17
15
|
main_page = {
|
|
18
16
|
f"{main_url}" : "Yeni Eklenen Filmler",
|
|
@@ -285,12 +283,4 @@ class HDFilmCehennemi(PluginBase):
|
|
|
285
283
|
for video_data in video_data_list:
|
|
286
284
|
results.append(video_data)
|
|
287
285
|
|
|
288
|
-
return results
|
|
289
|
-
|
|
290
|
-
async def play(self, **kwargs):
|
|
291
|
-
extract_result = ExtractResult(**kwargs)
|
|
292
|
-
self.media_handler.title = kwargs.get("name")
|
|
293
|
-
if self.name not in self.media_handler.title:
|
|
294
|
-
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
295
|
-
|
|
296
|
-
self.media_handler.play_media(extract_result)
|
|
286
|
+
return results
|
|
@@ -110,11 +110,9 @@ class JetFilmizle(PluginBase):
|
|
|
110
110
|
|
|
111
111
|
if src and src != "about:blank":
|
|
112
112
|
iframe_url = self.fix_url(src)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
"name": extractor.name if extractor else "Ana Player"
|
|
117
|
-
})
|
|
113
|
+
data = await self.extract(iframe_url)
|
|
114
|
+
if data:
|
|
115
|
+
results.append(data)
|
|
118
116
|
|
|
119
117
|
# 2) Sayfa numaralarından linkleri topla (Fragman hariç)
|
|
120
118
|
page_links = []
|
|
@@ -138,11 +136,9 @@ class JetFilmizle(PluginBase):
|
|
|
138
136
|
|
|
139
137
|
if src and src != "about:blank":
|
|
140
138
|
iframe_url = self.fix_url(src)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
"name": f"{extractor.name if extractor else 'Player'} | {isim}"
|
|
145
|
-
})
|
|
139
|
+
data = await self.extract(iframe_url, prefix=isim)
|
|
140
|
+
if data:
|
|
141
|
+
results.append(data)
|
|
146
142
|
except Exception:
|
|
147
143
|
continue
|
|
148
144
|
|
|
@@ -208,12 +208,9 @@ class KultFilmler(PluginBase):
|
|
|
208
208
|
if subtitle_url:
|
|
209
209
|
subtitles.append(Subtitle(name="Türkçe", url=subtitle_url))
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
"
|
|
214
|
-
|
|
215
|
-
"referer" : f"{self.main_url}/",
|
|
216
|
-
"subtitles" : subtitles
|
|
217
|
-
})
|
|
211
|
+
data = await self.extract(iframe)
|
|
212
|
+
if data:
|
|
213
|
+
data["subtitles"] = subtitles
|
|
214
|
+
results.append(data)
|
|
218
215
|
|
|
219
216
|
return results
|
KekikStream/Plugins/RecTV.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo
|
|
4
4
|
from json import dumps, loads
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -147,12 +147,4 @@ class RecTV(PluginBase):
|
|
|
147
147
|
"referer" : "https://twitter.com/"
|
|
148
148
|
})
|
|
149
149
|
|
|
150
|
-
return results
|
|
151
|
-
|
|
152
|
-
async def play(self, **kwargs):
|
|
153
|
-
extract_result = ExtractResult(**kwargs)
|
|
154
|
-
self.media_handler.title = kwargs.get("name")
|
|
155
|
-
if self.name not in self.media_handler.title:
|
|
156
|
-
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
157
|
-
|
|
158
|
-
self.media_handler.play_media(extract_result)
|
|
150
|
+
return results
|
KekikStream/Plugins/RoketDizi.py
CHANGED
|
@@ -211,13 +211,10 @@ class RoketDizi(PluginBase):
|
|
|
211
211
|
continue
|
|
212
212
|
seen_urls.add(iframe_url)
|
|
213
213
|
|
|
214
|
-
#
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
"url" : iframe_url,
|
|
219
|
-
"name" : extractor.name if extractor else "Player"
|
|
220
|
-
})
|
|
214
|
+
# Extract with helper
|
|
215
|
+
data = await self.extract(iframe_url)
|
|
216
|
+
if data:
|
|
217
|
+
results.append(data)
|
|
221
218
|
|
|
222
219
|
return results
|
|
223
220
|
|
|
@@ -284,13 +284,9 @@ class SelcukFlix(PluginBase):
|
|
|
284
284
|
iframe_src = iframe_sel.css("iframe::attr(src)").get()
|
|
285
285
|
if iframe_src:
|
|
286
286
|
iframe_src = self.fix_url(iframe_src)
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
return [{
|
|
291
|
-
"url" : iframe_src,
|
|
292
|
-
"name" : extractor.name
|
|
293
|
-
}]
|
|
287
|
+
data = await self.extract(iframe_src)
|
|
288
|
+
if data:
|
|
289
|
+
return [data]
|
|
294
290
|
|
|
295
291
|
return []
|
|
296
292
|
|
|
@@ -245,15 +245,8 @@ class SetFilmIzle(PluginBase):
|
|
|
245
245
|
if not label and part_key:
|
|
246
246
|
label = part_key.replace("_", " ").title()
|
|
247
247
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
name = f"{name} | {label}"
|
|
252
|
-
|
|
253
|
-
links.append({
|
|
254
|
-
"url" : iframe_url,
|
|
255
|
-
"name" : name,
|
|
256
|
-
"referer" : self.main_url
|
|
257
|
-
})
|
|
248
|
+
data = await self.extract(iframe_url, prefix=label if label else None)
|
|
249
|
+
if data:
|
|
250
|
+
links.append(data)
|
|
258
251
|
|
|
259
252
|
return links
|
|
@@ -152,12 +152,8 @@ class SezonlukDizi(PluginBase):
|
|
|
152
152
|
continue
|
|
153
153
|
|
|
154
154
|
iframe_url = self.fix_url(iframe)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
results.append({
|
|
159
|
-
"url" : iframe_url,
|
|
160
|
-
"name" : f"{extractor.name} | {label}"
|
|
161
|
-
})
|
|
155
|
+
data = await self.extract(iframe_url, prefix=label)
|
|
156
|
+
if data:
|
|
157
|
+
results.append(data)
|
|
162
158
|
|
|
163
159
|
return results
|
KekikStream/Plugins/SineWix.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo
|
|
4
4
|
import json
|
|
5
5
|
|
|
6
6
|
class SineWix(PluginBase):
|
|
@@ -156,11 +156,3 @@ class SineWix(PluginBase):
|
|
|
156
156
|
})
|
|
157
157
|
|
|
158
158
|
return results
|
|
159
|
-
|
|
160
|
-
async def play(self, **kwargs):
|
|
161
|
-
extract_result = ExtractResult(**kwargs)
|
|
162
|
-
self.media_handler.title = kwargs.get("name")
|
|
163
|
-
if self.name not in self.media_handler.title:
|
|
164
|
-
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
165
|
-
|
|
166
|
-
self.media_handler.play_media(extract_result)
|
KekikStream/Plugins/SinemaCX.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo,
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -138,16 +138,8 @@ class SinemaCX(PluginBase):
|
|
|
138
138
|
})
|
|
139
139
|
else:
|
|
140
140
|
# Extractor'a yönlendir
|
|
141
|
-
|
|
142
|
-
data
|
|
143
|
-
|
|
141
|
+
data = await self.extract(iframe)
|
|
142
|
+
if data:
|
|
143
|
+
results.append(data)
|
|
144
144
|
|
|
145
145
|
return results
|
|
146
|
-
|
|
147
|
-
async def play(self, **kwargs):
|
|
148
|
-
extract_result = ExtractResult(**kwargs)
|
|
149
|
-
self.media_handler.title = kwargs.get("name")
|
|
150
|
-
if self.name not in self.media_handler.title:
|
|
151
|
-
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
152
|
-
|
|
153
|
-
self.media_handler.play_media(extract_result)
|
KekikStream/Plugins/Sinezy.py
CHANGED
|
@@ -134,12 +134,9 @@ class Sinezy(PluginBase):
|
|
|
134
134
|
iframe = iframe_match.group(1)
|
|
135
135
|
iframe = self.fix_url(iframe)
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
"url" : iframe,
|
|
141
|
-
"name" : extractor.name if extractor else "Iframe"
|
|
142
|
-
}]
|
|
137
|
+
data = await self.extract(iframe)
|
|
138
|
+
if data:
|
|
139
|
+
return [data]
|
|
143
140
|
except Exception:
|
|
144
141
|
pass
|
|
145
142
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -89,7 +89,7 @@ class SuperFilmGeldi(PluginBase):
|
|
|
89
89
|
# Mix player özel işleme
|
|
90
90
|
if "mix" in iframe and "index.php?data=" in iframe:
|
|
91
91
|
iframe_istek = await self.httpx.get(iframe, headers={"Referer": f"{self.main_url}/"})
|
|
92
|
-
mix_point = re.search(r'videoUrl"
|
|
92
|
+
mix_point = re.search(r'videoUrl"\s*:\s*"(.*?)"\s*,\s*"videoServer', iframe_istek.text)
|
|
93
93
|
|
|
94
94
|
if mix_point:
|
|
95
95
|
mix_point = mix_point[1].replace("\\", "")
|
|
@@ -111,11 +111,9 @@ class SuperFilmGeldi(PluginBase):
|
|
|
111
111
|
"subtitles" : []
|
|
112
112
|
})
|
|
113
113
|
else:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"referer" : f"{self.main_url}/"
|
|
119
|
-
})
|
|
114
|
+
# Extractor'a yönlendir
|
|
115
|
+
data = await self.extract(iframe)
|
|
116
|
+
if data:
|
|
117
|
+
results.append(data)
|
|
120
118
|
|
|
121
119
|
return results
|
KekikStream/Plugins/UgurFilm.py
CHANGED
|
@@ -84,7 +84,7 @@ class UgurFilm(PluginBase):
|
|
|
84
84
|
secici = Selector(istek.text)
|
|
85
85
|
results = []
|
|
86
86
|
|
|
87
|
-
for
|
|
87
|
+
for part_link in secici.css("li.parttab a::attr(href)").getall():
|
|
88
88
|
sub_response = await self.httpx.get(part_link)
|
|
89
89
|
sub_selector = Selector(sub_response.text)
|
|
90
90
|
|
|
@@ -100,10 +100,8 @@ class UgurFilm(PluginBase):
|
|
|
100
100
|
data = post_data
|
|
101
101
|
)
|
|
102
102
|
iframe = self.fix_url(player_response.json().get("iframe"))
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
"name" : f"{extractor.name if extractor else f'Part {idx + 1}'}"
|
|
107
|
-
})
|
|
103
|
+
data = await self.extract(iframe)
|
|
104
|
+
if data:
|
|
105
|
+
results.append(data)
|
|
108
106
|
|
|
109
107
|
return results
|
KekikStream/__init__.py
CHANGED
|
@@ -232,27 +232,8 @@ class KekikStream:
|
|
|
232
232
|
konsol.print("[bold red]Bağlantı bulunamadı![/bold red]")
|
|
233
233
|
return await self.handle_no_results()
|
|
234
234
|
|
|
235
|
-
# Direkt oynatma
|
|
236
|
-
|
|
237
|
-
return await self.play_direct(links)
|
|
238
|
-
|
|
239
|
-
# Extractor ile oynat
|
|
240
|
-
url_list = [link["url"] for link in links]
|
|
241
|
-
mapping = self.extractor.map_links_to_extractors(url_list)
|
|
242
|
-
|
|
243
|
-
if not mapping:
|
|
244
|
-
konsol.print("[bold red]Extractor bulunamadı![/bold red]")
|
|
245
|
-
return await self.handle_no_results()
|
|
246
|
-
|
|
247
|
-
choice = await self.ui.select_from_list("Ne yapmak istersiniz?", ["İzle", "Tüm Eklentilerde Ara", "Ana Menü"])
|
|
248
|
-
|
|
249
|
-
match choice:
|
|
250
|
-
case "İzle":
|
|
251
|
-
await self.play_with_extractor(links, mapping)
|
|
252
|
-
case "Tüm Eklentilerde Ara":
|
|
253
|
-
await self.search_all_plugins()
|
|
254
|
-
case "Ana Menü":
|
|
255
|
-
await self.start()
|
|
235
|
+
# Direkt oynatma - tüm pluginlerde artık play metodu var (PluginBase'den miras)
|
|
236
|
+
return await self.play_direct(links)
|
|
256
237
|
|
|
257
238
|
async def play_direct(self, links: list[dict]):
|
|
258
239
|
"""Plugin'in kendi metoduyla oynat"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.0
|
|
3
|
+
Version: 2.1.0
|
|
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
|
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
KekikStream/__init__.py,sha256=
|
|
1
|
+
KekikStream/__init__.py,sha256=7WBVAkCpUNvxYgRjDiy3sCdug7efWL7yg_SDdwsB9K4,12775
|
|
2
2
|
KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
|
|
3
3
|
KekikStream/requirements.txt,sha256=0fO-7byqgLMr4NyJO7fQBFOnLv0zcAeqk7tLhHXqonk,76
|
|
4
4
|
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
|
5
5
|
KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElcii8,1487
|
|
6
6
|
KekikStream/Core/__init__.py,sha256=Ise27_Hqe1YeqTcSNnf3HqynhbySEVC-pNP2uKa2GOo,771
|
|
7
|
-
KekikStream/Core/Extractor/ExtractorBase.py,sha256=
|
|
7
|
+
KekikStream/Core/Extractor/ExtractorBase.py,sha256=CAdeel6zGlj_RHD0lwjyNW5hAaivo1XyAZbnmiVDaZo,2023
|
|
8
8
|
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=GPGCmgFpDBywR8CsNw43-ddseZhSKTjAUETp1Ohbi6E,4796
|
|
9
9
|
KekikStream/Core/Extractor/ExtractorManager.py,sha256=VYkj4CCE5Puqsr6PCeN8i_OS0hfYKI4NScj98BLO39o,2644
|
|
10
10
|
KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6XBOc0HS0tXGDwajI,445
|
|
11
11
|
KekikStream/Core/Extractor/YTDLPCache.py,sha256=sRg5kwFxkRXA_8iRwsV29E51g9qQJvg8dWUnzfr7EwA,984
|
|
12
12
|
KekikStream/Core/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
|
|
13
13
|
KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
|
|
14
|
-
KekikStream/Core/Plugin/PluginBase.py,sha256=
|
|
14
|
+
KekikStream/Core/Plugin/PluginBase.py,sha256=OYmYtIlyIVq8nPXqEi7i3zBG4pren10ZoyZ-LnWb8e8,5969
|
|
15
15
|
KekikStream/Core/Plugin/PluginLoader.py,sha256=GcDqN1u3nJeoGKH_oDFHCpwteJlLCxHNbmPrC5L-hZE,3692
|
|
16
16
|
KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
|
|
17
17
|
KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P8S0tRNhS6E,2476
|
|
18
18
|
KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
|
|
19
19
|
KekikStream/Extractors/CloseLoad.py,sha256=rc1lYy32ThB4ApC1hZdqVQ3cAVHvRGHOMdjomWeDgaQ,884
|
|
20
|
-
KekikStream/Extractors/ContentX.py,sha256=
|
|
20
|
+
KekikStream/Extractors/ContentX.py,sha256=x0j67e1OAw4L1m7ejUTyiIxqr1EhvpjaA_0U-s4IQ-I,3617
|
|
21
21
|
KekikStream/Extractors/DonilasPlay.py,sha256=Lr60pEht96SMlXICYWo9J5dOwV4ty8fetBCCqJ3ARUY,3221
|
|
22
22
|
KekikStream/Extractors/DzenRu.py,sha256=X0Rhm1-W4YjQwVrJs8YFqVcCxMaZi8rsKiLhK_ZsYlU,1185
|
|
23
23
|
KekikStream/Extractors/ExPlay.py,sha256=EJNVKAbaIxlbOsCx7J9aLfNHKOFoqSLZZUw7W4QYeH0,1827
|
|
24
|
-
KekikStream/Extractors/FirePlayer.py,sha256=HlJjFgii0fGZK7cgwpoZAIoajabl7IQX6ZrAQT1fBIw,2188
|
|
25
24
|
KekikStream/Extractors/HDPlayerSystem.py,sha256=EgnFzx5Q4PkuwAtuff5SYU9k59B-CyOdySl7lbCZ9hM,1312
|
|
26
25
|
KekikStream/Extractors/JetTv.py,sha256=aA3WeOvR-tszac-WSwunZZb1NRy25TQH8vxY3TDscRI,1596
|
|
27
26
|
KekikStream/Extractors/MailRu.py,sha256=xQVCWwYqNoG5T43VAW1_m0v4e80FbO-1pNPKkwhTccU,1218
|
|
@@ -31,9 +30,9 @@ KekikStream/Extractors/MolyStream.py,sha256=IeeBw9tJJrL5QQ-t2Yp-a-6lnDc3Y00UNiaN
|
|
|
31
30
|
KekikStream/Extractors/Odnoklassniki.py,sha256=YfFRCL3Ag5N4zDzK9ZLOr3HVQcsETFQpff1px02imJ0,4019
|
|
32
31
|
KekikStream/Extractors/PeaceMakerst.py,sha256=pEgJb3KDfEPAUjbuvrYbUlxIciKgED-Vd0arrRO3QCk,2317
|
|
33
32
|
KekikStream/Extractors/PixelDrain.py,sha256=Uk2pPvtBzaKtRXu1iNO8FLHd0EAuIOIzI1H_n02tg-U,964
|
|
34
|
-
KekikStream/Extractors/PlayerFilmIzle.py,sha256=
|
|
33
|
+
KekikStream/Extractors/PlayerFilmIzle.py,sha256=kH-O_RtQvG4iRLGKi-sFn1ST14DrxxoAa5iRT2PsdXc,2503
|
|
35
34
|
KekikStream/Extractors/RapidVid.py,sha256=FgAZfgtnKE57KRiRIFw-6_ZES0Trp5QriNbRTfSBGQs,3139
|
|
36
|
-
KekikStream/Extractors/SetPlay.py,sha256=
|
|
35
|
+
KekikStream/Extractors/SetPlay.py,sha256=6XuNXoNFM1h3KOCkTxeZmcAl8QTdqzVN_pp_dEIKF8A,2235
|
|
37
36
|
KekikStream/Extractors/SetPrime.py,sha256=ob09y-Sm91YR7rIRzikhZiMHX6D4Djm5QzFTg6KbO4k,1536
|
|
38
37
|
KekikStream/Extractors/SibNet.py,sha256=zJTkzlr34ufKCWzKKCgJrzhb2o-fpjTjFdi38gv6N6g,849
|
|
39
38
|
KekikStream/Extractors/Sobreatsesuyp.py,sha256=qlSQHUHjTjBoY0nsuZQWAjnfswbPORkBg6rUuP7SagA,2000
|
|
@@ -49,33 +48,33 @@ KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ3
|
|
|
49
48
|
KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
|
|
50
49
|
KekikStream/Extractors/YTDLP.py,sha256=Hy8loCSFSquu2zaL3INord-Jm6T8CM6K2-VcDA2K79g,7390
|
|
51
50
|
KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
|
|
52
|
-
KekikStream/Plugins/BelgeselX.py,sha256=
|
|
53
|
-
KekikStream/Plugins/DiziBox.py,sha256=
|
|
54
|
-
KekikStream/Plugins/DiziPal.py,sha256=
|
|
55
|
-
KekikStream/Plugins/DiziYou.py,sha256=
|
|
56
|
-
KekikStream/Plugins/Dizilla.py,sha256=
|
|
57
|
-
KekikStream/Plugins/FilmBip.py,sha256=
|
|
58
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
59
|
-
KekikStream/Plugins/FilmModu.py,sha256=
|
|
60
|
-
KekikStream/Plugins/FullHDFilm.py,sha256=
|
|
61
|
-
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=
|
|
62
|
-
KekikStream/Plugins/HDFilmCehennemi.py,sha256=
|
|
63
|
-
KekikStream/Plugins/JetFilmizle.py,sha256=
|
|
64
|
-
KekikStream/Plugins/KultFilmler.py,sha256=
|
|
65
|
-
KekikStream/Plugins/RecTV.py,sha256=
|
|
66
|
-
KekikStream/Plugins/RoketDizi.py,sha256=
|
|
67
|
-
KekikStream/Plugins/SelcukFlix.py,sha256=
|
|
68
|
-
KekikStream/Plugins/SetFilmIzle.py,sha256=
|
|
69
|
-
KekikStream/Plugins/SezonlukDizi.py,sha256=
|
|
70
|
-
KekikStream/Plugins/SineWix.py,sha256=
|
|
51
|
+
KekikStream/Plugins/BelgeselX.py,sha256=qVYZpmadbVImCAlBNwkak7ShHVECFgO3cr5VcPGnq6Y,8396
|
|
52
|
+
KekikStream/Plugins/DiziBox.py,sha256=7WxUhyr-RwDpgYS3SnlwgN_TQnSPSZ-lZ5xW-mPbCek,9691
|
|
53
|
+
KekikStream/Plugins/DiziPal.py,sha256=hCjf1as54Bc6aC3UV9P0T4yIbOFOP6jHIAoIgRMPbJQ,9686
|
|
54
|
+
KekikStream/Plugins/DiziYou.py,sha256=XTTShRhlDjTNeqgc28HF-FN9Y7tGUBzHZU0KuFgwvYA,8669
|
|
55
|
+
KekikStream/Plugins/Dizilla.py,sha256=OzZJuFDJK6q6szIcAFM-s3H1HNdUuTaK8VWVGhnONBs,11741
|
|
56
|
+
KekikStream/Plugins/FilmBip.py,sha256=bgdUJWW6f_DoaKxJPES0tJJRauy2PVpw4jsg2zAjbcI,6012
|
|
57
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=QtjgRjHz3wsbb76j9uNWd5xyOsCDOGEpCL9vNVg7wps,5126
|
|
58
|
+
KekikStream/Plugins/FilmModu.py,sha256=ux5FACwmkuNQxx3rXQEeX-bWSXC4L7CfFxBZOhPuPFc,6524
|
|
59
|
+
KekikStream/Plugins/FullHDFilm.py,sha256=lYcGpes7HJYFHoKn_Ntk3gUL6bdm8MzDLAv0ns6S1YM,6837
|
|
60
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=nimV_mSaPYYxG4_d-gnW2Bh4EKMM6hGh0Ev8RbJVs-8,6054
|
|
61
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=6rZX6xfGIo9l0hojE8YFrvKmsPeLgltFF3ySFla8dGk,12048
|
|
62
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=4gbvLgnjdzWr6f10jKYQAC4W5NEJCEOKxJnVQH36QTY,6386
|
|
63
|
+
KekikStream/Plugins/KultFilmler.py,sha256=H_U2uil9Z-aw10tZuSUB0dmMtQJrnckodGRhaA6t6gg,8944
|
|
64
|
+
KekikStream/Plugins/RecTV.py,sha256=tzIVjBP4YKL4dBvjRNIuECrAfNw6F892Fw0pXvLutoU,7187
|
|
65
|
+
KekikStream/Plugins/RoketDizi.py,sha256=hiqeFeARK9Gs2Ar933vVtCndrMXCqAkLIallxHsVw18,8544
|
|
66
|
+
KekikStream/Plugins/SelcukFlix.py,sha256=8OnYtiQro4VBd1f9UKfdpWG96vdUhOafn2wwD2vEkhY,12351
|
|
67
|
+
KekikStream/Plugins/SetFilmIzle.py,sha256=X31Xk1wTQgRDqFdyD9ZDQwa3LCr1dZ7aGpGfB8TDkDg,9991
|
|
68
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=alCeuvS0X-9-3nejHkaAJPE-9WgCUX7Ly93WaW03BZE,7047
|
|
69
|
+
KekikStream/Plugins/SineWix.py,sha256=3c1N5-2PshwnNZTE--SEzI77Yh_d30iCUZMYoT0tftA,7007
|
|
71
70
|
KekikStream/Plugins/Sinefy.py,sha256=riB2lgSSG5MkgxnVtX1OlApBcHG6vVjfiHyJ6h8_6DM,9965
|
|
72
|
-
KekikStream/Plugins/SinemaCX.py,sha256=
|
|
73
|
-
KekikStream/Plugins/Sinezy.py,sha256=
|
|
74
|
-
KekikStream/Plugins/SuperFilmGeldi.py,sha256=
|
|
75
|
-
KekikStream/Plugins/UgurFilm.py,sha256=
|
|
76
|
-
kekikstream-2.0.
|
|
77
|
-
kekikstream-2.0.
|
|
78
|
-
kekikstream-2.0.
|
|
79
|
-
kekikstream-2.0.
|
|
80
|
-
kekikstream-2.0.
|
|
81
|
-
kekikstream-2.0.
|
|
71
|
+
KekikStream/Plugins/SinemaCX.py,sha256=jrE7gkvJgPKjk8XymztyxYErZtPVF9onW48E22Us9pA,6766
|
|
72
|
+
KekikStream/Plugins/Sinezy.py,sha256=_iituEi6A7b-Y-wGcTkFknwFus-oAvZje2XKayzCZHY,6104
|
|
73
|
+
KekikStream/Plugins/SuperFilmGeldi.py,sha256=O3f8jwnX-ihF49kmZ7g6IKU2HZLmLf_RCucplDSglN4,5347
|
|
74
|
+
KekikStream/Plugins/UgurFilm.py,sha256=9vulu0uP0dWVVhWzDf-C7RQN_dLKB2AOJ2NoxU-YMlA,4672
|
|
75
|
+
kekikstream-2.1.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
76
|
+
kekikstream-2.1.0.dist-info/METADATA,sha256=PkzjGPbxftAmFMzr9JxsJU_NnfjicQAcFiaKbR-0N7g,10090
|
|
77
|
+
kekikstream-2.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
78
|
+
kekikstream-2.1.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
79
|
+
kekikstream-2.1.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
80
|
+
kekikstream-2.1.0.dist-info/RECORD,,
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
-
|
|
3
|
-
from KekikStream.Core import ExtractorBase, ExtractResult
|
|
4
|
-
from Kekik.Sifreleme import Packer
|
|
5
|
-
import re
|
|
6
|
-
|
|
7
|
-
class FirePlayer(ExtractorBase):
|
|
8
|
-
name = "FirePlayer"
|
|
9
|
-
main_url = "https://Player.filmizle.in"
|
|
10
|
-
|
|
11
|
-
def can_handle_url(self, url: str) -> bool:
|
|
12
|
-
return "filmizle.in" in url or "fireplayer" in url.lower()
|
|
13
|
-
|
|
14
|
-
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
15
|
-
if not referer:
|
|
16
|
-
referer = "https://sinezy.site/"
|
|
17
|
-
|
|
18
|
-
headers = {
|
|
19
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
20
|
-
"Referer": referer
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
istek = await self.httpx.get(url, headers=headers)
|
|
24
|
-
|
|
25
|
-
# Unpack usage similar to VidMoxy / suggestion
|
|
26
|
-
# Find the packed code block
|
|
27
|
-
match = re.search(r'(eval\(function\(p,a,c,k,e,d\)[\s\S]+?)\s*</script>', istek.text)
|
|
28
|
-
if match:
|
|
29
|
-
packed_code = match.group(1)
|
|
30
|
-
unpacked = Packer.unpack(packed_code)
|
|
31
|
-
else:
|
|
32
|
-
unpacked = istek.text
|
|
33
|
-
|
|
34
|
-
# Normalize escaped slashes
|
|
35
|
-
unpacked = unpacked.replace(r"\/", "/")
|
|
36
|
-
|
|
37
|
-
video_url = None
|
|
38
|
-
|
|
39
|
-
# Look for .mp4 or .m3u8 urls directly first
|
|
40
|
-
url_match = re.search(r'(https?://[^"\'\s]+\.(?:mp4|m3u8))', unpacked)
|
|
41
|
-
if url_match:
|
|
42
|
-
video_url = url_match.group(1)
|
|
43
|
-
|
|
44
|
-
if not video_url:
|
|
45
|
-
# Fallback: find all 'file': '...' and pick best
|
|
46
|
-
files = re.findall(r'file\s*:\s*["\']([^"\']+)["\']', unpacked)
|
|
47
|
-
for f in files:
|
|
48
|
-
if f.strip() and not f.endswith(".jpg") and not f.endswith(".png") and not f.endswith(".vtt"):
|
|
49
|
-
video_url = f
|
|
50
|
-
break
|
|
51
|
-
|
|
52
|
-
if not video_url:
|
|
53
|
-
raise ValueError("Could not find video URL in unpacked content")
|
|
54
|
-
|
|
55
|
-
return ExtractResult(
|
|
56
|
-
name = self.name,
|
|
57
|
-
url = video_url,
|
|
58
|
-
referer = url,
|
|
59
|
-
user_agent = headers.get("User-Agent", "")
|
|
60
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|