KekikStream 2.2.9__py3-none-any.whl → 2.3.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/Plugins/FilmMakinesi.py +57 -2
- KekikStream/Plugins/Sinefy.py +44 -33
- {kekikstream-2.2.9.dist-info → kekikstream-2.3.0.dist-info}/METADATA +1 -1
- {kekikstream-2.2.9.dist-info → kekikstream-2.3.0.dist-info}/RECORD +8 -8
- {kekikstream-2.2.9.dist-info → kekikstream-2.3.0.dist-info}/WHEEL +0 -0
- {kekikstream-2.2.9.dist-info → kekikstream-2.3.0.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.2.9.dist-info → kekikstream-2.3.0.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.2.9.dist-info → kekikstream-2.3.0.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
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, ExtractResult
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult
|
|
4
4
|
from selectolax.parser import HTMLParser
|
|
5
|
+
import re
|
|
5
6
|
|
|
6
7
|
class FilmMakinesi(PluginBase):
|
|
7
8
|
name = "FilmMakinesi"
|
|
@@ -81,7 +82,7 @@ class FilmMakinesi(PluginBase):
|
|
|
81
82
|
|
|
82
83
|
return results
|
|
83
84
|
|
|
84
|
-
async def load_item(self, url: str) -> MovieInfo:
|
|
85
|
+
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
85
86
|
istek = await self.httpx.get(url)
|
|
86
87
|
secici = HTMLParser(istek.text)
|
|
87
88
|
|
|
@@ -115,6 +116,60 @@ class FilmMakinesi(PluginBase):
|
|
|
115
116
|
if len(parts) > 1:
|
|
116
117
|
duration = parts[1].strip()
|
|
117
118
|
|
|
119
|
+
# Dizi mi kontrol et - sezon/bölüm linkleri var mı?
|
|
120
|
+
episodes = []
|
|
121
|
+
all_links = secici.css("a[href]")
|
|
122
|
+
for link in all_links:
|
|
123
|
+
href = link.attrs.get("href", "")
|
|
124
|
+
match = re.search(r"/sezon-(\d+)/bolum-(\d+)", href)
|
|
125
|
+
if match:
|
|
126
|
+
season_no = int(match.group(1))
|
|
127
|
+
ep_no = int(match.group(2))
|
|
128
|
+
|
|
129
|
+
# Bölüm başlığını çıkar - text'ten gerçek ismi al
|
|
130
|
+
# Format: "22 Eylül 2014 / 44 dk /1. Sezon / 1. BölümPilot"
|
|
131
|
+
full_text = link.text(strip=True)
|
|
132
|
+
# "Bölüm" kelimesinden sonraki kısmı al
|
|
133
|
+
ep_title = ""
|
|
134
|
+
if "Bölüm" in full_text:
|
|
135
|
+
parts = full_text.split("Bölüm")
|
|
136
|
+
if len(parts) > 1:
|
|
137
|
+
ep_title = parts[-1].strip()
|
|
138
|
+
|
|
139
|
+
episodes.append(Episode(
|
|
140
|
+
season = season_no,
|
|
141
|
+
episode = ep_no,
|
|
142
|
+
title = ep_title,
|
|
143
|
+
url = self.fix_url(href)
|
|
144
|
+
))
|
|
145
|
+
|
|
146
|
+
# Bölümler varsa SeriesInfo döndür
|
|
147
|
+
if episodes:
|
|
148
|
+
# Tekrar eden bölümleri kaldır
|
|
149
|
+
seen = set()
|
|
150
|
+
unique_episodes = []
|
|
151
|
+
for ep in episodes:
|
|
152
|
+
key = (ep.season, ep.episode)
|
|
153
|
+
if key not in seen:
|
|
154
|
+
seen.add(key)
|
|
155
|
+
unique_episodes.append(ep)
|
|
156
|
+
|
|
157
|
+
# Sırala
|
|
158
|
+
unique_episodes.sort(key=lambda x: (x.season or 0, x.episode or 0))
|
|
159
|
+
|
|
160
|
+
return SeriesInfo(
|
|
161
|
+
url = url,
|
|
162
|
+
poster = self.fix_url(poster) if poster else None,
|
|
163
|
+
title = self.clean_title(title),
|
|
164
|
+
description = description,
|
|
165
|
+
tags = tags,
|
|
166
|
+
rating = rating,
|
|
167
|
+
year = year,
|
|
168
|
+
actors = actors,
|
|
169
|
+
duration = duration,
|
|
170
|
+
episodes = unique_episodes
|
|
171
|
+
)
|
|
172
|
+
|
|
118
173
|
return MovieInfo(
|
|
119
174
|
url = url,
|
|
120
175
|
poster = self.fix_url(poster) if poster else None,
|
KekikStream/Plugins/Sinefy.py
CHANGED
|
@@ -175,49 +175,60 @@ class Sinefy(PluginBase):
|
|
|
175
175
|
year = year_el.text(strip=True) if year_el else None
|
|
176
176
|
|
|
177
177
|
episodes = []
|
|
178
|
-
|
|
178
|
+
episodes_box = sel.css_first("section.episodes-box")
|
|
179
179
|
|
|
180
|
-
if
|
|
181
|
-
#
|
|
182
|
-
|
|
183
|
-
menu = sel.css("div.ui.vertical.fluid.tabular.menu a")
|
|
184
|
-
for link in menu:
|
|
185
|
-
href = link.attrs.get("href")
|
|
186
|
-
if href:
|
|
187
|
-
season_links.append(self.fix_url(href))
|
|
180
|
+
if episodes_box:
|
|
181
|
+
# Sezon menüsünden sezon linklerini al
|
|
182
|
+
season_menu = episodes_box.css("div.ui.vertical.fluid.tabular.menu a.item")
|
|
188
183
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
184
|
+
# Sezon tab içeriklerini al
|
|
185
|
+
season_tabs = episodes_box.css("div.ui.tab")
|
|
186
|
+
|
|
187
|
+
# Eğer birden fazla sezon varsa, her sezon tab'ından bölümleri çek
|
|
188
|
+
if season_tabs:
|
|
189
|
+
for idx, season_tab in enumerate(season_tabs):
|
|
190
|
+
# Sezon numarasını belirle
|
|
191
|
+
current_season_no = idx + 1
|
|
192
|
+
|
|
193
|
+
# Menüden sezon numarasını almaya çalış
|
|
194
|
+
if idx < len(season_menu):
|
|
195
|
+
menu_href = season_menu[idx].attrs.get("href", "")
|
|
196
|
+
match = re.search(r"sezon-(\d+)", menu_href)
|
|
197
|
+
if match:
|
|
198
|
+
current_season_no = int(match.group(1))
|
|
196
199
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if match:
|
|
200
|
-
current_season_no = int(match.group(1))
|
|
200
|
+
# Bu sezon tab'ından bölüm linklerini çek
|
|
201
|
+
ep_links = season_tab.css("a[href*='bolum']")
|
|
201
202
|
|
|
203
|
+
seen_urls = set()
|
|
202
204
|
for ep_link in ep_links:
|
|
203
205
|
href = ep_link.attrs.get("href")
|
|
204
|
-
|
|
205
|
-
|
|
206
|
+
if not href or href in seen_urls:
|
|
207
|
+
continue
|
|
208
|
+
seen_urls.add(href)
|
|
206
209
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
# Bölüm numarasını URL'den çıkar
|
|
211
|
+
ep_no = 0
|
|
212
|
+
match_ep = re.search(r"bolum-(\d+)", href)
|
|
213
|
+
if match_ep:
|
|
214
|
+
ep_no = int(match_ep.group(1))
|
|
215
|
+
|
|
216
|
+
# Bölüm başlığını çıkar (önce title attribute, sonra text)
|
|
217
|
+
name = ep_link.attrs.get("title", "")
|
|
218
|
+
if not name:
|
|
219
|
+
name_el = ep_link.css_first("div.content div.header")
|
|
220
|
+
if name_el:
|
|
221
|
+
name = name_el.text(strip=True)
|
|
222
|
+
else:
|
|
223
|
+
name = ep_link.text(strip=True)
|
|
224
|
+
|
|
225
|
+
if href and ep_no > 0:
|
|
213
226
|
episodes.append(Episode(
|
|
214
|
-
season
|
|
227
|
+
season = current_season_no,
|
|
215
228
|
episode = ep_no,
|
|
216
|
-
title
|
|
217
|
-
url
|
|
229
|
+
title = name.strip() if name else f"{ep_no}. Bölüm",
|
|
230
|
+
url = self.fix_url(href)
|
|
218
231
|
))
|
|
219
|
-
except Exception:
|
|
220
|
-
pass
|
|
221
232
|
|
|
222
233
|
if episodes:
|
|
223
234
|
return SeriesInfo(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.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
|
|
@@ -56,7 +56,7 @@ KekikStream/Plugins/DiziPal.py,sha256=oo8pA6mfgpZoZV7B6EBwMec4dlUkMlDpaLnvQsxVhg
|
|
|
56
56
|
KekikStream/Plugins/DiziYou.py,sha256=FryU5EQR7xcMTkfcc6l-V73kqlbsFVCAPk5ss2zu8gM,9906
|
|
57
57
|
KekikStream/Plugins/Dizilla.py,sha256=HZ-A-ecFW2zdykNIjpv38n0FYRh1t8D03CrPresMSkk,13914
|
|
58
58
|
KekikStream/Plugins/FilmBip.py,sha256=tTp1gLHC1rVn0vY39jwxpF_fHC5_F0pqcCUCDItgHn0,7103
|
|
59
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
59
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=tjNcTreesqJCIby1uloLMl2e_dnaUtJe2Wbp7FhzjlY,8733
|
|
60
60
|
KekikStream/Plugins/FilmModu.py,sha256=ZUrBAq1mK2na8YuZEmev64tGhLrql-n-KK1wYDLICn0,7730
|
|
61
61
|
KekikStream/Plugins/FullHDFilm.py,sha256=B8ckb2TftuzfAgxNBs_rkIuAHc9YNVqjG_H9Y3QqGQM,10822
|
|
62
62
|
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=Y6wzW4JnALT91FR_RAmbi1KhM6m7NYlCBh8UGXkKeSs,7900
|
|
@@ -69,14 +69,14 @@ KekikStream/Plugins/SelcukFlix.py,sha256=hsoKh5cZ0xDeJ7MtRUQPX-mWFcrTrsaLy2dDaVw
|
|
|
69
69
|
KekikStream/Plugins/SetFilmIzle.py,sha256=cCl5dO77GyTAv0IAsvybBZyz74ZAwySxoIJMSOtLg5A,11501
|
|
70
70
|
KekikStream/Plugins/SezonlukDizi.py,sha256=xIc6Ez8Xt3iyKykJDB52MygpotIjrTTLjgMD1HVL85c,10828
|
|
71
71
|
KekikStream/Plugins/SineWix.py,sha256=z0r90lggAugEWE1g9vg8gZsInBObUZPnVFQwq7GYmJs,7052
|
|
72
|
-
KekikStream/Plugins/Sinefy.py,sha256=
|
|
72
|
+
KekikStream/Plugins/Sinefy.py,sha256=VVsi3iD1a1LcIx44vynH5olS0Kqh9DAsuuHtBiYUpxo,11612
|
|
73
73
|
KekikStream/Plugins/SinemaCX.py,sha256=6mYz7Yqja_weEfCiLrzMhji1eiSKaYHj0vX4aomDWvs,8628
|
|
74
74
|
KekikStream/Plugins/Sinezy.py,sha256=zBpxUpIIfdnZdolPdkxLMkTsWeGUMW1lht3dNwp_AYU,6756
|
|
75
75
|
KekikStream/Plugins/SuperFilmGeldi.py,sha256=zrTMpAP4NTxhQ4lgprBPXkihE7oQu2jNY7IFA7NWWYA,7144
|
|
76
76
|
KekikStream/Plugins/UgurFilm.py,sha256=S4Zrml9I3W3iW_2feLJWSkvsVZHpQQQlXRJk4E8li-c,5999
|
|
77
|
-
kekikstream-2.
|
|
78
|
-
kekikstream-2.
|
|
79
|
-
kekikstream-2.
|
|
80
|
-
kekikstream-2.
|
|
81
|
-
kekikstream-2.
|
|
82
|
-
kekikstream-2.
|
|
77
|
+
kekikstream-2.3.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
78
|
+
kekikstream-2.3.0.dist-info/METADATA,sha256=1-DSdf8BTHLe-q9KbiWvCI60xVQpSGmdCvHeQQv0oRE,10761
|
|
79
|
+
kekikstream-2.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
80
|
+
kekikstream-2.3.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
81
|
+
kekikstream-2.3.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
82
|
+
kekikstream-2.3.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|