KekikStream 1.3.1__tar.gz → 1.3.3__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 (70) hide show
  1. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Media/MediaHandler.py +4 -4
  2. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/CloseLoad.py +0 -1
  3. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/FilmMakinesi.py +1 -1
  4. kekikstream-1.3.3/KekikStream/Plugins/FullHDFilmizlesene.py +127 -0
  5. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/HDFilmCehennemi.py +38 -3
  6. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/JetFilmizle.py +32 -4
  7. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/RecTV.py +41 -6
  8. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/SezonlukDizi.py +3 -3
  9. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/Shorten.py +3 -3
  10. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/SineWix.py +4 -4
  11. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/UgurFilm.py +3 -3
  12. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream.egg-info/PKG-INFO +1 -1
  13. {kekikstream-1.3.1 → kekikstream-1.3.3}/PKG-INFO +1 -1
  14. {kekikstream-1.3.1 → kekikstream-1.3.3}/setup.py +1 -1
  15. kekikstream-1.3.1/KekikStream/Plugins/FullHDFilmizlesene.py +0 -80
  16. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/CLI/__init__.py +0 -0
  17. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/CLI/pypi_kontrol.py +0 -0
  18. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  19. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  20. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  21. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  22. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Media/MediaManager.py +0 -0
  23. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  24. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  25. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  26. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  27. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/UI/UIManager.py +0 -0
  28. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Core/__init__.py +0 -0
  29. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/ContentX.py +0 -0
  30. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/FourCX.py +0 -0
  31. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/FourPichive.py +0 -0
  32. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/FourPlayRu.py +0 -0
  33. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/HDStreamAble.py +0 -0
  34. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/Hotlinger.py +0 -0
  35. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/MailRu.py +0 -0
  36. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/MixPlayHD.py +0 -0
  37. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/MolyStream.py +0 -0
  38. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  39. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  40. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/OkRuSSL.py +0 -0
  41. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  42. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/Pichive.py +0 -0
  43. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/PixelDrain.py +0 -0
  44. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/PlayRu.py +0 -0
  45. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/RapidVid.py +0 -0
  46. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/SibNet.py +0 -0
  47. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  48. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/TRsTX.py +0 -0
  49. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/TauVideo.py +0 -0
  50. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/TurboImgz.py +0 -0
  51. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/VidMoly.py +0 -0
  52. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/VidMolyMe.py +0 -0
  53. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/VidMoxy.py +0 -0
  54. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Extractors/VideoSeyred.py +0 -0
  55. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Helpers/Unpack.py +0 -0
  56. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/DiziBox.py +0 -0
  57. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/DiziYou.py +0 -0
  58. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/Plugins/Dizilla.py +0 -0
  59. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/__init__.py +0 -0
  60. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/__main__.py +0 -0
  61. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream/requirements.txt +0 -0
  62. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream.egg-info/SOURCES.txt +0 -0
  63. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream.egg-info/dependency_links.txt +0 -0
  64. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream.egg-info/entry_points.txt +0 -0
  65. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream.egg-info/requires.txt +0 -0
  66. {kekikstream-1.3.1 → kekikstream-1.3.3}/KekikStream.egg-info/top_level.txt +0 -0
  67. {kekikstream-1.3.1 → kekikstream-1.3.3}/LICENSE +0 -0
  68. {kekikstream-1.3.1 → kekikstream-1.3.3}/MANIFEST.in +0 -0
  69. {kekikstream-1.3.1 → kekikstream-1.3.3}/README.md +0 -0
  70. {kekikstream-1.3.1 → kekikstream-1.3.3}/setup.cfg +0 -0
@@ -123,11 +123,11 @@ class MediaHandler:
123
123
  subprocess.run(mpv_command, stdin=ytdlp_proc.stdout, check=True)
124
124
 
125
125
  except subprocess.CalledProcessError as hata:
126
- print(f"[red]Oynatma hatası: {hata}[/red]")
127
- print({"title": self.title, "url": extract_data.url, "headers": self.headers})
126
+ konsol.print(f"[red]Oynatma hatası: {hata}[/red]")
127
+ konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
128
128
  except FileNotFoundError:
129
- print("[red]yt-dlp veya mpv bulunamadı! Kurulumlarından emin olun.[/red]")
130
- print({"title": self.title, "url": extract_data.url, "headers": self.headers})
129
+ konsol.print("[red]yt-dlp veya mpv bulunamadı! Kurulumlarından emin olun.[/red]")
130
+ konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
131
131
 
132
132
  def play_with_android_mxplayer(self, extract_data: ExtractResult):
133
133
  konsol.log(f"[yellow][»] MxPlayer ile Oynatılıyor : {extract_data.url}")
@@ -36,7 +36,6 @@ class CloseLoadExtractor(ExtractorBase):
36
36
 
37
37
  eval_func = re.compile(r'\s*(eval\(function[\s\S].*)\s*').findall(istek.text)[0]
38
38
  m3u_link = get_m3u_link(extract_data(unpack(eval_func)))
39
- print(m3u_link)
40
39
 
41
40
  await self.close()
42
41
  return ExtractResult(
@@ -8,7 +8,7 @@ class FilmMakinesi(PluginBase):
8
8
  language = "tr"
9
9
  main_url = "https://filmmakinesi.de"
10
10
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
- description = "Diziyou en kaliteli Türkçe dublaj ve altyazılı yabancı dizi izleme sitesidir. Güncel ve efsanevi dizileri 1080p Full HD kalitede izlemek için hemen tıkla!"
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
14
  f"{main_url}/page/" : "Son Filmler",
@@ -0,0 +1,127 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
4
+ from parsel import Selector
5
+ from Kekik.Sifreleme import StringCodec
6
+ import json, re
7
+
8
+ class FullHDFilmizlesene(PluginBase):
9
+ name = "FullHDFilmizlesene"
10
+ language = "tr"
11
+ main_url = "https://www.fullhdfilmizlesene.de"
12
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
+ description = "Sinema zevkini evinize kadar getirdik. Türkiye'nin lider Film sitesinde, en yeni filmleri Full HD izleyin."
14
+
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",
42
+ }
43
+
44
+ @kekik_cache(ttl=60*60)
45
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
46
+ istek = self.cloudscraper.get(f"{url}{page}")
47
+ secici = Selector(istek.text)
48
+
49
+ return [
50
+ MainPageResult(
51
+ category = category,
52
+ title = veri.css("span.film-title::text").get(),
53
+ url = self.fix_url(veri.css("a::attr(href)").get()),
54
+ poster = self.fix_url(veri.css("img::attr(data-src)").get()),
55
+ )
56
+ for veri in secici.css("li.film")
57
+ ]
58
+
59
+ @kekik_cache(ttl=60*60)
60
+ async def search(self, query: str) -> list[SearchResult]:
61
+ istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
62
+ secici = Selector(istek.text)
63
+
64
+ results = []
65
+ for film in secici.css("li.film"):
66
+ title = film.css("span.film-title::text").get()
67
+ href = film.css("a::attr(href)").get()
68
+ poster = film.css("img::attr(data-src)").get()
69
+
70
+ if title and href:
71
+ results.append(
72
+ SearchResult(
73
+ title = title.strip(),
74
+ url = self.fix_url(href.strip()),
75
+ poster = self.fix_url(poster.strip()) if poster else None,
76
+ )
77
+ )
78
+
79
+ return results
80
+
81
+ @kekik_cache(ttl=60*60)
82
+ async def load_item(self, url: str) -> MovieInfo:
83
+ istek = await self.httpx.get(url)
84
+ secici = Selector(istek.text)
85
+
86
+ title = secici.xpath("normalize-space(//div[@class='izle-titles'])").get().strip()
87
+ poster = secici.css("div img::attr(data-src)").get().strip()
88
+ description = secici.css("div.ozet-ic p::text").get().strip()
89
+ tags = secici.css("a[rel='category tag']::text").getall()
90
+ rating = secici.xpath("normalize-space(//div[@class='puanx-puan'])").get().split()[-1]
91
+ year = secici.css("div.dd a.category::text").get().strip().split()[0]
92
+ actors = secici.css("div.film-info ul li:nth-child(2) a > span::text").getall()
93
+ duration = secici.css("span.sure::text").get("0 Dakika").split()[0]
94
+
95
+ return MovieInfo(
96
+ url = url,
97
+ poster = self.fix_url(poster),
98
+ title = title,
99
+ description = description,
100
+ tags = tags,
101
+ rating = rating,
102
+ year = year,
103
+ actors = actors,
104
+ duration = duration
105
+ )
106
+
107
+ @kekik_cache(ttl=15*60)
108
+ async def load_links(self, url: str) -> list[str]:
109
+ istek = await self.httpx.get(url)
110
+ secici = Selector(istek.text)
111
+
112
+ script = secici.xpath("(//script)[1]").get()
113
+ scx_data = json.loads(re.findall(r"scx = (.*?);", script)[0])
114
+ scx_keys = list(scx_data.keys())
115
+
116
+ link_list = []
117
+ for key in scx_keys:
118
+ t = scx_data[key]["sx"]["t"]
119
+ if isinstance(t, list):
120
+ link_list.extend(StringCodec.decode(elem) for elem in t)
121
+ if isinstance(t, dict):
122
+ link_list.extend(StringCodec.decode(v) for k, v in t.items())
123
+
124
+ return [
125
+ f"https:{link}" if link.startswith("//") else link
126
+ for link in link_list
127
+ ]
@@ -1,12 +1,47 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, SearchResult, MovieInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, Subtitle
4
4
  from parsel import Selector
5
5
  import random, string
6
6
 
7
7
  class HDFilmCehennemi(PluginBase):
8
- name = "HDFilmCehennemi"
9
- main_url = "https://www.hdfilmcehennemi.nl"
8
+ name = "HDFilmCehennemi"
9
+ language = "tr"
10
+ main_url = "https://www.hdfilmcehennemi.nl"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ description = "Türkiye'nin en hızlı hd film izleme sitesi"
13
+
14
+ main_page = {
15
+ f"{main_url}" : "Yeni Eklenen Filmler",
16
+ f"{main_url}/yabancidiziizle-2" : "Yeni Eklenen Diziler",
17
+ f"{main_url}/category/tavsiye-filmler-izle2" : "Tavsiye Filmler",
18
+ f"{main_url}/imdb-7-puan-uzeri-filmler" : "IMDB 7+ Filmler",
19
+ f"{main_url}/en-cok-yorumlananlar-1" : "En Çok Yorumlananlar",
20
+ f"{main_url}/en-cok-begenilen-filmleri-izle" : "En Çok Beğenilenler",
21
+ f"{main_url}/tur/aile-filmleri-izleyin-6" : "Aile Filmleri",
22
+ f"{main_url}/tur/aksiyon-filmleri-izleyin-3" : "Aksiyon Filmleri",
23
+ f"{main_url}/tur/animasyon-filmlerini-izleyin-4" : "Animasyon Filmleri",
24
+ f"{main_url}/tur/belgesel-filmlerini-izle-1" : "Belgesel Filmleri",
25
+ f"{main_url}/tur/bilim-kurgu-filmlerini-izleyin-2" : "Bilim Kurgu Filmleri",
26
+ f"{main_url}/tur/komedi-filmlerini-izleyin-1" : "Komedi Filmleri",
27
+ f"{main_url}/tur/korku-filmlerini-izle-2/" : "Korku Filmleri",
28
+ f"{main_url}/tur/romantik-filmleri-izle-1" : "Romantik Filmleri"
29
+ }
30
+
31
+ @kekik_cache(ttl=60*60)
32
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
33
+ istek = await self.httpx.get(f"{url}")
34
+ secici = Selector(istek.text)
35
+
36
+ return [
37
+ MainPageResult(
38
+ category = category,
39
+ title = veri.css("strong.poster-title::text").get(),
40
+ url = self.fix_url(veri.css("::attr(href)").get()),
41
+ poster = self.fix_url(veri.css("img::attr(data-src)").get()),
42
+ )
43
+ for veri in secici.css("div.section-content a.poster")
44
+ ]
10
45
 
11
46
  @kekik_cache(ttl=60*60)
12
47
  async def search(self, query: str) -> list[SearchResult]:
@@ -1,11 +1,38 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, SearchResult, MovieInfo
3
+ from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
4
4
  from parsel import Selector
5
5
 
6
6
  class JetFilmizle(PluginBase):
7
- name = "JetFilmizle"
8
- main_url = "https://jetfilmizle.io"
7
+ name = "JetFilmizle"
8
+ language = "tr"
9
+ main_url = "https://jetfilmizle.io"
10
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
11
+ description = "Binlerce Film İzleme Seçeneğiyle En İyi Film İzleme Sitesi"
12
+
13
+ main_page = {
14
+ f"{main_url}/page/" : "Son Filmler",
15
+ f"{main_url}/netflix/page/" : "Netflix",
16
+ f"{main_url}/editorun-secimi/page/" : "Editörün Seçimi",
17
+ f"{main_url}/turk-film-izle/page/" : "Türk Filmleri",
18
+ f"{main_url}/cizgi-filmler-izle/page/" : "Çizgi Filmler",
19
+ f"{main_url}/kategoriler/yesilcam-filmleri-izlee/page/" : "Yeşilçam Filmleri"
20
+ }
21
+
22
+ @kekik_cache(ttl=60*60)
23
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
24
+ istek = await self.httpx.get(f"{url}{page}")
25
+ secici = Selector(istek.text)
26
+
27
+ return [
28
+ MainPageResult(
29
+ category = category,
30
+ title = self.clean_title(veri.css("h2 a::text, h3 a::text, h4 a::text, h5 a::text, h6 a::text").get()),
31
+ url = self.fix_url(veri.css("a::attr(href)").get()),
32
+ poster = self.fix_url(veri.css("img::attr(data-src)").get() or veri.css("img::attr(src)").get()),
33
+ )
34
+ for veri in secici.css("article.movie")
35
+ ]
9
36
 
10
37
  @kekik_cache(ttl=60*60)
11
38
  async def search(self, query: str) -> list[SearchResult]:
@@ -43,7 +70,8 @@ class JetFilmizle(PluginBase):
43
70
  description = secici.css("section.movie-exp p.aciklama::text").get().strip()
44
71
  tags = secici.css("section.movie-exp div.catss a::text").getall()
45
72
  rating = secici.css("section.movie-exp div.imdb_puan span::text").get().strip()
46
- year = secici.xpath("//div[@class='yap' and (contains(., 'Vizyon') or contains(., 'Yapım'))]/text()").get().strip()
73
+ year = secici.xpath("//div[@class='yap' and (contains(., 'Vizyon') or contains(., 'Yapım'))]/text()").get()
74
+ year = year.strip() if year else None
47
75
  actors = secici.css("div[itemprop='actor'] a span::text").getall()
48
76
 
49
77
  return MovieInfo(
@@ -1,19 +1,54 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.Core import kekik_cache, PluginBase, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
3
+ from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, ExtractResult, Subtitle
4
4
  from httpx import AsyncClient
5
5
  from json import dumps, loads
6
6
  import re
7
7
 
8
8
  class RecTV(PluginBase):
9
- name = "RecTV"
10
- main_url = "https://a.prectv35.sbs"
9
+ name = "RecTV"
10
+ language = "tr"
11
+ main_url = "https://a.prectv35.sbs"
12
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
+ description = "RecTv APK, Türkiye’deki en popüler Çevrimiçi Medya Akış platformlarından biridir. Filmlerin, Canlı Sporların, Web Dizilerinin ve çok daha fazlasının keyfini ücretsiz çıkarın."
11
14
 
12
15
  sw_key = "4F5A9C3D9A86FA54EACEDDD635185/c3c5bd17-e37b-4b94-a944-8a3688a30452"
13
16
  http2 = AsyncClient(http2=True)
14
17
  http2.headers.update({"user-agent": "okhttp/4.12.0"})
15
18
 
16
- kekik_cache(ttl=60*60)
19
+ main_page = {
20
+ f"{main_url}/api/channel/by/filtres/0/0/SAYFA/{sw_key}/" : "Canlı",
21
+ f"{main_url}/api/movie/by/filtres/0/created/SAYFA/{sw_key}/" : "Son Filmler",
22
+ f"{main_url}/api/serie/by/filtres/0/created/SAYFA/{sw_key}/" : "Son Diziler",
23
+ f"{main_url}/api/movie/by/filtres/14/created/SAYFA/{sw_key}/" : "Aile",
24
+ f"{main_url}/api/movie/by/filtres/1/created/SAYFA/{sw_key}/" : "Aksiyon",
25
+ f"{main_url}/api/movie/by/filtres/13/created/SAYFA/{sw_key}/" : "Animasyon",
26
+ f"{main_url}/api/movie/by/filtres/19/created/SAYFA/{sw_key}/" : "Belgesel",
27
+ f"{main_url}/api/movie/by/filtres/4/created/SAYFA/{sw_key}/" : "Bilim Kurgu",
28
+ f"{main_url}/api/movie/by/filtres/2/created/SAYFA/{sw_key}/" : "Dram",
29
+ f"{main_url}/api/movie/by/filtres/10/created/SAYFA/{sw_key}/" : "Fantastik",
30
+ f"{main_url}/api/movie/by/filtres/3/created/SAYFA/{sw_key}/" : "Komedi",
31
+ f"{main_url}/api/movie/by/filtres/8/created/SAYFA/{sw_key}/" : "Korku",
32
+ f"{main_url}/api/movie/by/filtres/17/created/SAYFA/{sw_key}/" : "Macera",
33
+ f"{main_url}/api/movie/by/filtres/5/created/SAYFA/{sw_key}/" : "Romantik"
34
+ }
35
+
36
+ @kekik_cache(ttl=60*60)
37
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
38
+ istek = await self.httpx.get(f"{url.replace('SAYFA', str(int(page) - 1))}")
39
+ veriler = istek.json()
40
+
41
+ return [
42
+ MainPageResult(
43
+ category = category,
44
+ title = self.clean_title(veri.get("title")),
45
+ url = dumps(veri),
46
+ poster = self.fix_url(veri.get("image")),
47
+ )
48
+ for veri in veriler
49
+ ]
50
+
51
+ @kekik_cache(ttl=60*60)
17
52
  async def search(self, query: str) -> list[SearchResult]:
18
53
  self.media_handler.headers.update({"User-Agent": "googleusercontent"})
19
54
 
@@ -35,7 +70,7 @@ class RecTV(PluginBase):
35
70
  for veri in tum_veri
36
71
  ]
37
72
 
38
- kekik_cache(ttl=60*60)
73
+ @kekik_cache(ttl=60*60)
39
74
  async def load_item(self, url: str) -> MovieInfo:
40
75
  veri = loads(url)
41
76
 
@@ -86,7 +121,7 @@ class RecTV(PluginBase):
86
121
  actors = []
87
122
  )
88
123
 
89
- kekik_cache(ttl=15*60)
124
+ @kekik_cache(ttl=15*60)
90
125
  async def load_links(self, url: str) -> list[str]:
91
126
  try:
92
127
  veri = loads(url)
@@ -7,7 +7,7 @@ class SezonlukDizi(PluginBase):
7
7
  name = "SezonlukDizi"
8
8
  main_url = "https://sezonlukdizi6.com"
9
9
 
10
- kekik_cache(ttl=60*60)
10
+ @kekik_cache(ttl=60*60)
11
11
  async def search(self, query: str) -> list[SearchResult]:
12
12
  istek = await self.httpx.get(f"{self.main_url}/diziler.asp?adi={query}")
13
13
  secici = Selector(istek.text)
@@ -21,7 +21,7 @@ class SezonlukDizi(PluginBase):
21
21
  for afis in secici.css("div.afis a.column")
22
22
  ]
23
23
 
24
- kekik_cache(ttl=60*60)
24
+ @kekik_cache(ttl=60*60)
25
25
  async def load_item(self, url: str) -> SeriesInfo:
26
26
  istek = await self.httpx.get(url)
27
27
  secici = Selector(istek.text)
@@ -73,7 +73,7 @@ class SezonlukDizi(PluginBase):
73
73
  actors = actors
74
74
  )
75
75
 
76
- kekik_cache(ttl=15*60)
76
+ @kekik_cache(ttl=15*60)
77
77
  async def load_links(self, url: str) -> list[str]:
78
78
  istek = await self.httpx.get(url)
79
79
  secici = Selector(istek.text)
@@ -155,7 +155,7 @@ class Shorten(PluginBase):
155
155
 
156
156
  return veriler["data"]
157
157
 
158
- kekik_cache(ttl=60*60)
158
+ @kekik_cache(ttl=60*60)
159
159
  async def search(self, query: str) -> list[SearchResult]:
160
160
  veriler = await self.raw_diziler()
161
161
 
@@ -168,7 +168,7 @@ class Shorten(PluginBase):
168
168
  for veri in veriler
169
169
  ]
170
170
 
171
- kekik_cache(ttl=60*60)
171
+ @kekik_cache(ttl=60*60)
172
172
  async def load_item(self, url: str) -> MovieInfo:
173
173
  veri = await self.bolumler(url)
174
174
 
@@ -205,7 +205,7 @@ class Shorten(PluginBase):
205
205
  episodes = episodes,
206
206
  )
207
207
 
208
- kekik_cache(ttl=15*60)
208
+ @kekik_cache(ttl=15*60)
209
209
  async def load_links(self, url: str) -> list[str]:
210
210
  return [url]
211
211
 
@@ -34,7 +34,7 @@ class SineWix(PluginBase):
34
34
  f"{main_url}/sinewix/movies/36" : "Tarih",
35
35
  }
36
36
 
37
- kekik_cache(ttl=60*60)
37
+ @kekik_cache(ttl=60*60)
38
38
  async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
39
39
  istek = await self.httpx.get(f"{url}/{page}")
40
40
  veriler = istek.json()
@@ -49,7 +49,7 @@ class SineWix(PluginBase):
49
49
  for veri in veriler.get("data")
50
50
  ]
51
51
 
52
- kekik_cache(ttl=60*60)
52
+ @kekik_cache(ttl=60*60)
53
53
  async def search(self, query: str) -> list[SearchResult]:
54
54
  istek = await self.httpx.get(f"{self.main_url}/sinewix/search/{query}")
55
55
 
@@ -62,7 +62,7 @@ class SineWix(PluginBase):
62
62
  for veri in istek.json().get("search")
63
63
  ]
64
64
 
65
- kekik_cache(ttl=60*60)
65
+ @kekik_cache(ttl=60*60)
66
66
  async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
67
67
  item_type = url.split("?type=")[-1].split("&id=")[0]
68
68
  item_id = url.split("&id=")[-1]
@@ -125,7 +125,7 @@ class SineWix(PluginBase):
125
125
  episodes = episodes,
126
126
  )
127
127
 
128
- kekik_cache(ttl=15*60)
128
+ @kekik_cache(ttl=15*60)
129
129
  async def load_links(self, url: str) -> list[str]:
130
130
  if not url.startswith(self.main_url):
131
131
  return [url]
@@ -7,7 +7,7 @@ class UgurFilm(PluginBase):
7
7
  name = "UgurFilm"
8
8
  main_url = "https://ugurfilm8.com"
9
9
 
10
- kekik_cache(ttl=60*60)
10
+ @kekik_cache(ttl=60*60)
11
11
  async def search(self, query: str) -> list[SearchResult]:
12
12
  istek = await self.httpx.get(f"{self.main_url}/?s={query}")
13
13
  secici = Selector(istek.text)
@@ -29,7 +29,7 @@ class UgurFilm(PluginBase):
29
29
 
30
30
  return results
31
31
 
32
- kekik_cache(ttl=60*60)
32
+ @kekik_cache(ttl=60*60)
33
33
  async def load_item(self, url: str) -> MovieInfo:
34
34
  istek = await self.httpx.get(url)
35
35
  secici = Selector(istek.text)
@@ -51,7 +51,7 @@ class UgurFilm(PluginBase):
51
51
  actors = actors,
52
52
  )
53
53
 
54
- kekik_cache(ttl=15*60)
54
+ @kekik_cache(ttl=15*60)
55
55
  async def load_links(self, url: str) -> list[str]:
56
56
  istek = await self.httpx.get(url)
57
57
  secici = Selector(istek.text)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: terminal üzerinden medya içeriği aramanızı ve VLC/MPV gibi popüler medya oynatıcılar aracılığıyla doğrudan izlemenizi sağlayan modüler ve genişletilebilir bir bıdı bıdı
5
5
  Home-page: https://github.com/keyiflerolsun/KekikStream
6
6
  Author: keyiflerolsun
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.3.1
3
+ Version: 1.3.3
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.3.1",
9
+ version = "1.3.3",
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,80 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from KekikStream.Core import kekik_cache, PluginBase, SearchResult, MovieInfo
4
- from parsel import Selector
5
- from Kekik.Sifreleme import StringCodec
6
- import json, re
7
-
8
- class FullHDFilmizlesene(PluginBase):
9
- name = "FullHDFilmizlesene"
10
- main_url = "https://www.fullhdfilmizlesene.de"
11
-
12
- @kekik_cache(ttl=60*60)
13
- async def search(self, query: str) -> list[SearchResult]:
14
- istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
15
- secici = Selector(istek.text)
16
-
17
- results = []
18
- for film in secici.css("li.film"):
19
- title = film.css("span.film-title::text").get()
20
- href = film.css("a::attr(href)").get()
21
- poster = film.css("img::attr(data-src)").get()
22
-
23
- if title and href:
24
- results.append(
25
- SearchResult(
26
- title = title.strip(),
27
- url = self.fix_url(href.strip()),
28
- poster = self.fix_url(poster.strip()) if poster else None,
29
- )
30
- )
31
-
32
- return results
33
-
34
- @kekik_cache(ttl=60*60)
35
- async def load_item(self, url: str) -> MovieInfo:
36
- istek = await self.httpx.get(url)
37
- secici = Selector(istek.text)
38
-
39
- title = secici.xpath("normalize-space(//div[@class='izle-titles'])").get().strip()
40
- poster = secici.css("div img::attr(data-src)").get().strip()
41
- description = secici.css("div.ozet-ic p::text").get().strip()
42
- tags = secici.css("a[rel='category tag']::text").getall()
43
- rating = secici.xpath("normalize-space(//div[@class='puanx-puan'])").get().split()[-1]
44
- year = secici.css("div.dd a.category::text").get().strip().split()[0]
45
- actors = secici.css("div.film-info ul li:nth-child(2) a > span::text").getall()
46
- duration = secici.css("span.sure::text").get("0 Dakika").split()[0]
47
-
48
- return MovieInfo(
49
- url = url,
50
- poster = self.fix_url(poster),
51
- title = title,
52
- description = description,
53
- tags = tags,
54
- rating = rating,
55
- year = year,
56
- actors = actors,
57
- duration = duration
58
- )
59
-
60
- @kekik_cache(ttl=15*60)
61
- async def load_links(self, url: str) -> list[str]:
62
- istek = await self.httpx.get(url)
63
- secici = Selector(istek.text)
64
-
65
- script = secici.xpath("(//script)[1]").get()
66
- scx_data = json.loads(re.findall(r"scx = (.*?);", script)[0])
67
- scx_keys = list(scx_data.keys())
68
-
69
- link_list = []
70
- for key in scx_keys:
71
- t = scx_data[key]["sx"]["t"]
72
- if isinstance(t, list):
73
- link_list.extend(StringCodec.decode(elem) for elem in t)
74
- if isinstance(t, dict):
75
- link_list.extend(StringCodec.decode(v) for k, v in t.items())
76
-
77
- return [
78
- f"https:{link}" if link.startswith("//") else link
79
- for link in link_list
80
- ]
File without changes
File without changes
File without changes
File without changes