KekikStream 1.9.4__tar.gz → 1.9.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 (92) hide show
  1. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorBase.py +1 -0
  2. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorManager.py +5 -0
  3. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginBase.py +1 -0
  4. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/JetTv.py +1 -1
  5. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PlayerFilmIzle.py +3 -3
  6. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/RoketDizi.py +97 -84
  7. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SinemaCX.py +1 -1
  8. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/PKG-INFO +1 -1
  9. {kekikstream-1.9.4 → kekikstream-1.9.9}/PKG-INFO +1 -1
  10. {kekikstream-1.9.4 → kekikstream-1.9.9}/setup.py +1 -1
  11. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/CLI/__init__.py +0 -0
  12. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/CLI/pypi_kontrol.py +0 -0
  13. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  14. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  15. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Media/MediaHandler.py +0 -0
  16. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Media/MediaManager.py +0 -0
  17. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  18. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  19. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  20. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/UI/UIManager.py +0 -0
  21. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/__init__.py +0 -0
  22. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/CloseLoad.py +0 -0
  23. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/ContentX.py +0 -0
  24. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/DzenRu.py +0 -0
  25. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/ExPlay.py +0 -0
  26. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FirePlayer.py +0 -0
  27. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FourCX.py +0 -0
  28. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FourPichive.py +0 -0
  29. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FourPlayRu.py +0 -0
  30. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  31. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/HDStreamAble.py +0 -0
  32. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Hotlinger.py +0 -0
  33. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MailRu.py +0 -0
  34. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MixPlayHD.py +0 -0
  35. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MixTiger.py +0 -0
  36. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MolyStream.py +0 -0
  37. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  38. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  39. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/OkRuSSL.py +0 -0
  40. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  41. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Pichive.py +0 -0
  42. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PixelDrain.py +0 -0
  43. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PlayRu.py +0 -0
  44. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/RapidVid.py +0 -0
  45. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/SetPlay.py +0 -0
  46. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/SetPrime.py +0 -0
  47. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/SibNet.py +0 -0
  48. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  49. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TRsTX.py +0 -0
  50. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TauVideo.py +0 -0
  51. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TurboImgz.py +0 -0
  52. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  53. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidHide.py +0 -0
  54. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidMoly.py +0 -0
  55. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidMolyMe.py +0 -0
  56. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidMoxy.py +0 -0
  57. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidPapi.py +0 -0
  58. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VideoSeyred.py +0 -0
  59. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/YTDLP.py +0 -0
  60. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  61. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/DiziBox.py +0 -0
  62. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/DiziPal.py +0 -0
  63. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/DiziYou.py +0 -0
  64. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/Dizilla.py +0 -0
  65. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FilmBip.py +0 -0
  66. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  67. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FilmModu.py +0 -0
  68. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FullHDFilm.py +0 -0
  69. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  70. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  71. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/JetFilmizle.py +0 -0
  72. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/KultFilmler.py +0 -0
  73. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/RecTV.py +0 -0
  74. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SelcukFlix.py +0 -0
  75. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  76. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SineWix.py +0 -0
  77. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/Sinefy.py +0 -0
  78. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/Sinezy.py +0 -0
  79. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  80. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/UgurFilm.py +0 -0
  81. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/__init__.py +0 -0
  82. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/__main__.py +0 -0
  83. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/requirements.txt +0 -0
  84. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/SOURCES.txt +0 -0
  85. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/dependency_links.txt +0 -0
  86. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/entry_points.txt +0 -0
  87. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/requires.txt +0 -0
  88. {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/top_level.txt +0 -0
  89. {kekikstream-1.9.4 → kekikstream-1.9.9}/LICENSE +0 -0
  90. {kekikstream-1.9.4 → kekikstream-1.9.9}/MANIFEST.in +0 -0
  91. {kekikstream-1.9.4 → kekikstream-1.9.9}/README.md +0 -0
  92. {kekikstream-1.9.4 → kekikstream-1.9.9}/setup.cfg +0 -0
@@ -23,6 +23,7 @@ class ExtractorBase(ABC):
23
23
  )
24
24
  self.httpx.headers.update(self.cloudscraper.headers)
25
25
  self.httpx.cookies.update(self.cloudscraper.cookies)
26
+ self.httpx.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
26
27
 
27
28
  def can_handle_url(self, url: str) -> bool:
28
29
  # URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
@@ -47,7 +47,9 @@ class ExtractorManager:
47
47
  """
48
48
  Verilen bağlantıyı işleyebilecek çıkarıcıyı bul
49
49
  """
50
+ # Lazy loading: İlk kullanımda extractorları initialize et
50
51
  self._ensure_initialized()
52
+
51
53
  # Cached instance'ları kullan
52
54
  for extractor in self._extractor_instances:
53
55
  if extractor.can_handle_url(link):
@@ -59,6 +61,9 @@ class ExtractorManager:
59
61
  """
60
62
  Bağlantıları uygun çıkarıcılarla eşleştir
61
63
  """
64
+ # Lazy loading: İlk kullanımda extractorları initialize et
65
+ self._ensure_initialized()
66
+
62
67
  mapping = {}
63
68
  for link in links:
64
69
  # Cached instance'ları kullan
@@ -34,6 +34,7 @@ class PluginBase(ABC):
34
34
  )
35
35
  self.httpx.headers.update(self.cloudscraper.headers)
36
36
  self.httpx.cookies.update(self.cloudscraper.cookies)
37
+ self.httpx.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
37
38
 
38
39
  self.media_handler = MediaHandler()
39
40
  self.ex_manager = ExtractorManager()
@@ -31,7 +31,7 @@ class JetTv(ExtractorBase):
31
31
 
32
32
  # 2. Yöntem: Regex Fallback
33
33
  if not master_url:
34
- if match := re.search(r"file: '([^']*)'", document, re.IGNORE_CASE):
34
+ if match := re.search(r"file: '([^']*)'", document, re.IGNORECASE):
35
35
  master_url = match.group(1)
36
36
 
37
37
  if not master_url:
@@ -16,7 +16,7 @@ class PlayerFilmIzle(ExtractorBase):
16
16
  video_req = istek.text
17
17
 
18
18
  subtitles = []
19
- if sub_match := re.search(r'playerjsSubtitle = "([^"]*)"', video_req, re.IGNORE_CASE):
19
+ if sub_match := re.search(r'playerjsSubtitle = "([^"]*)"', video_req, re.IGNORECASE):
20
20
  sub_yakala = sub_match.group(1)
21
21
  # Format örneği: [dil]url
22
22
  # Kotlin kodunda: subYakala.substringAfter("]") -> url
@@ -27,7 +27,7 @@ class PlayerFilmIzle(ExtractorBase):
27
27
  subtitles.append(Subtitle(name=sub_lang, url=sub_url))
28
28
 
29
29
  # Data yakalama: FirePlayer|DATA|...
30
- data_match = re.search(r'FirePlayer\|([^|]+)\|', video_req, re.IGNORE_CASE)
30
+ data_match = re.search(r'FirePlayer\|([^|]+)\|', video_req, re.IGNORECASE)
31
31
  data_val = data_match.group(1) if data_match else None
32
32
 
33
33
  if not data_val:
@@ -47,7 +47,7 @@ class PlayerFilmIzle(ExtractorBase):
47
47
  get_url = response.text.replace("\\", "")
48
48
 
49
49
  m3u8_url = ""
50
- if url_yakala := re.search(r'"securedLink":"([^"]*)"', get_url, re.IGNORE_CASE):
50
+ if url_yakala := re.search(r'"securedLink":"([^"]*)"', get_url, re.IGNORECASE):
51
51
  m3u8_url = url_yakala.group(1)
52
52
 
53
53
  if not m3u8_url:
@@ -11,86 +11,74 @@ class RoketDizi(PluginBase):
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
12
  description = "Türkiye'nin en tatlış yabancı dizi izleme sitesi. Türkçe dublaj, altyazılı, eski ve yeni yabancı dizilerin yanı sıra kore (asya) dizileri izleyebilirsiniz."
13
13
 
14
-
15
-
16
14
  main_page = {
17
- "dizi/tur/aksiyon" : "Aksiyon",
18
- "dizi/tur/bilim-kurgu" : "Bilim Kurgu",
19
- "dizi/tur/gerilim" : "Gerilim",
20
- "dizi/tur/fantastik" : "Fantastik",
21
- "dizi/tur/komedi" : "Komedi",
22
- "dizi/tur/korku" : "Korku",
23
- "dizi/tur/macera" : "Macera",
24
- "dizi/tur/suc" : "Suç"
15
+ f"{main_url}/dizi/tur/aksiyon" : "Aksiyon",
16
+ f"{main_url}/dizi/tur/bilim-kurgu" : "Bilim Kurgu",
17
+ f"{main_url}/dizi/tur/gerilim" : "Gerilim",
18
+ f"{main_url}/dizi/tur/fantastik" : "Fantastik",
19
+ f"{main_url}/dizi/tur/komedi" : "Komedi",
20
+ f"{main_url}/dizi/tur/korku" : "Korku",
21
+ f"{main_url}/dizi/tur/macera" : "Macera",
22
+ f"{main_url}/dizi/tur/suc" : "Suç"
25
23
  }
26
24
 
27
25
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
28
- full_url = f"{self.main_url}/{url}?&page={page}"
29
- resp = await self.httpx.get(full_url)
30
- sel = Selector(resp.text)
26
+ istek = await self.httpx.get(f"{url}?&page={page}")
27
+ secici = Selector(istek.text)
31
28
 
32
29
  results = []
33
30
 
34
- for item in sel.css("div.w-full.p-4 span.bg-\\[\\#232323\\]"):
35
- title = item.css("span.font-normal.line-clamp-1::text").get()
36
- href = item.css("a::attr(href)").get()
37
- poster = item.css("img::attr(src)").get()
38
-
39
- if title and href:
40
- results.append(MainPageResult(
41
- category = category,
42
- title = title,
43
- url = self.fix_url(href),
44
- poster = self.fix_url(poster)
45
- ))
31
+ for item in secici.css("div.w-full.p-4 span.bg-\\[\\#232323\\]"):
32
+ title = item.css("span.font-normal.line-clamp-1::text").get()
33
+ href = item.css("a::attr(href)").get()
34
+ poster = item.css("img::attr(src)").get()
35
+
36
+ if title and href:
37
+ results.append(MainPageResult(
38
+ category = category,
39
+ title = self.clean_title(title),
40
+ url = self.fix_url(href),
41
+ poster = self.fix_url(poster)
42
+ ))
43
+
46
44
  return results
47
45
 
48
46
  async def search(self, query: str) -> list[SearchResult]:
49
- post_url = f"{self.main_url}/api/bg/searchContent?searchterm={query}"
50
-
51
- headers = {
52
- "Accept" : "application/json, text/javascript, */*; q=0.01",
53
- "X-Requested-With" : "XMLHttpRequest",
54
- "Referer" : f"{self.main_url}/",
55
- }
56
-
57
- search_req = await self.httpx.post(post_url, headers=headers)
47
+ istek = await self.httpx.post(
48
+ url = f"{self.main_url}/api/bg/searchContent?searchterm={query}",
49
+ headers = {
50
+ "Accept" : "application/json, text/javascript, */*; q=0.01",
51
+ "X-Requested-With" : "XMLHttpRequest",
52
+ "Referer" : f"{self.main_url}/",
53
+ }
54
+ )
58
55
 
59
56
  try:
60
- resp_json = search_req.json()
61
-
62
- # Response is base64 encoded!
63
- if not resp_json.get("success"):
64
- return []
65
-
66
- encoded_response = resp_json.get("response", "")
67
- if not encoded_response:
57
+ veri = istek.json()
58
+ encoded = veri.get("response", "")
59
+ if not encoded:
68
60
  return []
69
-
70
- # Decode base64
71
- decoded = base64.b64decode(encoded_response).decode('utf-8')
72
- data = json.loads(decoded)
73
-
74
- if not data.get("state"):
61
+
62
+ decoded = base64.b64decode(encoded).decode("utf-8")
63
+ veri = json.loads(decoded)
64
+
65
+ if not veri.get("state"):
75
66
  return []
76
-
67
+
77
68
  results = []
78
- result_items = data.get("result", [])
79
-
80
- for item in result_items:
81
- title = item.get("object_name", "")
82
- slug = item.get("used_slug", "")
69
+
70
+ for item in veri.get("result", []):
71
+ title = item.get("object_name", "")
72
+ slug = item.get("used_slug", "")
83
73
  poster = item.get("object_poster_url", "")
84
-
74
+
85
75
  if title and slug:
86
- # Construct full URL from slug
87
- full_url = f"{self.main_url}/{slug}"
88
76
  results.append(SearchResult(
89
- title = title.strip(),
90
- url = full_url,
77
+ title = self.clean_title(title.strip()),
78
+ url = self.fix_url(f"{self.main_url}/{slug}"),
91
79
  poster = self.fix_url(poster) if poster else None
92
80
  ))
93
-
81
+
94
82
  return results
95
83
 
96
84
  except Exception:
@@ -100,24 +88,24 @@ class RoketDizi(PluginBase):
100
88
  # Note: Handling both Movie and Series logic in one, returning SeriesInfo generally or MovieInfo
101
89
  resp = await self.httpx.get(url)
102
90
  sel = Selector(resp.text)
103
-
91
+
104
92
  title = sel.css("h1.text-white::text").get()
105
93
  poster = sel.css("div.w-full.page-top img::attr(src)").get()
106
94
  description = sel.css("div.mt-2.text-sm::text").get()
107
-
95
+
108
96
  # Tags - genre bilgileri (Detaylar bölümünde)
109
97
  tags = []
110
98
  genre_text = sel.css("h3.text-white.opacity-90::text").get()
111
99
  if genre_text:
112
100
  tags = [t.strip() for t in genre_text.split(",")]
113
-
101
+
114
102
  # Rating
115
- rating = sel.css("div.flex.items-center span.text-white.text-sm::text").get()
116
-
103
+ rating = sel.css("span.text-white.text-sm.font-bold::text").get()
104
+
117
105
  # Year ve Actors - Detaylar (Details) bölümünden
118
106
  year = None
119
107
  actors = []
120
-
108
+
121
109
  # Detaylar bölümündeki tüm flex-col div'leri al
122
110
  detail_items = sel.css("div.flex.flex-col")
123
111
  for item in detail_items:
@@ -144,7 +132,7 @@ class RoketDizi(PluginBase):
144
132
  # Check urls for episodes
145
133
  all_urls = re.findall(r'"url":"([^"]*)"', resp.text)
146
134
  is_series = any("bolum-" in u for u in all_urls)
147
-
135
+
148
136
  episodes = []
149
137
  if is_series:
150
138
  # Dict kullanarak duplicate'leri önle ama sıralı tut
@@ -153,10 +141,10 @@ class RoketDizi(PluginBase):
153
141
  if "bolum" in u and u not in episodes_dict:
154
142
  season_match = re.search(r'/sezon-(\d+)', u)
155
143
  ep_match = re.search(r'/bolum-(\d+)', u)
156
-
144
+
157
145
  season = int(season_match.group(1)) if season_match else 1
158
146
  episode_num = int(ep_match.group(1)) if ep_match else 1
159
-
147
+
160
148
  # Key olarak (season, episode) tuple kullan
161
149
  key = (season, episode_num)
162
150
  episodes_dict[key] = Episode(
@@ -165,10 +153,10 @@ class RoketDizi(PluginBase):
165
153
  title = f"{season}. Sezon {episode_num}. Bölüm",
166
154
  url = self.fix_url(u)
167
155
  )
168
-
156
+
169
157
  # Sıralı liste oluştur
170
158
  episodes = [episodes_dict[key] for key in sorted(episodes_dict.keys())]
171
-
159
+
172
160
  return SeriesInfo(
173
161
  title = title,
174
162
  url = url,
@@ -188,31 +176,56 @@ class RoketDizi(PluginBase):
188
176
  next_data = sel.css("script#__NEXT_DATA__::text").get()
189
177
  if not next_data:
190
178
  return []
191
-
179
+
192
180
  try:
193
181
  data = json.loads(next_data)
194
182
  secure_data = data["props"]["pageProps"]["secureData"]
195
- decoded = base64.b64decode(secure_data).decode('utf-8')
196
-
183
+ decoded_json = json.loads(base64.b64decode(secure_data).decode('utf-8'))
184
+
185
+ # secureData içindeki RelatedResults -> getEpisodeSources -> result dizisini al
186
+ sources = decoded_json.get("RelatedResults", {}).get("getEpisodeSources", {}).get("result", [])
187
+
197
188
  results = []
198
- matches = re.findall(r'iframe src=\\"([^"]*)\\"', decoded)
199
- for m in matches:
200
- iframe_url = m.replace('\\', '')
189
+ for source in sources:
190
+ source_content = source.get("source_content", "")
191
+
192
+ # iframe URL'ini source_content'ten çıkar
193
+ iframe_match = re.search(r'<iframe[^>]*src=["\']([^"\']*)["\']', source_content)
194
+ if not iframe_match:
195
+ continue
196
+
197
+ iframe_url = iframe_match.group(1)
201
198
  if "http" not in iframe_url:
202
199
  if iframe_url.startswith("//"):
203
200
  iframe_url = "https:" + iframe_url
204
201
  else:
205
- iframe_url = "https://" + iframe_url # fallback
206
-
202
+ iframe_url = "https://" + iframe_url
203
+
207
204
  # Check extractor
208
205
  extractor = self.ex_manager.find_extractor(iframe_url)
209
- name = extractor.name if extractor else "Iframe"
210
-
206
+ ext_name = extractor.name if extractor else ""
207
+
208
+ # Metadata'dan bilgileri al
209
+ source_name = source.get("source_name", "")
210
+ language_name = source.get("language_name", "")
211
+ quality_name = source.get("quality_name", "")
212
+
213
+ # İsmi oluştur
214
+ name_parts = []
215
+ if source_name:
216
+ name_parts.append(source_name)
217
+ if ext_name:
218
+ name_parts.append(ext_name)
219
+ if language_name:
220
+ name_parts.append(language_name)
221
+ if quality_name:
222
+ name_parts.append(quality_name)
223
+
211
224
  results.append({
212
- "url": iframe_url,
213
- "name": name
225
+ "url" : iframe_url,
226
+ "name" : " | ".join(name_parts)
214
227
  })
215
-
228
+
216
229
  return results
217
230
 
218
231
  except Exception:
@@ -7,7 +7,7 @@ import re
7
7
  class SinemaCX(PluginBase):
8
8
  name = "SinemaCX"
9
9
  language = "tr"
10
- main_url = "https://www.sinema.onl"
10
+ main_url = "https://www.sinema.fit"
11
11
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
12
  description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
13
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 1.9.4
3
+ Version: 1.9.9
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: 1.9.4
3
+ Version: 1.9.9
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.9.4",
9
+ version = "1.9.9",
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