KekikStream 1.4.4__py3-none-any.whl → 2.0.2__py3-none-any.whl

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 (81) hide show
  1. KekikStream/CLI/pypi_kontrol.py +6 -6
  2. KekikStream/Core/Extractor/ExtractorBase.py +13 -12
  3. KekikStream/Core/Extractor/ExtractorLoader.py +25 -17
  4. KekikStream/Core/Extractor/ExtractorManager.py +53 -9
  5. KekikStream/Core/Extractor/ExtractorModels.py +5 -7
  6. KekikStream/Core/Extractor/YTDLPCache.py +35 -0
  7. KekikStream/Core/Media/MediaHandler.py +52 -31
  8. KekikStream/Core/Media/MediaManager.py +0 -3
  9. KekikStream/Core/Plugin/PluginBase.py +47 -21
  10. KekikStream/Core/Plugin/PluginLoader.py +11 -7
  11. KekikStream/Core/Plugin/PluginModels.py +25 -25
  12. KekikStream/Core/__init__.py +1 -0
  13. KekikStream/Extractors/CloseLoad.py +6 -26
  14. KekikStream/Extractors/ContentX_.py +40 -0
  15. KekikStream/Extractors/DzenRu.py +38 -0
  16. KekikStream/Extractors/ExPlay.py +53 -0
  17. KekikStream/Extractors/FirePlayer.py +60 -0
  18. KekikStream/Extractors/HDPlayerSystem.py +41 -0
  19. KekikStream/Extractors/JetTv.py +45 -0
  20. KekikStream/Extractors/MailRu.py +2 -4
  21. KekikStream/Extractors/MixTiger.py +57 -0
  22. KekikStream/Extractors/MolyStream.py +25 -7
  23. KekikStream/Extractors/Odnoklassniki.py +16 -11
  24. KekikStream/Extractors/{OkRuHTTP.py → Odnoklassniki_.py} +5 -1
  25. KekikStream/Extractors/{HDStreamAble.py → PeaceMakerst_.py} +1 -1
  26. KekikStream/Extractors/PixelDrain.py +0 -1
  27. KekikStream/Extractors/PlayerFilmIzle.py +62 -0
  28. KekikStream/Extractors/RapidVid.py +30 -13
  29. KekikStream/Extractors/RapidVid_.py +7 -0
  30. KekikStream/Extractors/SetPlay.py +57 -0
  31. KekikStream/Extractors/SetPrime.py +45 -0
  32. KekikStream/Extractors/SibNet.py +0 -1
  33. KekikStream/Extractors/TurkeyPlayer.py +34 -0
  34. KekikStream/Extractors/VidHide.py +72 -0
  35. KekikStream/Extractors/VidMoly.py +20 -19
  36. KekikStream/Extractors/{VidMolyMe.py → VidMoly_.py} +1 -1
  37. KekikStream/Extractors/VidMoxy.py +0 -1
  38. KekikStream/Extractors/VidPapi.py +89 -0
  39. KekikStream/Extractors/YTDLP.py +177 -0
  40. KekikStream/Extractors/YildizKisaFilm.py +41 -0
  41. KekikStream/Plugins/DiziBox.py +28 -16
  42. KekikStream/Plugins/DiziPal.py +246 -0
  43. KekikStream/Plugins/DiziYou.py +58 -31
  44. KekikStream/Plugins/Dizilla.py +97 -68
  45. KekikStream/Plugins/FilmBip.py +145 -0
  46. KekikStream/Plugins/FilmMakinesi.py +61 -52
  47. KekikStream/Plugins/FilmModu.py +138 -0
  48. KekikStream/Plugins/FullHDFilm.py +164 -0
  49. KekikStream/Plugins/FullHDFilmizlesene.py +38 -37
  50. KekikStream/Plugins/HDFilmCehennemi.py +44 -54
  51. KekikStream/Plugins/JetFilmizle.py +68 -42
  52. KekikStream/Plugins/KultFilmler.py +219 -0
  53. KekikStream/Plugins/RecTV.py +41 -37
  54. KekikStream/Plugins/RoketDizi.py +232 -0
  55. KekikStream/Plugins/SelcukFlix.py +309 -0
  56. KekikStream/Plugins/SezonlukDizi.py +16 -14
  57. KekikStream/Plugins/SineWix.py +39 -30
  58. KekikStream/Plugins/Sinefy.py +238 -0
  59. KekikStream/Plugins/SinemaCX.py +157 -0
  60. KekikStream/Plugins/Sinezy.py +146 -0
  61. KekikStream/Plugins/SuperFilmGeldi.py +121 -0
  62. KekikStream/Plugins/UgurFilm.py +10 -10
  63. KekikStream/__init__.py +296 -319
  64. KekikStream/requirements.txt +3 -4
  65. kekikstream-2.0.2.dist-info/METADATA +309 -0
  66. kekikstream-2.0.2.dist-info/RECORD +82 -0
  67. {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info}/WHEEL +1 -1
  68. KekikStream/Extractors/FourCX.py +0 -7
  69. KekikStream/Extractors/FourPichive.py +0 -7
  70. KekikStream/Extractors/FourPlayRu.py +0 -7
  71. KekikStream/Extractors/Hotlinger.py +0 -7
  72. KekikStream/Extractors/OkRuSSL.py +0 -7
  73. KekikStream/Extractors/Pichive.py +0 -7
  74. KekikStream/Extractors/PlayRu.py +0 -7
  75. KekikStream/Helpers/Unpack.py +0 -75
  76. KekikStream/Plugins/Shorten.py +0 -225
  77. kekikstream-1.4.4.dist-info/METADATA +0 -108
  78. kekikstream-1.4.4.dist-info/RECORD +0 -63
  79. {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info}/entry_points.txt +0 -0
  80. {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info/licenses}/LICENSE +0 -0
  81. {kekikstream-1.4.4.dist-info → kekikstream-2.0.2.dist-info}/top_level.txt +0 -0
@@ -1,65 +1,63 @@
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):
7
7
  name = "FilmMakinesi"
8
8
  language = "tr"
9
- main_url = "https://filmmakinesi.de"
9
+ main_url = "https://filmmakinesi.to"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
11
  description = "Film Makinesi, en yeni ve en güncel filmleri sitemizde full HD kalite farkı ile izleyebilirsiniz. HD film izle denildiğinde akla gelen en kaliteli film izleme sitesi."
12
12
 
13
13
  main_page = {
14
- f"{main_url}/page/" : "Son Filmler",
15
- f"{main_url}/film-izle/olmeden-izlenmesi-gerekenler/page/" : "Ölmeden İzle",
16
- f"{main_url}/film-izle/aksiyon-filmleri-izle/page/" : "Aksiyon",
17
- f"{main_url}/film-izle/bilim-kurgu-filmi-izle/page/" : "Bilim Kurgu",
18
- f"{main_url}/film-izle/macera-filmleri/page/" : "Macera",
19
- f"{main_url}/film-izle/komedi-filmi-izle/page/" : "Komedi",
20
- f"{main_url}/film-izle/romantik-filmler-izle/page/" : "Romantik",
21
- f"{main_url}/film-izle/belgesel/page/" : "Belgesel",
22
- f"{main_url}/film-izle/fantastik-filmler-izle/page/" : "Fantastik",
23
- f"{main_url}/film-izle/polisiye-filmleri-izle/page/" : "Polisiye Suç",
24
- f"{main_url}/film-izle/korku-filmleri-izle-hd/page/" : "Korku",
25
- f"{main_url}/film-izle/savas/page/" : "Tarihi ve Savaş",
26
- f"{main_url}/film-izle/gerilim-filmleri-izle/page/" : "Gerilim Heyecan",
27
- f"{main_url}/film-izle/gizemli/page/" : "Gizem",
28
- f"{main_url}/film-izle/aile-filmleri/page/" : "Aile",
29
- f"{main_url}/film-izle/animasyon-filmler/page/" : "Animasyon",
30
- f"{main_url}/film-izle/western/page/" : "Western",
31
- f"{main_url}/film-izle/biyografi/page/" : "Biyografik",
32
- f"{main_url}/film-izle/dram/page/" : "Dram",
33
- f"{main_url}/film-izle/muzik/page/" : "Müzik",
34
- f"{main_url}/film-izle/spor/page/" : "Spor"
14
+ f"{main_url}/filmler-1/" : "Son Filmler",
15
+ f"{main_url}/tur/aksiyon-fm1/film/" : "Aksiyon",
16
+ f"{main_url}/tur/aile-fm1/film/" : "Aile",
17
+ f"{main_url}/tur/animasyon-fm2/film/" : "Animasyon",
18
+ f"{main_url}/tur/belgesel/film/" : "Belgesel",
19
+ f"{main_url}/tur/biyografi/film/" : "Biyografi",
20
+ f"{main_url}/tur/bilim-kurgu-fm3/film/" : "Bilim Kurgu",
21
+ f"{main_url}/tur/dram-fm1/film/" : "Dram",
22
+ f"{main_url}/tur/fantastik-fm1/film/" : "Fantastik",
23
+ f"{main_url}/tur/gerilim-fm1/film/" : "Gerilim",
24
+ f"{main_url}/tur/gizem/film/" : "Gizem",
25
+ f"{main_url}/tur/komedi-fm1/film/" : "Komedi",
26
+ f"{main_url}/tur/korku-fm1/film/" : "Korku",
27
+ f"{main_url}/tur/macera-fm1/film/" : "Macera",
28
+ f"{main_url}/tur/muzik/film/" : "Müzik",
29
+ f"{main_url}/tur/polisiye/film/" : "Polisiye",
30
+ f"{main_url}/tur/romantik-fm1/film/" : "Romantik",
31
+ f"{main_url}/tur/savas-fm1/film/" : "Savaş",
32
+ f"{main_url}/tur/spor/film/" : "Spor",
33
+ f"{main_url}/tur/tarih/film/" : "Tarih",
34
+ f"{main_url}/tur/western-fm1/film/" : "Western"
35
35
  }
36
36
 
37
- @kekik_cache(ttl=60*60)
38
37
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
39
- istek = self.cloudscraper.get(f"{url}{page}")
38
+ istek = self.cloudscraper.get(f"{url}{'' if page == 1 else f'page/{page}/'}")
40
39
  secici = Selector(istek.text)
41
40
 
42
- veriler = secici.css("section#film_posts article") if "/film-izle/" in url else secici.css("section#film_posts div.tooltip")
41
+ veriler = secici.css("div.item-relative")
43
42
 
44
43
  return [
45
44
  MainPageResult(
46
45
  category = category,
47
- title = veri.css("h6 a::text").get(),
48
- url = self.fix_url(veri.css("h6 a::attr(href)").get()),
46
+ title = veri.css("div.title::text").get(),
47
+ url = self.fix_url(veri.css("a::attr(href)").get()),
49
48
  poster = self.fix_url(veri.css("img::attr(data-src)").get() or veri.css("img::attr(src)").get()),
50
49
  )
51
50
  for veri in veriler
52
51
  ]
53
52
 
54
- @kekik_cache(ttl=60*60)
55
53
  async def search(self, query: str) -> list[SearchResult]:
56
- istek = await self.httpx.get(f"{self.main_url}/?s={query}")
54
+ istek = await self.httpx.get(f"{self.main_url}/arama/?s={query}")
57
55
  secici = Selector(istek.text)
58
56
 
59
57
  results = []
60
- for article in secici.css("section#film_posts article"):
61
- title = article.css("h6 a::text").get()
62
- href = article.css("h6 a::attr(href)").get()
58
+ for article in secici.css("div.item-relative"):
59
+ title = article.css("div.title::text").get()
60
+ href = article.css("a::attr(href)").get()
63
61
  poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
64
62
 
65
63
  if title and href:
@@ -73,40 +71,51 @@ class FilmMakinesi(PluginBase):
73
71
 
74
72
  return results
75
73
 
76
- @kekik_cache(ttl=60*60)
77
74
  async def load_item(self, url: str) -> MovieInfo:
78
75
  istek = await self.httpx.get(url)
79
76
  secici = Selector(istek.text)
80
77
 
81
- title = secici.css("h1.single_h1 a::text").get().strip()
82
- poster = secici.css("[property='og:image']::attr(content)").get().strip()
83
- description = secici.css("section#film_single article p:last-of-type::text").get().strip()
84
- tags = secici.css("dt:contains('Tür:') + dd a::text").get().strip()
85
- rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get().strip()
86
- year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get().strip()
87
- actors = secici.css("dt:contains('Oyuncular:') + dd::text").get().strip()
88
- duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get().strip()
89
-
90
- duration_minutes = 0
91
- if duration and duration.startswith("PT") and duration.endswith("M"):
92
- duration_minutes = int(duration[2:-1])
78
+ title = secici.css("h1.title::text").get().strip()
79
+ poster = secici.css("img.cover-img::attr(src)").get().strip()
80
+ description = secici.css("div.info-description p::text").get().strip()
81
+ rating = secici.css("div.score::text").get()
82
+ if rating:
83
+ rating = rating.strip().split()[0]
84
+ year = secici.css("span.date a::text").get().strip()
85
+ actors = secici.css("div.cast-name::text").getall()
86
+ tags = secici.css("div.genre a::text").getall()
87
+ duration = secici.css("div.time::text").get()
88
+ if duration:
89
+ duration = duration.split()[1].strip()
93
90
 
94
91
  return MovieInfo(
95
92
  url = url,
96
93
  poster = self.fix_url(poster),
97
- title = title,
94
+ title = self.clean_title(title),
98
95
  description = description,
99
96
  tags = tags,
100
97
  rating = rating,
101
98
  year = year,
102
99
  actors = actors,
103
- duration = duration_minutes
100
+ duration = duration
104
101
  )
105
102
 
106
- @kekik_cache(ttl=15*60)
107
- async def load_links(self, url: str) -> list[str]:
103
+ async def load_links(self, url: str) -> list[dict]:
108
104
  istek = await self.httpx.get(url)
109
105
  secici = Selector(istek.text)
110
106
 
111
- iframe_src = secici.css("div.player-div iframe::attr(src)").get() or secici.css("div.player-div iframe::attr(data-src)").get()
112
- return [self.fix_url(iframe_src)] if iframe_src else []
107
+ iframe_src = secici.css("iframe::attr(data-src)").get()
108
+
109
+ all_links = [iframe_src] if iframe_src else []
110
+ for link in secici.css("div.video-parts a[data-video_url]"):
111
+ all_links.append(link.attrib.get("data-video_url"))
112
+
113
+ response = []
114
+ for idx, link in enumerate(all_links):
115
+ extractor = self.ex_manager.find_extractor(link)
116
+ response.append({
117
+ "url" : link,
118
+ "name" : f"{extractor.name if extractor else f'Player {idx + 1}'}",
119
+ })
120
+
121
+ return response
@@ -0,0 +1,138 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
4
+ from parsel import Selector
5
+ import re
6
+
7
+ class FilmModu(PluginBase):
8
+ name = "FilmModu"
9
+ language = "tr"
10
+ main_url = "https://www.filmmodu.ws"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
13
+
14
+ main_page = {
15
+ f"{main_url}/hd-film-kategori/4k-film-izle?page=SAYFA" : "4K",
16
+ f"{main_url}/hd-film-kategori/aile-filmleri?page=SAYFA" : "Aile",
17
+ f"{main_url}/hd-film-kategori/aksiyon?page=SAYFA" : "Aksiyon",
18
+ f"{main_url}/hd-film-kategori/animasyon?page=SAYFA" : "Animasyon",
19
+ f"{main_url}/hd-film-kategori/belgeseller?page=SAYFA" : "Belgesel",
20
+ f"{main_url}/hd-film-kategori/bilim-kurgu-filmleri?page=SAYFA" : "Bilim-Kurgu",
21
+ f"{main_url}/hd-film-kategori/dram-filmleri?page=SAYFA" : "Dram",
22
+ f"{main_url}/hd-film-kategori/fantastik-filmler?page=SAYFA" : "Fantastik",
23
+ f"{main_url}/hd-film-kategori/gerilim?page=SAYFA" : "Gerilim",
24
+ f"{main_url}/hd-film-kategori/gizem-filmleri?page=SAYFA" : "Gizem",
25
+ f"{main_url}/hd-film-kategori/hd-hint-filmleri?page=SAYFA" : "Hint Filmleri",
26
+ f"{main_url}/hd-film-kategori/kisa-film?page=SAYFA" : "Kısa Film",
27
+ f"{main_url}/hd-film-kategori/hd-komedi-filmleri?page=SAYFA" : "Komedi",
28
+ f"{main_url}/hd-film-kategori/korku-filmleri?page=SAYFA" : "Korku",
29
+ f"{main_url}/hd-film-kategori/kult-filmler-izle?page=SAYFA" : "Kült Filmler",
30
+ f"{main_url}/hd-film-kategori/macera-filmleri?page=SAYFA" : "Macera",
31
+ f"{main_url}/hd-film-kategori/muzik?page=SAYFA" : "Müzik",
32
+ f"{main_url}/hd-film-kategori/odullu-filmler-izle?page=SAYFA" : "Oscar Ödüllü",
33
+ f"{main_url}/hd-film-kategori/romantik-filmler?page=SAYFA" : "Romantik",
34
+ f"{main_url}/hd-film-kategori/savas?page=SAYFA" : "Savaş",
35
+ f"{main_url}/hd-film-kategori/stand-up?page=SAYFA" : "Stand Up",
36
+ f"{main_url}/hd-film-kategori/suc-filmleri?page=SAYFA" : "Suç",
37
+ f"{main_url}/hd-film-kategori/tarih?page=SAYFA" : "Tarih",
38
+ f"{main_url}/hd-film-kategori/tavsiye-filmler?page=SAYFA" : "Tavsiye",
39
+ f"{main_url}/hd-film-kategori/tv-film?page=SAYFA" : "TV Film",
40
+ f"{main_url}/hd-film-kategori/vahsi-bati-filmleri?page=SAYFA" : "Vahşi Batı",
41
+ }
42
+
43
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
44
+ istek = await self.httpx.get(url.replace("SAYFA", str(page)))
45
+ secici = Selector(istek.text)
46
+
47
+ return [
48
+ MainPageResult(
49
+ category = category,
50
+ title = veri.css("a::text").get(),
51
+ url = self.fix_url(veri.css("a::attr(href)").get()),
52
+ poster = self.fix_url(veri.css("picture img::attr(data-src)").get()),
53
+ )
54
+ for veri in secici.css("div.movie")
55
+ if veri.css("a::text").get()
56
+ ]
57
+
58
+ async def search(self, query: str) -> list[SearchResult]:
59
+ istek = await self.httpx.get(f"{self.main_url}/film-ara?term={query}")
60
+ secici = Selector(istek.text)
61
+
62
+ return [
63
+ SearchResult(
64
+ title = veri.css("a::text").get(),
65
+ url = self.fix_url(veri.css("a::attr(href)").get()),
66
+ poster = self.fix_url(veri.css("picture img::attr(data-src)").get()),
67
+ )
68
+ for veri in secici.css("div.movie")
69
+ if veri.css("a::text").get()
70
+ ]
71
+
72
+ async def load_item(self, url: str) -> MovieInfo:
73
+ istek = await self.httpx.get(url)
74
+ secici = Selector(istek.text)
75
+
76
+ org_title = secici.css("div.titles h1::text").get()
77
+ alt_title = secici.css("div.titles h2::text").get()
78
+ title = f"{org_title} - {alt_title}" if alt_title else org_title
79
+
80
+ return MovieInfo(
81
+ url = url,
82
+ poster = self.fix_url(secici.css("img.img-responsive::attr(src)").get()),
83
+ title = title,
84
+ description = secici.css("p[itemprop='description']::text").get(),
85
+ tags = [a.css("::text").get() for a in secici.css("a[href*='film-tur/']")],
86
+ year = secici.css("span[itemprop='dateCreated']::text").get(),
87
+ actors = [a.css("span::text").get() for a in secici.css("a[itemprop='actor']")],
88
+ )
89
+
90
+ async def load_links(self, url: str) -> list[dict]:
91
+ istek = await self.httpx.get(url)
92
+ secici = Selector(istek.text)
93
+
94
+ results = []
95
+
96
+ for alternatif in secici.css("div.alternates a"):
97
+ alt_link = self.fix_url(alternatif.css("::attr(href)").get())
98
+ alt_name = alternatif.css("::text").get()
99
+
100
+ if alt_name == "Fragman" or not alt_link:
101
+ continue
102
+
103
+ alt_istek = await self.httpx.get(alt_link)
104
+ alt_text = alt_istek.text
105
+
106
+ vid_id = re.search(r"var videoId = '(.*)'", alt_text)
107
+ vid_type = re.search(r"var videoType = '(.*)'", alt_text)
108
+
109
+ if not vid_id or not vid_type:
110
+ continue
111
+
112
+ source_istek = await self.httpx.get(
113
+ f"{self.main_url}/get-source?movie_id={vid_id[1]}&type={vid_type[1]}"
114
+ )
115
+ source_data = source_istek.json()
116
+
117
+ if source_data.get("subtitle"):
118
+ subtitle_url = self.fix_url(source_data["subtitle"])
119
+ else:
120
+ subtitle_url = None
121
+
122
+ for source in source_data.get("sources", []):
123
+ results.append({
124
+ "name" : f"{self.name} | {alt_name} | {source.get('label', 'Bilinmiyor')}",
125
+ "url" : self.fix_url(source["src"]),
126
+ "referer" : f"{self.main_url}/",
127
+ "subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
128
+ })
129
+
130
+ return results
131
+
132
+ async def play(self, **kwargs):
133
+ extract_result = ExtractResult(**kwargs)
134
+ self.media_handler.title = kwargs.get("name")
135
+ if self.name not in self.media_handler.title:
136
+ self.media_handler.title = f"{self.name} | {self.media_handler.title}"
137
+
138
+ self.media_handler.play_media(extract_result)
@@ -0,0 +1,164 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
4
+ from parsel import Selector
5
+ import re, base64
6
+
7
+ class FullHDFilm(PluginBase):
8
+ name = "FullHDFilm"
9
+ language = "tr"
10
+ main_url = "https://hdfilm.us"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Full HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
13
+
14
+ main_page = {
15
+ f"{main_url}/tur/turkce-altyazili-film-izle" : "Altyazılı Filmler",
16
+ f"{main_url}/tur/netflix-filmleri-izle" : "Netflix",
17
+ f"{main_url}/category/aile-filmleri-izle" : "Aile",
18
+ f"{main_url}/category/aksiyon-filmleri-izle" : "Aksiyon",
19
+ f"{main_url}/category/animasyon-filmleri-izle" : "Animasyon",
20
+ f"{main_url}/category/belgesel-filmleri-izle" : "Belgesel",
21
+ f"{main_url}/category/bilim-kurgu-filmleri-izle" : "Bilim-Kurgu",
22
+ f"{main_url}/category/biyografi-filmleri-izle" : "Biyografi",
23
+ f"{main_url}/category/dram-filmleri-izle" : "Dram",
24
+ f"{main_url}/category/fantastik-filmler-izle" : "Fantastik",
25
+ f"{main_url}/category/gerilim-filmleri-izle" : "Gerilim",
26
+ f"{main_url}/category/gizem-filmleri-izle" : "Gizem",
27
+ f"{main_url}/category/komedi-filmleri-izle" : "Komedi",
28
+ f"{main_url}/category/korku-filmleri-izle" : "Korku",
29
+ f"{main_url}/category/macera-filmleri-izle" : "Macera",
30
+ f"{main_url}/category/romantik-filmler-izle" : "Romantik",
31
+ f"{main_url}/category/savas-filmleri-izle" : "Savaş",
32
+ f"{main_url}/category/suc-filmleri-izle" : "Suç",
33
+ f"{main_url}/tur/yerli-film-izle" : "Yerli Film",
34
+ }
35
+
36
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
37
+ page_url = url if page == 1 else f"{url}/page/{page}"
38
+
39
+ self.httpx.headers.update({
40
+ "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
41
+ "Referer" : f"{self.main_url}/"
42
+ })
43
+
44
+ istek = await self.httpx.get(page_url)
45
+ secici = Selector(istek.text)
46
+
47
+ return [
48
+ MainPageResult(
49
+ category = category,
50
+ title = veri.css("img::attr(alt)").get(),
51
+ url = self.fix_url(veri.css("a::attr(href)").get()),
52
+ poster = self.fix_url(veri.css("img::attr(src)").get()),
53
+ )
54
+ for veri in secici.css("div.movie-poster")
55
+ if veri.css("img::attr(alt)").get()
56
+ ]
57
+
58
+ async def search(self, query: str) -> list[SearchResult]:
59
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
60
+ secici = Selector(istek.text)
61
+
62
+ return [
63
+ SearchResult(
64
+ title = veri.css("img::attr(alt)").get(),
65
+ url = self.fix_url(veri.css("a::attr(href)").get()),
66
+ poster = self.fix_url(veri.css("img::attr(src)").get()),
67
+ )
68
+ for veri in secici.css("div.movie-poster")
69
+ if veri.css("img::attr(alt)").get()
70
+ ]
71
+
72
+ async def load_item(self, url: str) -> MovieInfo:
73
+ istek = await self.httpx.get(url)
74
+ secici = Selector(istek.text)
75
+
76
+ title = secici.css("h1::text").get()
77
+ poster = self.fix_url(secici.css("div.poster img::attr(src)").get())
78
+ description = secici.css("div#details div.text::text").get() or \
79
+ secici.css("div#details div::text").get()
80
+
81
+ actors_text = secici.css("div.oyuncular.info::text").get()
82
+ if actors_text:
83
+ actors_text = actors_text.replace("Oyuncular:", "").strip()
84
+ actors = [a.strip() for a in actors_text.split(",")]
85
+ else:
86
+ actors = []
87
+
88
+ year = secici.css("div.yayin-tarihi.info::text").re_first(r"(\d{4})")
89
+ tags = secici.css("div.tur.info a::text").getall()
90
+ rating = secici.css("div.imdb::text").re_first(r"IMDb\s*([\d\.]+)")
91
+
92
+ # Açıklama usually above .others
93
+ description = secici.xpath("//div[contains(@class, 'others')]/preceding-sibling::div[1]//text()").getall()
94
+ description = "".join(description).strip() if description else None
95
+
96
+ return MovieInfo(
97
+ url = url,
98
+ poster = poster,
99
+ title = self.clean_title(title) if title else "",
100
+ description = description,
101
+ tags = tags,
102
+ year = year,
103
+ actors = actors,
104
+ rating = rating.strip() if rating else None,
105
+ )
106
+
107
+ def _get_iframe(self, source_code: str) -> str:
108
+ """Base64 kodlu iframe'i çözümle"""
109
+ match = re.search(r'<script[^>]*>(PCEtLWJhc2xpazp[^<]*)</script>', source_code)
110
+ if not match:
111
+ return ""
112
+
113
+ try:
114
+ decoded_html = base64.b64decode(match[1]).decode("utf-8")
115
+ iframe_match = re.search(r'<iframe[^>]+src=["\']([^"\']+)["\']', decoded_html)
116
+ return self.fix_url(iframe_match[1]) if iframe_match else ""
117
+ except Exception:
118
+ return ""
119
+
120
+ def _extract_subtitle_url(self, source_code: str) -> str | None:
121
+ """playerjsSubtitle değişkeninden .srt URL çıkar"""
122
+ patterns = [
123
+ r'var playerjsSubtitle = "\[Türkçe\](https?://[^\s"]+?\.srt)";',
124
+ r'var playerjsSubtitle = "(https?://[^\s"]+?\.srt)";',
125
+ r'subtitle:\s*"(https?://[^\s"]+?\.srt)"',
126
+ ]
127
+
128
+ for pattern in patterns:
129
+ if match := re.search(pattern, source_code):
130
+ return match[1]
131
+
132
+ return None
133
+
134
+ async def load_links(self, url: str) -> list[dict]:
135
+ self.httpx.headers.update({
136
+ "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
137
+ "Referer" : self.main_url
138
+ })
139
+
140
+ istek = await self.httpx.get(url)
141
+ source_code = istek.text
142
+
143
+ # Ana sayfadan altyazı URL'sini çek
144
+ subtitle_url = self._extract_subtitle_url(source_code)
145
+
146
+ # Iframe'den altyazı URL'sini çek
147
+ iframe_src = self._get_iframe(source_code)
148
+
149
+ if not subtitle_url and iframe_src:
150
+ iframe_istek = await self.httpx.get(iframe_src)
151
+ subtitle_url = self._extract_subtitle_url(iframe_istek.text)
152
+
153
+ results = []
154
+
155
+ if iframe_src:
156
+ extractor = self.ex_manager.find_extractor(iframe_src)
157
+ results.append({
158
+ "name" : extractor.name if extractor else "FullHDFilm Player",
159
+ "url" : iframe_src,
160
+ "referer" : self.main_url,
161
+ "subtitles" : [Subtitle(name="Türkçe", url=subtitle_url)] if subtitle_url else []
162
+ })
163
+
164
+ return results
@@ -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
@@ -8,40 +8,38 @@ import json, re
8
8
  class FullHDFilmizlesene(PluginBase):
9
9
  name = "FullHDFilmizlesene"
10
10
  language = "tr"
11
- main_url = "https://www.fullhdfilmizlesene.de"
11
+ main_url = "https://www.fullhdfilmizlesene.tv"
12
12
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
13
  description = "Sinema zevkini evinize kadar getirdik. Türkiye'nin lider Film sitesinde, en yeni filmleri Full HD izleyin."
14
14
 
15
15
  main_page = {
16
- f"{main_url}/en-cok-izlenen-filmler-izle-hd/" : "En Çok izlenen Filmler",
17
- f"{main_url}/filmizle/imdb-puani-yuksek-filmler-izle-1/" : "IMDB Puanı Yüksek Filmler",
18
- f"{main_url}/filmizle/aile-filmleri-izle-2/" : "Aile Filmleri",
19
- f"{main_url}/filmizle/aksiyon-filmler-izle-1/" : "Aksiyon Filmleri",
20
- f"{main_url}/filmizle/animasyon-filmleri-izle-4/" : "Animasyon Filmleri",
21
- f"{main_url}/filmizle/belgesel-filmleri-izle-2/" : "Belgeseller",
22
- f"{main_url}/filmizle/bilim-kurgu-filmleri-izle-1/" : "Bilim Kurgu Filmleri",
23
- f"{main_url}/filmizle/bluray-filmler-izle-1/" : "Blu Ray Filmler",
24
- f"{main_url}/filmizle/cizgi-filmler-izle-1/" : "Çizgi Filmler",
25
- f"{main_url}/filmizle/dram-filmleri-izle/" : "Dram Filmleri",
26
- f"{main_url}/filmizle/fantastik-filmleri-izle-2/" : "Fantastik Filmler",
27
- f"{main_url}/filmizle/gerilim-filmleri-izle-3/" : "Gerilim Filmleri",
28
- f"{main_url}/filmizle/gizem-filmleri-izle/" : "Gizem Filmleri",
29
- f"{main_url}/filmizle/hint-filmler-fh-hd-izle/" : "Hint Filmleri",
30
- f"{main_url}/filmizle/komedi-filmleri-izle-2/" : "Komedi Filmleri",
31
- f"{main_url}/filmizle/korku-filmleri-izle-2/" : "Korku Filmleri",
32
- f"{main_url}/filmizle/macera-filmleri-izle-1/" : "Macera Filmleri",
33
- f"{main_url}/filmizle/muzikal-filmleri-izle/" : "Müzikal Filmler",
34
- f"{main_url}/filmizle/polisiye-filmleri-izle-1/" : "Polisiye Filmleri",
35
- f"{main_url}/filmizle/psikolojik-filmleri-izle/" : "Psikolojik Filmler",
36
- f"{main_url}/filmizle/romantik-filmler-izle-1/" : "Romantik Filmler",
37
- f"{main_url}/filmizle/savas-filmleri-izle-2/" : "Savaş Filmleri",
38
- f"{main_url}/filmizle/suc-filmleri-izle-3/" : "Suç Filmleri",
39
- f"{main_url}/filmizle/tarih-filmleri-izle/" : "Tarih Filmleri",
40
- f"{main_url}/filmizle/western-filmleri-izle/" : "Western Filmler",
41
- f"{main_url}/filmizle/yerli-filmler-izle-3/" : "Yerli Filmler",
16
+ f"{main_url}/en-cok-izlenen-hd-filmler/" : "En Çok izlenen Filmler",
17
+ f"{main_url}/filmizle/aile-filmleri-hdf-izle/" : "Aile Filmleri",
18
+ f"{main_url}/filmizle/aksiyon-filmleri-hdf-izle/" : "Aksiyon Filmleri",
19
+ f"{main_url}/filmizle/animasyon-filmleri-izle/" : "Animasyon Filmleri",
20
+ f"{main_url}/filmizle/belgesel-filmleri-izle/" : "Belgeseller",
21
+ f"{main_url}/filmizle/bilim-kurgu-filmleri-izle-2/" : "Bilim Kurgu Filmleri",
22
+ f"{main_url}/filmizle/bluray-filmler-izle/" : "Blu Ray Filmler",
23
+ f"{main_url}/filmizle/cizgi-filmler-fhd-izle/" : "Çizgi Filmler",
24
+ f"{main_url}/filmizle/dram-filmleri-hd-izle/" : "Dram Filmleri",
25
+ f"{main_url}/filmizle/fantastik-filmler-hd-izle/" : "Fantastik Filmler",
26
+ f"{main_url}/filmizle/gerilim-filmleri-fhd-izle/" : "Gerilim Filmleri",
27
+ f"{main_url}/filmizle/gizem-filmleri-hd-izle/" : "Gizem Filmleri",
28
+ f"{main_url}/filmizle/hint-filmleri-fhd-izle/" : "Hint Filmleri",
29
+ f"{main_url}/filmizle/komedi-filmleri-fhd-izle/" : "Komedi Filmleri",
30
+ f"{main_url}/filmizle/korku-filmleri-izle-3/" : "Korku Filmleri",
31
+ f"{main_url}/filmizle/macera-filmleri-fhd-izle/" : "Macera Filmleri",
32
+ f"{main_url}/filmizle/muzikal-filmler-izle/" : "Müzikal Filmler",
33
+ f"{main_url}/filmizle/polisiye-filmleri-izle/" : "Polisiye Filmleri",
34
+ f"{main_url}/filmizle/psikolojik-filmler-izle/" : "Psikolojik Filmler",
35
+ f"{main_url}/filmizle/romantik-filmler-fhd-izle/" : "Romantik Filmler",
36
+ f"{main_url}/filmizle/savas-filmleri-fhd-izle/" : "Savaş Filmleri",
37
+ f"{main_url}/filmizle/suc-filmleri-izle/" : "Suç Filmleri",
38
+ f"{main_url}/filmizle/tarih-filmleri-fhd-izle/" : "Tarih Filmleri",
39
+ f"{main_url}/filmizle/western-filmler-hd-izle-3/" : "Western Filmler",
40
+ f"{main_url}/filmizle/yerli-filmler-hd-izle/" : "Yerli Filmler"
42
41
  }
43
42
 
44
- @kekik_cache(ttl=60*60)
45
43
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
46
44
  istek = self.cloudscraper.get(f"{url}{page}")
47
45
  secici = Selector(istek.text)
@@ -56,7 +54,6 @@ class FullHDFilmizlesene(PluginBase):
56
54
  for veri in secici.css("li.film")
57
55
  ]
58
56
 
59
- @kekik_cache(ttl=60*60)
60
57
  async def search(self, query: str) -> list[SearchResult]:
61
58
  istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
62
59
  secici = Selector(istek.text)
@@ -78,7 +75,6 @@ class FullHDFilmizlesene(PluginBase):
78
75
 
79
76
  return results
80
77
 
81
- @kekik_cache(ttl=60*60)
82
78
  async def load_item(self, url: str) -> MovieInfo:
83
79
  istek = await self.httpx.get(url)
84
80
  secici = Selector(istek.text)
@@ -104,8 +100,7 @@ class FullHDFilmizlesene(PluginBase):
104
100
  duration = duration
105
101
  )
106
102
 
107
- @kekik_cache(ttl=15*60)
108
- async def load_links(self, url: str) -> list[str]:
103
+ async def load_links(self, url: str) -> list[dict]:
109
104
  istek = await self.httpx.get(url)
110
105
  secici = Selector(istek.text)
111
106
 
@@ -121,7 +116,13 @@ class FullHDFilmizlesene(PluginBase):
121
116
  if isinstance(t, dict):
122
117
  link_list.extend(StringCodec.decode(v) for k, v in t.items())
123
118
 
124
- return [
125
- f"https:{link}" if link.startswith("//") else link
126
- for link in link_list
127
- ]
119
+ response = []
120
+ for link in link_list:
121
+ link = f"https:{link}" if link.startswith("//") else link
122
+ extractor = self.ex_manager.find_extractor(link)
123
+ response.append({
124
+ "url" : link,
125
+ "name" : extractor.name if extractor else "Direct Link"
126
+ })
127
+
128
+ return response