KekikStream 0.9.2__tar.gz → 1.0.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Media/MediaHandler.py +4 -0
  2. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/Shorten.py +8 -7
  3. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/__init__.py +123 -61
  4. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream.egg-info/PKG-INFO +1 -1
  5. {kekikstream-0.9.2 → kekikstream-1.0.0}/PKG-INFO +1 -1
  6. {kekikstream-0.9.2 → kekikstream-1.0.0}/setup.py +1 -1
  7. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/CLI/__init__.py +0 -0
  8. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/CLI/pypi_kontrol.py +0 -0
  9. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  10. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  11. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  12. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  13. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Media/MediaManager.py +0 -0
  14. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  15. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  16. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  17. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  18. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/UI/UIManager.py +0 -0
  19. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Core/__init__.py +0 -0
  20. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/CloseLoad.py +0 -0
  21. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/ContentX.py +0 -0
  22. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/FourCX.py +0 -0
  23. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/FourPichive.py +0 -0
  24. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/FourPlayRu.py +0 -0
  25. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/HDStreamAble.py +0 -0
  26. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/Hotlinger.py +0 -0
  27. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/MailRu.py +0 -0
  28. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/MixPlayHD.py +0 -0
  29. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  30. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  31. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/OkRuSSL.py +0 -0
  32. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  33. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/Pichive.py +0 -0
  34. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/PixelDrain.py +0 -0
  35. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/PlayRu.py +0 -0
  36. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/RapidVid.py +0 -0
  37. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/SibNet.py +0 -0
  38. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  39. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/TRsTX.py +0 -0
  40. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/TauVideo.py +0 -0
  41. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/TurboImgz.py +0 -0
  42. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/VidMoly.py +0 -0
  43. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/VidMoxy.py +0 -0
  44. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Extractors/VideoSeyred.py +0 -0
  45. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/DiziBox.py +0 -0
  46. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/DiziYou.py +0 -0
  47. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/Dizilla.py +0 -0
  48. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  49. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  50. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/JetFilmizle.py +0 -0
  51. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/RecTV.py +0 -0
  52. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  53. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/SineWix.py +0 -0
  54. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/Plugins/UgurFilm.py +0 -0
  55. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/__main__.py +0 -0
  56. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream/requirements.txt +0 -0
  57. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream.egg-info/SOURCES.txt +0 -0
  58. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream.egg-info/dependency_links.txt +0 -0
  59. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream.egg-info/entry_points.txt +0 -0
  60. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream.egg-info/requires.txt +0 -0
  61. {kekikstream-0.9.2 → kekikstream-1.0.0}/KekikStream.egg-info/top_level.txt +0 -0
  62. {kekikstream-0.9.2 → kekikstream-1.0.0}/LICENSE +0 -0
  63. {kekikstream-0.9.2 → kekikstream-1.0.0}/MANIFEST.in +0 -0
  64. {kekikstream-0.9.2 → kekikstream-1.0.0}/README.md +0 -0
  65. {kekikstream-0.9.2 → kekikstream-1.0.0}/setup.cfg +0 -0
@@ -14,6 +14,10 @@ class MediaHandler:
14
14
  self.title = title
15
15
 
16
16
  def play_media(self, extract_data: ExtractResult):
17
+ # Referer varsa headers'a ekle
18
+ if extract_data.referer:
19
+ self.headers.update({"Referer": extract_data.referer})
20
+
17
21
  # Google Drive gibi özel durumlar için yt-dlp kullan
18
22
  if self.headers.get("User-Agent") == "googleusercontent":
19
23
  return self.play_with_ytdlp(extract_data)
@@ -65,13 +65,13 @@ async def extract_next_f_push_data(source_code):
65
65
 
66
66
  class Shorten(PluginBase):
67
67
  name = "Shorten"
68
- main_url = "http://localhost:8080"
68
+ main_url = "https://shorten.com"
69
69
  token = None
70
70
 
71
71
  async def __giris(self):
72
- await self.oturum.get("https://shorten.com/tr", follow_redirects=True)
72
+ await self.oturum.get(f"{self.main_url}/tr", follow_redirects=True)
73
73
 
74
- self.token = await self.oturum.get("https://shorten.com/api/session")
74
+ self.token = await self.oturum.get(f"{self.main_url}/api/session")
75
75
  self.token = self.token.json().get("token")
76
76
 
77
77
  self.oturum.headers.update({"Authorization": f"Bearer {self.token}"})
@@ -94,7 +94,7 @@ class Shorten(PluginBase):
94
94
  if not self.token:
95
95
  await self.__giris()
96
96
 
97
- istek = await self.oturum.get(f"https://shorten.com/tr/series/{slug}", follow_redirects=True)
97
+ istek = await self.oturum.get(f"{self.main_url}/tr/series/{slug}", follow_redirects=True)
98
98
  veriler = await extract_next_f_push_data(istek.text)
99
99
  veriler = veriler["8"][-1]["children"][-2][-1]["children"][-1]["data"]
100
100
  return [
@@ -114,7 +114,7 @@ class Shorten(PluginBase):
114
114
  "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
115
115
  "Content-Type" : "application/json",
116
116
  "Origin" : "https://vod.byteplusapi.com",
117
- "Referer" : "https://shorten.com/",
117
+ "Referer" : f"{self.main_url}/",
118
118
  }
119
119
  )
120
120
 
@@ -128,7 +128,7 @@ class Shorten(PluginBase):
128
128
  raw_req = await self.raw_bolumler(slug)
129
129
  number, _hash = raw_req[0].values()
130
130
 
131
- istek = await self.oturum.get(f"https://shorten.com/tr/series/{slug}/episode-{number}-{_hash}", follow_redirects=True)
131
+ istek = await self.oturum.get(f"{self.main_url}/tr/series/{slug}/episode-{number}-{_hash}", follow_redirects=True)
132
132
  veriler = await extract_next_f_push_data(istek.text)
133
133
  veriler = veriler["b"][3]["children"][1][3]["children"][3]["children"][3]["children"][-1]
134
134
 
@@ -175,6 +175,7 @@ class Shorten(PluginBase):
175
175
  for episode in veri.get("episodes"):
176
176
  episode["name"] = veri["title"] + f" | {episode.get('number')}. Bölüm"
177
177
  episode["subtitles"] = [subtitle for subtitle in episode["subtitles"] if subtitle.get("code").lower() in ["tr", "en"]]
178
+ episode["subtitles"].reverse()
178
179
 
179
180
  ep_model = Episode(
180
181
  season = 1,
@@ -187,7 +188,7 @@ class Shorten(PluginBase):
187
188
  self._data[ep_model.url] = {
188
189
  "ext_name" : self.name,
189
190
  "name" : f"{ep_model.title}",
190
- "referer" : "https://shorten.com/tr",
191
+ "referer" : f"{self.main_url}/tr",
191
192
  "subtitles" : []
192
193
  }
193
194
 
@@ -7,19 +7,22 @@ from contextlib import suppress
7
7
 
8
8
  class KekikStream:
9
9
  def __init__(self):
10
- # Yönetici sınıflarını başlat
10
+ """
11
+ KekikStream sınıfı, eklenti, çıkarıcı, arayüz ve medya yönetimini yürütür.
12
+ """
11
13
  self.eklentiler_yonetici = PluginManager()
12
14
  self.cikaricilar_yonetici = ExtractorManager()
13
15
  self.arayuz_yonetici = UIManager()
14
16
  self.medya_yonetici = MediaManager()
15
17
  self.suanki_eklenti: PluginBase = None
16
18
  self.secilen_sonuc = None
19
+ self.dizi = False
17
20
 
18
21
  async def baslat(self):
19
- # Konsolu temizle ve başlık göster
20
- self.arayuz_yonetici.clear_console()
21
- konsol.rule("[bold cyan]KekikStream Başlatılıyor[/bold cyan]")
22
-
22
+ """
23
+ Uygulamayı başlatır: konsolu temizler, başlığı gösterir ve eklenti seçimiyle devam eder.
24
+ """
25
+ self._temizle_ve_baslik_goster("[bold cyan]KekikStream Başlatılıyor[/bold cyan]")
23
26
  # Eklenti kontrolü
24
27
  if not self.eklentiler_yonetici.get_plugin_names():
25
28
  return konsol.print("[bold red]Hiçbir eklenti bulunamadı![/bold red]")
@@ -30,8 +33,17 @@ class KekikStream:
30
33
  # Program kapanırken tüm eklentileri kapat
31
34
  await self.eklentiler_yonetici.close_plugins()
32
35
 
36
+ def _temizle_ve_baslik_goster(self, baslik: str):
37
+ """
38
+ Konsolu temizler ve verilen başlıkla bir kural (separator) gösterir.
39
+ """
40
+ self.arayuz_yonetici.clear_console()
41
+ konsol.rule(baslik)
42
+
33
43
  async def sonuc_bulunamadi(self):
34
- # Sonuç bulunamadığında kullanıcıya seçenekler sun
44
+ """
45
+ Arama sonucunda hiçbir içerik bulunamadığında kullanıcıya seçenekler sunar.
46
+ """
35
47
  secim = await self.arayuz_yonetici.select_from_list(
36
48
  message = "Ne yapmak istersiniz?",
37
49
  choices = ["Tüm Eklentilerde Ara", "Ana Menü", "Çıkış"]
@@ -46,7 +58,9 @@ class KekikStream:
46
58
  cikis_yap(False)
47
59
 
48
60
  async def eklenti_secimi(self):
49
- # Fuzzy ile eklenti seçimi yap
61
+ """
62
+ Kullanıcıdan eklenti seçimi alır ve seçime göre arama işlemini başlatır.
63
+ """
50
64
  eklenti_adi = await self.arayuz_yonetici.select_from_fuzzy(
51
65
  message = "Arama yapılacak eklentiyi seçin:",
52
66
  choices = ["Tüm Eklentilerde Ara", *self.eklentiler_yonetici.get_plugin_names()]
@@ -59,9 +73,10 @@ class KekikStream:
59
73
  await self.eklenti_ile_arama()
60
74
 
61
75
  async def eklenti_ile_arama(self):
62
- # Seçilen eklentide arama yap
63
- self.arayuz_yonetici.clear_console()
64
- konsol.rule(f"[bold cyan]{self.suanki_eklenti.name} Eklentisinde Arama Yapın[/bold cyan]")
76
+ """
77
+ Seçilen eklentiyle arama yapar; kullanıcıdan sorgu alır, sonuçları listeler ve seçim sonrası detayları gösterir.
78
+ """
79
+ self._temizle_ve_baslik_goster(f"[bold cyan]{self.suanki_eklenti.name} Eklentisinde Arama Yapın[/bold cyan]")
65
80
 
66
81
  # Kullanıcıdan sorgu al ve ara
67
82
  sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
@@ -71,21 +86,24 @@ class KekikStream:
71
86
  konsol.print("[bold red]Arama sonucu bulunamadı![/bold red]")
72
87
  return await self.sonuc_bulunamadi()
73
88
 
74
- if secilen_sonuc := await self.eklenti_sonuc_secimi(sonuclar):
89
+ secilen_sonuc = await self.eklenti_sonuc_secimi(sonuclar)
90
+ if secilen_sonuc:
75
91
  await self.sonuc_detaylari_goster({"plugin": self.suanki_eklenti.name, "url": secilen_sonuc})
76
92
 
77
- async def eklenti_sonuc_secimi(self, sonuclar):
78
- # Arama sonuçlarından birini seç
93
+ async def eklenti_sonuc_secimi(self, sonuclar: list):
94
+ """
95
+ Arama sonuçlarından kullanıcıya seçim yaptırır.
96
+ """
79
97
  return await self.arayuz_yonetici.select_from_fuzzy(
80
98
  message = "İçerik sonuçlarından birini seçin:",
81
99
  choices = [{"name": sonuc.title, "value": sonuc.url} for sonuc in sonuclar]
82
100
  )
83
101
 
84
102
  async def tum_eklentilerde_arama(self):
85
- # Tüm eklentilerde arama yap
86
- self.arayuz_yonetici.clear_console()
87
- konsol.rule("[bold cyan]Tüm Eklentilerde Arama Yapın[/bold cyan]")
88
-
103
+ """
104
+ Tüm eklentilerde arama yapar ve sonuçlara göre işlem yapar.
105
+ """
106
+ self._temizle_ve_baslik_goster("[bold cyan]Tüm Eklentilerde Arama Yapın[/bold cyan]")
89
107
  sorgu = await self.arayuz_yonetici.prompt_text("Arama sorgusu girin:")
90
108
  sonuclar = await self.tum_eklentilerde_arama_sorgula(sorgu)
91
109
 
@@ -95,11 +113,13 @@ class KekikStream:
95
113
  secilen_sonuc = await self.tum_sonuc_secimi(sonuclar)
96
114
 
97
115
  if secilen_sonuc:
98
- return await self.sonuc_detaylari_goster(secilen_sonuc)
116
+ await self.sonuc_detaylari_goster(secilen_sonuc)
99
117
 
100
118
  async def tum_eklentilerde_arama_sorgula(self, sorgu: str) -> list:
119
+ """
120
+ Tüm eklentilerde arama yapar ve bulunan sonuçları listeler.
121
+ """
101
122
  tum_sonuclar = []
102
-
103
123
  # Her eklentide arama yap
104
124
  for eklenti_adi, eklenti in self.eklentiler_yonetici.plugins.items():
105
125
  # Eklenti türü kontrolü
@@ -113,7 +133,15 @@ class KekikStream:
113
133
  if sonuclar:
114
134
  # Sonuçları listeye ekle
115
135
  tum_sonuclar.extend(
116
- [{"plugin": eklenti_adi, "title": sonuc.title, "url": sonuc.url, "poster": sonuc.poster} for sonuc in sonuclar]
136
+ [
137
+ {
138
+ "plugin" : eklenti_adi,
139
+ "title" : sonuc.title,
140
+ "url" : sonuc.url,
141
+ "poster" : sonuc.poster
142
+ }
143
+ for sonuc in sonuclar
144
+ ]
117
145
  )
118
146
  except Exception as hata:
119
147
  konsol.print(f"[bold red]{eklenti_adi} » hata oluştu: {hata}[/bold red]")
@@ -121,12 +149,12 @@ class KekikStream:
121
149
  if not tum_sonuclar:
122
150
  konsol.print("[bold red]Hiçbir sonuç bulunamadı![/bold red]")
123
151
  await self.sonuc_bulunamadi()
124
- return []
125
-
126
152
  return tum_sonuclar
127
153
 
128
- async def tum_sonuc_secimi(self, sonuclar):
129
- # Tüm sonuçlardan birini seç
154
+ async def tum_sonuc_secimi(self, sonuclar: list):
155
+ """
156
+ Tüm arama sonuçlarından kullanıcıya seçim yaptırır.
157
+ """
130
158
  secenekler = [
131
159
  {"name": f"[{sonuc['plugin']}]".ljust(21) + f" » {sonuc['title']}", "value": sonuc}
132
160
  for sonuc in sonuclar
@@ -137,7 +165,21 @@ class KekikStream:
137
165
  choices = secenekler
138
166
  )
139
167
 
168
+ async def _medya_bilgisi_yukle(self, url: str, deneme: int = 3):
169
+ """
170
+ Belirtilen URL için medya bilgilerini, belirlenen deneme sayısı kadar yüklemeye çalışır.
171
+ """
172
+ for _ in range(deneme):
173
+ with suppress(Exception):
174
+ return await self.suanki_eklenti.load_item(url)
175
+
176
+ konsol.print("[bold red]Medya bilgileri yüklenemedi![/bold red]")
177
+ return None
178
+
140
179
  async def sonuc_detaylari_goster(self, secilen_sonuc):
180
+ """
181
+ Seçilen sonucun detaylarını gösterir; medya bilgilerini yükler, dizi ise bölüm seçimi sağlar.
182
+ """
141
183
  self.secilen_sonuc = secilen_sonuc
142
184
  try:
143
185
  # Seçilen sonucun detaylarını al
@@ -149,41 +191,45 @@ class KekikStream:
149
191
  else:
150
192
  url = secilen_sonuc
151
193
 
152
- # Medya bilgilerini yükle (3 deneme hakkı)
153
- medya_bilgi = None
154
- for _ in range(3):
155
- with suppress(Exception):
156
- medya_bilgi = await self.suanki_eklenti.load_item(url)
157
- break
158
- if not medya_bilgi:
159
- konsol.print("[bold red]Medya bilgileri yüklenemedi![/bold red]")
160
- return await self.sonuc_bulunamadi()
194
+ medya_bilgi = await self._medya_bilgisi_yukle(url)
195
+ if not medya_bilgi:
196
+ return await self.sonuc_bulunamadi()
161
197
 
162
198
  except Exception as hata:
163
199
  konsol.log(secilen_sonuc)
164
200
  return hata_yakala(hata)
165
201
 
166
- # Medya başlığını ayarla ve bilgileri göster
202
+ # Medya bilgilerini göster ve başlığı ayarla
167
203
  self.medya_yonetici.set_title(f"{self.suanki_eklenti.name} | {medya_bilgi.title}")
168
204
  self.arayuz_yonetici.display_media_info(f"{self.suanki_eklenti.name} | {medya_bilgi.title}", medya_bilgi)
169
205
 
170
- # Dizi ise bölüm seçimi yap
206
+ # Eğer medya bilgisi dizi ise bölüm seçimi yapılır
171
207
  if isinstance(medya_bilgi, SeriesInfo):
172
- secilen_bolum = await self.arayuz_yonetici.select_from_fuzzy(
173
- message = "İzlemek istediğiniz bölümü seçin:",
174
- choices = [
175
- {"name": f"{bolum.season}. Sezon {bolum.episode}. Bölüm{f' - {bolum.title}' if bolum.title else ''}", "value": bolum.url}
176
- for bolum in medya_bilgi.episodes
177
- ]
178
- )
179
- if secilen_bolum:
180
- baglantilar = await self.suanki_eklenti.load_links(secilen_bolum)
181
- await self.baglanti_secenekleri_goster(baglantilar)
208
+ self.dizi = True
209
+ await self.dizi_bolum_secimi(medya_bilgi)
182
210
  else:
183
211
  baglantilar = await self.suanki_eklenti.load_links(medya_bilgi.url)
184
212
  await self.baglanti_secenekleri_goster(baglantilar)
185
213
 
214
+ async def dizi_bolum_secimi(self, medya_bilgi: SeriesInfo):
215
+ """
216
+ Dizi içeriği için bölüm seçimi yapar ve seçilen bölümün bağlantılarını yükler.
217
+ """
218
+ secilen_bolum = await self.arayuz_yonetici.select_from_fuzzy(
219
+ message = "İzlemek istediğiniz bölümü seçin:",
220
+ choices = [
221
+ {"name": f"{bolum.season}. Sezon {bolum.episode}. Bölüm" + (f" - {bolum.title}" if bolum.title else ""), "value": bolum.url}
222
+ for bolum in medya_bilgi.episodes
223
+ ]
224
+ )
225
+ if secilen_bolum:
226
+ baglantilar = await self.suanki_eklenti.load_links(secilen_bolum)
227
+ await self.baglanti_secenekleri_goster(baglantilar)
228
+
186
229
  async def baglanti_secenekleri_goster(self, baglantilar):
230
+ """
231
+ Bağlantı seçeneklerini kullanıcıya sunar ve seçilen bağlantıya göre oynatma işlemini gerçekleştirir.
232
+ """
187
233
  if not baglantilar:
188
234
  konsol.print("[bold red]Hiçbir bağlantı bulunamadı![/bold red]")
189
235
  return await self.sonuc_bulunamadi()
@@ -202,16 +248,7 @@ class KekikStream:
202
248
 
203
249
  # Doğrudan oynatma seçeneği
204
250
  if not haritalama:
205
- secilen_link = await self.arayuz_yonetici.select_from_list(
206
- message = "Doğrudan oynatmak için bir bağlantı seçin:",
207
- choices = [{"name": value["ext_name"], "value": key} for key, value in self.suanki_eklenti._data.items() if key in baglantilar]
208
- )
209
- if secilen_link:
210
- await self.medya_oynat(secilen_link)
211
-
212
- self.arayuz_yonetici.clear_console()
213
- konsol.rule(f"[bold cyan]{self.suanki_eklenti.name} » Bi Bölüm Daha?[/bold cyan]")
214
- return await self.sonuc_detaylari_goster(self.secilen_sonuc)
251
+ return await self.direkt_oynat(baglantilar)
215
252
 
216
253
  # Kullanıcı seçenekleri
217
254
  secim = await self.arayuz_yonetici.select_from_list(
@@ -234,16 +271,39 @@ class KekikStream:
234
271
  case _:
235
272
  await self.baslat()
236
273
 
237
- async def medya_oynat(self, secilen_link):
238
- # Eklentinin kendi oynatıcısı varsa onu kullan
274
+ async def direkt_oynat(self, baglantilar):
275
+ """
276
+ Extractor eşleşmesi yoksa, doğrudan oynatma seçeneği sunar.
277
+ """
278
+ secilen_link = await self.arayuz_yonetici.select_from_list(
279
+ message = "Doğrudan oynatmak için bir bağlantı seçin:",
280
+ choices = [
281
+ {"name": value["ext_name"], "value": key}
282
+ for key, value in self.suanki_eklenti._data.items() if key in baglantilar
283
+ ]
284
+ )
285
+ if secilen_link:
286
+ await self.medya_oynat(secilen_link)
287
+
288
+ async def bi_bolum_daha(self):
289
+ self._temizle_ve_baslik_goster(f"[bold cyan]{self.suanki_eklenti.name} » Bi Bölüm Daha?[/bold cyan]")
290
+ return await self.sonuc_detaylari_goster(self.secilen_sonuc)
291
+
292
+ async def medya_oynat(self, secilen_link: str):
293
+ """
294
+ Seçilen bağlantıya göre medya oynatma işlemini gerçekleştirir.
295
+ """
239
296
  if hasattr(self.suanki_eklenti, "play") and callable(self.suanki_eklenti.play):
240
297
  konsol.log(f"[yellow][»] Oynatılıyor : {secilen_link}")
241
- return await self.suanki_eklenti.play(
242
- name = self.suanki_eklenti._data[secilen_link]["name"],
298
+ data = self.suanki_eklenti._data.get(secilen_link, {})
299
+
300
+ await self.suanki_eklenti.play(
301
+ name = data.get("name"),
243
302
  url = secilen_link,
244
- referer = self.suanki_eklenti._data[secilen_link]["referer"],
245
- subtitles = self.suanki_eklenti._data[secilen_link]["subtitles"]
303
+ referer = data.get("referer"),
304
+ subtitles = data.get("subtitles")
246
305
  )
306
+ return await self.bi_bolum_daha() if self.dizi else await self.baslat()
247
307
 
248
308
  # Uygun çıkarıcıyı bul
249
309
  cikarici: ExtractorBase = self.cikaricilar_yonetici.find_extractor(secilen_link)
@@ -275,6 +335,8 @@ class KekikStream:
275
335
  self.medya_yonetici.set_headers({"Referer": secilen_data.referer})
276
336
  konsol.log(f"[yellow][»] Oynatılıyor : {secilen_data.url}")
277
337
  self.medya_yonetici.play_media(secilen_data)
338
+
339
+ await self.bi_bolum_daha() if self.dizi else await self.baslat()
278
340
 
279
341
  def basla():
280
342
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 0.9.2
3
+ Version: 1.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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 0.9.2
3
+ Version: 1.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
@@ -6,7 +6,7 @@ from io import open
6
6
  setup(
7
7
  # ? Genel Bilgiler
8
8
  name = "KekikStream",
9
- version = "0.9.2",
9
+ version = "1.0.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