KekikStream 1.3.0__tar.gz → 1.3.2__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 (72) hide show
  1. kekikstream-1.3.2/KekikStream/Extractors/CloseLoad.py +47 -0
  2. kekikstream-1.3.2/KekikStream/Helpers/Unpack.py +75 -0
  3. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/DiziYou.py +39 -3
  4. kekikstream-1.3.2/KekikStream/Plugins/FilmMakinesi.py +112 -0
  5. kekikstream-1.3.2/KekikStream/Plugins/FullHDFilmizlesene.py +127 -0
  6. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/PKG-INFO +1 -1
  7. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/SOURCES.txt +1 -0
  8. {kekikstream-1.3.0 → kekikstream-1.3.2}/PKG-INFO +1 -1
  9. {kekikstream-1.3.0 → kekikstream-1.3.2}/setup.py +1 -1
  10. kekikstream-1.3.0/KekikStream/Extractors/CloseLoad.py +0 -31
  11. kekikstream-1.3.0/KekikStream/Plugins/FilmMakinesi.py +0 -68
  12. kekikstream-1.3.0/KekikStream/Plugins/FullHDFilmizlesene.py +0 -80
  13. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/CLI/__init__.py +0 -0
  14. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/CLI/pypi_kontrol.py +0 -0
  15. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  16. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  17. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  18. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  19. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Media/MediaHandler.py +0 -0
  20. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Media/MediaManager.py +0 -0
  21. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  22. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  23. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  24. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  25. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/UI/UIManager.py +0 -0
  26. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Core/__init__.py +0 -0
  27. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/ContentX.py +0 -0
  28. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/FourCX.py +0 -0
  29. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/FourPichive.py +0 -0
  30. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/FourPlayRu.py +0 -0
  31. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/HDStreamAble.py +0 -0
  32. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Hotlinger.py +0 -0
  33. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/MailRu.py +0 -0
  34. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/MixPlayHD.py +0 -0
  35. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/MolyStream.py +0 -0
  36. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  37. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  38. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/OkRuSSL.py +0 -0
  39. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  40. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Pichive.py +0 -0
  41. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/PixelDrain.py +0 -0
  42. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/PlayRu.py +0 -0
  43. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/RapidVid.py +0 -0
  44. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/SibNet.py +0 -0
  45. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  46. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/TRsTX.py +0 -0
  47. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/TauVideo.py +0 -0
  48. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/TurboImgz.py +0 -0
  49. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VidMoly.py +0 -0
  50. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VidMolyMe.py +0 -0
  51. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VidMoxy.py +0 -0
  52. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Extractors/VideoSeyred.py +0 -0
  53. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/DiziBox.py +0 -0
  54. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/Dizilla.py +0 -0
  55. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  56. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/JetFilmizle.py +0 -0
  57. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/RecTV.py +0 -0
  58. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  59. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/Shorten.py +0 -0
  60. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/SineWix.py +0 -0
  61. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/Plugins/UgurFilm.py +0 -0
  62. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/__init__.py +0 -0
  63. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/__main__.py +0 -0
  64. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream/requirements.txt +0 -0
  65. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/dependency_links.txt +0 -0
  66. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/entry_points.txt +0 -0
  67. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/requires.txt +0 -0
  68. {kekikstream-1.3.0 → kekikstream-1.3.2}/KekikStream.egg-info/top_level.txt +0 -0
  69. {kekikstream-1.3.0 → kekikstream-1.3.2}/LICENSE +0 -0
  70. {kekikstream-1.3.0 → kekikstream-1.3.2}/MANIFEST.in +0 -0
  71. {kekikstream-1.3.0 → kekikstream-1.3.2}/README.md +0 -0
  72. {kekikstream-1.3.0 → kekikstream-1.3.2}/setup.cfg +0 -0
@@ -0,0 +1,47 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult
4
+ from KekikStream.Helpers.Unpack import unpack
5
+ import re, base64
6
+
7
+ def get_m3u_link(data: str) -> str:
8
+ first = base64.b64decode(data)
9
+ first_reversed = first[::-1]
10
+
11
+ second = base64.b64decode(first_reversed)
12
+
13
+ parts = second.decode('utf-8').split("|")
14
+ if len(parts) < 2:
15
+ raise ValueError("Decoded data has an unexpected format.")
16
+
17
+ return parts[1]
18
+
19
+ def extract_data(raw_script: str) -> str:
20
+ pattern = re.compile(r'return result\}var .*?=.*?\("(.*?)"\)')
21
+ if match := pattern.search(raw_script):
22
+ return match[1]
23
+ else:
24
+ raise Exception("data not found")
25
+
26
+ class CloseLoadExtractor(ExtractorBase):
27
+ name = "CloseLoad"
28
+ main_url = "https://closeload.filmmakinesi.de"
29
+
30
+ async def extract(self, url, referer=None) -> ExtractResult:
31
+ if referer:
32
+ self.httpx.headers.update({"Referer": referer})
33
+
34
+ istek = await self.httpx.get(url)
35
+ istek.raise_for_status()
36
+
37
+ eval_func = re.compile(r'\s*(eval\(function[\s\S].*)\s*').findall(istek.text)[0]
38
+ m3u_link = get_m3u_link(extract_data(unpack(eval_func)))
39
+ print(m3u_link)
40
+
41
+ await self.close()
42
+ return ExtractResult(
43
+ name = self.name,
44
+ url = m3u_link,
45
+ referer = self.main_url,
46
+ subtitles = []
47
+ )
@@ -0,0 +1,75 @@
1
+ # ! https://github.com/keyiflerolsun/Kekik-cloudstream/blob/master/FilmMakinesi/src/main/kotlin/com/keyiflerolsun/CloseLoadUnpacker.kt
2
+
3
+ import re
4
+
5
+ packed_extract_regex = re.compile(
6
+ r"\}\('(.*)',\s*(\d+),\s*(\d+),\s*'(.*?)'\.split\('\|'\)",
7
+ re.IGNORECASE | re.MULTILINE
8
+ )
9
+
10
+ unpack_replace_regex = re.compile(
11
+ r"\b\w+\b",
12
+ re.IGNORECASE | re.MULTILINE
13
+ )
14
+
15
+ class Unbaser:
16
+ ALPHABET = {
17
+ 52: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP",
18
+ 54: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR",
19
+ 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
20
+ 95: " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
21
+ }
22
+
23
+ def __init__(self, base: int):
24
+ self.base = base
25
+
26
+ if base > 62:
27
+ self.selector = 95
28
+ elif base > 54:
29
+ self.selector = 62
30
+ elif base > 52:
31
+ self.selector = 54
32
+ else:
33
+ self.selector = 52
34
+
35
+ self.dict = {char: idx for idx, char in enumerate(Unbaser.ALPHABET[self.selector])}
36
+
37
+ def unbase(self, value: str) -> int:
38
+ if 2 <= self.base <= 36:
39
+ try:
40
+ return int(value, self.base)
41
+ except ValueError:
42
+ return 0
43
+ else:
44
+ result = 0
45
+
46
+ for index, c in enumerate(reversed(value)):
47
+ digit = self.dict.get(c, 0)
48
+ result += digit * (self.base ** index)
49
+
50
+ return result
51
+
52
+ def unpack(script_block: str) -> str:
53
+ match = packed_extract_regex.search(script_block)
54
+ if not match:
55
+ raise ValueError("Packed script not found")
56
+
57
+ payload, radix_str, count_str, symtab_str = match.groups()
58
+
59
+ radix = int(radix_str)
60
+ count = int(count_str)
61
+ symtab = symtab_str.split('|')
62
+
63
+ if len(symtab) != count:
64
+ raise ValueError("there is an error in the packed script")
65
+
66
+ unbaser = Unbaser(radix)
67
+
68
+ def replacer(match_obj):
69
+ word = match_obj.group(0)
70
+ index = unbaser.unbase(word)
71
+ replacement = symtab[index] if index < len(symtab) else word
72
+
73
+ return replacement or word
74
+
75
+ return unpack_replace_regex.sub(replacer, payload)
@@ -1,12 +1,48 @@
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, SeriesInfo, Episode, Subtitle, ExtractResult
3
+ from KekikStream.Core import kekik_cache, PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, Subtitle, ExtractResult
4
4
  from parsel import Selector
5
5
  import re
6
6
 
7
7
  class DiziYou(PluginBase):
8
- name = "DiziYou"
9
- main_url = "https://www.diziyou1.com"
8
+ name = "DiziYou"
9
+ language = "tr"
10
+ main_url = "https://www.diziyou1.com"
11
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
12
+ 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!"
13
+
14
+ main_page = {
15
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Aile" : "Aile",
16
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Aksiyon" : "Aksiyon",
17
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Animasyon" : "Animasyon",
18
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Belgesel" : "Belgesel",
19
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Bilim+Kurgu" : "Bilim Kurgu",
20
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Dram" : "Dram",
21
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Fantazi" : "Fantazi",
22
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Gerilim" : "Gerilim",
23
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Gizem" : "Gizem",
24
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Komedi" : "Komedi",
25
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Korku" : "Korku",
26
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Macera" : "Macera",
27
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Sava%C5%9F" : "Savaş",
28
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Su%C3%A7" : "Suç",
29
+ f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Vah%C5%9Fi+Bat%C4%B1" : "Vahşi Batı"
30
+ }
31
+
32
+ @kekik_cache(ttl=60*60)
33
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
34
+ istek = await self.httpx.get(f"{url.replace('SAYFA', str(page))}")
35
+ secici = Selector(istek.text)
36
+
37
+ return [
38
+ MainPageResult(
39
+ category = category,
40
+ title = veri.css("div#categorytitle a::text").get(),
41
+ url = self.fix_url(veri.css("div#categorytitle a::attr(href)").get()),
42
+ poster = self.fix_url(veri.css("img::attr(src)").get()),
43
+ )
44
+ for veri in secici.css("div.single-item")
45
+ ]
10
46
 
11
47
  @kekik_cache(ttl=60*60)
12
48
  async def search(self, query: str) -> list[SearchResult]:
@@ -0,0 +1,112 @@
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
+
6
+ class FilmMakinesi(PluginBase):
7
+ name = "FilmMakinesi"
8
+ language = "tr"
9
+ main_url = "https://filmmakinesi.de"
10
+ favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
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
+
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"
35
+ }
36
+
37
+ @kekik_cache(ttl=60*60)
38
+ async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
39
+ istek = self.cloudscraper.get(f"{url}{page}")
40
+ secici = Selector(istek.text)
41
+
42
+ veriler = secici.css("section#film_posts article") if "/film-izle/" in url else secici.css("section#film_posts div.tooltip")
43
+
44
+ return [
45
+ MainPageResult(
46
+ category = category,
47
+ title = veri.css("h6 a::text").get(),
48
+ url = self.fix_url(veri.css("h6 a::attr(href)").get()),
49
+ poster = self.fix_url(veri.css("img::attr(data-src)").get() or veri.css("img::attr(src)").get()),
50
+ )
51
+ for veri in veriler
52
+ ]
53
+
54
+ @kekik_cache(ttl=60*60)
55
+ async def search(self, query: str) -> list[SearchResult]:
56
+ istek = await self.httpx.get(f"{self.main_url}/?s={query}")
57
+ secici = Selector(istek.text)
58
+
59
+ 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()
63
+ poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
64
+
65
+ if title and href:
66
+ results.append(
67
+ SearchResult(
68
+ title = title.strip(),
69
+ url = self.fix_url(href.strip()),
70
+ poster = self.fix_url(poster.strip()) if poster else None,
71
+ )
72
+ )
73
+
74
+ return results
75
+
76
+ @kekik_cache(ttl=60*60)
77
+ async def load_item(self, url: str) -> MovieInfo:
78
+ istek = await self.httpx.get(url)
79
+ secici = Selector(istek.text)
80
+
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])
93
+
94
+ return MovieInfo(
95
+ url = url,
96
+ poster = self.fix_url(poster),
97
+ title = title,
98
+ description = description,
99
+ tags = tags,
100
+ rating = rating,
101
+ year = year,
102
+ actors = actors,
103
+ duration = duration_minutes
104
+ )
105
+
106
+ @kekik_cache(ttl=15*60)
107
+ async def load_links(self, url: str) -> list[str]:
108
+ istek = await self.httpx.get(url)
109
+ secici = Selector(istek.text)
110
+
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 []
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.3.0
3
+ Version: 1.3.2
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
@@ -52,6 +52,7 @@ KekikStream/Extractors/VidMoly.py
52
52
  KekikStream/Extractors/VidMolyMe.py
53
53
  KekikStream/Extractors/VidMoxy.py
54
54
  KekikStream/Extractors/VideoSeyred.py
55
+ KekikStream/Helpers/Unpack.py
55
56
  KekikStream/Plugins/DiziBox.py
56
57
  KekikStream/Plugins/DiziYou.py
57
58
  KekikStream/Plugins/Dizilla.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.3.0
3
+ Version: 1.3.2
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.0",
9
+ version = "1.3.2",
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,31 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from KekikStream.Core import ExtractorBase, ExtractResult
4
- from parsel import Selector
5
- from base64 import b64decode
6
-
7
- class CloseLoadExtractor(ExtractorBase):
8
- name = "CloseLoad"
9
- main_url = "https://closeload.filmmakinesi.de"
10
-
11
- async def extract(self, url, referer=None) -> ExtractResult:
12
- if referer:
13
- self.httpx.headers.update({"Referer": referer})
14
-
15
- istek = await self.httpx.get(url)
16
- istek.raise_for_status()
17
-
18
- secici = Selector(istek.text)
19
- atob = secici.re(r"aHR0[0-9a-zA-Z+/=]*")
20
- if not atob:
21
- raise ValueError("Base64 kodu bulunamadı.")
22
-
23
- m3u_link = b64decode(f"{atob[0]}===").decode("utf-8")
24
-
25
- await self.close()
26
- return ExtractResult(
27
- name = self.name,
28
- url = m3u_link,
29
- referer = self.main_url,
30
- subtitles = []
31
- )
@@ -1,68 +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
-
6
- class FilmMakinesi(PluginBase):
7
- name = "FilmMakinesi"
8
- main_url = "https://filmmakinesi.de"
9
-
10
- @kekik_cache(ttl=60*60)
11
- async def search(self, query: str) -> list[SearchResult]:
12
- istek = await self.httpx.get(f"{self.main_url}/?s={query}")
13
- secici = Selector(istek.text)
14
-
15
- results = []
16
- for article in secici.css("section#film_posts article"):
17
- title = article.css("h6 a::text").get()
18
- href = article.css("h6 a::attr(href)").get()
19
- poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
20
-
21
- if title and href:
22
- results.append(
23
- SearchResult(
24
- title = title.strip(),
25
- url = self.fix_url(href.strip()),
26
- poster = self.fix_url(poster.strip()) if poster else None,
27
- )
28
- )
29
-
30
- return results
31
-
32
- @kekik_cache(ttl=60*60)
33
- async def load_item(self, url: str) -> MovieInfo:
34
- istek = await self.httpx.get(url)
35
- secici = Selector(istek.text)
36
-
37
- title = secici.css("h1.single_h1 a::text").get().strip()
38
- poster = secici.css("[property='og:image']::attr(content)").get().strip()
39
- description = secici.css("section#film_single article p:last-of-type::text").get().strip()
40
- tags = secici.css("dt:contains('Tür:') + dd a::text").get().strip()
41
- rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get().strip()
42
- year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get().strip()
43
- actors = secici.css("dt:contains('Oyuncular:') + dd::text").get().strip()
44
- duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get().strip()
45
-
46
- duration_minutes = 0
47
- if duration and duration.startswith("PT") and duration.endswith("M"):
48
- duration_minutes = int(duration[2:-1])
49
-
50
- return MovieInfo(
51
- url = url,
52
- poster = self.fix_url(poster),
53
- title = title,
54
- description = description,
55
- tags = tags,
56
- rating = rating,
57
- year = year,
58
- actors = actors,
59
- duration = duration_minutes
60
- )
61
-
62
- @kekik_cache(ttl=15*60)
63
- async def load_links(self, url: str) -> list[str]:
64
- istek = await self.httpx.get(url)
65
- secici = Selector(istek.text)
66
-
67
- iframe_src = secici.css("div.player-div iframe::attr(src)").get() or secici.css("div.player-div iframe::attr(data-src)").get()
68
- return [self.fix_url(iframe_src)] if iframe_src else []
@@ -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