KekikStream 2.2.9__tar.gz → 2.3.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 (88) hide show
  1. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/FilmMakinesi.py +57 -2
  2. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/Sinefy.py +44 -33
  3. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream.egg-info/PKG-INFO +1 -1
  4. {kekikstream-2.2.9 → kekikstream-2.3.0}/PKG-INFO +1 -1
  5. {kekikstream-2.2.9 → kekikstream-2.3.0}/setup.py +1 -1
  6. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/CLI/__init__.py +0 -0
  7. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/CLI/pypi_kontrol.py +0 -0
  8. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  9. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  10. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  11. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  12. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  13. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Media/MediaHandler.py +0 -0
  14. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Media/MediaManager.py +0 -0
  15. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  16. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  17. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  18. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  19. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/UI/UIManager.py +0 -0
  20. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Core/__init__.py +0 -0
  21. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/CloseLoad.py +0 -0
  22. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/ContentX.py +0 -0
  23. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/DonilasPlay.py +0 -0
  24. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/DzenRu.py +0 -0
  25. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/ExPlay.py +0 -0
  26. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/Filemoon.py +0 -0
  27. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  28. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/JFVid.py +0 -0
  29. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/JetTv.py +0 -0
  30. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/MailRu.py +0 -0
  31. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/MixPlayHD.py +0 -0
  32. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/MixTiger.py +0 -0
  33. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/MolyStream.py +0 -0
  34. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  35. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  36. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/PixelDrain.py +0 -0
  37. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  38. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/RapidVid.py +0 -0
  39. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/SetPlay.py +0 -0
  40. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/SetPrime.py +0 -0
  41. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/SibNet.py +0 -0
  42. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  43. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/TRsTX.py +0 -0
  44. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/TauVideo.py +0 -0
  45. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/TurboImgz.py +0 -0
  46. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  47. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/VCTPlay.py +0 -0
  48. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/VidHide.py +0 -0
  49. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/VidMoly.py +0 -0
  50. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/VidMoxy.py +0 -0
  51. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/VidPapi.py +0 -0
  52. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/VideoSeyred.py +0 -0
  53. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/YTDLP.py +0 -0
  54. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  55. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/BelgeselX.py +0 -0
  56. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/DiziBox.py +0 -0
  57. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/DiziPal.py +0 -0
  58. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/DiziYou.py +0 -0
  59. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/Dizilla.py +0 -0
  60. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/FilmBip.py +0 -0
  61. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/FilmModu.py +0 -0
  62. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/FullHDFilm.py +0 -0
  63. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  64. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  65. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/JetFilmizle.py +0 -0
  66. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/KultFilmler.py +0 -0
  67. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/RecTV.py +0 -0
  68. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/RoketDizi.py +0 -0
  69. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/SelcukFlix.py +0 -0
  70. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/SetFilmIzle.py +0 -0
  71. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  72. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/SineWix.py +0 -0
  73. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/SinemaCX.py +0 -0
  74. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/Sinezy.py +0 -0
  75. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  76. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/Plugins/UgurFilm.py +0 -0
  77. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/__init__.py +0 -0
  78. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/__main__.py +0 -0
  79. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream/requirements.txt +0 -0
  80. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream.egg-info/SOURCES.txt +0 -0
  81. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream.egg-info/dependency_links.txt +0 -0
  82. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream.egg-info/entry_points.txt +0 -0
  83. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream.egg-info/requires.txt +0 -0
  84. {kekikstream-2.2.9 → kekikstream-2.3.0}/KekikStream.egg-info/top_level.txt +0 -0
  85. {kekikstream-2.2.9 → kekikstream-2.3.0}/LICENSE +0 -0
  86. {kekikstream-2.2.9 → kekikstream-2.3.0}/MANIFEST.in +0 -0
  87. {kekikstream-2.2.9 → kekikstream-2.3.0}/README.md +0 -0
  88. {kekikstream-2.2.9 → kekikstream-2.3.0}/setup.cfg +0 -0
@@ -1,7 +1,8 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult
4
4
  from selectolax.parser import HTMLParser
5
+ import re
5
6
 
6
7
  class FilmMakinesi(PluginBase):
7
8
  name = "FilmMakinesi"
@@ -81,7 +82,7 @@ class FilmMakinesi(PluginBase):
81
82
 
82
83
  return results
83
84
 
84
- async def load_item(self, url: str) -> MovieInfo:
85
+ async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
85
86
  istek = await self.httpx.get(url)
86
87
  secici = HTMLParser(istek.text)
87
88
 
@@ -115,6 +116,60 @@ class FilmMakinesi(PluginBase):
115
116
  if len(parts) > 1:
116
117
  duration = parts[1].strip()
117
118
 
119
+ # Dizi mi kontrol et - sezon/bölüm linkleri var mı?
120
+ episodes = []
121
+ all_links = secici.css("a[href]")
122
+ for link in all_links:
123
+ href = link.attrs.get("href", "")
124
+ match = re.search(r"/sezon-(\d+)/bolum-(\d+)", href)
125
+ if match:
126
+ season_no = int(match.group(1))
127
+ ep_no = int(match.group(2))
128
+
129
+ # Bölüm başlığını çıkar - text'ten gerçek ismi al
130
+ # Format: "22 Eylül 2014 / 44 dk /1. Sezon / 1. BölümPilot"
131
+ full_text = link.text(strip=True)
132
+ # "Bölüm" kelimesinden sonraki kısmı al
133
+ ep_title = ""
134
+ if "Bölüm" in full_text:
135
+ parts = full_text.split("Bölüm")
136
+ if len(parts) > 1:
137
+ ep_title = parts[-1].strip()
138
+
139
+ episodes.append(Episode(
140
+ season = season_no,
141
+ episode = ep_no,
142
+ title = ep_title,
143
+ url = self.fix_url(href)
144
+ ))
145
+
146
+ # Bölümler varsa SeriesInfo döndür
147
+ if episodes:
148
+ # Tekrar eden bölümleri kaldır
149
+ seen = set()
150
+ unique_episodes = []
151
+ for ep in episodes:
152
+ key = (ep.season, ep.episode)
153
+ if key not in seen:
154
+ seen.add(key)
155
+ unique_episodes.append(ep)
156
+
157
+ # Sırala
158
+ unique_episodes.sort(key=lambda x: (x.season or 0, x.episode or 0))
159
+
160
+ return SeriesInfo(
161
+ url = url,
162
+ poster = self.fix_url(poster) if poster else None,
163
+ title = self.clean_title(title),
164
+ description = description,
165
+ tags = tags,
166
+ rating = rating,
167
+ year = year,
168
+ actors = actors,
169
+ duration = duration,
170
+ episodes = unique_episodes
171
+ )
172
+
118
173
  return MovieInfo(
119
174
  url = url,
120
175
  poster = self.fix_url(poster) if poster else None,
@@ -175,49 +175,60 @@ class Sinefy(PluginBase):
175
175
  year = year_el.text(strip=True) if year_el else None
176
176
 
177
177
  episodes = []
178
- season_elements = sel.css("section.episodes-box")
178
+ episodes_box = sel.css_first("section.episodes-box")
179
179
 
180
- if season_elements:
181
- # Get season links
182
- season_links = []
183
- menu = sel.css("div.ui.vertical.fluid.tabular.menu a")
184
- for link in menu:
185
- href = link.attrs.get("href")
186
- if href:
187
- season_links.append(self.fix_url(href))
180
+ if episodes_box:
181
+ # Sezon menüsünden sezon linklerini al
182
+ season_menu = episodes_box.css("div.ui.vertical.fluid.tabular.menu a.item")
188
183
 
189
- for s_url in season_links:
190
- target_url = s_url if "/bolum-" in s_url else f"{s_url}/bolum-1"
191
-
192
- try:
193
- s_resp = await self.httpx.get(target_url)
194
- s_sel = HTMLParser(s_resp.text)
195
- ep_links = s_sel.css("div.ui.list.celled a.item")
184
+ # Sezon tab içeriklerini al
185
+ season_tabs = episodes_box.css("div.ui.tab")
186
+
187
+ # Eğer birden fazla sezon varsa, her sezon tab'ından bölümleri çek
188
+ if season_tabs:
189
+ for idx, season_tab in enumerate(season_tabs):
190
+ # Sezon numarasını belirle
191
+ current_season_no = idx + 1
192
+
193
+ # Menüden sezon numarasını almaya çalış
194
+ if idx < len(season_menu):
195
+ menu_href = season_menu[idx].attrs.get("href", "")
196
+ match = re.search(r"sezon-(\d+)", menu_href)
197
+ if match:
198
+ current_season_no = int(match.group(1))
196
199
 
197
- current_season_no = 1
198
- match = re.search(r"sezon-(\d+)", target_url)
199
- if match:
200
- current_season_no = int(match.group(1))
200
+ # Bu sezon tab'ından bölüm linklerini çek
201
+ ep_links = season_tab.css("a[href*='bolum']")
201
202
 
203
+ seen_urls = set()
202
204
  for ep_link in ep_links:
203
205
  href = ep_link.attrs.get("href")
204
- name_el = ep_link.css_first("div.content div.header")
205
- name = name_el.text(strip=True) if name_el else ""
206
+ if not href or href in seen_urls:
207
+ continue
208
+ seen_urls.add(href)
206
209
 
207
- if href:
208
- ep_no = 0
209
- match_ep = re.search(r"bolum-(\d+)", href)
210
- if match_ep:
211
- ep_no = int(match_ep.group(1))
212
-
210
+ # Bölüm numarasını URL'den çıkar
211
+ ep_no = 0
212
+ match_ep = re.search(r"bolum-(\d+)", href)
213
+ if match_ep:
214
+ ep_no = int(match_ep.group(1))
215
+
216
+ # Bölüm başlığını çıkar (önce title attribute, sonra text)
217
+ name = ep_link.attrs.get("title", "")
218
+ if not name:
219
+ name_el = ep_link.css_first("div.content div.header")
220
+ if name_el:
221
+ name = name_el.text(strip=True)
222
+ else:
223
+ name = ep_link.text(strip=True)
224
+
225
+ if href and ep_no > 0:
213
226
  episodes.append(Episode(
214
- season = current_season_no,
227
+ season = current_season_no,
215
228
  episode = ep_no,
216
- title = name,
217
- url = self.fix_url(href)
229
+ title = name.strip() if name else f"{ep_no}. Bölüm",
230
+ url = self.fix_url(href)
218
231
  ))
219
- except Exception:
220
- pass
221
232
 
222
233
  if episodes:
223
234
  return SeriesInfo(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 2.2.9
3
+ Version: 2.3.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.4
2
2
  Name: KekikStream
3
- Version: 2.2.9
3
+ Version: 2.3.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 = "2.2.9",
9
+ version = "2.3.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