KekikStream 1.8.9__tar.gz → 1.9.0__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 (92) hide show
  1. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Media/MediaHandler.py +5 -58
  2. kekikstream-1.9.0/KekikStream/Extractors/YTDLP.py +109 -0
  3. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream.egg-info/PKG-INFO +1 -1
  4. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream.egg-info/SOURCES.txt +1 -0
  5. {kekikstream-1.8.9 → kekikstream-1.9.0}/PKG-INFO +1 -1
  6. {kekikstream-1.8.9 → kekikstream-1.9.0}/setup.py +1 -1
  7. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/CLI/__init__.py +0 -0
  8. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/CLI/pypi_kontrol.py +0 -0
  9. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  10. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  11. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  12. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  13. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Media/MediaManager.py +0 -0
  14. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  15. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  16. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  17. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  18. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/UI/UIManager.py +0 -0
  19. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Core/__init__.py +0 -0
  20. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/CloseLoad.py +0 -0
  21. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/ContentX.py +0 -0
  22. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/DzenRu.py +0 -0
  23. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/ExPlay.py +0 -0
  24. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/FirePlayer.py +0 -0
  25. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/FourCX.py +0 -0
  26. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/FourPichive.py +0 -0
  27. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/FourPlayRu.py +0 -0
  28. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  29. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/HDStreamAble.py +0 -0
  30. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/Hotlinger.py +0 -0
  31. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/JetTv.py +0 -0
  32. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/MailRu.py +0 -0
  33. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/MixPlayHD.py +0 -0
  34. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/MixTiger.py +0 -0
  35. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/MolyStream.py +0 -0
  36. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  37. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  38. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/OkRuSSL.py +0 -0
  39. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  40. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/Pichive.py +0 -0
  41. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/PixelDrain.py +0 -0
  42. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/PlayRu.py +0 -0
  43. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  44. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/RapidVid.py +0 -0
  45. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/SetPlay.py +0 -0
  46. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/SetPrime.py +0 -0
  47. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/SibNet.py +0 -0
  48. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  49. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/TRsTX.py +0 -0
  50. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/TauVideo.py +0 -0
  51. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/TurboImgz.py +0 -0
  52. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  53. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/VidHide.py +0 -0
  54. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/VidMoly.py +0 -0
  55. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/VidMolyMe.py +0 -0
  56. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/VidMoxy.py +0 -0
  57. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/VidPapi.py +0 -0
  58. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/VideoSeyred.py +0 -0
  59. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  60. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/DiziBox.py +0 -0
  61. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/DiziPal.py +0 -0
  62. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/DiziYou.py +0 -0
  63. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/Dizilla.py +0 -0
  64. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/FilmBip.py +0 -0
  65. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  66. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/FilmModu.py +0 -0
  67. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/FullHDFilm.py +0 -0
  68. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  69. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  70. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/JetFilmizle.py +0 -0
  71. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/KultFilmler.py +0 -0
  72. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/RecTV.py +0 -0
  73. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/RoketDizi.py +0 -0
  74. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/SelcukFlix.py +0 -0
  75. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  76. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/SineWix.py +0 -0
  77. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/Sinefy.py +0 -0
  78. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/SinemaCX.py +0 -0
  79. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/Sinezy.py +0 -0
  80. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  81. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/Plugins/UgurFilm.py +0 -0
  82. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/__init__.py +0 -0
  83. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/__main__.py +0 -0
  84. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream/requirements.txt +0 -0
  85. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream.egg-info/dependency_links.txt +0 -0
  86. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream.egg-info/entry_points.txt +0 -0
  87. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream.egg-info/requires.txt +0 -0
  88. {kekikstream-1.8.9 → kekikstream-1.9.0}/KekikStream.egg-info/top_level.txt +0 -0
  89. {kekikstream-1.8.9 → kekikstream-1.9.0}/LICENSE +0 -0
  90. {kekikstream-1.8.9 → kekikstream-1.9.0}/MANIFEST.in +0 -0
  91. {kekikstream-1.8.9 → kekikstream-1.9.0}/README.md +0 -0
  92. {kekikstream-1.8.9 → kekikstream-1.9.0}/setup.cfg +0 -0
@@ -2,62 +2,13 @@
2
2
 
3
3
  from ...CLI import konsol
4
4
  from ..Extractor.ExtractorModels import ExtractResult
5
- import subprocess, os, yt_dlp
5
+ import subprocess, os
6
6
 
7
7
  class MediaHandler:
8
8
  def __init__(self, title: str = "KekikStream"):
9
9
  self.title = title
10
10
  self.headers = {}
11
11
 
12
- def should_use_ytdlp(self, url: str, user_agent: str) -> bool:
13
- """
14
- yt-dlp gereken durumları profesyonel şekilde tespit et
15
-
16
- yt-dlp'nin native Python API'sini simulate mode ile kullanarak
17
- güvenilir ve performanslı tespit yapar.
18
-
19
- Args:
20
- url: Video URL'si
21
- user_agent: User-Agent string'i
22
-
23
- Returns:
24
- bool: yt-dlp kullanılması gerekiyorsa True
25
- """
26
- # 1. User-Agent bazlı kontrol (mevcut davranışı koru - RecTV, MolyStream için)
27
- ytdlp_user_agents = [
28
- "googleusercontent",
29
- "Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"
30
- ]
31
-
32
- if user_agent in ytdlp_user_agents:
33
- konsol.log("[cyan][ℹ] User-Agent bazlı yt-dlp tespiti[/cyan]")
34
- return True
35
-
36
- # 2. yt-dlp'nin native Python API'sini kullan (simulate mode)
37
- try:
38
- ydl_opts = {
39
- "simulate" : True, # Download yok, sadece tespit
40
- "quiet" : True, # Log kirliliği yok
41
- "no_warnings" : True, # Uyarı mesajları yok
42
- "extract_flat" : True # Minimal işlem
43
- }
44
-
45
- with yt_dlp.YoutubeDL(ydl_opts) as ydl:
46
- # URL'yi işleyebiliyor mu kontrol et
47
- info = ydl.extract_info(url, download=False, process=False)
48
-
49
- # Generic extractor ise atla
50
- if info and info.get("extractor_key") != "Generic":
51
- konsol.log(f"[cyan][ℹ] yt-dlp extractor: {info.get('extractor_key', 'Unknown')}[/cyan]")
52
- return True
53
-
54
- return False
55
-
56
- except Exception as e:
57
- # yt-dlp işleyemezse False döndür
58
- konsol.log(f"[yellow][⚠] yt-dlp kontrol hatası: {e}[/yellow]")
59
- return False
60
-
61
12
  def play_media(self, extract_data: ExtractResult):
62
13
  # user-agent ekle (varsayılan veya extract_data'dan)
63
14
  user_agent = extract_data.user_agent or "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"
@@ -67,18 +18,14 @@ class MediaHandler:
67
18
  if extract_data.referer:
68
19
  self.headers["referer"] = extract_data.referer
69
20
 
21
+ # Özel Durumlar (RecTV vs. Googleusercontent)
22
+ if user_agent in ["googleusercontent", "Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"]:
23
+ return self.play_with_ytdlp(extract_data)
24
+
70
25
  # İşletim sistemine göre oynatıcı seç (Android durumu)
71
26
  if subprocess.check_output(['uname', '-o']).strip() == b'Android':
72
27
  return self.play_with_android_mxplayer(extract_data)
73
28
 
74
- # Akıllı yt-dlp tespiti
75
- if self.should_use_ytdlp(extract_data.url, user_agent):
76
- konsol.log("[green][✓] yt-dlp kullanılacak[/green]")
77
- success = self.play_with_ytdlp(extract_data)
78
- if success:
79
- return True
80
- konsol.log("[yellow][⚠] yt-dlp başarısız, standart oynatıcılar deneniyor...[/yellow]")
81
-
82
29
  # Oynatıcı öncelik sırası (fallback zincirleme)
83
30
  players = [
84
31
  ("MPV", self.play_with_mpv),
@@ -0,0 +1,109 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
4
+ import yt_dlp, sys, os
5
+
6
+ class YTDLP(ExtractorBase):
7
+ name = "yt-dlp"
8
+ main_url = "" # Universal - tüm siteleri destekler
9
+
10
+ def __init__(self):
11
+ pass
12
+
13
+ def can_handle_url(self, url: str) -> bool:
14
+ """
15
+ yt-dlp'nin bu URL'yi işleyip işleyemeyeceğini kontrol et
16
+ """
17
+ try:
18
+ # stderr'ı geçici olarak kapat (hata mesajlarını gizle)
19
+ old_stderr = sys.stderr
20
+ sys.stderr = open(os.devnull, "w")
21
+
22
+ try:
23
+ ydl_opts = {
24
+ "simulate" : True, # Download yok, sadece tespit
25
+ "quiet" : True, # Log kirliliği yok
26
+ "no_warnings" : True, # Uyarı mesajları yok
27
+ "extract_flat" : True, # Minimal işlem
28
+ "no_check_certificates" : True,
29
+ "ignoreerrors" : True # Hataları yoksay
30
+ }
31
+
32
+ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
33
+ # URL'yi işleyebiliyor mu kontrol et
34
+ info = ydl.extract_info(url, download=False, process=False)
35
+
36
+ # Generic extractor ise atla
37
+ if info and info.get("extractor_key") != "Generic":
38
+ return True
39
+
40
+ return False
41
+ finally:
42
+ # stderr'ı geri yükle
43
+ sys.stderr.close()
44
+ sys.stderr = old_stderr
45
+
46
+ except Exception:
47
+ # yt-dlp işleyemezse False döndür
48
+ return False
49
+
50
+ async def extract(self, url: str, referer: str | None = None) -> ExtractResult:
51
+ ydl_opts = {
52
+ "quiet" : True,
53
+ "no_warnings" : True,
54
+ "extract_flat" : False, # Tam bilgi al
55
+ "format" : "best", # En iyi kalite
56
+ "no_check_certificates" : True
57
+ }
58
+
59
+ # Referer varsa header olarak ekle
60
+ if referer:
61
+ ydl_opts["http_headers"] = {"Referer": referer}
62
+
63
+ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
64
+ info = ydl.extract_info(url, download=False)
65
+
66
+ if not info:
67
+ raise ValueError("yt-dlp video bilgisi döndürmedi")
68
+
69
+ # Video URL'sini al
70
+ video_url = info.get("url")
71
+ if not video_url:
72
+ # Bazen formatlar listesinde olabilir
73
+ formats = info.get("formats", [])
74
+ if formats:
75
+ video_url = formats[-1].get("url") # Son format (genellikle en iyi)
76
+
77
+ if not video_url:
78
+ raise ValueError("Video URL bulunamadı")
79
+
80
+ # Altyazıları çıkar
81
+ subtitles = []
82
+ if subtitle_data := info.get("subtitles"):
83
+ for lang, subs in subtitle_data.items():
84
+ for sub in subs:
85
+ if sub_url := sub.get("url"):
86
+ subtitles.append(
87
+ Subtitle(
88
+ name=f"{lang} ({sub.get('ext', 'unknown')})",
89
+ url=sub_url
90
+ )
91
+ )
92
+
93
+ # User-Agent al
94
+ user_agent = None
95
+ http_headers = info.get("http_headers", {})
96
+ if http_headers:
97
+ user_agent = http_headers.get("User-Agent")
98
+
99
+ return ExtractResult(
100
+ name = self.name,
101
+ url = video_url,
102
+ referer = referer or info.get("webpage_url"),
103
+ user_agent = user_agent,
104
+ subtitles = subtitles
105
+ )
106
+
107
+ async def close(self):
108
+ """yt-dlp için cleanup gerekmez"""
109
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 1.8.9
3
+ Version: 1.9.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
@@ -64,6 +64,7 @@ KekikStream/Extractors/VidMolyMe.py
64
64
  KekikStream/Extractors/VidMoxy.py
65
65
  KekikStream/Extractors/VidPapi.py
66
66
  KekikStream/Extractors/VideoSeyred.py
67
+ KekikStream/Extractors/YTDLP.py
67
68
  KekikStream/Extractors/YildizKisaFilm.py
68
69
  KekikStream/Plugins/DiziBox.py
69
70
  KekikStream/Plugins/DiziPal.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 1.8.9
3
+ Version: 1.9.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
@@ -6,7 +6,7 @@ from io import open
6
6
  setup(
7
7
  # ? Genel Bilgiler
8
8
  name = "KekikStream",
9
- version = "1.8.9",
9
+ version = "1.9.0",
10
10
  url = "https://github.com/keyiflerolsun/KekikStream",
11
11
  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 bıdı bıdı",
12
12
  keywords = ["KekikStream", "KekikAkademi", "keyiflerolsun"],
File without changes
File without changes
File without changes
File without changes