KekikStream 1.9.9__py3-none-any.whl → 2.0.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 +5 -5
- KekikStream/Core/Extractor/ExtractorLoader.py +12 -9
- KekikStream/Core/Extractor/ExtractorManager.py +1 -1
- KekikStream/Core/Plugin/PluginBase.py +4 -1
- KekikStream/Core/Plugin/PluginLoader.py +11 -7
- {kekikstream-1.9.9.dist-info → kekikstream-2.0.0.dist-info}/METADATA +27 -1
- {kekikstream-1.9.9.dist-info → kekikstream-2.0.0.dist-info}/RECORD +11 -11
- {kekikstream-1.9.9.dist-info → kekikstream-2.0.0.dist-info}/WHEEL +0 -0
- {kekikstream-1.9.9.dist-info → kekikstream-2.0.0.dist-info}/entry_points.txt +0 -0
- {kekikstream-1.9.9.dist-info → kekikstream-2.0.0.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-1.9.9.dist-info → kekikstream-2.0.0.dist-info}/top_level.txt +0 -0
|
@@ -17,13 +17,13 @@ class ExtractorBase(ABC):
|
|
|
17
17
|
self.cloudscraper = CloudScraper()
|
|
18
18
|
|
|
19
19
|
# httpx - lightweight and safe for most HTTP requests
|
|
20
|
-
self.httpx = AsyncClient(
|
|
21
|
-
timeout = 3,
|
|
22
|
-
follow_redirects = True
|
|
23
|
-
)
|
|
20
|
+
self.httpx = AsyncClient(timeout = 10)
|
|
24
21
|
self.httpx.headers.update(self.cloudscraper.headers)
|
|
25
22
|
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
26
|
-
self.httpx.headers.update({
|
|
23
|
+
self.httpx.headers.update({
|
|
24
|
+
"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0",
|
|
25
|
+
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
|
|
26
|
+
})
|
|
27
27
|
|
|
28
28
|
def can_handle_url(self, url: str) -> bool:
|
|
29
29
|
# URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
|
|
@@ -19,19 +19,22 @@ class ExtractorLoader:
|
|
|
19
19
|
def load_all(self) -> list[ExtractorBase]:
|
|
20
20
|
extractors = []
|
|
21
21
|
|
|
22
|
-
#
|
|
23
|
-
if self.global_extractors_dir.exists():
|
|
24
|
-
# konsol.log(f"[green][*] Global Extractor dizininden yükleniyor: {self.global_extractors_dir}[/green]")
|
|
25
|
-
global_extractors = self._load_from_directory(self.global_extractors_dir)
|
|
26
|
-
# konsol.log(f"[green]Global Extractor'lar: {[e.__name__ for e in global_extractors]}[/green]")
|
|
27
|
-
extractors.extend(global_extractors)
|
|
28
|
-
|
|
29
|
-
# Yerel çıkarıcıları yükle
|
|
22
|
+
# Eğer yerel dizinde Extractor varsa, sadece onları yükle (eklenti geliştirme modu)
|
|
30
23
|
if self.local_extractors_dir.exists():
|
|
31
24
|
# konsol.log(f"[green][*] Yerel Extractor dizininden yükleniyor: {self.local_extractors_dir}[/green]")
|
|
32
25
|
local_extractors = self._load_from_directory(self.local_extractors_dir)
|
|
33
26
|
# konsol.log(f"[green]Yerel Extractor'lar: {[e.__name__ for e in local_extractors]}[/green]")
|
|
34
|
-
|
|
27
|
+
|
|
28
|
+
if local_extractors:
|
|
29
|
+
# konsol.log("[cyan][*] Yerel Extractor bulundu, global Extractor'lar atlanıyor (eklenti geliştirme modu)[/cyan]")
|
|
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():
|
|
34
|
+
# konsol.log(f"[green][*] Global Extractor dizininden yükleniyor: {self.global_extractors_dir}[/green]")
|
|
35
|
+
global_extractors = self._load_from_directory(self.global_extractors_dir)
|
|
36
|
+
# konsol.log(f"[green]Global Extractor'lar: {[e.__name__ for e in global_extractors]}[/green]")
|
|
37
|
+
extractors.extend(global_extractors)
|
|
35
38
|
|
|
36
39
|
# Benzersizliği sağlama (modül adı + sınıf adı bazında)
|
|
37
40
|
unique_extractors = []
|
|
@@ -34,7 +34,10 @@ class PluginBase(ABC):
|
|
|
34
34
|
)
|
|
35
35
|
self.httpx.headers.update(self.cloudscraper.headers)
|
|
36
36
|
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
37
|
-
self.httpx.headers.update({
|
|
37
|
+
self.httpx.headers.update({
|
|
38
|
+
"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0",
|
|
39
|
+
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
|
|
40
|
+
})
|
|
38
41
|
|
|
39
42
|
self.media_handler = MediaHandler()
|
|
40
43
|
self.ex_manager = ExtractorManager()
|
|
@@ -19,15 +19,19 @@ class PluginLoader:
|
|
|
19
19
|
def load_all(self) -> dict[str, PluginBase]:
|
|
20
20
|
plugins = {}
|
|
21
21
|
|
|
22
|
-
#
|
|
23
|
-
if self.global_plugins_dir.exists():
|
|
24
|
-
# konsol.log(f"[green][*] Global Eklenti dizininden yükleniyor: {self.global_plugins_dir}[/green]")
|
|
25
|
-
plugins |= self._load_from_directory(self.global_plugins_dir)
|
|
26
|
-
|
|
27
|
-
# Yerel eklentileri yükle
|
|
22
|
+
# Eğer yerel dizinde Plugin varsa, sadece onları yükle (eklenti geliştirme modu)
|
|
28
23
|
if self.local_plugins_dir.exists():
|
|
29
24
|
# konsol.log(f"[green][*] Yerel Eklenti dizininden yükleniyor: {self.local_plugins_dir}[/green]")
|
|
30
|
-
|
|
25
|
+
local_plugins = self._load_from_directory(self.local_plugins_dir)
|
|
26
|
+
|
|
27
|
+
if local_plugins:
|
|
28
|
+
# konsol.log("[cyan][*] Yerel Plugin bulundu, global Plugin'ler atlanıyor (eklenti geliştirme modu)[/cyan]")
|
|
29
|
+
plugins |= local_plugins
|
|
30
|
+
|
|
31
|
+
# Yerel dizinde Plugin yoksa, global'leri yükle
|
|
32
|
+
if not plugins and self.global_plugins_dir.exists():
|
|
33
|
+
# konsol.log(f"[green][*] Global Eklenti dizininden yükleniyor: {self.global_plugins_dir}[/green]")
|
|
34
|
+
plugins |= self._load_from_directory(self.global_plugins_dir)
|
|
31
35
|
|
|
32
36
|
if not plugins:
|
|
33
37
|
konsol.print("[yellow][!] Yüklenecek bir Eklenti bulunamadı![/yellow]")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.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
|
|
@@ -235,6 +235,32 @@ KekikStream/
|
|
|
235
235
|
3. `get_main_page`, `search`, `load_item`, `load_links` metodlarını implemente edin.
|
|
236
236
|
4. Plugin'i test edin (örnek: `Tests/Single.py`).
|
|
237
237
|
|
|
238
|
+
### 🔧 Geliştirme Modu
|
|
239
|
+
|
|
240
|
+
KekikStream, eklenti geliştiricileri için otomatik bir **geliştirme modu** sunar:
|
|
241
|
+
|
|
242
|
+
**Plugin Geliştirme:**
|
|
243
|
+
- Çalışma dizininde `Plugins/` klasörü oluşturup içine plugin dosyası eklerseniz, **sadece bu local plugin'ler** yüklenir
|
|
244
|
+
- Global plugin'ler (sisteme kurulu olanlar) otomatik olarak atlanır
|
|
245
|
+
- Bu sayede test sırasında diğer plugin'lerle karışma olmaz
|
|
246
|
+
|
|
247
|
+
**Extractor Geliştirme:**
|
|
248
|
+
- Çalışma dizininde `Extractors/` klasörü oluşturup içine extractor dosyası eklerseniz, **sadece bu local extractor'lar** yüklenir
|
|
249
|
+
- Global extractor'lar otomatik olarak atlanır
|
|
250
|
+
- Kendi extractor'ınızı izole bir ortamda test edebilirsiniz
|
|
251
|
+
|
|
252
|
+
**Örnek:**
|
|
253
|
+
```bash
|
|
254
|
+
# Çalışma dizininizde
|
|
255
|
+
mkdir Plugins
|
|
256
|
+
touch Plugins/MyTestPlugin.py # Plugin'inizi yazın
|
|
257
|
+
|
|
258
|
+
# KekikStream'i çalıştırın - sadece MyTestPlugin yüklenecek
|
|
259
|
+
KekikStream
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
> 💡 **Not:** Yerel dizinde herhangi bir Plugin/Extractor dosyası bulunmazsa, sistem normal şekilde global olanları yükler.
|
|
263
|
+
|
|
238
264
|
---
|
|
239
265
|
|
|
240
266
|
## 📊 Performans
|
|
@@ -4,14 +4,14 @@ KekikStream/requirements.txt,sha256=0fO-7byqgLMr4NyJO7fQBFOnLv0zcAeqk7tLhHXqonk,
|
|
|
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=ar2MZQF83ryfLfydEXcfjdwNe4Too_HT6bP-D_4TopA,710
|
|
7
|
-
KekikStream/Core/Extractor/ExtractorBase.py,sha256=
|
|
8
|
-
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=
|
|
9
|
-
KekikStream/Core/Extractor/ExtractorManager.py,sha256=
|
|
7
|
+
KekikStream/Core/Extractor/ExtractorBase.py,sha256=_9l0VIZpFHBdzVLI_hp1RQRf4CmsxrTt-FIKEaF1Z04,1824
|
|
8
|
+
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=cYV2Cwzf6IdlglWrDK3LRK0aZO6pdMGTsXepIM6DO_E,4552
|
|
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/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
|
|
12
12
|
KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
|
|
13
|
-
KekikStream/Core/Plugin/PluginBase.py,sha256=
|
|
14
|
-
KekikStream/Core/Plugin/PluginLoader.py,sha256=
|
|
13
|
+
KekikStream/Core/Plugin/PluginBase.py,sha256=xR1J6unUDpUNe_fHRtZSryEbAPdf-qdT3LpMsjT_kBk,4126
|
|
14
|
+
KekikStream/Core/Plugin/PluginLoader.py,sha256=GcDqN1u3nJeoGKH_oDFHCpwteJlLCxHNbmPrC5L-hZE,3692
|
|
15
15
|
KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
|
|
16
16
|
KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P8S0tRNhS6E,2476
|
|
17
17
|
KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
|
|
@@ -78,9 +78,9 @@ KekikStream/Plugins/SinemaCX.py,sha256=dEoZJJLnTgayBeCbGoR1qSUjrnTeRx5ZLck_dSPDL
|
|
|
78
78
|
KekikStream/Plugins/Sinezy.py,sha256=EttAZogKoKMP8RP_X1fSfi8vVxA2RWizwgnLkmnhERQ,5675
|
|
79
79
|
KekikStream/Plugins/SuperFilmGeldi.py,sha256=Ohm21BPsJH_S1tx5i2APEgAOD25k2NiwRP7rSgAKvRs,5289
|
|
80
80
|
KekikStream/Plugins/UgurFilm.py,sha256=eKGzmSi8k_QbXnYPWXZRdmCxxc32zZh4rynmdxCbm1o,4832
|
|
81
|
-
kekikstream-
|
|
82
|
-
kekikstream-
|
|
83
|
-
kekikstream-
|
|
84
|
-
kekikstream-
|
|
85
|
-
kekikstream-
|
|
86
|
-
kekikstream-
|
|
81
|
+
kekikstream-2.0.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
82
|
+
kekikstream-2.0.0.dist-info/METADATA,sha256=ec5QwOxhLLKAnYgw_zsy8HRqPjFGcng0jr9H0NE1iV4,10090
|
|
83
|
+
kekikstream-2.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
84
|
+
kekikstream-2.0.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
85
|
+
kekikstream-2.0.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
86
|
+
kekikstream-2.0.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|