KekikStream 2.5.0__py3-none-any.whl → 2.5.2__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/ExtractorLoader.py +8 -14
- KekikStream/Core/Plugin/PluginLoader.py +9 -12
- KekikStream/Plugins/FilmEkseni.py +53 -16
- KekikStream/Plugins/FilmMakinesi.py +1 -1
- KekikStream/Plugins/FilmciBaba.py +1 -1
- {kekikstream-2.5.0.dist-info → kekikstream-2.5.2.dist-info}/METADATA +3 -3
- {kekikstream-2.5.0.dist-info → kekikstream-2.5.2.dist-info}/RECORD +11 -11
- {kekikstream-2.5.0.dist-info → kekikstream-2.5.2.dist-info}/WHEEL +0 -0
- {kekikstream-2.5.0.dist-info → kekikstream-2.5.2.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.5.0.dist-info → kekikstream-2.5.2.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.5.0.dist-info → kekikstream-2.5.2.dist-info}/top_level.txt +0 -0
|
@@ -9,7 +9,7 @@ class ExtractorLoader:
|
|
|
9
9
|
def __init__(self, extractors_dir: str):
|
|
10
10
|
# Yerel ve global çıkarıcı dizinlerini ayarla
|
|
11
11
|
self.local_extractors_dir = Path(extractors_dir)
|
|
12
|
-
self.global_extractors_dir = Path(__file__).parent.parent.parent /
|
|
12
|
+
self.global_extractors_dir = Path(__file__).parent.parent.parent / "Extractors"
|
|
13
13
|
|
|
14
14
|
# Dizin kontrolü
|
|
15
15
|
if not self.local_extractors_dir.exists() and not self.global_extractors_dir.exists():
|
|
@@ -19,22 +19,16 @@ class ExtractorLoader:
|
|
|
19
19
|
def load_all(self) -> list[ExtractorBase]:
|
|
20
20
|
extractors = []
|
|
21
21
|
|
|
22
|
-
#
|
|
23
|
-
|
|
22
|
+
# Yerel Extractor'lar varsa önce onları yükle (ek/öncelikli yetenekler)
|
|
23
|
+
# Eğer yerel dizin global dizinle aynıysa (örn: doğrudan core'da çalışırken) tekrar yükleme yapma
|
|
24
|
+
if self.local_extractors_dir.exists() and self.local_extractors_dir.resolve() != self.global_extractors_dir.resolve():
|
|
24
25
|
# konsol.log(f"[green][*] Yerel Extractor dizininden yükleniyor: {self.local_extractors_dir}[/green]")
|
|
25
|
-
|
|
26
|
-
# konsol.log(f"[green]Yerel Extractor'lar: {[e.__name__ for e in local_extractors]}[/green]")
|
|
26
|
+
extractors.extend(self._load_from_directory(self.local_extractors_dir))
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
extractors.extend(local_extractors)
|
|
31
|
-
|
|
32
|
-
# Yerel dizinde Extractor yoksa, global'leri yükle
|
|
33
|
-
if not extractors and self.global_extractors_dir.exists():
|
|
28
|
+
# Global Extractor'ları her zaman yükle (temel yetenekler)
|
|
29
|
+
if self.global_extractors_dir.exists():
|
|
34
30
|
# konsol.log(f"[green][*] Global Extractor dizininden yükleniyor: {self.global_extractors_dir}[/green]")
|
|
35
|
-
|
|
36
|
-
# konsol.log(f"[green]Global Extractor'lar: {[e.__name__ for e in global_extractors]}[/green]")
|
|
37
|
-
extractors.extend(global_extractors)
|
|
31
|
+
extractors.extend(self._load_from_directory(self.global_extractors_dir))
|
|
38
32
|
|
|
39
33
|
# Benzersizliği sağlama (modül adı + sınıf adı bazında)
|
|
40
34
|
unique_extractors = []
|
|
@@ -10,7 +10,7 @@ class PluginLoader:
|
|
|
10
10
|
# Yerel ve global eklenti dizinlerini ayarla
|
|
11
11
|
self.proxy = proxy
|
|
12
12
|
self.local_plugins_dir = Path(plugins_dir).resolve()
|
|
13
|
-
self.global_plugins_dir = Path(__file__).parent.parent.parent /
|
|
13
|
+
self.global_plugins_dir = Path(__file__).parent.parent.parent / "Plugins"
|
|
14
14
|
|
|
15
15
|
# Dizin kontrolü
|
|
16
16
|
if not self.local_plugins_dir.exists() and not self.global_plugins_dir.exists():
|
|
@@ -18,19 +18,16 @@ class PluginLoader:
|
|
|
18
18
|
cikis_yap(False)
|
|
19
19
|
|
|
20
20
|
def load_all(self) -> dict[str, PluginBase]:
|
|
21
|
-
plugins
|
|
21
|
+
plugins = {}
|
|
22
|
+
local_dir_exists = self.local_plugins_dir.exists() and self.local_plugins_dir.resolve() != self.global_plugins_dir.resolve()
|
|
22
23
|
|
|
23
|
-
# Eğer yerel
|
|
24
|
-
if
|
|
24
|
+
# Eğer yerel dizin varsa, sadece oradan yükle (eklenti geliştirme/yayınlama modu)
|
|
25
|
+
if local_dir_exists:
|
|
25
26
|
# konsol.log(f"[green][*] Yerel Eklenti dizininden yükleniyor: {self.local_plugins_dir}[/green]")
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
plugins |= local_plugins
|
|
31
|
-
|
|
32
|
-
# Yerel dizinde Plugin yoksa, global'leri yükle
|
|
33
|
-
if not plugins and self.global_plugins_dir.exists():
|
|
27
|
+
plugins |= self._load_from_directory(self.local_plugins_dir)
|
|
28
|
+
|
|
29
|
+
# Yerel dizin yoksa (veya core ile aynı yerse), global'leri yükle
|
|
30
|
+
else:
|
|
34
31
|
# konsol.log(f"[green][*] Global Eklenti dizininden yükleniyor: {self.global_plugins_dir}[/green]")
|
|
35
32
|
plugins |= self._load_from_directory(self.global_plugins_dir)
|
|
36
33
|
|
|
@@ -137,23 +137,60 @@ class FilmEkseni(PluginBase):
|
|
|
137
137
|
istek = await self.httpx.get(url)
|
|
138
138
|
secici = HTMLHelper(istek.text)
|
|
139
139
|
|
|
140
|
+
# Dil sekmelerini bul (Dublaj, Altyazı vb.)
|
|
141
|
+
# Fragman vb. linkleri dahil etmemek için sadece 'a.nav-link' bakıyoruz
|
|
142
|
+
lang_tabs = [
|
|
143
|
+
tab for tab in secici.select("ul.nav-tabs.nav-slider a.nav-link")
|
|
144
|
+
if "fragman" not in tab.text().lower()
|
|
145
|
+
]
|
|
146
|
+
|
|
147
|
+
# Player panellerini bul
|
|
148
|
+
tab_panes = secici.select("div.tab-pane")
|
|
149
|
+
|
|
140
150
|
sources = [] # (name, url, is_active)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
151
|
+
|
|
152
|
+
# Eğer dil sekmeleri ve paneller eşleşiyorsa (ideal durum)
|
|
153
|
+
if lang_tabs and tab_panes:
|
|
154
|
+
for i, pane in enumerate(tab_panes):
|
|
155
|
+
if i >= len(lang_tabs):
|
|
156
|
+
break
|
|
157
|
+
|
|
158
|
+
lang_name = lang_tabs[i].text(strip=True)
|
|
159
|
+
player_links = secici.select("a.nav-link", element=pane)
|
|
160
|
+
|
|
161
|
+
for link in player_links:
|
|
162
|
+
p_name = link.text(strip=True)
|
|
163
|
+
if not p_name or any(x in p_name.lower() for x in ["paylaş", "indir", "hata"]):
|
|
164
|
+
continue
|
|
165
|
+
|
|
166
|
+
href = link.attrs.get("href")
|
|
167
|
+
if not href or href == "#":
|
|
168
|
+
continue
|
|
169
|
+
|
|
170
|
+
# Yeni isim "Moly | Türkçe Dublaj"
|
|
171
|
+
full_name = f"{p_name} | {lang_name}"
|
|
172
|
+
is_active = "active" in link.attrs.get("class", "")
|
|
173
|
+
|
|
174
|
+
sources.append((full_name, self.fix_url(href), is_active))
|
|
175
|
+
|
|
176
|
+
# Eğer panel yapısı beklediğimizden farklıysa eski mantığa dön
|
|
177
|
+
if not sources:
|
|
178
|
+
if nav_links := secici.select("nav.card-nav a.nav-link"):
|
|
179
|
+
seen_urls = set()
|
|
180
|
+
for link in nav_links:
|
|
181
|
+
if link.attrs.get("href") == "#":
|
|
182
|
+
continue # Sinema Modu vb.
|
|
183
|
+
|
|
184
|
+
name = link.text(strip=True)
|
|
185
|
+
href = link.attrs.get("href")
|
|
186
|
+
is_active = "active" in link.attrs.get("class", "")
|
|
187
|
+
|
|
188
|
+
if href and href not in seen_urls:
|
|
189
|
+
seen_urls.add(href)
|
|
190
|
+
sources.append((name, self.fix_url(href), is_active))
|
|
191
|
+
else:
|
|
192
|
+
# Nav yoksa mevcut sayfayı (Varsayılan/VIP) al
|
|
193
|
+
sources.append(("VIP", url, True))
|
|
157
194
|
|
|
158
195
|
tasks = []
|
|
159
196
|
for name, link_url, is_active in sources:
|
|
@@ -78,7 +78,7 @@ class FilmMakinesi(PluginBase):
|
|
|
78
78
|
|
|
79
79
|
title = self.clean_title(secici.select_text("h1.title"))
|
|
80
80
|
poster = secici.select_poster("img.cover-img")
|
|
81
|
-
description = secici.select_text("div.info-description
|
|
81
|
+
description = secici.select_text("div.info-description")
|
|
82
82
|
rating = secici.select_text("div.info div.imdb b")
|
|
83
83
|
year = secici.select_text("span.date a")
|
|
84
84
|
actors = secici.select_texts("div.cast-name")
|
|
@@ -5,7 +5,7 @@ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
|
5
5
|
class FilmciBaba(PluginBase):
|
|
6
6
|
name = "FilmciBaba"
|
|
7
7
|
language = "tr"
|
|
8
|
-
main_url = "https://
|
|
8
|
+
main_url = "https://4kizle.live"
|
|
9
9
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
10
10
|
description = "Filmci Baba, film izleme sitesi 4k Full film izle, 1080p ve 4k kalite de sinema filmleri ve dizileri, tek parça hd kalitede türkçe dublajlı filmler seyret."
|
|
11
11
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.2
|
|
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
|
|
@@ -63,13 +63,13 @@ Terminal üzerinden içerik arayın, VLC/MPV ile doğrudan izleyin veya kendi AP
|
|
|
63
63
|
|
|
64
64
|
## 🚦 Ne Sunar?
|
|
65
65
|
|
|
66
|
-
KekikStream, Türkçe medya kaynaklarını tek CLI arayüzünde toplayarak hızlı arama ve oynatma sunar. Plugin mimarisi sayesinde yeni kaynaklar eklemek ve [
|
|
66
|
+
KekikStream, Türkçe medya kaynaklarını tek CLI arayüzünde toplayarak hızlı arama ve oynatma sunar. Plugin mimarisi sayesinde yeni kaynaklar eklemek ve [KekikStreamAPI](https://github.com/keyiflerolsun/KekikStreamAPI) ile web/API üzerinden yayın yapmak kolaydır.
|
|
67
67
|
|
|
68
68
|
- 🎥 Çoklu kaynak desteği: Onlarca Türkçe medya sitesi
|
|
69
69
|
- 🔌 Plugin mimarisi: Yeni kaynak eklemek dakikalar sürer
|
|
70
70
|
- 🎬 Çoklu oynatıcı: VLC, MPV, MX Player
|
|
71
71
|
- 🖥️ CLI & kütüphane: Terminalde veya kod içinde kullanın
|
|
72
|
-
- 🌐 API/Web UI:
|
|
72
|
+
- 🌐 API/Web UI: KekikStreamAPI üzerinden uzak erişim
|
|
73
73
|
|
|
74
74
|
---
|
|
75
75
|
|
|
@@ -6,14 +6,14 @@ KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElci
|
|
|
6
6
|
KekikStream/Core/HTMLHelper.py,sha256=jhRZc6ENhCjSY7X9IEo10WDKfmb-CPb8de_EICHIXQ0,8697
|
|
7
7
|
KekikStream/Core/__init__.py,sha256=sk2pWup1_jsGB43HJzbbqgQYFDZpf2TquEBYUhqOdN4,807
|
|
8
8
|
KekikStream/Core/Extractor/ExtractorBase.py,sha256=9Q79wULey2Nl254MUkiulhxZzGyb2C1H3mOUh4t0MN0,2077
|
|
9
|
-
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=
|
|
9
|
+
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=vMakgaGlcrpw5VMNMgmudTr9KRHorUlbjjTaOngXsJo,4484
|
|
10
10
|
KekikStream/Core/Extractor/ExtractorManager.py,sha256=VYkj4CCE5Puqsr6PCeN8i_OS0hfYKI4NScj98BLO39o,2644
|
|
11
11
|
KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6XBOc0HS0tXGDwajI,445
|
|
12
12
|
KekikStream/Core/Extractor/YTDLPCache.py,sha256=sRg5kwFxkRXA_8iRwsV29E51g9qQJvg8dWUnzfr7EwA,984
|
|
13
13
|
KekikStream/Core/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
|
|
14
14
|
KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
|
|
15
15
|
KekikStream/Core/Plugin/PluginBase.py,sha256=t6zaDlwDfnevIu-NLUgmQkBnw0mcRisb3jnUWlcv5tU,7335
|
|
16
|
-
KekikStream/Core/Plugin/PluginLoader.py,sha256=
|
|
16
|
+
KekikStream/Core/Plugin/PluginLoader.py,sha256=6itvniiXF4y9f1pQR4w-PWtBC8PP5zrbnuO1IUJ16LA,3669
|
|
17
17
|
KekikStream/Core/Plugin/PluginManager.py,sha256=6a0Q2mHtzIpx1ttdSTsVHg2HfLJIO0r_iHjK3Kui1Rw,939
|
|
18
18
|
KekikStream/Core/Plugin/PluginModels.py,sha256=7g1uHjJstfnrdTabDgyrBnu1ojIQ025hsmw85cDXFS8,2353
|
|
19
19
|
KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
|
|
@@ -68,11 +68,11 @@ KekikStream/Plugins/DiziPal.py,sha256=Ezrjbfq7EUcEjpA6yuOUtlhC009CE4aXW0_eM8Uf3y
|
|
|
68
68
|
KekikStream/Plugins/DiziYou.py,sha256=Z6MznGOcUnnxdsQsK-rnPmGHa1PAq7NcFw0slXlEVGo,6759
|
|
69
69
|
KekikStream/Plugins/Dizilla.py,sha256=U6z4cfy48HhtJNGi9-A3kUzoph-JpQuMtiOZ7fE_DUI,12705
|
|
70
70
|
KekikStream/Plugins/FilmBip.py,sha256=enTqWdx8YbseSsyQEYIVs6Dr7A7llkn7AtFaTYuatCE,9137
|
|
71
|
-
KekikStream/Plugins/FilmEkseni.py,sha256=
|
|
72
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
71
|
+
KekikStream/Plugins/FilmEkseni.py,sha256=EwtHH1kuTV2ow1Yc9D063CZ0c4OOXcwchyKN5oAXY_s,8645
|
|
72
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=AdollSseX3M7sQQ5YAyLU93t7PncP4PIdqYd3nUog6s,7970
|
|
73
73
|
KekikStream/Plugins/FilmModu.py,sha256=7qm7kC4R0oH1OWyLleSqj6SMUgWbbERfYbE1d726ZOM,6943
|
|
74
74
|
KekikStream/Plugins/Filmatek.py,sha256=AdOeBVP1rfq5R1YJlQj2saT77rnzVHX54tEOAH-t9fI,7700
|
|
75
|
-
KekikStream/Plugins/FilmciBaba.py,sha256=
|
|
75
|
+
KekikStream/Plugins/FilmciBaba.py,sha256=rBrtFwZpe4QtR2Q-Jze_KaC2x2dXrArpUpQPn5Na4CU,6934
|
|
76
76
|
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=dJ1xo1D3ujPCQE6PewpqdvSMKlBbifA67uU7BAMmvVM,6274
|
|
77
77
|
KekikStream/Plugins/HDFilm.py,sha256=m6tjV1O1l5U_jqkGKizi62GOdSMd5osyOS2_9jehS-w,10754
|
|
78
78
|
KekikStream/Plugins/HDFilmCehennemi.py,sha256=h3FTKN-psrzvN0Juw8Am83MV8QL9aX-RSWhYqXRQU-E,17368
|
|
@@ -91,9 +91,9 @@ KekikStream/Plugins/SuperFilmGeldi.py,sha256=hXhYYuQkVbYJ07P8y5QjY5iR3rVgUfAWc_M
|
|
|
91
91
|
KekikStream/Plugins/UgurFilm.py,sha256=2U3-rC9JzwDoF1c8t3VyE3jMcz-SB51uxFX-8DqrQ7M,6778
|
|
92
92
|
KekikStream/Plugins/Watch32.py,sha256=wAw-glE9bQNsyfzhv1zlFIjYAhSvK58mUri-XGytuHs,7318
|
|
93
93
|
KekikStream/Plugins/YabanciDizi.py,sha256=aqdPLQ3Oajs32JNkgIPeqHuYgcM8K2jGHT0Ikw8Q6jY,10582
|
|
94
|
-
kekikstream-2.5.
|
|
95
|
-
kekikstream-2.5.
|
|
96
|
-
kekikstream-2.5.
|
|
97
|
-
kekikstream-2.5.
|
|
98
|
-
kekikstream-2.5.
|
|
99
|
-
kekikstream-2.5.
|
|
94
|
+
kekikstream-2.5.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
95
|
+
kekikstream-2.5.2.dist-info/METADATA,sha256=HrYKAjQtnk3v29idmfEAGrQW8_jPmbf_jBhy3wBi-mU,10761
|
|
96
|
+
kekikstream-2.5.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
97
|
+
kekikstream-2.5.2.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
98
|
+
kekikstream-2.5.2.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
99
|
+
kekikstream-2.5.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|