KekikStream 1.8.5__tar.gz → 1.8.9__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 (94) hide show
  1. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Media/MediaHandler.py +87 -12
  2. kekikstream-1.8.9/KekikStream.egg-info/PKG-INFO +290 -0
  3. kekikstream-1.8.9/PKG-INFO +290 -0
  4. kekikstream-1.8.9/README.md +253 -0
  5. {kekikstream-1.8.5 → kekikstream-1.8.9}/setup.py +1 -1
  6. kekikstream-1.8.5/KekikStream.egg-info/PKG-INFO +0 -109
  7. kekikstream-1.8.5/PKG-INFO +0 -109
  8. kekikstream-1.8.5/README.md +0 -72
  9. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/CLI/__init__.py +0 -0
  10. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/CLI/pypi_kontrol.py +0 -0
  11. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  12. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  13. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  14. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  15. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Media/MediaManager.py +0 -0
  16. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  17. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  18. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  19. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  20. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/UI/UIManager.py +0 -0
  21. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Core/__init__.py +0 -0
  22. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/CloseLoad.py +0 -0
  23. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/ContentX.py +0 -0
  24. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/DzenRu.py +0 -0
  25. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/ExPlay.py +0 -0
  26. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FirePlayer.py +0 -0
  27. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FourCX.py +0 -0
  28. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FourPichive.py +0 -0
  29. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/FourPlayRu.py +0 -0
  30. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  31. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/HDStreamAble.py +0 -0
  32. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Hotlinger.py +0 -0
  33. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/JetTv.py +0 -0
  34. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MailRu.py +0 -0
  35. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MixPlayHD.py +0 -0
  36. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MixTiger.py +0 -0
  37. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/MolyStream.py +0 -0
  38. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  39. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  40. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/OkRuSSL.py +0 -0
  41. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  42. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Pichive.py +0 -0
  43. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PixelDrain.py +0 -0
  44. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PlayRu.py +0 -0
  45. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  46. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/RapidVid.py +0 -0
  47. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/SetPlay.py +0 -0
  48. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/SetPrime.py +0 -0
  49. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/SibNet.py +0 -0
  50. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  51. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TRsTX.py +0 -0
  52. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TauVideo.py +0 -0
  53. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TurboImgz.py +0 -0
  54. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  55. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidHide.py +0 -0
  56. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidMoly.py +0 -0
  57. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidMolyMe.py +0 -0
  58. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidMoxy.py +0 -0
  59. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VidPapi.py +0 -0
  60. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/VideoSeyred.py +0 -0
  61. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  62. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/DiziBox.py +0 -0
  63. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/DiziPal.py +0 -0
  64. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/DiziYou.py +0 -0
  65. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/Dizilla.py +0 -0
  66. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FilmBip.py +0 -0
  67. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  68. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FilmModu.py +0 -0
  69. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FullHDFilm.py +0 -0
  70. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  71. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  72. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/JetFilmizle.py +0 -0
  73. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/KultFilmler.py +0 -0
  74. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/RecTV.py +0 -0
  75. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/RoketDizi.py +0 -0
  76. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SelcukFlix.py +0 -0
  77. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  78. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SineWix.py +0 -0
  79. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/Sinefy.py +0 -0
  80. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SinemaCX.py +0 -0
  81. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/Sinezy.py +0 -0
  82. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  83. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/Plugins/UgurFilm.py +0 -0
  84. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/__init__.py +0 -0
  85. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/__main__.py +0 -0
  86. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream/requirements.txt +0 -0
  87. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/SOURCES.txt +0 -0
  88. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/dependency_links.txt +0 -0
  89. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/entry_points.txt +0 -0
  90. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/requires.txt +0 -0
  91. {kekikstream-1.8.5 → kekikstream-1.8.9}/KekikStream.egg-info/top_level.txt +0 -0
  92. {kekikstream-1.8.5 → kekikstream-1.8.9}/LICENSE +0 -0
  93. {kekikstream-1.8.5 → kekikstream-1.8.9}/MANIFEST.in +0 -0
  94. {kekikstream-1.8.5 → kekikstream-1.8.9}/setup.cfg +0 -0
@@ -2,13 +2,62 @@
2
2
 
3
3
  from ...CLI import konsol
4
4
  from ..Extractor.ExtractorModels import ExtractResult
5
- import subprocess, os
5
+ import subprocess, os, yt_dlp
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
+
12
61
  def play_media(self, extract_data: ExtractResult):
13
62
  # user-agent ekle (varsayılan veya extract_data'dan)
14
63
  user_agent = extract_data.user_agent or "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"
@@ -18,19 +67,38 @@ class MediaHandler:
18
67
  if extract_data.referer:
19
68
  self.headers["referer"] = extract_data.referer
20
69
 
21
- # Google Drive gibi özel durumlar için yt-dlp kullan
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
-
25
- # İşletim sistemine göre oynatıcı seç
70
+ # İşletim sistemine göre oynatıcı seç (Android durumu)
26
71
  if subprocess.check_output(['uname', '-o']).strip() == b'Android':
27
72
  return self.play_with_android_mxplayer(extract_data)
28
73
 
29
- # Alt yazılar varsa mpv kullan
30
- if extract_data.subtitles:
31
- return self.play_with_mpv(extract_data)
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
+ # Oynatıcı öncelik sırası (fallback zincirleme)
83
+ players = [
84
+ ("MPV", self.play_with_mpv),
85
+ ("VLC", self.play_with_vlc),
86
+ ("yt-dlp", self.play_with_ytdlp)
87
+ ]
88
+
89
+ # Fallback zincirleme
90
+ for player_name, player_func in players:
91
+ try:
92
+ result = player_func(extract_data)
93
+ if result or result is None: # None = MPV (exception yok)
94
+ konsol.log(f"[green][✓] {player_name} ile başarılı[/green]")
95
+ return True
96
+ except Exception as e:
97
+ konsol.log(f"[yellow][⚠] {player_name} hatası: {e}[/yellow]")
98
+ continue
32
99
 
33
- return self.play_with_vlc(extract_data) or self.play_with_mpv(extract_data)
100
+ konsol.print("[red][✗] Hiçbir oynatıcı çalışmadı![/red]")
101
+ return False
34
102
 
35
103
  def play_with_vlc(self, extract_data: ExtractResult):
36
104
  konsol.log(f"[yellow][»] VLC ile Oynatılıyor : {extract_data.url}")
@@ -88,12 +156,15 @@ class MediaHandler:
88
156
  with open(os.devnull, "w") as devnull:
89
157
  subprocess.run(mpv_command, stdout=devnull, stderr=devnull, check=True)
90
158
 
159
+ return True
91
160
  except subprocess.CalledProcessError as hata:
92
161
  konsol.print(f"[red]mpv oynatma hatası: {hata}[/red]")
93
162
  konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
163
+ return False
94
164
  except FileNotFoundError:
95
165
  konsol.print("[red]mpv bulunamadı! mpv kurulu olduğundan emin olun.[/red]")
96
166
  konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
167
+ return False
97
168
 
98
169
  def play_with_ytdlp(self, extract_data: ExtractResult):
99
170
  konsol.log(f"[yellow][»] yt-dlp ile Oynatılıyor : {extract_data.url}")
@@ -121,12 +192,15 @@ class MediaHandler:
121
192
  with subprocess.Popen(ytdlp_command, stdout=subprocess.PIPE) as ytdlp_proc:
122
193
  subprocess.run(mpv_command, stdin=ytdlp_proc.stdout, check=True)
123
194
 
195
+ return True
124
196
  except subprocess.CalledProcessError as hata:
125
197
  konsol.print(f"[red]Oynatma hatası: {hata}[/red]")
126
198
  konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
199
+ return False
127
200
  except FileNotFoundError:
128
201
  konsol.print("[red]yt-dlp veya mpv bulunamadı! Kurulumlarından emin olun.[/red]")
129
202
  konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
203
+ return False
130
204
 
131
205
  def play_with_android_mxplayer(self, extract_data: ExtractResult):
132
206
  konsol.log(f"[yellow][»] MxPlayer ile Oynatılıyor : {extract_data.url}")
@@ -151,11 +225,12 @@ class MediaHandler:
151
225
  with open(os.devnull, "w") as devnull:
152
226
  subprocess.run(android_command, stdout=devnull, stderr=devnull, check=True)
153
227
 
154
- return
155
-
228
+ return True
156
229
  except subprocess.CalledProcessError as hata:
157
230
  konsol.print(f"[red]{paket} oynatma hatası: {hata}[/red]")
158
231
  konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
232
+ return False
159
233
  except FileNotFoundError:
160
234
  konsol.print(f"Paket: {paket}, Hata: MX Player kurulu değil")
161
235
  konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
236
+ return False
@@ -0,0 +1,290 @@
1
+ Metadata-Version: 2.4
2
+ Name: KekikStream
3
+ Version: 1.8.9
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
+ Home-page: https://github.com/keyiflerolsun/KekikStream
6
+ Author: keyiflerolsun
7
+ Author-email: keyiflerolsun@gmail.com
8
+ License: GPLv3+
9
+ Keywords: KekikStream,KekikAkademi,keyiflerolsun
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: >=3.11
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: setuptools
17
+ Requires-Dist: wheel
18
+ Requires-Dist: Kekik
19
+ Requires-Dist: httpx
20
+ Requires-Dist: cloudscraper
21
+ Requires-Dist: parsel
22
+ Requires-Dist: pydantic
23
+ Requires-Dist: InquirerPy
24
+ Requires-Dist: yt-dlp
25
+ Dynamic: author
26
+ Dynamic: author-email
27
+ Dynamic: classifier
28
+ Dynamic: description
29
+ Dynamic: description-content-type
30
+ Dynamic: home-page
31
+ Dynamic: keywords
32
+ Dynamic: license
33
+ Dynamic: license-file
34
+ Dynamic: requires-dist
35
+ Dynamic: requires-python
36
+ Dynamic: summary
37
+
38
+ # <img src="https://github.com/keyiflerolsun/KekikStream/raw/master/.github/icons/KekikStream.png?raw=True" height="32" align="center"> KekikStream
39
+
40
+ [![Boyut](https://img.shields.io/github/repo-size/keyiflerolsun/KekikStream?logo=git&logoColor=white&label=Boyut)](#)
41
+ [![Görüntülenme](https://visitor-badge.laobi.icu/badge?page_id=keyiflerolsun/KekikStream&title=Görüntülenme)](#)
42
+ <a href="https://KekikAkademi.org/Kahve" target="_blank"><img src="https://img.shields.io/badge/☕️-Kahve Ismarla-ffdd00" title="☕️ Kahve Ismarla" style="padding-left:5px;"></a>
43
+
44
+ [![PyPI](https://img.shields.io/pypi/v/KekikStream?logo=pypi&logoColor=white&label=PyPI)](https://pypi.org/project/KekikStream)
45
+ [![PyPI - Yüklenme](https://img.shields.io/pypi/dm/KekikStream?logo=pypi&logoColor=white&label=Yüklenme)](https://pypi.org/project/KekikStream)
46
+ [![PyPI - Wheel](https://img.shields.io/pypi/wheel/KekikStream?logo=pypi&logoColor=white&label=Wheel)](https://pypi.org/project/KekikStream)
47
+
48
+ [![Python Version](https://img.shields.io/pypi/pyversions/KekikStream?logo=python&logoColor=white&label=Python)](#)
49
+ [![Lisans](https://img.shields.io/pypi/l/KekikStream?logo=gnu&logoColor=white&label=Lisans)](#)
50
+ [![Durum](https://img.shields.io/pypi/status/KekikStream?logo=windowsterminal&logoColor=white&label=Durum)](#)
51
+
52
+ [![PyPI Yükle](https://github.com/keyiflerolsun/KekikStream/actions/workflows/pypiYukle.yml/badge.svg)](https://github.com/keyiflerolsun/KekikStream/actions/workflows/pypiYukle.yml)
53
+
54
+ **Modüler ve genişletilebilir medya streaming kütüphanesi**
55
+ Terminal üzerinden içerik arayın, VLC/MPV ile doğrudan izleyin veya kendi API’nizi kurun. 🚀
56
+
57
+ [![Video](https://github.com/user-attachments/assets/63d31bb0-0b69-40b4-84aa-66623f2a253f)](https://github.com/user-attachments/assets/63d31bb0-0b69-40b4-84aa-66623f2a253f)
58
+
59
+ [![ForTheBadge made-with-python](https://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/)
60
+ [![ForTheBadge built-with-love](https://ForTheBadge.com/images/badges/built-with-love.svg)](https://GitHub.com/keyiflerolsun/)
61
+
62
+ ---
63
+
64
+ ## 🚦 Ne Sunar?
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 [KekikStreamAPI](https://github.com/keyiflerolsun/KekikStreamAPI) ile web/API üzerinden yayın yapmak kolaydır.
67
+
68
+ - 🎥 Çoklu kaynak desteği: Onlarca Türkçe medya sitesi
69
+ - 🔌 Plugin mimarisi: Yeni kaynak eklemek dakikalar sürer
70
+ - 🎬 Çoklu oynatıcı: VLC, MPV, MX Player
71
+ - 🖥️ CLI & kütüphane: Terminalde veya kod içinde kullanın
72
+ - 🌐 API/Web UI: KekikStreamAPI üzerinden uzak erişim
73
+
74
+ ---
75
+
76
+ ## 🚀 Hızlı Başlangıç
77
+
78
+ > Gereksinimler: Python 3.11+, sistemde VLC veya MPV kurulu olmalı (Android için MX Player + ADB).
79
+
80
+ ```bash
81
+ # Kurulum
82
+ pip install KekikStream
83
+
84
+ # Güncelleme
85
+ pip install -U KekikStream
86
+ ```
87
+
88
+ ### Temel Kullanım
89
+
90
+ **CLI:**
91
+ ```bash
92
+ KekikStream
93
+ ```
94
+
95
+ **Kütüphane (örnek arama):**
96
+ ```python
97
+ from KekikStream import Manager
98
+ results = Manager().search("vikings")
99
+ print(results[0].title)
100
+ ```
101
+
102
+ ---
103
+
104
+ ## ✨ Özellikler
105
+
106
+ ### 🔌 Plugin Sistemi
107
+
108
+ KekikStream modüler bir plugin mimarisi kullanır; her medya kaynağı bağımsız bir plugin'dir.
109
+
110
+ **Mevcut Pluginler (örnek):** Dizilla, HDFilmCehennemi, Dizipal, Dizifon, RoketDizi, Sinefy, Moviesseed, FullHDFilmizlesene, HDBestMovies, SuperFilmGeldi, Sinezy ve daha fazlası.
111
+
112
+ **Plugin Geliştirme:**
113
+ ```python
114
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo
115
+
116
+ class MyPlugin(PluginBase):
117
+ name = "MyPlugin"
118
+ language = "en"
119
+ main_url = "https://example.com"
120
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
121
+ description = "MyPlugin description"
122
+
123
+ main_page = {
124
+ f"{main_url}/category/" : "Category Name"
125
+ }
126
+
127
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
128
+ return results
129
+
130
+ async def search(self, query: str) -> list[SearchResult]:
131
+ return results
132
+
133
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
134
+ return details
135
+
136
+ async def load_links(self, url: str) -> list[dict]:
137
+ return links
138
+ ```
139
+
140
+ ### 🎬 Oynatıcı Desteği
141
+
142
+ | Oynatıcı | Platform | Özellikler |
143
+ |----------|----------|------------|
144
+ | **VLC** | Desktop | Custom headers, subtitles, varsayılan |
145
+ | **MPV** | Desktop | Custom headers, subtitles |
146
+ | **MX Player** | Android | ADB üzerinden |
147
+
148
+ > Özel durumlar için (Google Drive vb.) arka planda otomatik olarak yt-dlp devreye girer.
149
+
150
+ ### 🔗 Extractor Sistemi
151
+
152
+ Vidmoly, Filemoon, Sibnet, Sendvid, Voe, Doodstream, Streamtape, Upstream, Dailymotion, JWPlayer ve birçok kaynaktan direkt streaming linki çıkarır.
153
+
154
+ ---
155
+
156
+ ## 🏗️ Mimari
157
+
158
+ ```mermaid
159
+ graph TB
160
+ CLI[🖥️ CLI Interface]
161
+ Manager[🔌 Plugin Manager]
162
+
163
+ subgraph Plugins
164
+ P1[📺 Dizilla]
165
+ P2[🎬 HDFilmCehennemi]
166
+ P3[🍿 Dizipal]
167
+ PN[... 20+ Plugin]
168
+ end
169
+
170
+ subgraph Extractors
171
+ E1[🔗 Vidmoly]
172
+ E2[🔗 Filemoon]
173
+ E3[🔗 Sibnet]
174
+ EN[... Extractors]
175
+ end
176
+
177
+ subgraph Players
178
+ VLC[🎥 VLC]
179
+ MPV[🎥 MPV]
180
+ MX[🎥 MX Player]
181
+ end
182
+
183
+ CLI --> Manager
184
+ Manager --> P1
185
+ Manager --> P2
186
+ Manager --> P3
187
+ Manager --> PN
188
+
189
+ %% Her plugin otomatik olarak ihtiyaç duyduğu extractor'ı kullanır
190
+ P1 -.-> E1
191
+ P1 -.-> E2
192
+ P1 -.-> E3
193
+
194
+ P2 -.-> E1
195
+ P2 -.-> E2
196
+ P2 -.-> E3
197
+
198
+ P3 -.-> E1
199
+ P3 -.-> E2
200
+ P3 -.-> E3
201
+
202
+ PN -.-> EN
203
+
204
+ E1 --> VLC
205
+ E2 --> VLC
206
+ E3 --> VLC
207
+ EN --> VLC
208
+
209
+ E1 --> MPV
210
+ E2 --> MPV
211
+ E3 --> MPV
212
+ EN --> MPV
213
+
214
+ E1 --> MX
215
+ E2 --> MX
216
+ E3 --> MX
217
+ EN --> MX
218
+ ```
219
+
220
+ ---
221
+
222
+ ## 🛠️ Geliştirme
223
+
224
+ ### Proje Yapısı
225
+
226
+ ```
227
+ KekikStream/
228
+ ├── KekikStream/
229
+ │ ├── Core/ # Temel sınıflar
230
+ │ ├── Libs/ # Yardımcı kütüphaneler
231
+ │ ├── Plugins/ # Medya kaynak pluginleri
232
+ │ ├── Extractors/ # Video extractorları
233
+ │ └── __init__.py # CLI entry point
234
+ ├── Tests/ # Örnek kullanım
235
+ └── requirements.txt
236
+ ```
237
+
238
+ ### Yeni Plugin Ekleme
239
+
240
+ 1. `KekikStream/Plugins/` altına yeni dosya oluşturun.
241
+ 2. `PluginBase` sınıfından türetin.
242
+ 3. `get_main_page`, `search`, `load_item`, `load_links` metodlarını implemente edin.
243
+ 4. Plugin'i test edin (örnek: `Tests/Single.py`).
244
+
245
+ ---
246
+
247
+ ## 📊 Performans
248
+
249
+ | Metrik | Değer |
250
+ |--------|-------|
251
+ | Plugin Sayısı | 20+ |
252
+ | Extractor Sayısı | 40+ |
253
+ | Desteklenen Platform | Desktop, Android |
254
+ | Async Arama | ✅ |
255
+ | Cache Desteği | ✅ |
256
+
257
+ ---
258
+
259
+ ## 🤝 Katkıda Bulunma
260
+
261
+ Projeyi geliştirmek için katkılarınızı bekliyoruz!
262
+
263
+ 1. Yeni plugin ekleyin
264
+ 2. Bug raporu açın
265
+ 3. Feature request gönderin
266
+ 4. Dokümantasyon iyileştirin
267
+
268
+ ### 🎁 Teşekkürler
269
+
270
+ - [DeoDorqnt387/aniwatch-tr](https://github.com/DeoDorqnt387/aniwatch-tr)
271
+
272
+ ### 💻 Genişletme Referansları
273
+
274
+ - [keyiflerolsun/Kekik-cloudstream](https://github.com/keyiflerolsun/Kekik-cloudstream)
275
+ - [keyiflerolsun/seyirTurk-Parser](https://github.com/keyiflerolsun/seyirTurk-Parser)
276
+
277
+ ## 🌐 Telif Hakkı ve Lisans
278
+
279
+ *Copyright (C) 2024 by* [keyiflerolsun](https://github.com/keyiflerolsun) ❤️️
280
+ [GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007](https://github.com/keyiflerolsun/KekikStream/blob/master/LICENSE) *Koşullarına göre lisanslanmıştır..*
281
+
282
+ ---
283
+
284
+ <p align="center">
285
+ Bu proje <a href="https://github.com/keyiflerolsun">@keyiflerolsun</a> tarafından <a href="https://t.me/KekikAkademi">@KekikAkademi</a> için geliştirilmiştir.
286
+ </p>
287
+
288
+ <p align="center">
289
+ <sub>⭐ Beğendiyseniz yıldız vermeyi unutmayın!</sub>
290
+ </p>