KekikStream 2.0.3__py3-none-any.whl → 2.0.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.
- KekikStream/Extractors/ContentX.py +13 -0
- KekikStream/Extractors/DonilasPlay.py +86 -0
- KekikStream/Extractors/Odnoklassniki.py +6 -0
- KekikStream/Extractors/PeaceMakerst.py +6 -0
- KekikStream/Extractors/PlayerFilmIzle.py +8 -5
- KekikStream/Extractors/RapidVid.py +6 -0
- KekikStream/Extractors/SetPlay.py +7 -1
- KekikStream/Extractors/VCTPlay.py +41 -0
- KekikStream/Extractors/VidMoly.py +52 -30
- KekikStream/Extractors/YTDLP.py +87 -53
- KekikStream/Plugins/BelgeselX.py +204 -0
- 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 +83 -8
- KekikStream/Plugins/JetFilmizle.py +1 -1
- KekikStream/Plugins/KultFilmler.py +1 -1
- KekikStream/Plugins/RoketDizi.py +17 -24
- KekikStream/Plugins/SelcukFlix.py +51 -52
- KekikStream/Plugins/SetFilmIzle.py +259 -0
- KekikStream/Plugins/SezonlukDizi.py +28 -7
- KekikStream/Plugins/Sinefy.py +11 -8
- KekikStream/Plugins/SinemaCX.py +3 -7
- KekikStream/Plugins/SuperFilmGeldi.py +13 -7
- KekikStream/Plugins/UgurFilm.py +1 -1
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.9.dist-info}/METADATA +1 -1
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.9.dist-info}/RECORD +32 -34
- KekikStream/Extractors/ContentX_.py +0 -40
- KekikStream/Extractors/FirePlayer.py +0 -60
- KekikStream/Extractors/Odnoklassniki_.py +0 -11
- KekikStream/Extractors/PeaceMakerst_.py +0 -7
- KekikStream/Extractors/RapidVid_.py +0 -7
- KekikStream/Extractors/VidMoly_.py +0 -7
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.9.dist-info}/WHEEL +0 -0
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.9.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.9.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.0.3.dist-info → kekikstream-2.0.9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,259 @@
|
|
|
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
|
|
4
|
+
from parsel import Selector
|
|
5
|
+
import re, json
|
|
6
|
+
|
|
7
|
+
class SetFilmIzle(PluginBase):
|
|
8
|
+
name = "SetFilmIzle"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://www.setfilmizle.uk"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Setfilmizle sitemizde, donma yaşamadan Türkçe dublaj ve altyazılı filmleri ile dizileri muhteşem 1080p full HD kalitesinde izleyebilirsiniz."
|
|
13
|
+
|
|
14
|
+
main_page = {
|
|
15
|
+
f"{main_url}/tur/aile/" : "Aile",
|
|
16
|
+
f"{main_url}/tur/aksiyon/" : "Aksiyon",
|
|
17
|
+
f"{main_url}/tur/animasyon/" : "Animasyon",
|
|
18
|
+
f"{main_url}/tur/belgesel/" : "Belgesel",
|
|
19
|
+
f"{main_url}/tur/bilim-kurgu/" : "Bilim-Kurgu",
|
|
20
|
+
f"{main_url}/tur/biyografi/" : "Biyografi",
|
|
21
|
+
f"{main_url}/tur/dini/" : "Dini",
|
|
22
|
+
f"{main_url}/tur/dram/" : "Dram",
|
|
23
|
+
f"{main_url}/tur/fantastik/" : "Fantastik",
|
|
24
|
+
f"{main_url}/tur/genclik/" : "Gençlik",
|
|
25
|
+
f"{main_url}/tur/gerilim/" : "Gerilim",
|
|
26
|
+
f"{main_url}/tur/gizem/" : "Gizem",
|
|
27
|
+
f"{main_url}/tur/komedi/" : "Komedi",
|
|
28
|
+
f"{main_url}/tur/korku/" : "Korku",
|
|
29
|
+
f"{main_url}/tur/macera/" : "Macera",
|
|
30
|
+
f"{main_url}/tur/romantik/" : "Romantik",
|
|
31
|
+
f"{main_url}/tur/savas/" : "Savaş",
|
|
32
|
+
f"{main_url}/tur/suc/" : "Suç",
|
|
33
|
+
f"{main_url}/tur/tarih/" : "Tarih",
|
|
34
|
+
f"{main_url}/tur/western/" : "Western"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
38
|
+
istek = self.cloudscraper.get(url)
|
|
39
|
+
secici = Selector(istek.text)
|
|
40
|
+
|
|
41
|
+
results = []
|
|
42
|
+
for item in secici.css("div.items article"):
|
|
43
|
+
title = item.css("h2::text").get()
|
|
44
|
+
href = item.css("a::attr(href)").get()
|
|
45
|
+
poster = item.css("img::attr(data-src)").get()
|
|
46
|
+
|
|
47
|
+
if title and href:
|
|
48
|
+
results.append(MainPageResult(
|
|
49
|
+
category = category,
|
|
50
|
+
title = title.strip(),
|
|
51
|
+
url = self.fix_url(href),
|
|
52
|
+
poster = self.fix_url(poster) if poster else None
|
|
53
|
+
))
|
|
54
|
+
|
|
55
|
+
return results
|
|
56
|
+
|
|
57
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
58
|
+
# Ana sayfadan nonce değerini al
|
|
59
|
+
main_resp = self.cloudscraper.get(self.main_url)
|
|
60
|
+
|
|
61
|
+
# Birden fazla nonce pattern dene
|
|
62
|
+
nonce = ""
|
|
63
|
+
nonce_patterns = [
|
|
64
|
+
r'nonces:\s*\{\s*search:\s*"([^"]+)"', # STMOVIE_AJAX.nonces.search
|
|
65
|
+
r'"search":\s*"([a-zA-Z0-9]+)"', # JSON format
|
|
66
|
+
r"nonce:\s*'([^']*)'",
|
|
67
|
+
r'"nonce":"([^"]+)"',
|
|
68
|
+
r'data-nonce="([^"]+)"',
|
|
69
|
+
]
|
|
70
|
+
for pattern in nonce_patterns:
|
|
71
|
+
match = re.search(pattern, main_resp.text)
|
|
72
|
+
if match:
|
|
73
|
+
nonce = match.group(1)
|
|
74
|
+
break
|
|
75
|
+
|
|
76
|
+
search_resp = self.cloudscraper.post(
|
|
77
|
+
f"{self.main_url}/wp-admin/admin-ajax.php",
|
|
78
|
+
headers = {
|
|
79
|
+
"X-Requested-With" : "XMLHttpRequest",
|
|
80
|
+
"Content-Type" : "application/x-www-form-urlencoded",
|
|
81
|
+
"Referer" : f"{self.main_url}/"
|
|
82
|
+
},
|
|
83
|
+
data = {
|
|
84
|
+
"action" : "ajax_search",
|
|
85
|
+
"search" : query,
|
|
86
|
+
"original_search" : query,
|
|
87
|
+
"nonce" : nonce
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
data = search_resp.json()
|
|
93
|
+
html = data.get("html", "")
|
|
94
|
+
except:
|
|
95
|
+
return []
|
|
96
|
+
|
|
97
|
+
secici = Selector(text=html)
|
|
98
|
+
results = []
|
|
99
|
+
|
|
100
|
+
for item in secici.css("div.items article"):
|
|
101
|
+
title = item.css("h2::text").get()
|
|
102
|
+
href = item.css("a::attr(href)").get()
|
|
103
|
+
poster = item.css("img::attr(data-src)").get()
|
|
104
|
+
|
|
105
|
+
if title and href:
|
|
106
|
+
results.append(SearchResult(
|
|
107
|
+
title = title.strip(),
|
|
108
|
+
url = self.fix_url(href),
|
|
109
|
+
poster = self.fix_url(poster) if poster else None
|
|
110
|
+
))
|
|
111
|
+
|
|
112
|
+
return results
|
|
113
|
+
|
|
114
|
+
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
115
|
+
istek = await self.httpx.get(url)
|
|
116
|
+
secici = Selector(istek.text)
|
|
117
|
+
|
|
118
|
+
raw_title = secici.css("h1::text").get() or ""
|
|
119
|
+
title = re.sub(r"\s*izle.*$", "", raw_title, flags=re.IGNORECASE).strip()
|
|
120
|
+
poster = secici.css("div.poster img::attr(src)").get()
|
|
121
|
+
description = secici.css("div.wp-content p::text").get()
|
|
122
|
+
year = secici.css("div.extra span.C a::text").get()
|
|
123
|
+
if year:
|
|
124
|
+
year_match = re.search(r"\d{4}", year)
|
|
125
|
+
year = year_match.group() if year_match else None
|
|
126
|
+
tags = [a.css("::text").get().strip() for a in secici.css("div.sgeneros a") if a.css("::text").get()]
|
|
127
|
+
duration = secici.css("span.runtime::text").get()
|
|
128
|
+
if duration:
|
|
129
|
+
dur_match = re.search(r"\d+", duration)
|
|
130
|
+
duration = int(dur_match.group()) if dur_match else None
|
|
131
|
+
|
|
132
|
+
actors = [span.css("::text").get().strip() for span in secici.css("span.valor a > span") if span.css("::text").get()]
|
|
133
|
+
|
|
134
|
+
trailer_match = re.search(r'embed/([^?]*)\?rel', istek.text)
|
|
135
|
+
trailer = f"https://www.youtube.com/embed/{trailer_match.group(1)}" if trailer_match else None
|
|
136
|
+
|
|
137
|
+
# Dizi mi film mi kontrol et
|
|
138
|
+
is_series = "/dizi/" in url
|
|
139
|
+
|
|
140
|
+
if is_series:
|
|
141
|
+
year_elem = secici.css("a[href*='/yil/']::text").get()
|
|
142
|
+
if year_elem:
|
|
143
|
+
year_match = re.search(r"\d{4}", year_elem)
|
|
144
|
+
year = year_match.group() if year_match else year
|
|
145
|
+
|
|
146
|
+
dur_elem = secici.css("div#info span:contains('Dakika')::text").get()
|
|
147
|
+
if dur_elem:
|
|
148
|
+
dur_match = re.search(r"\d+", dur_elem)
|
|
149
|
+
duration = int(dur_match.group()) if dur_match else duration
|
|
150
|
+
|
|
151
|
+
episodes = []
|
|
152
|
+
for ep_item in secici.css("div#episodes ul.episodios li"):
|
|
153
|
+
ep_href = ep_item.css("h4.episodiotitle a::attr(href)").get()
|
|
154
|
+
ep_name = ep_item.css("h4.episodiotitle a::text").get()
|
|
155
|
+
|
|
156
|
+
if not ep_href or not ep_name:
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
ep_detail = ep_name.strip()
|
|
160
|
+
season_match = re.search(r"(\d+)\.\s*Sezon", ep_detail)
|
|
161
|
+
episode_match = re.search(r"Sezon\s+(\d+)\.\s*Bölüm", ep_detail)
|
|
162
|
+
|
|
163
|
+
ep_season = int(season_match.group(1)) if season_match else 1
|
|
164
|
+
ep_episode = int(episode_match.group(1)) if episode_match else None
|
|
165
|
+
|
|
166
|
+
episodes.append(Episode(
|
|
167
|
+
season = ep_season,
|
|
168
|
+
episode = ep_episode,
|
|
169
|
+
title = ep_name.strip(),
|
|
170
|
+
url = self.fix_url(ep_href)
|
|
171
|
+
))
|
|
172
|
+
|
|
173
|
+
return SeriesInfo(
|
|
174
|
+
url = url,
|
|
175
|
+
poster = self.fix_url(poster) if poster else None,
|
|
176
|
+
title = title,
|
|
177
|
+
description = description.strip() if description else None,
|
|
178
|
+
tags = tags,
|
|
179
|
+
year = year,
|
|
180
|
+
duration = duration,
|
|
181
|
+
actors = actors,
|
|
182
|
+
episodes = episodes
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
return MovieInfo(
|
|
186
|
+
url = url,
|
|
187
|
+
poster = self.fix_url(poster) if poster else None,
|
|
188
|
+
title = title,
|
|
189
|
+
description = description.strip() if description else None,
|
|
190
|
+
tags = tags,
|
|
191
|
+
year = year,
|
|
192
|
+
duration = duration,
|
|
193
|
+
actors = actors
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
197
|
+
istek = await self.httpx.get(url)
|
|
198
|
+
secici = Selector(istek.text)
|
|
199
|
+
|
|
200
|
+
nonce = secici.css("div#playex::attr(data-nonce)").get() or ""
|
|
201
|
+
|
|
202
|
+
# partKey to dil label mapping
|
|
203
|
+
part_key_labels = {
|
|
204
|
+
"turkcedublaj" : "Türkçe Dublaj",
|
|
205
|
+
"turkcealtyazi" : "Türkçe Altyazı",
|
|
206
|
+
"orijinal" : "Orijinal"
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
links = []
|
|
210
|
+
for player in secici.css("nav.player a"):
|
|
211
|
+
source_id = player.css("::attr(data-post-id)").get()
|
|
212
|
+
player_name = player.css("::attr(data-player-name)").get()
|
|
213
|
+
part_key = player.css("::attr(data-part-key)").get()
|
|
214
|
+
|
|
215
|
+
if not source_id or "event" in source_id or source_id == "":
|
|
216
|
+
continue
|
|
217
|
+
|
|
218
|
+
# Multipart form request
|
|
219
|
+
try:
|
|
220
|
+
resp = self.cloudscraper.post(
|
|
221
|
+
f"{self.main_url}/wp-admin/admin-ajax.php",
|
|
222
|
+
headers = {"Referer": url},
|
|
223
|
+
data = {
|
|
224
|
+
"action" : "get_video_url",
|
|
225
|
+
"nonce" : nonce,
|
|
226
|
+
"post_id" : source_id,
|
|
227
|
+
"player_name" : player_name or "",
|
|
228
|
+
"part_key" : part_key or ""
|
|
229
|
+
}
|
|
230
|
+
)
|
|
231
|
+
data = resp.json()
|
|
232
|
+
except:
|
|
233
|
+
continue
|
|
234
|
+
|
|
235
|
+
iframe_url = data.get("data", {}).get("url")
|
|
236
|
+
if not iframe_url:
|
|
237
|
+
continue
|
|
238
|
+
|
|
239
|
+
# SetPlay URL'si için part_key ekleme
|
|
240
|
+
if "setplay" not in iframe_url and part_key:
|
|
241
|
+
iframe_url = f"{iframe_url}?partKey={part_key}"
|
|
242
|
+
|
|
243
|
+
# Dil etiketi oluştur
|
|
244
|
+
label = part_key_labels.get(part_key, "")
|
|
245
|
+
if not label and part_key:
|
|
246
|
+
label = part_key.replace("_", " ").title()
|
|
247
|
+
|
|
248
|
+
extractor = self.ex_manager.find_extractor(iframe_url)
|
|
249
|
+
name = extractor.name if extractor else player_name or "Direct Link"
|
|
250
|
+
if label:
|
|
251
|
+
name = f"{name} | {label}"
|
|
252
|
+
|
|
253
|
+
links.append({
|
|
254
|
+
"url" : iframe_url,
|
|
255
|
+
"name" : name,
|
|
256
|
+
"referer" : self.main_url
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
return links
|
|
@@ -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.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",
|
|
@@ -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,17 @@ class SuperFilmGeldi(PluginBase):
|
|
|
111
111
|
"subtitles" : []
|
|
112
112
|
})
|
|
113
113
|
else:
|
|
114
|
+
# Extractor'a yönlendir
|
|
114
115
|
extractor = self.ex_manager.find_extractor(iframe)
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
"url" : iframe,
|
|
118
|
-
"referer" : f"{self.main_url}/"
|
|
119
|
-
})
|
|
116
|
+
data = await extractor.extract(iframe, referer=f"{self.main_url}/")
|
|
117
|
+
results.append(data.dict())
|
|
120
118
|
|
|
121
119
|
return results
|
|
120
|
+
|
|
121
|
+
async def play(self, **kwargs):
|
|
122
|
+
extract_result = ExtractResult(**kwargs)
|
|
123
|
+
self.media_handler.title = kwargs.get("name")
|
|
124
|
+
if self.name not in self.media_handler.title:
|
|
125
|
+
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
126
|
+
|
|
127
|
+
self.media_handler.play_media(extract_result)
|
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.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
|
|
@@ -17,26 +17,22 @@ KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-ao
|
|
|
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=
|
|
21
|
-
KekikStream/Extractors/
|
|
20
|
+
KekikStream/Extractors/ContentX.py,sha256=TEXJppAZJLkf0x8jxaKnrCVAcabqdBFBswinpqjG_70,3513
|
|
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
|
|
28
27
|
KekikStream/Extractors/MixPlayHD.py,sha256=POV_yq3KoZ6S6EqFsKYULEBz92NdUa2BpYKNo0eNQH8,1552
|
|
29
28
|
KekikStream/Extractors/MixTiger.py,sha256=mMEYhhr5-u6GgIrLESeFTRdwDykgSXKJO4KtkMML1bw,2124
|
|
30
29
|
KekikStream/Extractors/MolyStream.py,sha256=IeeBw9tJJrL5QQ-t2Yp-a-6lnDc3Y00UNiaN6m-o-7c,1160
|
|
31
|
-
KekikStream/Extractors/Odnoklassniki.py,sha256=
|
|
32
|
-
KekikStream/Extractors/
|
|
33
|
-
KekikStream/Extractors/PeaceMakerst.py,sha256=ZKk454eNZpeamht61UH9yMYe00_zGb3MSyujfDlbVDc,2096
|
|
34
|
-
KekikStream/Extractors/PeaceMakerst_.py,sha256=-PdSR8yFy6MEc6EodXvHksj8O_j6Xu8yceoSjM2pGYg,246
|
|
30
|
+
KekikStream/Extractors/Odnoklassniki.py,sha256=YfFRCL3Ag5N4zDzK9ZLOr3HVQcsETFQpff1px02imJ0,4019
|
|
31
|
+
KekikStream/Extractors/PeaceMakerst.py,sha256=pEgJb3KDfEPAUjbuvrYbUlxIciKgED-Vd0arrRO3QCk,2317
|
|
35
32
|
KekikStream/Extractors/PixelDrain.py,sha256=Uk2pPvtBzaKtRXu1iNO8FLHd0EAuIOIzI1H_n02tg-U,964
|
|
36
|
-
KekikStream/Extractors/PlayerFilmIzle.py,sha256=
|
|
37
|
-
KekikStream/Extractors/RapidVid.py,sha256=
|
|
38
|
-
KekikStream/Extractors/
|
|
39
|
-
KekikStream/Extractors/SetPlay.py,sha256=FsbLlYFXp7_28-ta6XAoqDQAEGYTVZOZayebkY1mWe8,1906
|
|
33
|
+
KekikStream/Extractors/PlayerFilmIzle.py,sha256=kH-O_RtQvG4iRLGKi-sFn1ST14DrxxoAa5iRT2PsdXc,2503
|
|
34
|
+
KekikStream/Extractors/RapidVid.py,sha256=FgAZfgtnKE57KRiRIFw-6_ZES0Trp5QriNbRTfSBGQs,3139
|
|
35
|
+
KekikStream/Extractors/SetPlay.py,sha256=FjHYtC6xTeeikTkrW6jz0TpWz0kaoJ5qHhr_H7aThEY,2135
|
|
40
36
|
KekikStream/Extractors/SetPrime.py,sha256=ob09y-Sm91YR7rIRzikhZiMHX6D4Djm5QzFTg6KbO4k,1536
|
|
41
37
|
KekikStream/Extractors/SibNet.py,sha256=zJTkzlr34ufKCWzKKCgJrzhb2o-fpjTjFdi38gv6N6g,849
|
|
42
38
|
KekikStream/Extractors/Sobreatsesuyp.py,sha256=qlSQHUHjTjBoY0nsuZQWAjnfswbPORkBg6rUuP7SagA,2000
|
|
@@ -44,39 +40,41 @@ KekikStream/Extractors/TRsTX.py,sha256=mbSRGnQt26a73SbqwtY9rpiYFwgRgVbvA6bkGb_Pv
|
|
|
44
40
|
KekikStream/Extractors/TauVideo.py,sha256=2ai9BwwM6qlCgxK7E0B642LtOF5y4hEb9tQ2aDpbMtc,1112
|
|
45
41
|
KekikStream/Extractors/TurboImgz.py,sha256=nnWnP1K4JZbMj6S-YuXxej31UZtF4JcboSW4n7A4A5c,824
|
|
46
42
|
KekikStream/Extractors/TurkeyPlayer.py,sha256=FX_H3vzXjAD7IjK11bjJVVw_VdPQ4n6YQLfjQ6E3t7o,1247
|
|
43
|
+
KekikStream/Extractors/VCTPlay.py,sha256=1BCl2_vVIrwvG56LCzl2KE5g2CUaMAhzImOZMdZpZCQ,1377
|
|
47
44
|
KekikStream/Extractors/VidHide.py,sha256=TVoS9CMV1WSE83vPC4FFxsNE71n-_DtVJm66_1Wt8pU,2538
|
|
48
|
-
KekikStream/Extractors/VidMoly.py,sha256=
|
|
49
|
-
KekikStream/Extractors/VidMoly_.py,sha256=737BzqogzknVhSebZgVDh70gsEgNo9s2mafySrDzr6o,219
|
|
45
|
+
KekikStream/Extractors/VidMoly.py,sha256=QLRRGH1uHFTREl5Oq3V8WIkVpqaZuuygmHaW1ulj1Lg,4774
|
|
50
46
|
KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0Jcek,1771
|
|
51
47
|
KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
|
|
52
48
|
KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
|
|
53
|
-
KekikStream/Extractors/YTDLP.py,sha256=
|
|
49
|
+
KekikStream/Extractors/YTDLP.py,sha256=Hy8loCSFSquu2zaL3INord-Jm6T8CM6K2-VcDA2K79g,7390
|
|
54
50
|
KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
|
|
51
|
+
KekikStream/Plugins/BelgeselX.py,sha256=WdCeU_Zvsph0kHt7jAWaZ3DQ_2rxaFChmhGKPcHLJpo,8728
|
|
55
52
|
KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
|
|
56
53
|
KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
|
|
57
54
|
KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
|
|
58
|
-
KekikStream/Plugins/Dizilla.py,sha256=
|
|
55
|
+
KekikStream/Plugins/Dizilla.py,sha256=ssoSZgT7RWO8ENYmdNeh-4pvY84yrRWDZ-qskdo8Lmg,11852
|
|
59
56
|
KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
|
|
60
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
61
|
-
KekikStream/Plugins/FilmModu.py,sha256=
|
|
57
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=xKI7iw3xvmIgyI2oir3bAWXVMFbaEDo6JrqhVRPm1vE,5260
|
|
58
|
+
KekikStream/Plugins/FilmModu.py,sha256=0qFkpX7zuH3GCwmseoKpXLved5Yg243oJb8N7DySrCQ,6871
|
|
62
59
|
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=
|
|
60
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=8ozxyuJnivFe1Cu_Fb8HjVPH-ptKCSWawYzGFcA1B98,6160
|
|
61
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=dwTEb2i7BxHE3Iy60A8WOVl4Rtm2DvS0FfTUQ3Vu3IA,12409
|
|
62
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=Jm2cYEgV_bRXVjrDtnLTelvyxGHVAUCZkKmP3lUkEA8,6631
|
|
63
|
+
KekikStream/Plugins/KultFilmler.py,sha256=fABm74yQhEUsvuWRSEK0jiy0VJflxtFZ5p65UDC_NP0,9103
|
|
67
64
|
KekikStream/Plugins/RecTV.py,sha256=dF3Ogf7KE_zpfLQRjVcEJQMuWtBtHo6iB73_ECQEJ58,7544
|
|
68
|
-
KekikStream/Plugins/RoketDizi.py,sha256=
|
|
69
|
-
KekikStream/Plugins/SelcukFlix.py,sha256=
|
|
70
|
-
KekikStream/Plugins/
|
|
65
|
+
KekikStream/Plugins/RoketDizi.py,sha256=PY9Cf6X0I21FdMj0K48WwvwRPtznoqI3mMsctXAeLHs,8672
|
|
66
|
+
KekikStream/Plugins/SelcukFlix.py,sha256=rajt0BbdiJDFvihD5HmjwizNdgmOXb3BN8c4Ju7aRkc,12533
|
|
67
|
+
KekikStream/Plugins/SetFilmIzle.py,sha256=buz8B8MOTPw-TMV8U-k4IG3PUEFFKtOXb0fV7VZlwMA,10224
|
|
68
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=vW-Mvk63Y9sAJmPnY1IdFwBzCMEB2tF03zwHVETZTtI,7262
|
|
71
69
|
KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
|
|
72
|
-
KekikStream/Plugins/Sinefy.py,sha256=
|
|
73
|
-
KekikStream/Plugins/SinemaCX.py,sha256
|
|
70
|
+
KekikStream/Plugins/Sinefy.py,sha256=riB2lgSSG5MkgxnVtX1OlApBcHG6vVjfiHyJ6h8_6DM,9965
|
|
71
|
+
KekikStream/Plugins/SinemaCX.py,sha256=-mcZe9Lh93hz5PZdbV2ASlT0O_t4KNMyZxA1q82rbmk,7197
|
|
74
72
|
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.
|
|
73
|
+
KekikStream/Plugins/SuperFilmGeldi.py,sha256=HmY37Onn8VLggT7NaMnvpYv863zrk8eQnPGpfK2HrEk,5788
|
|
74
|
+
KekikStream/Plugins/UgurFilm.py,sha256=sQatQ2zb9NER8J52DRLI5K9EnYFv4I1ZgZ22HtauX3Q,4813
|
|
75
|
+
kekikstream-2.0.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
76
|
+
kekikstream-2.0.9.dist-info/METADATA,sha256=UolpHMnBAebdvrjAnG9Zpn5uYT572fftvtH4qBpPz2Q,10090
|
|
77
|
+
kekikstream-2.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
78
|
+
kekikstream-2.0.9.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
79
|
+
kekikstream-2.0.9.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
80
|
+
kekikstream-2.0.9.dist-info/RECORD,,
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
-
|
|
3
|
-
from KekikStream.Extractors.ContentX import ContentX
|
|
4
|
-
|
|
5
|
-
# DPlayer82 Family - https://dplayer82.site subdomains
|
|
6
|
-
class SNDPlayer(ContentX):
|
|
7
|
-
name = "SNDPlayer"
|
|
8
|
-
main_url = "https://sn.dplayer82.site"
|
|
9
|
-
|
|
10
|
-
class FourDPlayer(ContentX):
|
|
11
|
-
name = "FourDPlayer"
|
|
12
|
-
main_url = "https://four.dplayer82.site"
|
|
13
|
-
|
|
14
|
-
class ORGDPlayer(ContentX):
|
|
15
|
-
name = "ORGDPlayer"
|
|
16
|
-
main_url = "https://org.dplayer82.site"
|
|
17
|
-
|
|
18
|
-
# Hotlinger
|
|
19
|
-
class Hotlinger(ContentX):
|
|
20
|
-
name = "Hotlinger"
|
|
21
|
-
main_url = "https://hotlinger.com"
|
|
22
|
-
|
|
23
|
-
# Pichive Family
|
|
24
|
-
class Pichive(ContentX):
|
|
25
|
-
name = "Pichive"
|
|
26
|
-
main_url = "https://pichive.me"
|
|
27
|
-
|
|
28
|
-
class FourPichive(ContentX):
|
|
29
|
-
name = "FourPichive"
|
|
30
|
-
main_url = "https://four.pichive.me"
|
|
31
|
-
|
|
32
|
-
# PlayRu Family
|
|
33
|
-
class FourPlayRu(ContentX):
|
|
34
|
-
name = "FourPlayRu"
|
|
35
|
-
main_url = "https://four.playru.net"
|
|
36
|
-
|
|
37
|
-
# CX Family
|
|
38
|
-
class FourCX(ContentX):
|
|
39
|
-
name = "FourCX"
|
|
40
|
-
main_url = "https://four.contentx.me"
|
|
@@ -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
|
-
)
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
-
|
|
3
|
-
from KekikStream.Extractors.Odnoklassniki import Odnoklassniki
|
|
4
|
-
|
|
5
|
-
class OkRuHTTP(Odnoklassniki):
|
|
6
|
-
name = "OkRuHTTP"
|
|
7
|
-
main_url = "http://ok.ru"
|
|
8
|
-
|
|
9
|
-
class OkRuSSL(Odnoklassniki):
|
|
10
|
-
name = "OkRuSSL"
|
|
11
|
-
main_url = "https://ok.ru"
|