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.
Files changed (50) hide show
  1. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorBase.py +10 -0
  2. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorMixins.py +2 -2
  3. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/__init__.py +8 -2
  4. {kekikstream-3.7.2 → kekikstream-3.7.4}/PKG-INFO +1 -1
  5. {kekikstream-3.7.2 → kekikstream-3.7.4}/pyproject.toml +1 -1
  6. {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/FUNDING.yml +0 -0
  7. {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/icons/KekikStream.png +0 -0
  8. {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/workflows/Kontrol.yml +0 -0
  9. {kekikstream-3.7.2 → kekikstream-3.7.4}/.github/workflows/pypiYukle.yml +0 -0
  10. {kekikstream-3.7.2 → kekikstream-3.7.4}/.gitignore +0 -0
  11. {kekikstream-3.7.2 → kekikstream-3.7.4}/KONTROL.py +0 -0
  12. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/CLI/__init__.py +0 -0
  13. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/CLI/pypi_kontrol.py +0 -0
  14. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  15. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  16. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  17. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/VideoPlayerExtractor.py +0 -0
  18. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  19. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/FallbackClients.py +0 -0
  20. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/HTMLHelper.py +0 -0
  21. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/MetadataHelper.py +0 -0
  22. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/MethodCache.py +0 -0
  23. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/Normalizer.py +0 -0
  24. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/PlayabilityHelper.py +0 -0
  25. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/SubtitleHelper.py +0 -0
  26. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/TitleHelper.py +0 -0
  27. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Helpers/__init__.py +0 -0
  28. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Media/MediaHandler.py +0 -0
  29. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Media/MediaManager.py +0 -0
  30. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/FlwBasePlugin.py +0 -0
  31. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  32. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  33. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  34. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  35. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/UI/UIManager.py +0 -0
  36. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Core/__init__.py +0 -0
  37. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Extractors/__init__.py +0 -0
  38. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/Plugins/__init__.py +0 -0
  39. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/__main__.py +0 -0
  40. {kekikstream-3.7.2 → kekikstream-3.7.4}/KekikStream/requirements.txt +0 -0
  41. {kekikstream-3.7.2 → kekikstream-3.7.4}/LICENSE +0 -0
  42. {kekikstream-3.7.2 → kekikstream-3.7.4}/README.md +0 -0
  43. {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/Multi.py +0 -0
  44. {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/PluginAudit/audit_plugins.py +0 -0
  45. {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/PluginAudit/clean_plugins.py +0 -0
  46. {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/PluginAudit/master_audit.py +0 -0
  47. {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/Single.py +0 -0
  48. {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/Validator.py +0 -0
  49. {kekikstream-3.7.2 → kekikstream-3.7.4}/Tests/test_links.py +0 -0
  50. {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 = os.path.dirname(os.path.abspath(__file__))
71
+ base_dir = os.path.dirname(os.path.abspath(__file__))
72
+
72
73
  extractor_dir = os.path.join(base_dir, "Extractors")
73
- plugin_dir = os.path.join(base_dir, "Plugins")
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.2
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.2"
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