KekikStream 1.3.0__tar.gz → 1.3.1__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 (71) hide show
  1. kekikstream-1.3.1/KekikStream/Extractors/CloseLoad.py +47 -0
  2. kekikstream-1.3.1/KekikStream/Helpers/Unpack.py +75 -0
  3. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/DiziYou.py +39 -3
  4. kekikstream-1.3.1/KekikStream/Plugins/FilmMakinesi.py +112 -0
  5. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream.egg-info/PKG-INFO +1 -1
  6. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream.egg-info/SOURCES.txt +1 -0
  7. {kekikstream-1.3.0 → kekikstream-1.3.1}/PKG-INFO +1 -1
  8. {kekikstream-1.3.0 → kekikstream-1.3.1}/setup.py +1 -1
  9. kekikstream-1.3.0/KekikStream/Extractors/CloseLoad.py +0 -31
  10. kekikstream-1.3.0/KekikStream/Plugins/FilmMakinesi.py +0 -68
  11. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/CLI/__init__.py +0 -0
  12. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/CLI/pypi_kontrol.py +0 -0
  13. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  14. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  15. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  16. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  17. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Media/MediaHandler.py +0 -0
  18. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Media/MediaManager.py +0 -0
  19. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  20. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  21. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  22. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  23. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/UI/UIManager.py +0 -0
  24. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Core/__init__.py +0 -0
  25. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/ContentX.py +0 -0
  26. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/FourCX.py +0 -0
  27. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/FourPichive.py +0 -0
  28. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/FourPlayRu.py +0 -0
  29. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/HDStreamAble.py +0 -0
  30. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/Hotlinger.py +0 -0
  31. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/MailRu.py +0 -0
  32. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/MixPlayHD.py +0 -0
  33. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/MolyStream.py +0 -0
  34. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  35. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/OkRuHTTP.py +0 -0
  36. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/OkRuSSL.py +0 -0
  37. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  38. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/Pichive.py +0 -0
  39. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/PixelDrain.py +0 -0
  40. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/PlayRu.py +0 -0
  41. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/RapidVid.py +0 -0
  42. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/SibNet.py +0 -0
  43. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  44. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/TRsTX.py +0 -0
  45. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/TauVideo.py +0 -0
  46. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/TurboImgz.py +0 -0
  47. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/VidMoly.py +0 -0
  48. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/VidMolyMe.py +0 -0
  49. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/VidMoxy.py +0 -0
  50. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Extractors/VideoSeyred.py +0 -0
  51. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/DiziBox.py +0 -0
  52. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/Dizilla.py +0 -0
  53. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  54. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  55. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/JetFilmizle.py +0 -0
  56. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/RecTV.py +0 -0
  57. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  58. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/Shorten.py +0 -0
  59. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/SineWix.py +0 -0
  60. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/Plugins/UgurFilm.py +0 -0
  61. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/__init__.py +0 -0
  62. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/__main__.py +0 -0
  63. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream/requirements.txt +0 -0
  64. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream.egg-info/dependency_links.txt +0 -0
  65. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream.egg-info/entry_points.txt +0 -0
  66. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream.egg-info/requires.txt +0 -0
  67. {kekikstream-1.3.0 → kekikstream-1.3.1}/KekikStream.egg-info/top_level.txt +0 -0
  68. {kekikstream-1.3.0 → kekikstream-1.3.1}/LICENSE +0 -0
  69. {kekikstream-1.3.0 → kekikstream-1.3.1}/MANIFEST.in +0 -0
  70. {kekikstream-1.3.0 → kekikstream-1.3.1}/README.md +0 -0
  71. {kekikstream-1.3.0 → kekikstream-1.3.1}/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 = "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!"
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 []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.3.0
3
+ Version: 1.3.1
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.1
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.1",
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 []
File without changes
File without changes
File without changes
File without changes