KekikStream 3.7.2__tar.gz → 3.7.4__tar.gz
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-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorBase.py +10 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorMixins.py +2 -2
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/__init__.py +8 -2
- {kekikstream-3.7.2 → kekikstream-3.7.4}/PKG-INFO +1 -1
- {kekikstream-3.7.2 → kekikstream-3.7.4}/pyproject.toml +1 -1
- {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/FUNDING.yml +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/icons/KekikStream.png +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/workflows/Kontrol.yml +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/workflows/pypiYukle.yml +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/.gitignore +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KONTROL.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/VideoPlayerExtractor.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/FallbackClients.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/HTMLHelper.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/MetadataHelper.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/MethodCache.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/Normalizer.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/PlayabilityHelper.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/SubtitleHelper.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/TitleHelper.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/__init__.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/FlwBasePlugin.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Extractors/__init__.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Plugins/__init__.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/__main__.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/requirements.txt +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/LICENSE +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/README.md +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/Multi.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/PluginAudit/audit_plugins.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/PluginAudit/clean_plugins.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/PluginAudit/master_audit.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/Single.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/Validator.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/test_links.py +0 -0
- {kekikstream-3.7.2 → kekikstream-3.7.4}/_config.yml +0 -0
|
@@ -76,6 +76,13 @@ class ExtractorBase(ABC):
|
|
|
76
76
|
if not original_extract or getattr(original_extract, "__wb_wrapped_extract__", False):
|
|
77
77
|
return
|
|
78
78
|
|
|
79
|
+
def _drop_empty_subtitles(item: ExtractResult) -> None:
|
|
80
|
+
# Bazı extractor'lar boş `url`'li Subtitle üretebiliyor (ör. kaynak
|
|
81
|
+
# JSON'da subtitle "file" alanı boş) - bu çöp kayıtları tüm
|
|
82
|
+
# extractor'lar için tek noktadan (bu wrapper) süz.
|
|
83
|
+
if item.subtitles:
|
|
84
|
+
item.subtitles = [sub for sub in item.subtitles if sub.url]
|
|
85
|
+
|
|
79
86
|
async def wrapped_extract(url: str, referer: str | None = None, *args, **kwargs) -> ExtractResult | list[ExtractResult] | None:
|
|
80
87
|
try:
|
|
81
88
|
res = await original_extract(url, referer, *args, **kwargs)
|
|
@@ -100,6 +107,8 @@ class ExtractorBase(ABC):
|
|
|
100
107
|
item for item, (is_playable, _) in zip(extract_items, playability_results)
|
|
101
108
|
if is_playable
|
|
102
109
|
]
|
|
110
|
+
for item in valid_results:
|
|
111
|
+
_drop_empty_subtitles(item)
|
|
103
112
|
|
|
104
113
|
return valid_results if valid_results else None
|
|
105
114
|
|
|
@@ -107,6 +116,7 @@ class ExtractorBase(ABC):
|
|
|
107
116
|
elif isinstance(res, ExtractResult):
|
|
108
117
|
is_playable, _ = await PlayabilityHelper.is_url_playable(res)
|
|
109
118
|
if is_playable:
|
|
119
|
+
_drop_empty_subtitles(res)
|
|
110
120
|
return res
|
|
111
121
|
else:
|
|
112
122
|
return None
|
|
@@ -207,9 +207,9 @@ class BePlayerExtractor(ExtractorBase):
|
|
|
207
207
|
client_data = data.get("schedule", {}).get("client", "")
|
|
208
208
|
m3u8_url = HTMLHelper(client_data).regex_first(r'"video_location":"([^"]+)"')
|
|
209
209
|
|
|
210
|
-
# Altyazıları çıkar
|
|
210
|
+
# Altyazıları çıkar (file boşsa atla, boş-url'lü çöp Subtitle üretmesin)
|
|
211
211
|
for sub in data.get("strSubtitles", []):
|
|
212
|
-
if "Forced" not in sub.get("label", ""):
|
|
212
|
+
if sub.get("file") and "Forced" not in sub.get("label", ""):
|
|
213
213
|
subtitles.append(Subtitle(
|
|
214
214
|
name = sub.get("label", "TR").upper(),
|
|
215
215
|
url = self.fix_url(sub.get("file", ""))
|
|
@@ -68,9 +68,15 @@ def _calculate_similarity_score(title: str, query: str) -> int:
|
|
|
68
68
|
class KekikStream:
|
|
69
69
|
def __init__(self):
|
|
70
70
|
# Kendi paket yolunu bul
|
|
71
|
-
base_dir
|
|
71
|
+
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
72
|
+
|
|
72
73
|
extractor_dir = os.path.join(base_dir, "Extractors")
|
|
73
|
-
|
|
74
|
+
if os.path.isdir(os.path.join(os.getcwd(), "Extractors")):
|
|
75
|
+
extractor_dir = os.path.join(os.getcwd(), "Extractors")
|
|
76
|
+
|
|
77
|
+
plugin_dir = os.path.join(base_dir, "Plugins")
|
|
78
|
+
if os.path.isdir(os.path.join(os.getcwd(), "Plugins")):
|
|
79
|
+
plugin_dir = os.path.join(os.getcwd(), "Plugins")
|
|
74
80
|
|
|
75
81
|
self.extractor = ExtractorManager(extractor_dir=extractor_dir)
|
|
76
82
|
self.plugin = PluginManager(plugin_dir=plugin_dir, ex_manager=self.extractor)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.4
|
|
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 yapı.
|
|
5
5
|
Project-URL: Homepage, https://github.com/keyiflerolsun/KekikStream
|
|
6
6
|
Project-URL: Repository, https://github.com/keyiflerolsun/KekikStream.git
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "KekikStream"
|
|
3
|
-
version = "3.7.
|
|
3
|
+
version = "3.7.4"
|
|
4
4
|
description = "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 yapı."
|
|
5
5
|
keywords = ["KekikStream", "KekikAkademi", "keyiflerolsun"]
|
|
6
6
|
license = { text = "GPLv3+" }
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|