KekikStream 1.8.3__tar.gz → 1.8.4__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.3 → kekikstream-1.8.4}/KekikStream/Plugins/DiziBox.py +0 -1
  2. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/DiziYou.py +1 -2
  3. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/Dizilla.py +0 -2
  4. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FilmMakinesi.py +1 -2
  5. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FullHDFilmizlesene.py +1 -2
  6. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/HDFilmCehennemi.py +1 -4
  7. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/JetFilmizle.py +1 -2
  8. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/RecTV.py +1 -2
  9. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SelcukFlix.py +160 -67
  10. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SezonlukDizi.py +1 -2
  11. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SineWix.py +1 -2
  12. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/Sinefy.py +72 -51
  13. kekikstream-1.8.4/KekikStream/Plugins/Sinezy.py +131 -0
  14. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/UgurFilm.py +1 -2
  15. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/PKG-INFO +1 -1
  16. {kekikstream-1.8.3 → kekikstream-1.8.4}/PKG-INFO +1 -1
  17. {kekikstream-1.8.3 → kekikstream-1.8.4}/setup.py +1 -1
  18. kekikstream-1.8.3/KekikStream/Plugins/Sinezy.py +0 -99
  19. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/CLI/__init__.py +0 -0
  20. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/CLI/pypi_kontrol.py +0 -0
  21. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  22. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  23. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  24. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  25. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Media/MediaHandler.py +0 -0
  26. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Media/MediaManager.py +0 -0
  27. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  28. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  29. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  30. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  31. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/UI/UIManager.py +0 -0
  32. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Core/__init__.py +0 -0
  33. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/CloseLoad.py +0 -0
  34. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/ContentX.py +0 -0
  35. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/DzenRu.py +0 -0
  36. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/ExPlay.py +0 -0
  37. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FirePlayer.py +0 -0
  38. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FourCX.py +0 -0
  39. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FourPichive.py +0 -0
  40. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/FourPlayRu.py +0 -0
  41. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  42. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/HDStreamAble.py +0 -0
  43. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Hotlinger.py +0 -0
  44. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/JetTv.py +0 -0
  45. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MailRu.py +0 -0
  46. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MixPlayHD.py +0 -0
  47. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MixTiger.py +0 -0
  48. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/MolyStream.py +0 -0
  49. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  50. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  51. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/OkRuSSL.py +0 -0
  52. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  53. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Pichive.py +0 -0
  54. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PixelDrain.py +0 -0
  55. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PlayRu.py +0 -0
  56. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  57. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/RapidVid.py +0 -0
  58. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/SetPlay.py +0 -0
  59. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/SetPrime.py +0 -0
  60. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/SibNet.py +0 -0
  61. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  62. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TRsTX.py +0 -0
  63. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TauVideo.py +0 -0
  64. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TurboImgz.py +0 -0
  65. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  66. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidHide.py +0 -0
  67. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidMoly.py +0 -0
  68. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidMolyMe.py +0 -0
  69. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidMoxy.py +0 -0
  70. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VidPapi.py +0 -0
  71. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/VideoSeyred.py +0 -0
  72. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  73. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/DiziPal.py +0 -0
  74. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FilmBip.py +0 -0
  75. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FilmModu.py +0 -0
  76. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/FullHDFilm.py +0 -0
  77. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/KultFilmler.py +0 -0
  78. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/RoketDizi.py +0 -0
  79. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SinemaCX.py +0 -0
  80. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
  81. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/__init__.py +0 -0
  82. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/__main__.py +0 -0
  83. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream/requirements.txt +0 -0
  84. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/SOURCES.txt +0 -0
  85. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/dependency_links.txt +0 -0
  86. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/entry_points.txt +0 -0
  87. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/requires.txt +0 -0
  88. {kekikstream-1.8.3 → kekikstream-1.8.4}/KekikStream.egg-info/top_level.txt +0 -0
  89. {kekikstream-1.8.3 → kekikstream-1.8.4}/LICENSE +0 -0
  90. {kekikstream-1.8.3 → kekikstream-1.8.4}/MANIFEST.in +0 -0
  91. {kekikstream-1.8.3 → kekikstream-1.8.4}/README.md +0 -0
  92. {kekikstream-1.8.3 → kekikstream-1.8.4}/setup.cfg +0 -0
@@ -174,7 +174,6 @@ class DiziBox(PluginBase):
174
174
 
175
175
  return results
176
176
 
177
- #@kekik_cache(ttl=15*60)
178
177
  async def load_links(self, url: str) -> list[dict]:
179
178
  istek = await self.httpx.get(url)
180
179
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
4
4
  from parsel import Selector
5
5
  import re
6
6
 
@@ -123,7 +123,6 @@ class DiziYou(PluginBase):
123
123
  actors = actors
124
124
  )
125
125
 
126
- #@kekik_cache(ttl=15*60)
127
126
  async def load_links(self, url: str) -> list[dict]:
128
127
  istek = await self.httpx.get(url)
129
128
  secici = Selector(istek.text)
@@ -1,6 +1,5 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from Kekik.cli import konsol
4
3
  from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
5
4
  from parsel import Selector
6
5
  from json import loads
@@ -171,7 +170,6 @@ class Dizilla(PluginBase):
171
170
  actors = actors
172
171
  )
173
172
 
174
- #@kekik_cache(ttl=15*60)
175
173
  async def load_links(self, url: str) -> list[dict]:
176
174
  istek = await self.httpx.get(url)
177
175
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
 
6
6
  class FilmMakinesi(PluginBase):
@@ -98,7 +98,6 @@ class FilmMakinesi(PluginBase):
98
98
  duration = duration
99
99
  )
100
100
 
101
- #@kekik_cache(ttl=15*60)
102
101
  async def load_links(self, url: str) -> list[dict]:
103
102
  istek = await self.httpx.get(url)
104
103
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
  from Kekik.Sifreleme import StringCodec
6
6
  import json, re
@@ -100,7 +100,6 @@ class FullHDFilmizlesene(PluginBase):
100
100
  duration = duration
101
101
  )
102
102
 
103
- #@kekik_cache(ttl=15*60)
104
103
  async def load_links(self, url: str) -> list[dict]:
105
104
  istek = await self.httpx.get(url)
106
105
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
4
4
  from parsel import Selector
5
5
  from Kekik.Sifreleme import Packer, StreamDecoder
6
6
  import random, string, re
@@ -108,7 +108,6 @@ class HDFilmCehennemi(PluginBase):
108
108
  def generate_random_cookie(self):
109
109
  return "".join(random.choices(string.ascii_letters + string.digits, k=16))
110
110
 
111
- #@kekik_cache(ttl=15*60)
112
111
  async def cehennempass(self, video_id: str) -> list[dict]:
113
112
  results = []
114
113
 
@@ -148,7 +147,6 @@ class HDFilmCehennemi(PluginBase):
148
147
 
149
148
  return results
150
149
 
151
- #@kekik_cache(ttl=15*60)
152
150
  async def invoke_local_source(self, iframe: str, source: str, url: str):
153
151
  self.cffi.headers.update({"Referer": f"{self.main_url}/"})
154
152
  istek = await self.cffi.get(iframe)
@@ -179,7 +177,6 @@ class HDFilmCehennemi(PluginBase):
179
177
  "subtitles" : subtitles
180
178
  }]
181
179
 
182
- #@kekik_cache(ttl=15*60)
183
180
  async def load_links(self, url: str) -> list[dict]:
184
181
  istek = await self.cffi.get(url)
185
182
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
 
6
6
  class JetFilmizle(PluginBase):
@@ -89,7 +89,6 @@ class JetFilmizle(PluginBase):
89
89
  actors = actors
90
90
  )
91
91
 
92
- #@kekik_cache(ttl=15*60)
93
92
  async def load_links(self, url: str) -> list[dict]:
94
93
  istek = await self.httpx.get(url)
95
94
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
4
4
  from json import dumps, loads
5
5
  import re
6
6
 
@@ -116,7 +116,6 @@ class RecTV(PluginBase):
116
116
  actors = []
117
117
  )
118
118
 
119
- #@kekik_cache(ttl=15*60)
120
119
  async def load_links(self, url: str) -> list[dict]:
121
120
  try:
122
121
  veri = loads(url)
@@ -5,109 +5,202 @@ from parsel import Selector
5
5
  import re, base64, json, urllib.parse
6
6
 
7
7
  class SelcukFlix(PluginBase):
8
- name = "SelcukFlix"
9
- main_url = "https://selcukflix.net"
10
- lang = "tr"
11
-
8
+ name = "SelcukFlix"
9
+ lang = "tr"
10
+ main_url = "https://selcukflix.net"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Selcukflix'te her türden en yeni ve en popüler dizi ve filmleri izlemenin keyfini çıkarın. Aksiyondan romantiğe, bilim kurgudan dramaya, geniş kütüphanemizde herkes için bir şey var."
13
+
12
14
  main_page = {
13
- "tum-bolumler" : "Yeni Eklenen Bölümler"
15
+ f"{main_url}/tum-bolumler" : "Yeni Eklenen Bölümler",
16
+ "" : "Yeni Diziler",
17
+ "" : "Kore Dizileri",
18
+ "" : "Yerli Diziler",
19
+ "15" : "Aile",
20
+ "17" : "Animasyon",
21
+ "9" : "Aksiyon",
22
+ "5" : "Bilim Kurgu",
23
+ "2" : "Dram",
24
+ "12" : "Fantastik",
25
+ "18" : "Gerilim",
26
+ "3" : "Gizem",
27
+ "8" : "Korku",
28
+ "4" : "Komedi",
29
+ "7" : "Romantik"
14
30
  }
15
31
 
16
32
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
17
- full_url = f"{self.main_url}/{url}"
18
- resp = await self.httpx.get(full_url)
19
- sel = Selector(resp.text)
20
-
21
33
  results = []
22
34
  if "tum-bolumler" in url:
23
- for item in sel.css("div.col-span-3 a"):
24
- name = item.css("h2::text").get()
25
- ep_info = item.css("div.opacity-80::text").get()
26
- href = item.css("::attr(href)").get()
27
- poster = item.css("div.image img::attr(src)").get()
28
-
29
- if name and href:
30
- title = f"{name} - {ep_info}" if ep_info else name
31
- final_url = self.fix_url(href)
32
- if "/dizi/" in final_url and "/sezon-" in final_url:
33
- final_url = final_url.split("/sezon-")[0]
34
-
35
+ try:
36
+ resp = await self.httpx.get(url)
37
+ sel = Selector(resp.text)
38
+
39
+ for item in sel.css("div.col-span-3 a"):
40
+ name = item.css("h2::text").get()
41
+ ep_info = item.css("div.opacity-80::text").get()
42
+ href = item.css("::attr(href)").get()
43
+ poster = item.css("div.image img::attr(src)").get()
44
+
45
+ if name and href:
46
+ title = f"{name} - {ep_info}" if ep_info else name
47
+ final_url = self.fix_url(href)
48
+
49
+ if "/dizi/" in final_url and "/sezon-" in final_url:
50
+ final_url = final_url.split("/sezon-")[0]
51
+
52
+ results.append(MainPageResult(
53
+ category = category,
54
+ title = title,
55
+ url = final_url,
56
+ poster = self.fix_url(poster)
57
+ ))
58
+ except Exception:
59
+ pass
60
+ return results
61
+
62
+ base_api = f"{self.main_url}/api/bg/findSeries"
63
+
64
+ params = {
65
+ "releaseYearStart" : "1900",
66
+ "releaseYearEnd" : "2026",
67
+ "imdbPointMin" : "1",
68
+ "imdbPointMax" : "10",
69
+ "categoryIdsComma" : "",
70
+ "countryIdsComma" : "",
71
+ "orderType" : "date_desc",
72
+ "languageId" : "-1",
73
+ "currentPage" : page,
74
+ "currentPageCount" : "24",
75
+ "queryStr" : "",
76
+ "categorySlugsComma" : "",
77
+ "countryCodesComma" : ""
78
+ }
79
+
80
+ if "Yerli Diziler" in category:
81
+ params["imdbPointMin"] = "5"
82
+ params["countryIdsComma"] = "29"
83
+ elif "Kore Dizileri" in category:
84
+ params["countryIdsComma"] = "21"
85
+ params["countryCodesComma"] = "KR"
86
+ else:
87
+ params["categoryIdsComma"] = url
88
+
89
+ full_url = f"{base_api}?{urllib.parse.urlencode(params)}"
90
+
91
+ headers = {
92
+ "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0",
93
+ "Accept" : "application/json, text/plain, */*",
94
+ "Accept-Language" : "en-US,en;q=0.5",
95
+ "X-Requested-With" : "XMLHttpRequest",
96
+ "Sec-Fetch-Site" : "same-origin",
97
+ "Sec-Fetch-Mode" : "cors",
98
+ "Sec-Fetch-Dest" : "empty",
99
+ "Referer" : f"{self.main_url}/"
100
+ }
101
+
102
+ try:
103
+ post_resp = await self.httpx.post(full_url, headers=headers)
104
+ resp_json = post_resp.json()
105
+ response_data = resp_json.get("response")
106
+
107
+ raw_data = base64.b64decode(response_data)
108
+ try:
109
+ decoded_str = raw_data.decode('utf-8')
110
+ except UnicodeDecodeError:
111
+ decoded_str = raw_data.decode('iso-8859-1').encode('utf-8').decode('utf-8')
112
+
113
+ data = json.loads(decoded_str)
114
+
115
+ for item in data.get("result", []):
116
+ title = item.get("title")
117
+ slug = item.get("slug")
118
+ poster = item.get("poster")
119
+
120
+ if poster:
121
+ poster = self.clean_image_url(poster)
122
+
123
+ if slug:
35
124
  results.append(MainPageResult(
36
- category=category,
37
- title=title,
38
- url=final_url,
39
- poster=self.fix_url(poster)
125
+ category = category,
126
+ title = title,
127
+ url = self.fix_url(slug),
128
+ poster = poster
40
129
  ))
41
-
130
+
131
+ except Exception:
132
+ pass
133
+
42
134
  return results
43
135
 
44
136
  async def search(self, query: str) -> list[SearchResult]:
45
137
  search_url = f"{self.main_url}/api/bg/searchcontent?searchterm={query}"
46
-
138
+
47
139
  headers = {
48
- "Accept": "application/json, text/plain, */*",
49
- "X-Requested-With": "XMLHttpRequest",
50
- "Referer": f"{self.main_url}/"
140
+ "Accept" : "application/json, text/plain, */*",
141
+ "X-Requested-With" : "XMLHttpRequest",
142
+ "Referer" : f"{self.main_url}/"
51
143
  }
52
-
144
+
53
145
  post_resp = await self.httpx.post(search_url, headers=headers)
54
-
146
+
55
147
  try:
56
- resp_json = post_resp.json()
148
+ resp_json = post_resp.json()
57
149
  response_data = resp_json.get("response")
58
-
59
- raw_data = base64.b64decode(response_data)
150
+ raw_data = base64.b64decode(response_data)
60
151
  try:
61
152
  decoded_str = raw_data.decode('utf-8')
62
153
  except UnicodeDecodeError:
63
154
  decoded_str = raw_data.decode('iso-8859-1').encode('utf-8').decode('utf-8')
64
-
155
+
65
156
  search_data = json.loads(decoded_str)
66
-
157
+
67
158
  results = []
68
159
  for item in search_data.get("result", []):
69
- title = item.get("title")
70
- slug = item.get("slug")
160
+ title = item.get("title")
161
+ slug = item.get("slug")
71
162
  poster = item.get("poster")
163
+
72
164
  if poster:
73
165
  poster = self.clean_image_url(poster)
74
-
166
+
75
167
  if slug and "/seri-filmler/" not in slug:
76
168
  results.append(SearchResult(
77
- title=title,
78
- url=self.fix_url(slug),
79
- poster=poster
169
+ title = title,
170
+ url = self.fix_url(slug),
171
+ poster = poster
80
172
  ))
173
+
81
174
  return results
82
-
175
+
83
176
  except Exception:
84
177
  return []
85
178
 
86
179
  async def load_item(self, url: str) -> SeriesInfo:
87
180
  resp = await self.httpx.get(url)
88
181
  sel = Selector(resp.text)
89
-
182
+
90
183
  next_data = sel.css("script#__NEXT_DATA__::text").get()
91
184
  if not next_data:
92
185
  return None
93
-
94
- data = json.loads(next_data)
95
- secure_data = data["props"]["pageProps"]["secureData"]
96
- raw_data = base64.b64decode(secure_data.replace('"', ''))
186
+
187
+ data = json.loads(next_data)
188
+ secure_data = data["props"]["pageProps"]["secureData"]
189
+ raw_data = base64.b64decode(secure_data.replace('"', ''))
97
190
  try:
98
191
  decoded_str = raw_data.decode('utf-8')
99
192
  except UnicodeDecodeError:
100
193
  decoded_str = raw_data.decode('iso-8859-1') # .encode('utf-8').decode('utf-8') implied
101
-
194
+
102
195
  content_details = json.loads(decoded_str)
103
- item = content_details.get("contentItem", {})
104
-
105
- title = item.get("original_title") or item.get("originalTitle")
106
- poster = self.clean_image_url(item.get("poster_url") or item.get("posterUrl"))
107
- description = item.get("description") or item.get("used_description")
108
- rating = str(item.get("imdb_point") or item.get("imdbPoint", ""))
109
-
110
- series_data = content_details.get("relatedData", {}).get("seriesData")
196
+ item = content_details.get("contentItem", {})
197
+
198
+ title = item.get("original_title") or item.get("originalTitle")
199
+ poster = self.clean_image_url(item.get("poster_url") or item.get("posterUrl"))
200
+ description = item.get("description") or item.get("used_description")
201
+ rating = str(item.get("imdb_point") or item.get("imdbPoint", ""))
202
+
203
+ series_data = content_details.get("relatedData", {}).get("seriesData")
111
204
  if not series_data and "RelatedResults" in content_details:
112
205
  series_data = content_details["RelatedResults"].get("getSerieSeasonAndEpisodes", {}).get("result")
113
206
  if series_data and isinstance(series_data, list):
@@ -127,19 +220,19 @@ class SelcukFlix(PluginBase):
127
220
  ep_list = season.get("episodes", [])
128
221
  for ep in ep_list:
129
222
  episodes.append(Episode(
130
- season = s_no,
223
+ season = s_no,
131
224
  episode = ep.get("episode_no") or ep.get("episodeNo"),
132
- title = ep.get("ep_text") or ep.get("epText"),
133
- url = self.fix_url(ep.get("used_slug") or ep.get("usedSlug"))
225
+ title = ep.get("ep_text") or ep.get("epText"),
226
+ url = self.fix_url(ep.get("used_slug") or ep.get("usedSlug"))
134
227
  ))
135
228
 
136
229
  return SeriesInfo(
137
- title=title,
138
- url=url,
139
- poster=poster,
140
- description=description,
141
- rating=rating,
142
- episodes=episodes
230
+ title = title,
231
+ url = url,
232
+ poster = poster,
233
+ description = description,
234
+ rating = rating,
235
+ episodes = episodes
143
236
  )
144
237
 
145
238
  async def load_links(self, url: str) -> list[dict]:
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
4
4
  from parsel import Selector
5
5
 
6
6
  class SezonlukDizi(PluginBase):
@@ -99,7 +99,6 @@ class SezonlukDizi(PluginBase):
99
99
  actors = actors
100
100
  )
101
101
 
102
- #@kekik_cache(ttl=15*60)
103
102
  async def load_links(self, url: str) -> list[dict]:
104
103
  istek = await self.httpx.get(url)
105
104
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
4
4
  import json
5
5
 
6
6
  class SineWix(PluginBase):
@@ -123,7 +123,6 @@ class SineWix(PluginBase):
123
123
  episodes = episodes,
124
124
  )
125
125
 
126
- #@kekik_cache(ttl=15*60)
127
126
  async def load_links(self, url: str) -> list[dict]:
128
127
  try:
129
128
  veri = json.loads(url)
@@ -5,74 +5,95 @@ from parsel import Selector
5
5
  import re, json, urllib.parse
6
6
 
7
7
  class Sinefy(PluginBase):
8
- name = "Sinefy"
9
- main_url = "https://sinefy3.com"
10
- lang = "tr"
11
-
8
+ name = "Sinefy"
9
+ language = "tr"
10
+ main_url = "https://sinefy3.com"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Yabancı film izle olarak vizyondaki en yeni yabancı filmleri türkçe dublaj ve altyazılı olarak en hızlı şekilde full hd olarak sizlere sunuyoruz."
13
+
12
14
  main_page = {
13
- "page/" : "Son Eklenenler",
14
- "en-yenifilmler" : "Yeni Filmler",
15
- "netflix-filmleri-izle" : "Netflix Filmleri",
16
- "dizi-izle/netflix" : "Netflix Dizileri"
15
+ f"{main_url}/page/" : "Son Eklenenler",
16
+ f"{main_url}/en-yenifilmler" : "Yeni Filmler",
17
+ f"{main_url}/netflix-filmleri-izle" : "Netflix Filmleri",
18
+ f"{main_url}/dizi-izle/netflix" : "Netflix Dizileri",
19
+ f"{main_url}/gozat/filmler/animasyon" : "Animasyon",
20
+ f"{main_url}/gozat/filmler/komedi" : "Komedi",
21
+ f"{main_url}/gozat/filmler/suc" : "Suç",
22
+ f"{main_url}/gozat/filmler/aile" : "Aile",
23
+ f"{main_url}/gozat/filmler/aksiyon" : "Aksiyon",
24
+ f"{main_url}/gozat/filmler/macera" : "Macera",
25
+ f"{main_url}/gozat/filmler/fantastik" : "Fantastik",
26
+ f"{main_url}/gozat/filmler/korku" : "Korku",
27
+ f"{main_url}/gozat/filmler/romantik" : "Romantik",
28
+ f"{main_url}/gozat/filmler/savas" : "Savaş",
29
+ f"{main_url}/gozat/filmler/gerilim" : "Gerilim",
30
+ f"{main_url}/gozat/filmler/bilim-kurgu" : "Bilim Kurgu",
31
+ f"{main_url}/gozat/filmler/dram" : "Dram",
32
+ f"{main_url}/gozat/filmler/gizem" : "Gizem",
33
+ f"{main_url}/gozat/filmler/western" : "Western",
34
+ f"{main_url}/gozat/filmler/ulke/turkiye" : "Türk Filmleri",
35
+ f"{main_url}/gozat/filmler/ulke/kore" : "Kore Filmleri"
17
36
  }
18
37
 
19
38
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
20
39
  if "page/" in url:
21
- full_url = f"{self.main_url}/{url}{page}"
40
+ full_url = f"{url}{page}"
22
41
  elif "en-yenifilmler" in url or "netflix" in url:
23
- full_url = f"{self.main_url}/{url}/{page}"
42
+ full_url = f"{url}/{page}"
24
43
  else:
25
- full_url = f"{self.main_url}/{url}&page={page}"
26
-
44
+ full_url = f"{url}&page={page}"
45
+
27
46
  resp = await self.httpx.get(full_url)
28
- sel = Selector(resp.text)
29
-
47
+ sel = Selector(resp.text)
48
+
30
49
  results = []
31
50
  # Kotlin: div.poster-with-subject, div.dark-segment div.poster-md.poster
32
51
  for item in sel.css("div.poster-with-subject, div.dark-segment div.poster-md.poster"):
33
- title = item.css("h2::text").get()
34
- href = item.css("a::attr(href)").get()
35
- poster= item.css("img::attr(data-srcset)").get()
52
+ title = item.css("h2::text").get()
53
+ href = item.css("a::attr(href)").get()
54
+ poster = item.css("img::attr(data-srcset)").get()
36
55
  if poster:
37
56
  poster = poster.split(",")[0].split(" ")[0]
38
-
57
+
39
58
  if title and href:
40
59
  results.append(MainPageResult(
41
- category=category,
42
- title=title,
43
- url=self.fix_url(href),
44
- poster=self.fix_url(poster)
60
+ category = category,
61
+ title = title,
62
+ url = self.fix_url(href),
63
+ poster = self.fix_url(poster)
45
64
  ))
65
+
46
66
  return results
47
67
 
48
68
  async def search(self, query: str) -> list[SearchResult]:
49
69
  # Try to get dynamic keys from main page first
50
- c_key = "ca1d4a53d0f4761a949b85e51e18f096"
70
+ c_key = "ca1d4a53d0f4761a949b85e51e18f096"
51
71
  c_value = "MTc0NzI2OTAwMDU3ZTEwYmZjMDViNWFmOWIwZDViODg0MjU4MjA1ZmYxOThmZTYwMDdjMWQzMzliNzY5NzFlZmViMzRhMGVmNjgwODU3MGIyZA=="
52
-
72
+
53
73
  try:
54
74
  resp = await self.httpx.get(self.main_url)
55
- sel = Selector(resp.text)
56
- cke = sel.css("input[name='cKey']::attr(value)").get()
75
+ sel = Selector(resp.text)
76
+ cke = sel.css("input[name='cKey']::attr(value)").get()
57
77
  cval = sel.css("input[name='cValue']::attr(value)").get()
58
78
  if cke and cval:
59
- c_key = cke
79
+ c_key = cke
60
80
  c_value = cval
81
+
61
82
  except Exception:
62
83
  pass
63
84
 
64
85
  post_url = f"{self.main_url}/bg/searchcontent"
65
86
  data = {
66
- "cKey": c_key,
67
- "cValue": c_value,
68
- "searchTerm": query
87
+ "cKey" : c_key,
88
+ "cValue" : c_value,
89
+ "searchTerm" : query
69
90
  }
70
91
 
71
92
  headers = {
72
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
73
- "Accept": "application/json, text/javascript, */*; q=0.01",
74
- "X-Requested-With": "XMLHttpRequest",
75
- "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
93
+ "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
94
+ "Accept" : "application/json, text/javascript, */*; q=0.01",
95
+ "X-Requested-With" : "XMLHttpRequest",
96
+ "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8"
76
97
  }
77
98
 
78
99
  response = await self.httpx.post(post_url, data=data, headers=headers)
@@ -179,24 +200,24 @@ class Sinefy(PluginBase):
179
200
 
180
201
  if episodes:
181
202
  return SeriesInfo(
182
- title=title,
183
- url=url,
184
- poster=self.fix_url(poster),
185
- description=description,
186
- rating=rating,
187
- tags=tags,
188
- actors=actors,
189
- episodes=episodes
203
+ title = title,
204
+ url = url,
205
+ poster = self.fix_url(poster),
206
+ description = description,
207
+ rating = rating,
208
+ tags = tags,
209
+ actors = actors,
210
+ episodes = episodes
190
211
  )
191
212
  else:
192
213
  return MovieInfo(
193
- title=title,
194
- url=url,
195
- poster=self.fix_url(poster),
196
- description=description,
197
- rating=rating,
198
- tags=tags,
199
- actors=actors
214
+ title = title,
215
+ url = url,
216
+ poster = self.fix_url(poster),
217
+ description = description,
218
+ rating = rating,
219
+ tags = tags,
220
+ actors = actors
200
221
  )
201
222
 
202
223
  async def load_links(self, url: str) -> list[dict]:
@@ -208,7 +229,7 @@ class Sinefy(PluginBase):
208
229
  iframe = self.fix_url(iframe)
209
230
  extractor = self.ex_manager.find_extractor(iframe)
210
231
  return [{
211
- "url": iframe,
212
- "name": extractor.name if extractor else "Iframe"
232
+ "url" : iframe,
233
+ "name" : extractor.name if extractor else "Iframe"
213
234
  }]
214
235
  return []
@@ -0,0 +1,131 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
+ from parsel import Selector
5
+ import re, base64
6
+
7
+ class Sinezy(PluginBase):
8
+ name = "Sinezy"
9
+ language = "tr"
10
+ main_url = "https://sinezy.fit"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Yerli ve yabancı film izle! Türkçe Dublaj ve Alt Yazılı Seçenekleriyle full hd film izlemek için En çok tercih edilen adres!"
13
+
14
+ main_page = {
15
+ f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
16
+ f"{main_url}/izle/en-yi-filmler/" : "En İyi Filmler",
17
+ f"{main_url}/izle/aksiyon-filmleri/" : "Aksiyon ",
18
+ f"{main_url}/izle/animasyon-filmleri/" : "Animasyon",
19
+ f"{main_url}/izle/belgesel-izle/" : "Belgesel",
20
+ f"{main_url}/izle/bilim-kurgu-filmleri/" : "Bilim Kurgu ",
21
+ f"{main_url}/izle/biyografi-filmleri/" : "Biyografi ",
22
+ f"{main_url}/izle/dram-filmleri/" : "Dram",
23
+ f"{main_url}/izle/erotik-film-izle/" : "Erotik ",
24
+ f"{main_url}/izle/fantastik-filmler/" : "Fantastik",
25
+ f"{main_url}/izle/gelecek-filmler/" : "Yakında",
26
+ f"{main_url}/izle/gerilim-filmleri/" : "Gerilim ",
27
+ f"{main_url}/izle/gizem-filmleri/" : "Gizem ",
28
+ f"{main_url}/izle/komedi-filmleri/" : "Komedi ",
29
+ f"{main_url}/izle/korku-filmleri/" : "Korku ",
30
+ f"{main_url}/izle/macera-filmleri/" : "Macera ",
31
+ f"{main_url}/izle/muzikal-izle/" : "Müzikal",
32
+ f"{main_url}/izle/romantik-film/" : "Romantik ",
33
+ f"{main_url}/izle/savas-filmleri/" : "Savaş ",
34
+ f"{main_url}/izle/spor-filmleri/" : "Spor ",
35
+ f"{main_url}/izle/suc-filmleri/" : "Suç ",
36
+ f"{main_url}/izle/tarih-filmleri/" : "Tarih ",
37
+ f"{main_url}/izle/turkce-altyazili-promo/" : "Altyazılı Pro",
38
+ f"{main_url}/izle/yabanci-dizi/" : "Yabancı Dizi",
39
+ f"{main_url}/izle/en-iyi-filmler/" : "En İyi Filmler",
40
+ f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
41
+ f"{main_url}/izle/yerli-filmler/" : "Yerli Filmler",
42
+ f"{main_url}/izle/yetiskin-film/" : "Yetişkin +18",
43
+ }
44
+
45
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
46
+ full_url = f"{url}page/{page}/"
47
+ resp = await self.httpx.get(full_url)
48
+ sel = Selector(resp.text)
49
+
50
+ results = []
51
+ for item in sel.css("div.container div.content div.movie_box.move_k"):
52
+ title = item.css("a::attr(title)").get()
53
+ href = item.css("a::attr(href)").get()
54
+ poster = item.css("img::attr(data-src)").get()
55
+
56
+ if title and href:
57
+ results.append(MainPageResult(
58
+ category = category,
59
+ title = title,
60
+ url = self.fix_url(href),
61
+ poster = self.fix_url(poster)
62
+ ))
63
+
64
+ return results
65
+
66
+ async def search(self, query: str) -> list[SearchResult]:
67
+ url = f"{self.main_url}/arama/?s={query}"
68
+ resp = await self.httpx.get(url)
69
+ sel = Selector(resp.text)
70
+
71
+ results = []
72
+ for item in sel.css("div.movie_box.move_k"):
73
+ title = item.css("a::attr(title)").get()
74
+ href = item.css("a::attr(href)").get()
75
+ poster = item.css("img::attr(data-src)").get()
76
+
77
+ if title and href:
78
+ results.append(SearchResult(
79
+ title = title,
80
+ url = self.fix_url(href),
81
+ poster = self.fix_url(poster)
82
+ ))
83
+
84
+ return results
85
+
86
+ async def load_item(self, url: str) -> MovieInfo:
87
+ resp = await self.httpx.get(url)
88
+ sel = Selector(resp.text)
89
+
90
+ title = sel.css("div.detail::attr(title)").get()
91
+ poster = sel.css("div.move_k img::attr(data-src)").get()
92
+ description = sel.css("div.desc.yeniscroll p::text").get()
93
+ rating = sel.css("span.info span.imdb::text").get()
94
+
95
+ tags = sel.css("div.detail span a::text").getall()
96
+ actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
97
+
98
+ return MovieInfo(
99
+ title = title,
100
+ url = url,
101
+ poster = self.fix_url(poster),
102
+ description = description,
103
+ tags = tags,
104
+ rating = rating,
105
+ actors = actors
106
+ )
107
+
108
+ async def load_links(self, url: str) -> list[dict]:
109
+ resp = await self.httpx.get(url)
110
+
111
+ match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
112
+ if match:
113
+ encoded = match.group(1)
114
+ try:
115
+ decoded = base64.b64decode(encoded).decode('utf-8')
116
+ iframe_match = re.search(r'src="([^"]*)"', decoded)
117
+
118
+ if iframe_match:
119
+ iframe = iframe_match.group(1)
120
+ iframe = self.fix_url(iframe)
121
+
122
+ extractor = self.ex_manager.find_extractor(iframe)
123
+
124
+ return [{
125
+ "url" : iframe,
126
+ "name" : extractor.name if extractor else "Iframe"
127
+ }]
128
+ except Exception:
129
+ pass
130
+
131
+ return []
@@ -1,6 +1,6 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
 
6
6
  class UgurFilm(PluginBase):
@@ -79,7 +79,6 @@ class UgurFilm(PluginBase):
79
79
  actors = actors,
80
80
  )
81
81
 
82
- #@kekik_cache(ttl=15*60)
83
82
  async def load_links(self, url: str) -> list[dict]:
84
83
  istek = await self.httpx.get(url)
85
84
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: KekikStream
3
- Version: 1.8.3
3
+ Version: 1.8.4
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.8.3
3
+ Version: 1.8.4
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.3",
9
+ version = "1.8.4",
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"],
@@ -1,99 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
4
- from parsel import Selector
5
- import re, base64
6
-
7
- class Sinezy(PluginBase):
8
- name = "Sinezy"
9
- main_url = "https://sinezy.site"
10
- lang = "tr"
11
-
12
- main_page = {
13
- "izle/en-yeni-filmler/" : "Yeni Filmler",
14
- "izle/en-yi-filmler/" : "En İyi Filmler"
15
- }
16
-
17
- async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
18
- full_url = f"{self.main_url}/{url}page/{page}/"
19
- resp = await self.httpx.get(full_url)
20
- sel = Selector(resp.text)
21
-
22
- results = []
23
- for item in sel.css("div.container div.content div.movie_box.move_k"):
24
- title = item.css("a::attr(title)").get()
25
- href = item.css("a::attr(href)").get()
26
- poster= item.css("img::attr(data-src)").get()
27
-
28
- if title and href:
29
- results.append(MainPageResult(
30
- category=category,
31
- title=title,
32
- url=self.fix_url(href),
33
- poster=self.fix_url(poster)
34
- ))
35
- return results
36
-
37
- async def search(self, query: str) -> list[SearchResult]:
38
- url = f"{self.main_url}/arama/?s={query}"
39
- resp = await self.httpx.get(url)
40
- sel = Selector(resp.text)
41
-
42
- results = []
43
- for item in sel.css("div.movie_box.move_k"):
44
- title = item.css("a::attr(title)").get()
45
- href = item.css("a::attr(href)").get()
46
- poster= item.css("img::attr(data-src)").get()
47
-
48
- if title and href:
49
- results.append(SearchResult(
50
- title=title,
51
- url=self.fix_url(href),
52
- poster=self.fix_url(poster)
53
- ))
54
- return results
55
-
56
- async def load_item(self, url: str) -> MovieInfo:
57
- resp = await self.httpx.get(url)
58
- sel = Selector(resp.text)
59
-
60
- title = sel.css("div.detail::attr(title)").get()
61
- poster = sel.css("div.move_k img::attr(data-src)").get()
62
- description = sel.css("div.desc.yeniscroll p::text").get()
63
- rating = sel.css("span.info span.imdb::text").get()
64
-
65
- tags = sel.css("div.detail span a::text").getall()
66
- actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
67
-
68
- return MovieInfo(
69
- title=title,
70
- url=url,
71
- poster=self.fix_url(poster),
72
- description=description,
73
- tags=tags,
74
- rating=rating,
75
- actors=actors
76
- )
77
-
78
- async def load_links(self, url: str) -> list[dict]:
79
- resp = await self.httpx.get(url)
80
-
81
- match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
82
- if match:
83
- encoded = match.group(1)
84
- try:
85
- decoded = base64.b64decode(encoded).decode('utf-8')
86
- iframe_match = re.search(r'src="([^"]*)"', decoded)
87
- if iframe_match:
88
- iframe = iframe_match.group(1)
89
- iframe = self.fix_url(iframe)
90
-
91
- extractor = self.ex_manager.find_extractor(iframe)
92
- return [{
93
- "url": iframe,
94
- "name": extractor.name if extractor else "Iframe"
95
- }]
96
- except Exception:
97
- pass
98
-
99
- return []
File without changes
File without changes
File without changes
File without changes