KekikStream 0.2.3__py3-none-any.whl → 0.5.7__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.
- KekikStream/CLI/__init__.py +1 -1
- KekikStream/CLI/pypi_kontrol.py +30 -0
- KekikStream/Core/ExtractorBase.py +13 -2
- KekikStream/Core/ExtractorLoader.py +31 -10
- KekikStream/Core/ExtractorModels.py +2 -0
- KekikStream/Core/MediaHandler.py +70 -30
- KekikStream/Core/PluginBase.py +6 -5
- KekikStream/Core/PluginLoader.py +3 -5
- KekikStream/Core/PluginModels.py +6 -16
- KekikStream/Extractors/ContentX.py +80 -0
- KekikStream/Extractors/FourCX.py +7 -0
- KekikStream/Extractors/FourPichive.py +7 -0
- KekikStream/Extractors/FourPlayRu.py +7 -0
- KekikStream/Extractors/HDStreamAble.py +7 -0
- KekikStream/Extractors/Hotlinger.py +7 -0
- KekikStream/Extractors/MixPlayHD.py +42 -0
- KekikStream/Extractors/Odnoklassniki.py +106 -0
- KekikStream/Extractors/OkRuHTTP.py +7 -0
- KekikStream/Extractors/OkRuSSL.py +7 -0
- KekikStream/Extractors/PeaceMakerst.py +57 -0
- KekikStream/Extractors/Pichive.py +7 -0
- KekikStream/Extractors/PixelDrain.py +1 -1
- KekikStream/Extractors/PlayRu.py +7 -0
- KekikStream/Extractors/RapidVid.py +9 -10
- KekikStream/Extractors/SibNet.py +1 -1
- KekikStream/Extractors/Sobreatsesuyp.py +5 -6
- KekikStream/Extractors/TRsTX.py +5 -6
- KekikStream/Extractors/TauVideo.py +11 -10
- KekikStream/Extractors/TurboImgz.py +9 -12
- KekikStream/Extractors/VidMoly.py +25 -33
- KekikStream/Extractors/VidMoxy.py +1 -1
- KekikStream/Extractors/VideoSeyred.py +47 -0
- KekikStream/Managers/MediaManager.py +1 -1
- KekikStream/Managers/UIManager.py +6 -2
- KekikStream/Plugins/DiziBox.py +138 -0
- KekikStream/Plugins/Dizilla.py +95 -0
- KekikStream/Plugins/FilmMakinesi.py +8 -8
- KekikStream/Plugins/FullHDFilmizlesene.py +5 -4
- KekikStream/Plugins/JetFilmizle.py +4 -8
- KekikStream/Plugins/RecTV.py +111 -0
- KekikStream/Plugins/SineWix.py +4 -1
- KekikStream/Plugins/UgurFilm.py +3 -3
- KekikStream/__init__.py +177 -158
- KekikStream/__main__.py +1 -1
- KekikStream/requirements.txt +2 -1
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.7.dist-info}/METADATA +4 -3
- KekikStream-0.5.7.dist-info/RECORD +58 -0
- KekikStream/CLI/check_update.py +0 -33
- KekikStream-0.2.3.dist-info/RECORD +0 -41
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.7.dist-info}/LICENSE +0 -0
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.7.dist-info}/WHEEL +0 -0
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.7.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.2.3.dist-info → KekikStream-0.5.7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,138 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import PluginBase, SearchResult, SeriesInfo, Episode
|
4
|
+
from Kekik.Sifreleme import CryptoJS
|
5
|
+
from parsel import Selector
|
6
|
+
import re, urllib.parse, base64
|
7
|
+
|
8
|
+
class DiziBox(PluginBase):
|
9
|
+
name = "DiziBox"
|
10
|
+
main_url = "https://www.dizibox.plus"
|
11
|
+
|
12
|
+
async def search(self, query: str) -> list[SearchResult]:
|
13
|
+
self.oturum.cookies.update({
|
14
|
+
"LockUser" : "true",
|
15
|
+
"isTrustedUser" : "true",
|
16
|
+
"dbxu" : "1722403730363"
|
17
|
+
})
|
18
|
+
istek = await self.oturum.get(f"{self.main_url}/?s={query}")
|
19
|
+
secici = Selector(istek.text)
|
20
|
+
|
21
|
+
return [
|
22
|
+
SearchResult(
|
23
|
+
title = item.css("h3 a::text").get(),
|
24
|
+
url = self.fix_url(item.css("h3 a::attr(href)").get()),
|
25
|
+
poster = self.fix_url(item.css("img::attr(src)").get()),
|
26
|
+
)
|
27
|
+
for item in secici.css("article.detailed-article")
|
28
|
+
]
|
29
|
+
|
30
|
+
async def load_item(self, url: str) -> SeriesInfo:
|
31
|
+
istek = await self.oturum.get(url)
|
32
|
+
secici = Selector(istek.text)
|
33
|
+
|
34
|
+
title = secici.css("div.tv-overview h1 a::text").get()
|
35
|
+
poster = self.fix_url(secici.css("div.tv-overview figure img::attr(src)").get())
|
36
|
+
description = secici.css("div.tv-story p::text").get()
|
37
|
+
year = secici.css("a[href*='/yil/']::text").re_first(r"(\d{4})")
|
38
|
+
tags = secici.css("a[href*='/tur/']::text").getall()
|
39
|
+
rating = secici.css("span.label-imdb b::text").re_first(r"[\d.,]+")
|
40
|
+
actors = [actor.css("::text").get() for actor in secici.css("a[href*='/oyuncu/']")]
|
41
|
+
|
42
|
+
episodes = []
|
43
|
+
for sezon_link in secici.css("div#seasons-list a::attr(href)").getall():
|
44
|
+
sezon_url = self.fix_url(sezon_link)
|
45
|
+
sezon_istek = await self.oturum.get(sezon_url)
|
46
|
+
sezon_secici = Selector(sezon_istek.text)
|
47
|
+
|
48
|
+
for bolum in sezon_secici.css("article.grid-box"):
|
49
|
+
ep_secici = bolum.css("div.post-title a::text")
|
50
|
+
|
51
|
+
ep_title = ep_secici.get()
|
52
|
+
ep_href = self.fix_url(bolum.css("div.post-title a::attr(href)").get())
|
53
|
+
ep_season = ep_secici.re_first(r"(\d+)\. ?Sezon")
|
54
|
+
ep_episode = ep_secici.re_first(r"(\d+)\. ?Bölüm")
|
55
|
+
|
56
|
+
if ep_title and ep_href:
|
57
|
+
episodes.append(Episode(
|
58
|
+
season = ep_season,
|
59
|
+
episode = ep_episode,
|
60
|
+
title = ep_title.strip(),
|
61
|
+
url = ep_href,
|
62
|
+
))
|
63
|
+
|
64
|
+
return SeriesInfo(
|
65
|
+
url = url,
|
66
|
+
poster = poster,
|
67
|
+
title = title,
|
68
|
+
description = description,
|
69
|
+
tags = tags,
|
70
|
+
rating = rating,
|
71
|
+
year = year,
|
72
|
+
episodes = episodes,
|
73
|
+
actors = actors,
|
74
|
+
)
|
75
|
+
|
76
|
+
async def _iframe_decode(self, name:str, iframe_link:str, referer:str) -> list[str]:
|
77
|
+
results = []
|
78
|
+
|
79
|
+
if "/player/king/king.php" in iframe_link:
|
80
|
+
iframe_link = iframe_link.replace("king.php?v=", "king.php?wmode=opaque&v=")
|
81
|
+
self.oturum.headers.update({"Referer": referer})
|
82
|
+
|
83
|
+
istek = await self.oturum.get(iframe_link)
|
84
|
+
secici = Selector(istek.text)
|
85
|
+
iframe = secici.css("div#Player iframe::attr(src)").get()
|
86
|
+
|
87
|
+
self.oturum.headers.update({"Referer": self.main_url})
|
88
|
+
istek = await self.oturum.get(iframe)
|
89
|
+
|
90
|
+
crypt_data = re.search(r"CryptoJS\.AES\.decrypt\(\"(.*)\",\"", istek.text)[1]
|
91
|
+
crypt_pass = re.search(r"\",\"(.*)\"\);", istek.text)[1]
|
92
|
+
|
93
|
+
results.append(CryptoJS.decrypt(crypt_pass, crypt_data))
|
94
|
+
|
95
|
+
elif "/player/moly/moly.php" in iframe_link:
|
96
|
+
iframe_link = iframe_link.replace("moly.php?h=", "moly.php?wmode=opaque&h=")
|
97
|
+
self.oturum.headers.update({"Referer": referer})
|
98
|
+
istek = await self.oturum.get(iframe_link)
|
99
|
+
|
100
|
+
if atob_data := re.search(r"unescape\(\"(.*)\"\)", istek.text):
|
101
|
+
decoded_atob = urllib.parse.unquote(atob_data[1])
|
102
|
+
str_atob = base64.b64decode(decoded_atob).decode("utf-8")
|
103
|
+
|
104
|
+
if iframe := Selector(str_atob).css("div#Player iframe::attr(src)").get():
|
105
|
+
results.append(iframe)
|
106
|
+
|
107
|
+
elif "/player/haydi.php" in iframe_link:
|
108
|
+
okru_url = base64.b64decode(iframe_link.split("?v=")[-1]).decode("utf-8")
|
109
|
+
results.append(okru_url)
|
110
|
+
|
111
|
+
return results
|
112
|
+
|
113
|
+
async def load_links(self, url: str) -> list[str]:
|
114
|
+
istek = await self.oturum.get(url)
|
115
|
+
secici = Selector(istek.text)
|
116
|
+
|
117
|
+
iframes = []
|
118
|
+
if main_iframe := secici.css("div#video-area iframe::attr(src)").get():
|
119
|
+
if decoded := await self._iframe_decode(self.name, main_iframe, url):
|
120
|
+
iframes.extend(decoded)
|
121
|
+
|
122
|
+
for alternatif in secici.css("div.video-toolbar option[value]"):
|
123
|
+
alt_name = alternatif.css("::text").get()
|
124
|
+
alt_link = alternatif.css("::attr(value)").get()
|
125
|
+
|
126
|
+
if not alt_link:
|
127
|
+
continue
|
128
|
+
|
129
|
+
self.oturum.headers.update({"Referer": url})
|
130
|
+
alt_istek = await self.oturum.get(alt_link)
|
131
|
+
alt_istek.raise_for_status()
|
132
|
+
|
133
|
+
alt_secici = Selector(alt_istek.text)
|
134
|
+
if alt_iframe := alt_secici.css("div#video-area iframe::attr(src)").get():
|
135
|
+
if decoded := await self._iframe_decode(alt_name, alt_iframe, url):
|
136
|
+
iframes.extend(decoded)
|
137
|
+
|
138
|
+
return iframes
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import PluginBase, SearchResult, SeriesInfo, Episode
|
4
|
+
from parsel import Selector
|
5
|
+
from json import loads
|
6
|
+
|
7
|
+
class Dizilla(PluginBase):
|
8
|
+
name = "Dizilla"
|
9
|
+
main_url = "https://dizilla.club"
|
10
|
+
|
11
|
+
async def search(self, query: str) -> list[SearchResult]:
|
12
|
+
ilk_istek = await self.oturum.get(self.main_url)
|
13
|
+
ilk_secici = Selector(ilk_istek.text)
|
14
|
+
cKey = ilk_secici.css("input[name='cKey']::attr(value)").get()
|
15
|
+
cValue = ilk_secici.css("input[name='cValue']::attr(value)").get()
|
16
|
+
|
17
|
+
self.oturum.headers.update({
|
18
|
+
"Accept" : "application/json, text/javascript, */*; q=0.01",
|
19
|
+
"X-Requested-With" : "XMLHttpRequest",
|
20
|
+
"Referer" : f"{self.main_url}/"
|
21
|
+
})
|
22
|
+
self.oturum.cookies.update({
|
23
|
+
"showAllDaFull" : "true",
|
24
|
+
"PHPSESSID" : ilk_istek.cookies.get("PHPSESSID"),
|
25
|
+
})
|
26
|
+
|
27
|
+
arama_istek = await self.oturum.post(
|
28
|
+
url = f"{self.main_url}/bg/searchcontent",
|
29
|
+
data = {
|
30
|
+
"cKey" : cKey,
|
31
|
+
"cValue" : cValue,
|
32
|
+
"searchterm" : query
|
33
|
+
}
|
34
|
+
)
|
35
|
+
arama_veri = arama_istek.json().get("data", {}).get("result", [])
|
36
|
+
|
37
|
+
return [
|
38
|
+
SearchResult(
|
39
|
+
title = veri.get("object_name"),
|
40
|
+
url = self.fix_url(f"{self.main_url}/{veri.get('used_slug')}"),
|
41
|
+
poster = self.fix_url(veri.get("object_poster_url")),
|
42
|
+
)
|
43
|
+
for veri in arama_veri
|
44
|
+
]
|
45
|
+
|
46
|
+
async def load_item(self, url: str) -> SeriesInfo:
|
47
|
+
istek = await self.oturum.get(url)
|
48
|
+
secici = Selector(istek.text)
|
49
|
+
veri = loads(secici.xpath("//script[@type='application/ld+json']/text()").getall()[-1])
|
50
|
+
|
51
|
+
title = veri.get("name")
|
52
|
+
if alt_title := veri.get("alternateName"):
|
53
|
+
title += f" - ({alt_title})"
|
54
|
+
|
55
|
+
poster = self.fix_url(veri.get("image"))
|
56
|
+
description = veri.get("description")
|
57
|
+
year = veri.get("datePublished").split("-")[0]
|
58
|
+
tags = []
|
59
|
+
rating = veri.get("aggregateRating", {}).get("ratingValue")
|
60
|
+
actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
|
61
|
+
|
62
|
+
bolumler = []
|
63
|
+
sezonlar = veri.get("containsSeason") if isinstance(veri.get("containsSeason"), list) else [veri.get("containsSeason")]
|
64
|
+
for sezon in sezonlar:
|
65
|
+
for bolum in sezon.get("episode"):
|
66
|
+
bolumler.append(Episode(
|
67
|
+
season = sezon.get("seasonNumber"),
|
68
|
+
episode = bolum.get("episodeNumber"),
|
69
|
+
title = bolum.get("name"),
|
70
|
+
url = bolum.get("url"),
|
71
|
+
))
|
72
|
+
|
73
|
+
return SeriesInfo(
|
74
|
+
url = url,
|
75
|
+
poster = poster,
|
76
|
+
title = title,
|
77
|
+
description = description,
|
78
|
+
tags = tags,
|
79
|
+
rating = rating,
|
80
|
+
year = year,
|
81
|
+
episodes = bolumler,
|
82
|
+
actors = actors
|
83
|
+
)
|
84
|
+
|
85
|
+
async def load_links(self, url: str) -> list[str]:
|
86
|
+
istek = await self.oturum.get(url)
|
87
|
+
secici = Selector(istek.text)
|
88
|
+
|
89
|
+
iframes = [self.fix_url(secici.css("div#playerLsDizilla iframe::attr(src)").get())]
|
90
|
+
for alternatif in secici.css("a[href*='player']"):
|
91
|
+
alt_istek = await self.oturum.get(self.fix_url(alternatif.css("::attr(href)").get()))
|
92
|
+
alt_secici = Selector(alt_istek.text)
|
93
|
+
iframes.append(self.fix_url(alt_secici.css("div#playerLsDizilla iframe::attr(src)").get()))
|
94
|
+
|
95
|
+
return iframes
|
@@ -32,14 +32,14 @@ class FilmMakinesi(PluginBase):
|
|
32
32
|
istek = await self.oturum.get(url)
|
33
33
|
secici = Selector(istek.text)
|
34
34
|
|
35
|
-
title = secici.css("h1.single_h1 a::text").get(
|
36
|
-
poster = secici.css("[property='og:image']::attr(content)").get(
|
37
|
-
description = secici.css("section#film_single article p:last-of-type::text").get(
|
38
|
-
tags = secici.css("dt:contains('Tür:') + dd a::text").get(
|
39
|
-
rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get(
|
40
|
-
year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get(
|
41
|
-
actors = secici.css("dt:contains('Oyuncular:') + dd::text").get(
|
42
|
-
duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get(
|
35
|
+
title = secici.css("h1.single_h1 a::text").get().strip()
|
36
|
+
poster = secici.css("[property='og:image']::attr(content)").get().strip()
|
37
|
+
description = secici.css("section#film_single article p:last-of-type::text").get().strip()
|
38
|
+
tags = secici.css("dt:contains('Tür:') + dd a::text").get().strip()
|
39
|
+
rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get().strip()
|
40
|
+
year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get().strip()
|
41
|
+
actors = secici.css("dt:contains('Oyuncular:') + dd::text").get().strip()
|
42
|
+
duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get().strip()
|
43
43
|
|
44
44
|
duration_minutes = 0
|
45
45
|
if duration and duration.startswith("PT") and duration.endswith("M"):
|
@@ -61,7 +61,7 @@ class FullHDFilmizlesene(PluginBase):
|
|
61
61
|
secici = Selector(istek.text)
|
62
62
|
|
63
63
|
script = secici.xpath("(//script)[1]").get()
|
64
|
-
scx_data = json.loads(re.findall(r
|
64
|
+
scx_data = json.loads(re.findall(r"scx = (.*?);", script)[0])
|
65
65
|
scx_keys = list(scx_data.keys())
|
66
66
|
|
67
67
|
link_list = []
|
@@ -72,6 +72,7 @@ class FullHDFilmizlesene(PluginBase):
|
|
72
72
|
if isinstance(t, dict):
|
73
73
|
link_list.extend(StringCodec.decode(v) for k, v in t.items())
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
75
|
+
return [
|
76
|
+
f"https:{link}" if link.startswith("//") else link
|
77
|
+
for link in link_list
|
78
|
+
]
|
@@ -60,8 +60,7 @@ class JetFilmizle(PluginBase):
|
|
60
60
|
secici = Selector(istek.text)
|
61
61
|
|
62
62
|
iframes = []
|
63
|
-
main_iframe
|
64
|
-
if main_iframe:
|
63
|
+
if main_iframe := secici.css("div#movie iframe::attr(data-src), div#movie iframe::attr(data), div#movie iframe::attr(src)").get():
|
65
64
|
iframes.append(self.fix_url(main_iframe))
|
66
65
|
|
67
66
|
for part in secici.css("div.film_part a"):
|
@@ -72,13 +71,11 @@ class JetFilmizle(PluginBase):
|
|
72
71
|
part_istek = await self.oturum.get(part_href)
|
73
72
|
part_secici = Selector(part_istek.text)
|
74
73
|
|
75
|
-
iframe
|
76
|
-
if iframe:
|
74
|
+
if iframe := part_secici.css("div#movie iframe::attr(data-src), div#movie iframe::attr(data), div#movie iframe::attr(src)").get():
|
77
75
|
iframes.append(self.fix_url(iframe))
|
78
76
|
else:
|
79
77
|
for link in part_secici.css("div#movie p a"):
|
80
|
-
download_link
|
81
|
-
if download_link:
|
78
|
+
if download_link := link.attrib.get("href"):
|
82
79
|
iframes.append(self.fix_url(download_link))
|
83
80
|
|
84
81
|
processed_iframes = []
|
@@ -87,8 +84,7 @@ class JetFilmizle(PluginBase):
|
|
87
84
|
jetv_istek = await self.oturum.get(iframe)
|
88
85
|
jetv_secici = Selector(jetv_istek.text)
|
89
86
|
|
90
|
-
jetv_iframe
|
91
|
-
if jetv_iframe:
|
87
|
+
if jetv_iframe := jetv_secici.css("iframe::attr(src)").get():
|
92
88
|
processed_iframes.append(self.fix_url(jetv_iframe))
|
93
89
|
else:
|
94
90
|
processed_iframes.append(iframe)
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.CLI import konsol
|
4
|
+
from KekikStream.Core import PluginBase, SearchResult, MovieInfo, Episode, SeriesInfo
|
5
|
+
from KekikStream.Core.ExtractorModels import ExtractResult, Subtitle
|
6
|
+
from httpx import AsyncClient
|
7
|
+
from json import dumps, loads
|
8
|
+
import re
|
9
|
+
|
10
|
+
|
11
|
+
class RecTV(PluginBase):
|
12
|
+
name = "RecTV"
|
13
|
+
main_url = "https://m.brectv1.xyz"
|
14
|
+
|
15
|
+
sw_key = "4F5A9C3D9A86FA54EACEDDD635185/c3c5bd17-e37b-4b94-a944-8a3688a30452"
|
16
|
+
oturum = AsyncClient(http2=True)
|
17
|
+
oturum.headers.update({"user-agent": "okhttp/4.12.0"})
|
18
|
+
|
19
|
+
async def search(self, query: str) -> list[SearchResult]:
|
20
|
+
istek = await self.oturum.get(f"{self.main_url}/api/search/{query}/{self.sw_key}/")
|
21
|
+
|
22
|
+
kanallar = istek.json().get("channels")
|
23
|
+
kanallar = sorted(kanallar, key=lambda sozluk: sozluk["title"])
|
24
|
+
|
25
|
+
icerikler = istek.json().get("posters")
|
26
|
+
icerikler = sorted(icerikler, key=lambda sozluk: sozluk["title"])
|
27
|
+
|
28
|
+
return [
|
29
|
+
SearchResult(
|
30
|
+
title = veri.get("title"),
|
31
|
+
url = dumps(veri),
|
32
|
+
poster = self.fix_url(veri.get("image")),
|
33
|
+
)
|
34
|
+
for veri in [*kanallar, *icerikler]
|
35
|
+
]
|
36
|
+
|
37
|
+
async def load_item(self, url: str) -> MovieInfo:
|
38
|
+
veri = loads(url)
|
39
|
+
|
40
|
+
match veri.get("type"):
|
41
|
+
case "serie":
|
42
|
+
dizi_istek = await self.oturum.get(f"{self.main_url}/api/season/by/serie/{veri.get('id')}/{self.sw_key}/")
|
43
|
+
dizi_veri = dizi_istek.json()
|
44
|
+
|
45
|
+
episodes = []
|
46
|
+
for season in dizi_veri:
|
47
|
+
for episode in season.get("episodes"):
|
48
|
+
ep_model = Episode(
|
49
|
+
season = int(re.search(r"(\d+)\.S", season.get("title")).group(1)) if re.search(r"(\d+)\.S", season.get("title")) else 1,
|
50
|
+
episode = int(re.search(r"Bölüm (\d+)", episode.get("title")).group(1)) if re.search(r"Bölüm (\d+)", episode.get("title")) else 1,
|
51
|
+
title = episode.get("title"),
|
52
|
+
url = self.fix_url(episode.get("sources")[0].get("url")),
|
53
|
+
)
|
54
|
+
|
55
|
+
episodes.append(ep_model)
|
56
|
+
|
57
|
+
self._data[ep_model.url] = {
|
58
|
+
"name" : f"{veri.get('title')} | {ep_model.season}. Sezon {ep_model.episode}. Bölüm - {ep_model.title}",
|
59
|
+
"referer" : "https://twitter.com/",
|
60
|
+
"subtitles" : []
|
61
|
+
}
|
62
|
+
|
63
|
+
return SeriesInfo(
|
64
|
+
url = url,
|
65
|
+
poster = self.fix_url(veri.get("image")),
|
66
|
+
title = veri.get("title"),
|
67
|
+
description = veri.get("description"),
|
68
|
+
tags = [genre.get("title") for genre in veri.get("genres")] if veri.get("genres") else [],
|
69
|
+
rating = veri.get("imdb") or veri.get("rating"),
|
70
|
+
year = veri.get("year"),
|
71
|
+
actors = [],
|
72
|
+
episodes = episodes
|
73
|
+
)
|
74
|
+
case _:
|
75
|
+
return MovieInfo(
|
76
|
+
url = url,
|
77
|
+
poster = self.fix_url(veri.get("image")),
|
78
|
+
title = veri.get("title"),
|
79
|
+
description = veri.get("description"),
|
80
|
+
tags = [genre.get("title") for genre in veri.get("genres")] if veri.get("genres") else [],
|
81
|
+
rating = veri.get("imdb") or veri.get("rating"),
|
82
|
+
year = veri.get("year"),
|
83
|
+
actors = []
|
84
|
+
)
|
85
|
+
|
86
|
+
async def load_links(self, url: str) -> list[str]:
|
87
|
+
try:
|
88
|
+
veri = loads(url)
|
89
|
+
except Exception:
|
90
|
+
return [url]
|
91
|
+
|
92
|
+
videolar = []
|
93
|
+
if veri.get("sources"):
|
94
|
+
for kaynak in veri.get("sources"):
|
95
|
+
video_link = kaynak.get("url")
|
96
|
+
if "otolinkaff" in video_link:
|
97
|
+
continue
|
98
|
+
|
99
|
+
self._data[video_link] = {
|
100
|
+
"name" : veri.get("title"),
|
101
|
+
"referer" : "https://twitter.com/",
|
102
|
+
"subtitles" : []
|
103
|
+
}
|
104
|
+
videolar.append(video_link)
|
105
|
+
|
106
|
+
return videolar
|
107
|
+
|
108
|
+
async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
|
109
|
+
extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
|
110
|
+
self.media_handler.title = name
|
111
|
+
self.media_handler.play_media(extract_result)
|
KekikStream/Plugins/SineWix.py
CHANGED
@@ -50,6 +50,9 @@ class SineWix(PluginBase):
|
|
50
50
|
episodes = []
|
51
51
|
for season in veri.get("seasons"):
|
52
52
|
for episode in season.get("episodes"):
|
53
|
+
if not episode.get("videos"):
|
54
|
+
continue
|
55
|
+
|
53
56
|
ep_model = Episode(
|
54
57
|
season = season.get("season_number"),
|
55
58
|
episode = episode.get("episode_number"),
|
@@ -102,4 +105,4 @@ class SineWix(PluginBase):
|
|
102
105
|
async def play(self, name: str, url: str, referer: str, subtitles: list[Subtitle]):
|
103
106
|
extract_result = ExtractResult(name=name, url=url, referer=referer, subtitles=subtitles)
|
104
107
|
self.media_handler.title = name
|
105
|
-
self.media_handler.
|
108
|
+
self.media_handler.play_media(extract_result)
|
KekikStream/Plugins/UgurFilm.py
CHANGED
@@ -32,9 +32,9 @@ class UgurFilm(PluginBase):
|
|
32
32
|
istek = await self.oturum.get(url)
|
33
33
|
secici = Selector(istek.text)
|
34
34
|
|
35
|
-
title = secici.css("div.bilgi h2::text").get(
|
36
|
-
poster = secici.css("div.resim img::attr(src)").get(
|
37
|
-
description = secici.css("div.slayt-aciklama::text").get(
|
35
|
+
title = secici.css("div.bilgi h2::text").get().strip()
|
36
|
+
poster = secici.css("div.resim img::attr(src)").get().strip()
|
37
|
+
description = secici.css("div.slayt-aciklama::text").get().strip()
|
38
38
|
tags = secici.css("p.tur a[href*='/category/']::text").getall()
|
39
39
|
year = secici.css("a[href*='/yil/']::text").re_first(r"\d+")
|
40
40
|
actors = [actor.css("span::text").get() for actor in secici.css("li.oyuncu-k")]
|