KekikStream 2.1.6__py3-none-any.whl → 2.1.8__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/Plugin/PluginBase.py +20 -21
- KekikStream/Extractors/Filemoon.py +78 -0
- KekikStream/Extractors/RapidVid.py +15 -5
- KekikStream/Extractors/VidHide.py +11 -2
- KekikStream/Plugins/BelgeselX.py +7 -7
- KekikStream/Plugins/DiziBox.py +2 -2
- KekikStream/Plugins/DiziPal.py +8 -8
- KekikStream/Plugins/DiziYou.py +8 -8
- KekikStream/Plugins/Dizilla.py +2 -2
- KekikStream/Plugins/FilmBip.py +2 -2
- KekikStream/Plugins/FilmMakinesi.py +2 -2
- KekikStream/Plugins/FilmModu.py +8 -8
- KekikStream/Plugins/FullHDFilm.py +13 -5
- KekikStream/Plugins/FullHDFilmizlesene.py +2 -2
- KekikStream/Plugins/HDFilmCehennemi.py +19 -19
- KekikStream/Plugins/JetFilmizle.py +2 -2
- KekikStream/Plugins/KultFilmler.py +10 -9
- KekikStream/Plugins/RecTV.py +15 -15
- KekikStream/Plugins/RoketDizi.py +2 -2
- KekikStream/Plugins/SelcukFlix.py +2 -2
- KekikStream/Plugins/SetFilmIzle.py +2 -2
- KekikStream/Plugins/SezonlukDizi.py +2 -2
- KekikStream/Plugins/SineWix.py +13 -13
- KekikStream/Plugins/Sinefy.py +6 -6
- KekikStream/Plugins/SinemaCX.py +31 -22
- KekikStream/Plugins/Sinezy.py +2 -2
- KekikStream/Plugins/SuperFilmGeldi.py +30 -19
- KekikStream/Plugins/UgurFilm.py +2 -2
- KekikStream/__init__.py +15 -15
- {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/METADATA +3 -3
- {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/RECORD +35 -34
- {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/WHEEL +0 -0
- {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.1.6.dist-info → kekikstream-2.1.8.dist-info}/top_level.txt +0 -0
|
@@ -160,7 +160,7 @@ class KultFilmler(PluginBase):
|
|
|
160
160
|
match = re.search(r"(https?://[^\s\"]+\.srt)", source_code)
|
|
161
161
|
return match[1] if match else None
|
|
162
162
|
|
|
163
|
-
async def load_links(self, url: str) -> list[
|
|
163
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
164
164
|
istek = await self.httpx.get(url)
|
|
165
165
|
secici = Selector(istek.text)
|
|
166
166
|
|
|
@@ -195,12 +195,12 @@ class KultFilmler(PluginBase):
|
|
|
195
195
|
m3u_match = re.search(r'file:"([^"]+)"', iframe_istek.text)
|
|
196
196
|
|
|
197
197
|
if m3u_match:
|
|
198
|
-
results.append(
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
198
|
+
results.append(ExtractResult(
|
|
199
|
+
name = "VidMoly",
|
|
200
|
+
url = m3u_match[1],
|
|
201
|
+
referer = self.main_url,
|
|
202
|
+
subtitles = []
|
|
203
|
+
))
|
|
204
204
|
continue
|
|
205
205
|
|
|
206
206
|
# Altyazı çıkar
|
|
@@ -210,7 +210,8 @@ class KultFilmler(PluginBase):
|
|
|
210
210
|
|
|
211
211
|
data = await self.extract(iframe)
|
|
212
212
|
if data:
|
|
213
|
-
|
|
214
|
-
|
|
213
|
+
# ExtractResult objesi immutable, yeni bir kopya oluştur
|
|
214
|
+
updated_data = data.model_copy(update={"subtitles": subtitles}) if subtitles else data
|
|
215
|
+
results.append(updated_data)
|
|
215
216
|
|
|
216
217
|
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, ExtractResult
|
|
4
4
|
from json import dumps, loads
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -116,21 +116,21 @@ class RecTV(PluginBase):
|
|
|
116
116
|
actors = []
|
|
117
117
|
)
|
|
118
118
|
|
|
119
|
-
async def load_links(self, url: str) -> list[
|
|
119
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
120
120
|
try:
|
|
121
121
|
veri = loads(url)
|
|
122
122
|
except Exception:
|
|
123
123
|
# JSON değilse düz URL'dir (eski yapı veya hata)
|
|
124
|
-
return [
|
|
124
|
+
return [ExtractResult(url=url, name="Video")]
|
|
125
125
|
|
|
126
126
|
# Eğer dizi bölümü ise (bizim oluşturduğumuz yapı)
|
|
127
127
|
if veri.get("is_episode"):
|
|
128
|
-
return [
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
128
|
+
return [ExtractResult(
|
|
129
|
+
url = veri.get("url"),
|
|
130
|
+
name = veri.get("title", "Bölüm"),
|
|
131
|
+
user_agent = "googleusercontent",
|
|
132
|
+
referer = "https://twitter.com/"
|
|
133
|
+
)]
|
|
134
134
|
|
|
135
135
|
# Film ise (RecTV API yapısı)
|
|
136
136
|
results = []
|
|
@@ -140,11 +140,11 @@ class RecTV(PluginBase):
|
|
|
140
140
|
if "otolinkaff" in video_link:
|
|
141
141
|
continue
|
|
142
142
|
|
|
143
|
-
results.append(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
results.append(ExtractResult(
|
|
144
|
+
url = video_link,
|
|
145
|
+
name = f"{veri.get('title')} - {kaynak.get('title')}",
|
|
146
|
+
user_agent = "googleusercontent",
|
|
147
|
+
referer = "https://twitter.com/"
|
|
148
|
+
))
|
|
149
149
|
|
|
150
150
|
return results
|
KekikStream/Plugins/RoketDizi.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, MovieInfo
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, ExtractResult, MovieInfo
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re, base64, json
|
|
6
6
|
|
|
@@ -169,7 +169,7 @@ class RoketDizi(PluginBase):
|
|
|
169
169
|
year = year
|
|
170
170
|
)
|
|
171
171
|
|
|
172
|
-
async def load_links(self, url: str) -> list[
|
|
172
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
173
173
|
resp = await self.httpx.get(url)
|
|
174
174
|
sel = Selector(resp.text)
|
|
175
175
|
|
|
@@ -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, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re, base64, json, urllib.parse
|
|
6
6
|
|
|
@@ -256,7 +256,7 @@ class SelcukFlix(PluginBase):
|
|
|
256
256
|
duration = duration
|
|
257
257
|
)
|
|
258
258
|
|
|
259
|
-
async def load_links(self, url: str) -> list[
|
|
259
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
260
260
|
resp = await self.httpx.get(url)
|
|
261
261
|
sel = Selector(resp.text)
|
|
262
262
|
|
|
@@ -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, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re, json
|
|
6
6
|
|
|
@@ -194,7 +194,7 @@ class SetFilmIzle(PluginBase):
|
|
|
194
194
|
actors = actors
|
|
195
195
|
)
|
|
196
196
|
|
|
197
|
-
async def load_links(self, url: str) -> list[
|
|
197
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
198
198
|
istek = await self.httpx.get(url)
|
|
199
199
|
secici = Selector(istek.text)
|
|
200
200
|
|
|
@@ -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
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -114,7 +114,7 @@ class SezonlukDizi(PluginBase):
|
|
|
114
114
|
except Exception:
|
|
115
115
|
return ("22", "22") # Fallback to default versions
|
|
116
116
|
|
|
117
|
-
async def load_links(self, url: str) -> list[
|
|
117
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
118
118
|
istek = await self.httpx.get(url)
|
|
119
119
|
secici = Selector(istek.text)
|
|
120
120
|
|
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, ExtractResult
|
|
4
4
|
import json
|
|
5
5
|
|
|
6
6
|
class SineWix(PluginBase):
|
|
@@ -123,21 +123,21 @@ class SineWix(PluginBase):
|
|
|
123
123
|
episodes = episodes,
|
|
124
124
|
)
|
|
125
125
|
|
|
126
|
-
async def load_links(self, url: str) -> list[
|
|
126
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
127
127
|
try:
|
|
128
128
|
veri = json.loads(url)
|
|
129
129
|
if veri.get("is_episode"):
|
|
130
|
-
return [
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
130
|
+
return [ExtractResult(
|
|
131
|
+
url = veri.get("url"),
|
|
132
|
+
name = veri.get("title"),
|
|
133
|
+
referer = self.main_url
|
|
134
|
+
)]
|
|
135
135
|
except Exception:
|
|
136
136
|
pass
|
|
137
137
|
|
|
138
138
|
# Eğer JSON değilse ve direkt URL ise (eski yapı veya harici link)
|
|
139
139
|
if not url.startswith(self.main_url) and not url.startswith("{"):
|
|
140
|
-
return [
|
|
140
|
+
return [ExtractResult(url=url, name="Video")]
|
|
141
141
|
|
|
142
142
|
istek = await self.httpx.get(url)
|
|
143
143
|
veri = istek.json()
|
|
@@ -149,10 +149,10 @@ class SineWix(PluginBase):
|
|
|
149
149
|
results = []
|
|
150
150
|
for video in veri.get("videos"):
|
|
151
151
|
video_link = video.get("link").split("_blank\">")[-1]
|
|
152
|
-
results.append(
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
152
|
+
results.append(ExtractResult(
|
|
153
|
+
url = video_link,
|
|
154
|
+
name = f"{self.name}",
|
|
155
|
+
referer = self.main_url
|
|
156
|
+
))
|
|
157
157
|
|
|
158
158
|
return results
|
KekikStream/Plugins/Sinefy.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, MovieInfo
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, MovieInfo, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re, json, urllib.parse
|
|
6
6
|
|
|
@@ -223,7 +223,7 @@ class Sinefy(PluginBase):
|
|
|
223
223
|
year = year
|
|
224
224
|
)
|
|
225
225
|
|
|
226
|
-
async def load_links(self, url: str) -> list[
|
|
226
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
227
227
|
resp = await self.httpx.get(url)
|
|
228
228
|
sel = Selector(resp.text)
|
|
229
229
|
|
|
@@ -235,7 +235,7 @@ class Sinefy(PluginBase):
|
|
|
235
235
|
|
|
236
236
|
# Always return iframe (matching Kotlin - no extractor check)
|
|
237
237
|
# loadExtractor in Kotlin handles extraction internally
|
|
238
|
-
return [
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
238
|
+
return [ExtractResult(
|
|
239
|
+
url = iframe_url,
|
|
240
|
+
name = "Sinefy Player"
|
|
241
|
+
)]
|
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, Subtitle
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -12,20 +12,29 @@ class SinemaCX(PluginBase):
|
|
|
12
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
|
-
f"{main_url}/page/SAYFA"
|
|
16
|
-
f"{main_url}/izle/aile-filmleri/page/SAYFA"
|
|
17
|
-
f"{main_url}/izle/aksiyon-filmleri/page/SAYFA"
|
|
18
|
-
f"{main_url}/izle/animasyon-filmleri/page/SAYFA"
|
|
19
|
-
f"{main_url}/izle/belgesel/page/SAYFA"
|
|
20
|
-
f"{main_url}/izle/bilim-kurgu-filmleri/page/SAYFA"
|
|
21
|
-
f"{main_url}/izle/biyografi/page/SAYFA"
|
|
22
|
-
f"{main_url}/izle/
|
|
23
|
-
f"{main_url}/izle/
|
|
24
|
-
f"{main_url}/izle/
|
|
25
|
-
f"{main_url}/izle/
|
|
26
|
-
f"{main_url}/izle/
|
|
27
|
-
f"{main_url}/izle/
|
|
28
|
-
f"{main_url}/izle/
|
|
15
|
+
f"{main_url}/page/SAYFA" : "Son Eklenen Filmler",
|
|
16
|
+
f"{main_url}/izle/aile-filmleri/page/SAYFA" : "Aile Filmleri",
|
|
17
|
+
f"{main_url}/izle/aksiyon-filmleri/page/SAYFA" : "Aksiyon Filmleri",
|
|
18
|
+
f"{main_url}/izle/animasyon-filmleri/page/SAYFA" : "Animasyon Filmleri",
|
|
19
|
+
f"{main_url}/izle/belgesel/page/SAYFA" : "Belgesel Filmleri",
|
|
20
|
+
f"{main_url}/izle/bilim-kurgu-filmleri/page/SAYFA" : "Bilim Kurgu Filmler",
|
|
21
|
+
f"{main_url}/izle/biyografi/page/SAYFA" : "Biyografi Filmleri",
|
|
22
|
+
f"{main_url}/izle/dram-filmleri/page/SAYFA" : "Dram Filmleri",
|
|
23
|
+
f"{main_url}/izle/erotik-filmler/page/SAYFA" : "Erotik Film",
|
|
24
|
+
f"{main_url}/izle/fantastik-filmler/page/SAYFA" : "Fantastik Filmler",
|
|
25
|
+
f"{main_url}/izle/gerilim-filmleri/page/SAYFA" : "Gerilim Filmleri",
|
|
26
|
+
f"{main_url}/izle/gizem-filmleri/page/SAYFA" : "Gizem Filmleri",
|
|
27
|
+
f"{main_url}/izle/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
|
|
28
|
+
f"{main_url}/izle/korku-filmleri/page/SAYFA" : "Korku Filmleri",
|
|
29
|
+
f"{main_url}/izle/macera-filmleri/page/SAYFA" : "Macera Filmleri",
|
|
30
|
+
f"{main_url}/izle/muzikal-filmler/page/SAYFA" : "Müzikal Filmler",
|
|
31
|
+
f"{main_url}/izle/romantik-filmler/page/SAYFA" : "Romantik Filmler",
|
|
32
|
+
f"{main_url}/izle/savas-filmleri/page/SAYFA" : "Savaş Filmleri",
|
|
33
|
+
f"{main_url}/izle/seri-filmler/page/SAYFA" : "Seri Filmler",
|
|
34
|
+
f"{main_url}/izle/spor-filmleri/page/SAYFA" : "Spor Filmleri",
|
|
35
|
+
f"{main_url}/izle/suc-filmleri/page/SAYFA" : "Suç Filmleri",
|
|
36
|
+
f"{main_url}/izle/tarihi-filmler/page/SAYFA" : "Tarih Filmler",
|
|
37
|
+
f"{main_url}/izle/western-filmleri/page/SAYFA" : "Western Filmler",
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
@@ -75,7 +84,7 @@ class SinemaCX(PluginBase):
|
|
|
75
84
|
duration = int(duration_match[1]) if duration_match else None,
|
|
76
85
|
)
|
|
77
86
|
|
|
78
|
-
async def load_links(self, url: str) -> list[
|
|
87
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
79
88
|
istek = await self.httpx.get(url)
|
|
80
89
|
secici = Selector(istek.text)
|
|
81
90
|
|
|
@@ -130,12 +139,12 @@ class SinemaCX(PluginBase):
|
|
|
130
139
|
vid_data = vid_istek.json()
|
|
131
140
|
|
|
132
141
|
if vid_data.get("securedLink"):
|
|
133
|
-
results.append(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
142
|
+
results.append(ExtractResult(
|
|
143
|
+
name = f"{self.name}",
|
|
144
|
+
url = vid_data["securedLink"],
|
|
145
|
+
referer = iframe,
|
|
146
|
+
subtitles = subtitles
|
|
147
|
+
))
|
|
139
148
|
else:
|
|
140
149
|
# Extractor'a yönlendir
|
|
141
150
|
data = await self.extract(iframe)
|
KekikStream/Plugins/Sinezy.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, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re, base64
|
|
6
6
|
|
|
@@ -120,7 +120,7 @@ class Sinezy(PluginBase):
|
|
|
120
120
|
year = year
|
|
121
121
|
)
|
|
122
122
|
|
|
123
|
-
async def load_links(self, url: str) -> list[
|
|
123
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
124
124
|
resp = await self.httpx.get(url)
|
|
125
125
|
|
|
126
126
|
match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
|
|
@@ -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, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -12,17 +12,26 @@ class SuperFilmGeldi(PluginBase):
|
|
|
12
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
|
-
f"{main_url}/page/SAYFA"
|
|
16
|
-
f"{main_url}/hdizle/category/aksiyon/page/SAYFA"
|
|
17
|
-
f"{main_url}/hdizle/category/animasyon/page/SAYFA"
|
|
18
|
-
f"{main_url}/hdizle/category/belgesel/page/SAYFA"
|
|
19
|
-
f"{main_url}/hdizle/category/
|
|
20
|
-
f"{main_url}/hdizle/category/
|
|
21
|
-
f"{main_url}/hdizle/category/
|
|
22
|
-
f"{main_url}/hdizle/category/
|
|
23
|
-
f"{main_url}/hdizle/category/gerilim/page/SAYFA"
|
|
24
|
-
f"{main_url}/hdizle/category/
|
|
25
|
-
f"{main_url}/hdizle/category/
|
|
15
|
+
f"{main_url}/page/SAYFA" : "Son Eklenenler",
|
|
16
|
+
f"{main_url}/hdizle/category/aksiyon/page/SAYFA" : "Aksiyon",
|
|
17
|
+
f"{main_url}/hdizle/category/animasyon/page/SAYFA" : "Animasyon",
|
|
18
|
+
f"{main_url}/hdizle/category/belgesel/page/SAYFA" : "Belgesel",
|
|
19
|
+
f"{main_url}/hdizle/category/biyografi/page/SAYFA" : "Biyografi",
|
|
20
|
+
f"{main_url}/hdizle/category/bilim-kurgu/page/SAYFA" : "Bilim Kurgu",
|
|
21
|
+
f"{main_url}/hdizle/category/fantastik/page/SAYFA" : "Fantastik",
|
|
22
|
+
f"{main_url}/hdizle/category/dram/page/SAYFA" : "Dram",
|
|
23
|
+
f"{main_url}/hdizle/category/gerilim/page/SAYFA" : "Gerilim",
|
|
24
|
+
f"{main_url}/hdizle/category/gizem/page/SAYFA" : "Gizem",
|
|
25
|
+
f"{main_url}/hdizle/category/komedi-filmleri/page/SAYFA" : "Komedi Filmleri",
|
|
26
|
+
f"{main_url}/hdizle/category/karete-filmleri/page/SAYFA" : "Karate Filmleri",
|
|
27
|
+
f"{main_url}/hdizle/category/korku/page/SAYFA" : "Korku",
|
|
28
|
+
f"{main_url}/hdizle/category/muzik/page/SAYFA" : "Müzik",
|
|
29
|
+
f"{main_url}/hdizle/category/macera/page/SAYFA" : "Macera",
|
|
30
|
+
f"{main_url}/hdizle/category/romantik/page/SAYFA" : "Romantik",
|
|
31
|
+
f"{main_url}/hdizle/category/spor/page/SAYFA" : "Spor",
|
|
32
|
+
f"{main_url}/hdizle/category/savas/page/SAYFA" : "Savaş",
|
|
33
|
+
f"{main_url}/hdizle/category/suc/page/SAYFA" : "Suç",
|
|
34
|
+
f"{main_url}/hdizle/category/western/page/SAYFA" : "Western",
|
|
26
35
|
}
|
|
27
36
|
|
|
28
37
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
@@ -76,7 +85,9 @@ class SuperFilmGeldi(PluginBase):
|
|
|
76
85
|
actors = actors,
|
|
77
86
|
)
|
|
78
87
|
|
|
79
|
-
async def load_links(self, url: str) -> list[
|
|
88
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
89
|
+
from KekikStream.Core import ExtractResult
|
|
90
|
+
|
|
80
91
|
istek = await self.httpx.get(url)
|
|
81
92
|
secici = Selector(istek.text)
|
|
82
93
|
|
|
@@ -104,12 +115,12 @@ class SuperFilmGeldi(PluginBase):
|
|
|
104
115
|
|
|
105
116
|
m3u_link = iframe.split("/player")[0] + mix_point + end_point
|
|
106
117
|
|
|
107
|
-
results.append(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
results.append(ExtractResult(
|
|
119
|
+
name = f"{self.name} | Mix Player",
|
|
120
|
+
url = m3u_link,
|
|
121
|
+
referer = iframe,
|
|
122
|
+
subtitles = []
|
|
123
|
+
))
|
|
113
124
|
else:
|
|
114
125
|
# Extractor'a yönlendir
|
|
115
126
|
data = await self.extract(iframe)
|
KekikStream/Plugins/UgurFilm.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, ExtractResult
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
|
|
6
6
|
class UgurFilm(PluginBase):
|
|
@@ -79,7 +79,7 @@ class UgurFilm(PluginBase):
|
|
|
79
79
|
actors = actors,
|
|
80
80
|
)
|
|
81
81
|
|
|
82
|
-
async def load_links(self, url: str) -> list[
|
|
82
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
83
83
|
istek = await self.httpx.get(url)
|
|
84
84
|
secici = Selector(istek.text)
|
|
85
85
|
results = []
|
KekikStream/__init__.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from .CLI import konsol, cikis_yap, hata_yakala, pypi_kontrol_guncelle
|
|
4
|
-
from .Core import PluginManager, ExtractorManager, UIManager, MediaManager, PluginBase, ExtractorBase, SeriesInfo
|
|
4
|
+
from .Core import PluginManager, ExtractorManager, UIManager, MediaManager, PluginBase, ExtractorBase, SeriesInfo, ExtractResult
|
|
5
5
|
from asyncio import run, TaskGroup, Semaphore
|
|
6
6
|
from contextlib import suppress
|
|
7
7
|
|
|
@@ -226,7 +226,7 @@ class KekikStream:
|
|
|
226
226
|
case "Çıkış":
|
|
227
227
|
cikis_yap(False)
|
|
228
228
|
|
|
229
|
-
async def show_link_options(self, links: list[
|
|
229
|
+
async def show_link_options(self, links: list[ExtractResult]):
|
|
230
230
|
"""Bağlantı seçeneklerini göster"""
|
|
231
231
|
if not links:
|
|
232
232
|
konsol.print("[bold red]Bağlantı bulunamadı![/bold red]")
|
|
@@ -235,33 +235,33 @@ class KekikStream:
|
|
|
235
235
|
# Direkt oynatma - tüm pluginlerde artık play metodu var (PluginBase'den miras)
|
|
236
236
|
return await self.play_direct(links)
|
|
237
237
|
|
|
238
|
-
async def play_direct(self, links: list[
|
|
238
|
+
async def play_direct(self, links: list[ExtractResult]):
|
|
239
239
|
"""Plugin'in kendi metoduyla oynat"""
|
|
240
240
|
selected = await self.ui.select_from_list(
|
|
241
241
|
message = "Bağlantı seçin:",
|
|
242
|
-
choices = [{"name": link.
|
|
242
|
+
choices = [{"name": link.name or "Bilinmiyor", "value": link} for link in links]
|
|
243
243
|
)
|
|
244
244
|
|
|
245
245
|
if not selected:
|
|
246
246
|
return await self.content_finished()
|
|
247
247
|
|
|
248
248
|
self.update_title(self.episode_title)
|
|
249
|
-
self.update_title(selected.
|
|
249
|
+
self.update_title(selected.name)
|
|
250
250
|
|
|
251
251
|
await self.current_plugin.play(
|
|
252
252
|
name = self.media.get_title(),
|
|
253
|
-
url = selected.
|
|
254
|
-
user_agent = selected.
|
|
255
|
-
referer = selected.
|
|
256
|
-
subtitles = selected.
|
|
253
|
+
url = selected.url,
|
|
254
|
+
user_agent = selected.user_agent,
|
|
255
|
+
referer = selected.referer,
|
|
256
|
+
subtitles = selected.subtitles or []
|
|
257
257
|
)
|
|
258
258
|
return await self.content_finished()
|
|
259
259
|
|
|
260
|
-
async def play_with_extractor(self, links: list[
|
|
260
|
+
async def play_with_extractor(self, links: list[ExtractResult], mapping: dict):
|
|
261
261
|
"""Extractor ile oynat"""
|
|
262
262
|
options = [
|
|
263
|
-
{"name": link.
|
|
264
|
-
for link in links if link
|
|
263
|
+
{"name": link.name or mapping.get(link.url, "Bilinmiyor"), "value": link}
|
|
264
|
+
for link in links if link.url in mapping
|
|
265
265
|
]
|
|
266
266
|
|
|
267
267
|
if not options:
|
|
@@ -272,7 +272,7 @@ class KekikStream:
|
|
|
272
272
|
if not selected:
|
|
273
273
|
return await self.content_finished()
|
|
274
274
|
|
|
275
|
-
url = selected.
|
|
275
|
+
url = selected.url
|
|
276
276
|
extractor: ExtractorBase = self.extractor.find_extractor(url)
|
|
277
277
|
|
|
278
278
|
if not extractor:
|
|
@@ -280,7 +280,7 @@ class KekikStream:
|
|
|
280
280
|
return await self.handle_no_results()
|
|
281
281
|
|
|
282
282
|
try:
|
|
283
|
-
referer = selected.
|
|
283
|
+
referer = selected.referer or self.current_plugin.main_url
|
|
284
284
|
extract_data = await extractor.extract(url, referer=referer)
|
|
285
285
|
except Exception as e:
|
|
286
286
|
konsol.print(f"[bold red]{extractor.name} hatası: {e}[/bold red]")
|
|
@@ -298,7 +298,7 @@ class KekikStream:
|
|
|
298
298
|
|
|
299
299
|
# Başlıkları güncelle ve oynat
|
|
300
300
|
self.update_title(self.episode_title)
|
|
301
|
-
self.update_title(selected.
|
|
301
|
+
self.update_title(selected.name)
|
|
302
302
|
self.update_title(extract_data.name)
|
|
303
303
|
|
|
304
304
|
self.media.play_media(extract_data)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.8
|
|
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
|
|
@@ -104,7 +104,7 @@ KekikStream modüler bir plugin mimarisi kullanır; her medya kaynağı bağıms
|
|
|
104
104
|
|
|
105
105
|
**Plugin Geliştirme:**
|
|
106
106
|
```python
|
|
107
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo
|
|
107
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, ExtractResult
|
|
108
108
|
|
|
109
109
|
class MyPlugin(PluginBase):
|
|
110
110
|
name = "MyPlugin"
|
|
@@ -126,7 +126,7 @@ class MyPlugin(PluginBase):
|
|
|
126
126
|
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
127
127
|
return details
|
|
128
128
|
|
|
129
|
-
async def load_links(self, url: str) -> list[
|
|
129
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
130
130
|
return links
|
|
131
131
|
```
|
|
132
132
|
|