KekikStream 2.4.2__py3-none-any.whl → 2.4.4__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/Core/Extractor/ExtractorBase.py +3 -2
- KekikStream/Core/HTMLHelper.py +134 -40
- KekikStream/Core/Plugin/PluginBase.py +3 -2
- KekikStream/Extractors/CloseLoad.py +30 -54
- KekikStream/Extractors/ContentX.py +27 -72
- KekikStream/Extractors/DonilasPlay.py +33 -77
- KekikStream/Extractors/DzenRu.py +10 -24
- KekikStream/Extractors/ExPlay.py +20 -38
- KekikStream/Extractors/Filemoon.py +19 -45
- KekikStream/Extractors/HDMomPlayer.py +24 -56
- KekikStream/Extractors/HDPlayerSystem.py +13 -31
- KekikStream/Extractors/HotStream.py +14 -32
- KekikStream/Extractors/JFVid.py +3 -24
- KekikStream/Extractors/JetTv.py +21 -34
- KekikStream/Extractors/MailRu.py +11 -29
- KekikStream/Extractors/MixPlayHD.py +15 -28
- KekikStream/Extractors/MixTiger.py +17 -40
- KekikStream/Extractors/MolyStream.py +17 -21
- KekikStream/Extractors/Odnoklassniki.py +28 -104
- KekikStream/Extractors/PeaceMakerst.py +18 -45
- KekikStream/Extractors/PixelDrain.py +8 -16
- KekikStream/Extractors/PlayerFilmIzle.py +22 -41
- KekikStream/Extractors/RapidVid.py +21 -35
- KekikStream/Extractors/SetPlay.py +18 -43
- KekikStream/Extractors/SibNet.py +7 -17
- KekikStream/Extractors/Sobreatsesuyp.py +23 -45
- KekikStream/Extractors/TRsTX.py +23 -53
- KekikStream/Extractors/TurboImgz.py +7 -14
- KekikStream/Extractors/VCTPlay.py +10 -28
- KekikStream/Extractors/VidHide.py +10 -31
- KekikStream/Extractors/VidMoly.py +65 -99
- KekikStream/Extractors/VidMoxy.py +16 -27
- KekikStream/Extractors/VidPapi.py +24 -54
- KekikStream/Extractors/VideoSeyred.py +19 -40
- KekikStream/Extractors/Videostr.py +42 -99
- KekikStream/Extractors/Vidoza.py +8 -15
- KekikStream/Extractors/YildizKisaFilm.py +13 -31
- KekikStream/Plugins/BelgeselX.py +63 -69
- KekikStream/Plugins/DiziBox.py +16 -36
- KekikStream/Plugins/DiziMom.py +37 -129
- KekikStream/Plugins/DiziPal.py +71 -164
- KekikStream/Plugins/DiziYou.py +44 -152
- KekikStream/Plugins/Dizilla.py +18 -44
- KekikStream/Plugins/FilmBip.py +10 -24
- KekikStream/Plugins/FilmEkseni.py +12 -32
- KekikStream/Plugins/FilmMakinesi.py +24 -77
- KekikStream/Plugins/FilmModu.py +11 -18
- KekikStream/Plugins/Filmatek.py +13 -39
- KekikStream/Plugins/Full4kizle.py +33 -133
- KekikStream/Plugins/FullHDFilm.py +23 -93
- KekikStream/Plugins/FullHDFilmizlesene.py +10 -29
- KekikStream/Plugins/HDFilmCehennemi.py +27 -66
- KekikStream/Plugins/JetFilmizle.py +19 -20
- KekikStream/Plugins/KultFilmler.py +16 -50
- KekikStream/Plugins/RecTV.py +47 -85
- KekikStream/Plugins/SelcukFlix.py +29 -47
- KekikStream/Plugins/SetFilmIzle.py +28 -84
- KekikStream/Plugins/SezonlukDizi.py +27 -59
- KekikStream/Plugins/Sinefy.py +37 -100
- KekikStream/Plugins/SinemaCX.py +12 -18
- KekikStream/Plugins/Sinezy.py +11 -12
- KekikStream/Plugins/SuperFilmGeldi.py +8 -13
- KekikStream/Plugins/UgurFilm.py +14 -14
- KekikStream/Plugins/Watch32.py +42 -74
- KekikStream/Plugins/YabanciDizi.py +33 -87
- {kekikstream-2.4.2.dist-info → kekikstream-2.4.4.dist-info}/METADATA +1 -1
- kekikstream-2.4.4.dist-info/RECORD +93 -0
- kekikstream-2.4.2.dist-info/RECORD +0 -93
- {kekikstream-2.4.2.dist-info → kekikstream-2.4.4.dist-info}/WHEEL +0 -0
- {kekikstream-2.4.2.dist-info → kekikstream-2.4.4.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.4.2.dist-info → kekikstream-2.4.4.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.4.2.dist-info → kekikstream-2.4.4.dist-info}/top_level.txt +0 -0
KekikStream/Plugins/SinemaCX.py
CHANGED
|
@@ -83,36 +83,30 @@ class SinemaCX(PluginBase):
|
|
|
83
83
|
istek = await self.httpx.get(url)
|
|
84
84
|
secici = HTMLHelper(istek.text)
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
title = secici.select_text("div.f-bilgi h1")
|
|
87
|
+
poster = secici.select_poster("div.resim img")
|
|
88
88
|
description = secici.select_text("div.ackl div.scroll-liste")
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
tags = secici.select_all_text("div.f-bilgi div.tur a")
|
|
95
|
-
|
|
96
|
-
year = secici.select_text("div.f-bilgi ul.detay a[href*='yapim']")
|
|
97
|
-
|
|
98
|
-
actors = secici.select_all_text("li.oync li.oyuncu-k span.isim")
|
|
89
|
+
rating = secici.select_text("b.puandegistir")
|
|
90
|
+
tags = secici.select_texts("div.f-bilgi div.tur a")
|
|
91
|
+
year = secici.extract_year("ul.detay a[href*='yapim']")
|
|
92
|
+
actors = secici.select_texts("li.oync li.oyuncu-k span.isim")
|
|
99
93
|
|
|
100
94
|
return MovieInfo(
|
|
101
95
|
url = url,
|
|
102
96
|
poster = self.fix_url(poster) if poster else None,
|
|
103
|
-
title = title,
|
|
97
|
+
title = title or "Bilinmiyor",
|
|
104
98
|
description = description,
|
|
99
|
+
rating = rating,
|
|
105
100
|
tags = tags,
|
|
106
|
-
year = year,
|
|
107
|
-
actors = actors
|
|
108
|
-
duration = int(duration_match) if duration_match else None,
|
|
101
|
+
year = str(year) if year else None,
|
|
102
|
+
actors = actors
|
|
109
103
|
)
|
|
110
104
|
|
|
111
105
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
112
106
|
istek = await self.httpx.get(url)
|
|
113
107
|
secici = HTMLHelper(istek.text)
|
|
114
108
|
|
|
115
|
-
iframe_list = secici.
|
|
109
|
+
iframe_list = secici.select_attrs("iframe", "data-vsrc")
|
|
116
110
|
|
|
117
111
|
# Sadece fragman varsa /2/ sayfasından dene
|
|
118
112
|
has_only_trailer = all(
|
|
@@ -125,7 +119,7 @@ class SinemaCX(PluginBase):
|
|
|
125
119
|
alt_istek = await self.httpx.get(alt_url)
|
|
126
120
|
alt_istek = await self.httpx.get(alt_url)
|
|
127
121
|
alt_sec = HTMLHelper(alt_istek.text)
|
|
128
|
-
iframe_list = alt_sec.
|
|
122
|
+
iframe_list = alt_sec.select_attrs("iframe", "data-vsrc")
|
|
129
123
|
|
|
130
124
|
if not iframe_list:
|
|
131
125
|
return []
|
KekikStream/Plugins/Sinezy.py
CHANGED
|
@@ -83,29 +83,28 @@ class Sinezy(PluginBase):
|
|
|
83
83
|
return results
|
|
84
84
|
|
|
85
85
|
async def load_item(self, url: str) -> MovieInfo:
|
|
86
|
-
resp
|
|
86
|
+
resp = await self.httpx.get(url)
|
|
87
87
|
secici = HTMLHelper(resp.text)
|
|
88
88
|
|
|
89
|
-
title
|
|
90
|
-
poster
|
|
89
|
+
title = secici.select_attr("div.detail", "title")
|
|
90
|
+
poster = secici.select_poster("div.move_k img")
|
|
91
91
|
description = secici.select_text("div.desc.yeniscroll p")
|
|
92
|
-
rating
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
rating = secici.select_text("span.info span.imdb")
|
|
93
|
+
tags = secici.select_texts("div.detail span a")
|
|
94
|
+
actors = secici.select_texts("span.oyn p")
|
|
95
|
+
year = secici.extract_year()
|
|
96
|
+
duration = secici.regex_first(r"(\d+) Dakika", secici.select_text("div.detail p"))
|
|
96
97
|
|
|
97
|
-
year = secici.regex_first(r"\b(19\d{2}|20\d{2})\b")
|
|
98
|
-
if not year:
|
|
99
|
-
year = secici.regex_first(r"\b(19\d{2}|20\d{2})\b", secici.html)
|
|
100
98
|
return MovieInfo(
|
|
101
|
-
title = title,
|
|
102
99
|
url = url,
|
|
103
100
|
poster = self.fix_url(poster) if poster else None,
|
|
101
|
+
title = title or "Bilinmiyor",
|
|
104
102
|
description = description,
|
|
105
103
|
tags = tags,
|
|
106
104
|
rating = rating,
|
|
105
|
+
year = str(year) if year else None,
|
|
107
106
|
actors = actors,
|
|
108
|
-
|
|
107
|
+
duration = duration
|
|
109
108
|
)
|
|
110
109
|
|
|
111
110
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
@@ -79,26 +79,21 @@ class SuperFilmGeldi(PluginBase):
|
|
|
79
79
|
istek = await self.httpx.get(url)
|
|
80
80
|
secici = HTMLHelper(istek.text)
|
|
81
81
|
|
|
82
|
-
title
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
poster = secici.select_attr("div.poster img", "src")
|
|
86
|
-
|
|
87
|
-
year = secici.extract_year("div.release a")
|
|
88
|
-
|
|
82
|
+
title = self.clean_title(secici.select_text("div.title h1").split(" izle")[0]) if secici.select_text("div.title h1") else ""
|
|
83
|
+
poster = secici.select_poster("div.poster img")
|
|
84
|
+
year = secici.extract_year("div.release a")
|
|
89
85
|
description = secici.select_text("div.excerpt p")
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
actors = secici.select_all_text("div.actor a")
|
|
86
|
+
tags = secici.select_texts("div.categories a")
|
|
87
|
+
actors = secici.select_texts("div.actor a")
|
|
93
88
|
|
|
94
89
|
return MovieInfo(
|
|
95
90
|
url = url,
|
|
96
91
|
poster = self.fix_url(poster) if poster else None,
|
|
97
|
-
title = title,
|
|
92
|
+
title = title or "Bilinmiyor",
|
|
98
93
|
description = description,
|
|
99
94
|
tags = tags,
|
|
100
|
-
year = year,
|
|
101
|
-
actors = actors
|
|
95
|
+
year = str(year) if year else None,
|
|
96
|
+
actors = actors
|
|
102
97
|
)
|
|
103
98
|
|
|
104
99
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
KekikStream/Plugins/UgurFilm.py
CHANGED
|
@@ -68,25 +68,25 @@ class UgurFilm(PluginBase):
|
|
|
68
68
|
istek = await self.httpx.get(url)
|
|
69
69
|
secici = HTMLHelper(istek.text)
|
|
70
70
|
|
|
71
|
-
title
|
|
72
|
-
poster
|
|
73
|
-
description = secici.select_text("div.slayt-aciklama")
|
|
74
|
-
|
|
75
|
-
tags
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
actors = secici.select_all_text("li.oyuncu-k span")
|
|
71
|
+
title = secici.select_text("div.bilgi h2")
|
|
72
|
+
poster = secici.select_poster("div.resim img")
|
|
73
|
+
description = secici.select_text("div.slayt-aciklama")
|
|
74
|
+
rating = secici.select_text("b#puandegistir")
|
|
75
|
+
tags = secici.select_texts("p.tur a[href*='/category/']")
|
|
76
|
+
year = secici.extract_year("a[href*='/yil/']")
|
|
77
|
+
actors = secici.select_texts("li.oyuncu-k span")
|
|
78
|
+
duration = secici.regex_first(r"(\d+) Dakika", secici.select_text("div.bilgi b"))
|
|
81
79
|
|
|
82
80
|
return MovieInfo(
|
|
83
|
-
url =
|
|
81
|
+
url = url,
|
|
84
82
|
poster = self.fix_url(poster) if poster else None,
|
|
85
|
-
title = title,
|
|
83
|
+
title = title or "Bilinmiyor",
|
|
86
84
|
description = description,
|
|
85
|
+
rating = rating,
|
|
87
86
|
tags = tags,
|
|
88
|
-
year = year,
|
|
87
|
+
year = str(year) if year else None,
|
|
89
88
|
actors = actors,
|
|
89
|
+
duration = duration
|
|
90
90
|
)
|
|
91
91
|
|
|
92
92
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
@@ -94,7 +94,7 @@ class UgurFilm(PluginBase):
|
|
|
94
94
|
secici = HTMLHelper(istek.text)
|
|
95
95
|
results = []
|
|
96
96
|
|
|
97
|
-
part_links = secici.
|
|
97
|
+
part_links = secici.select_attrs("li.parttab a", "href")
|
|
98
98
|
|
|
99
99
|
for part_link in part_links:
|
|
100
100
|
sub_response = await self.httpx.get(part_link)
|
KekikStream/Plugins/Watch32.py
CHANGED
|
@@ -76,86 +76,54 @@ class Watch32(PluginBase):
|
|
|
76
76
|
istek = await self.httpx.get(url)
|
|
77
77
|
helper = HTMLHelper(istek.text)
|
|
78
78
|
|
|
79
|
-
content_id
|
|
80
|
-
details
|
|
81
|
-
name
|
|
82
|
-
|
|
83
|
-
poster = helper.select_attr("div.film-poster > img", "src", details)
|
|
79
|
+
content_id = helper.select_attr("div.detail_page-watch", "data-id")
|
|
80
|
+
details = helper.select_first("div.detail_page-infor")
|
|
81
|
+
name = helper.select_text("h2.heading-name > a", details)
|
|
82
|
+
poster = helper.select_poster("div.film-poster > img", details)
|
|
84
83
|
description = helper.select_text("div.description", details)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
# Fallback for series
|
|
90
|
-
year_text = helper.regex_first(r"Released:.+?(\d{4})")
|
|
91
|
-
|
|
92
|
-
# Tags/Genres
|
|
93
|
-
tags = helper.select_all_text("div.row-line:has(> span.type > strong:contains(Genre)) a")
|
|
94
|
-
|
|
95
|
-
# Rating
|
|
96
|
-
rating = helper.select_text("button.btn-imdb")
|
|
97
|
-
if rating:
|
|
98
|
-
rating = rating.replace("N/A", "").split(":")[-1].strip()
|
|
84
|
+
year = str(helper.extract_year())
|
|
85
|
+
tags = helper.meta_list("Genre", container_selector="div.row-line")
|
|
86
|
+
rating = helper.select_text("button.btn-imdb").replace("N/A", "").split(":")[-1].strip() if helper.select_text("button.btn-imdb") else None
|
|
87
|
+
actors = helper.meta_list("Casts", container_selector="div.row-line")
|
|
99
88
|
|
|
100
|
-
|
|
101
|
-
|
|
89
|
+
common_info = {
|
|
90
|
+
"url" : url,
|
|
91
|
+
"poster" : self.fix_url(poster),
|
|
92
|
+
"title" : name or "Bilinmiyor",
|
|
93
|
+
"description" : description,
|
|
94
|
+
"tags" : tags,
|
|
95
|
+
"rating" : rating,
|
|
96
|
+
"year" : year,
|
|
97
|
+
"actors" : actors
|
|
98
|
+
}
|
|
102
99
|
|
|
103
100
|
if "movie" in url:
|
|
104
|
-
return MovieInfo(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
)
|
|
114
|
-
else:
|
|
115
|
-
episodes = []
|
|
116
|
-
seasons_resp = await self.httpx.get(f"{self.main_url}/ajax/season/list/{content_id}")
|
|
117
|
-
sh = HTMLHelper(seasons_resp.text)
|
|
118
|
-
seasons = sh.select("a.dropdown-item") # Relaxed selector from a.ss-item
|
|
101
|
+
return MovieInfo(**common_info)
|
|
102
|
+
|
|
103
|
+
episodes = []
|
|
104
|
+
seasons_resp = await self.httpx.get(f"{self.main_url}/ajax/season/list/{content_id}")
|
|
105
|
+
sh = HTMLHelper(seasons_resp.text)
|
|
106
|
+
|
|
107
|
+
for season in sh.select("a.dropdown-item"):
|
|
108
|
+
season_id = season.attrs.get("data-id")
|
|
109
|
+
s_val, _ = sh.extract_season_episode(season.text())
|
|
119
110
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
season_num_text = season.text().replace("Season ", "").replace("Series", "").strip()
|
|
123
|
-
season_num = int(season_num_text) if season_num_text.isdigit() else 1
|
|
124
|
-
|
|
125
|
-
episodes_resp = await self.httpx.get(f"{self.main_url}/ajax/season/episodes/{season_id}")
|
|
126
|
-
eh = HTMLHelper(episodes_resp.text)
|
|
127
|
-
eps = eh.select("a.eps-item")
|
|
128
|
-
|
|
129
|
-
for ep in eps:
|
|
130
|
-
ep_id = ep.attrs.get("data-id")
|
|
131
|
-
ep_title_raw = ep.attrs.get("title", "")
|
|
132
|
-
# Eps 1: Name
|
|
133
|
-
m = re.search(r"Eps (\d+): (.+)", ep_title_raw)
|
|
134
|
-
if m:
|
|
135
|
-
ep_num = int(m.group(1))
|
|
136
|
-
ep_name = m.group(2)
|
|
137
|
-
else:
|
|
138
|
-
ep_num = 1
|
|
139
|
-
ep_name = ep_title_raw
|
|
140
|
-
|
|
141
|
-
episodes.append(Episode(
|
|
142
|
-
season = season_num,
|
|
143
|
-
episode = ep_num,
|
|
144
|
-
title = ep_name,
|
|
145
|
-
url = f"servers/{ep_id}"
|
|
146
|
-
))
|
|
111
|
+
e_resp = await self.httpx.get(f"{self.main_url}/ajax/season/episodes/{season_id}")
|
|
112
|
+
eh = HTMLHelper(e_resp.text)
|
|
147
113
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
114
|
+
for ep in eh.select("a.eps-item"):
|
|
115
|
+
ep_id = ep.attrs.get("data-id")
|
|
116
|
+
ep_title = ep.attrs.get("title", "")
|
|
117
|
+
_, e_val = eh.extract_season_episode(ep_title)
|
|
118
|
+
|
|
119
|
+
episodes.append(Episode(
|
|
120
|
+
season = s_val or 1,
|
|
121
|
+
episode = e_val or 1,
|
|
122
|
+
title = ep_title,
|
|
123
|
+
url = f"servers/{ep_id}"
|
|
124
|
+
))
|
|
125
|
+
|
|
126
|
+
return SeriesInfo(**common_info, episodes=episodes)
|
|
159
127
|
|
|
160
128
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
161
129
|
# url in load_links might be the full page URL for movies or "servers/epId" for episodes
|
|
@@ -84,97 +84,43 @@ class YabanciDizi(PluginBase):
|
|
|
84
84
|
resp = await self.httpx.get(url, follow_redirects=True)
|
|
85
85
|
sel = HTMLHelper(resp.text)
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
poster = sel.select_attr("meta[property='og:image']", "content")
|
|
87
|
+
title = (sel.select_attr("meta[property='og:title']", "content") or "").split("|")[0].strip() or sel.select_text("h1")
|
|
88
|
+
poster = sel.select_poster("meta[property='og:image']")
|
|
91
89
|
description = sel.select_text("p#tv-series-desc")
|
|
90
|
+
year = sel.extract_year("td div.truncate")
|
|
91
|
+
tags = sel.meta_list("Türü", container_selector="div.item")
|
|
92
|
+
rating = sel.meta_value("IMDb Puanı", container_selector="div.item")
|
|
93
|
+
duration = int(sel.regex_first(r"(\d+)", sel.meta_value("Süre", container_selector="div.item")) or 0)
|
|
94
|
+
actors = sel.meta_list("Oyuncular", container_selector="div.item") or sel.select_texts("div#common-cast-list div.item h5")
|
|
92
95
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
actors = []
|
|
105
|
-
for item in sel.select("div.item"):
|
|
106
|
-
text = item.text(strip=True)
|
|
107
|
-
if "T\u00fcr\u00fc:" in text:
|
|
108
|
-
tags = [t.strip() for t in text.replace("T\u00fcr\u00fc:", "").split(",")]
|
|
109
|
-
elif "IMDb Puan\u0131" in text:
|
|
110
|
-
rating = text.replace("IMDb Puan\u0131", "").strip()
|
|
111
|
-
elif "Yap\u0131m Y\u0131l\u0131" in text:
|
|
112
|
-
year_match = sel.regex_first(r"(\d{4})", text)
|
|
113
|
-
if year_match:
|
|
114
|
-
year = year_match
|
|
115
|
-
elif "Takip\u00e7iler" in text:
|
|
116
|
-
continue
|
|
117
|
-
elif "S\u00fcre" in text:
|
|
118
|
-
dur_match = sel.regex_first(r"(\d+)", text)
|
|
119
|
-
if dur_match:
|
|
120
|
-
duration = dur_match
|
|
121
|
-
elif "Oyuncular:" in text:
|
|
122
|
-
actors = [a.text(strip=True) for a in sel.select("a", item)]
|
|
123
|
-
|
|
124
|
-
if not actors:
|
|
125
|
-
actors = [a.text(strip=True) for a in sel.select("div#common-cast-list div.item h5")]
|
|
126
|
-
|
|
127
|
-
trailer_match = sel.regex_first(r"embed\/(.*)\?rel", resp.text)
|
|
128
|
-
trailer = f"https://www.youtube.com/embed/{trailer_match}" if trailer_match else None
|
|
96
|
+
common_info = {
|
|
97
|
+
"url" : url,
|
|
98
|
+
"poster" : self.fix_url(poster) if poster else None,
|
|
99
|
+
"title" : title or "Bilinmiyor",
|
|
100
|
+
"description" : description,
|
|
101
|
+
"tags" : tags,
|
|
102
|
+
"rating" : rating,
|
|
103
|
+
"year" : str(year) if year else None,
|
|
104
|
+
"actors" : actors,
|
|
105
|
+
"duration" : duration
|
|
106
|
+
}
|
|
129
107
|
|
|
130
108
|
if "/film/" in url:
|
|
131
|
-
return MovieInfo(
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
episodes
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if not link_el: continue
|
|
147
|
-
|
|
148
|
-
bolum_href = link_el.attrs.get("href")
|
|
149
|
-
bolum_name = sel.select_text("h6", bolum_item) or link_el.text(strip=True)
|
|
150
|
-
|
|
151
|
-
season = sel.regex_first(r"sezon-(\d+)", bolum_href)
|
|
152
|
-
episode = sel.regex_first(r"bolum-(\d+)", bolum_href)
|
|
153
|
-
|
|
154
|
-
ep_season = int(season) if season and season.isdigit() else None
|
|
155
|
-
ep_episode = int(episode) if episode and episode.isdigit() else None
|
|
156
|
-
|
|
157
|
-
episodes.append(Episode(
|
|
158
|
-
season = ep_season,
|
|
159
|
-
episode = ep_episode,
|
|
160
|
-
title = bolum_name,
|
|
161
|
-
url = self.fix_url(bolum_href)
|
|
162
|
-
))
|
|
163
|
-
|
|
164
|
-
if episodes and (episodes[0].episode or 0) > (episodes[-1].episode or 0):
|
|
165
|
-
episodes.reverse()
|
|
166
|
-
|
|
167
|
-
return SeriesInfo(
|
|
168
|
-
title = title,
|
|
169
|
-
url = url,
|
|
170
|
-
poster = self.fix_url(poster) if poster else None,
|
|
171
|
-
description = description,
|
|
172
|
-
rating = rating,
|
|
173
|
-
tags = tags,
|
|
174
|
-
actors = actors,
|
|
175
|
-
year = year,
|
|
176
|
-
episodes = episodes
|
|
177
|
-
)
|
|
109
|
+
return MovieInfo(**common_info)
|
|
110
|
+
|
|
111
|
+
episodes = []
|
|
112
|
+
for bolum in sel.select("div.episodes-list div.ui td:has(h6)"):
|
|
113
|
+
link = sel.select_first("a", bolum)
|
|
114
|
+
if link:
|
|
115
|
+
href = link.attrs.get("href")
|
|
116
|
+
name = sel.select_text("h6", bolum) or link.text(strip=True)
|
|
117
|
+
s, e = sel.extract_season_episode(href)
|
|
118
|
+
episodes.append(Episode(season=s or 1, episode=e or 1, title=name, url=self.fix_url(href)))
|
|
119
|
+
|
|
120
|
+
if episodes and (episodes[0].episode or 0) > (episodes[-1].episode or 0):
|
|
121
|
+
episodes.reverse()
|
|
122
|
+
|
|
123
|
+
return SeriesInfo(**common_info, episodes=episodes)
|
|
178
124
|
|
|
179
125
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
180
126
|
# Use cloudscraper to bypass Cloudflare
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.4
|
|
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
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
KekikStream/__init__.py,sha256=nTgIxO1716DVX-cZnMvwi6OjPbuebFyeYpHvpqCJ0Js,12767
|
|
2
|
+
KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
|
|
3
|
+
KekikStream/requirements.txt,sha256=V-Rk-4DnK8B-HRR6RtSKmTR3sHfaYgOrnBj8kmVz17w,80
|
|
4
|
+
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
|
5
|
+
KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElcii8,1487
|
|
6
|
+
KekikStream/Core/HTMLHelper.py,sha256=JI677_XerQc6ZwKDpwoCzfyHlKDekEWDuHgsEFOPu50,9792
|
|
7
|
+
KekikStream/Core/__init__.py,sha256=sk2pWup1_jsGB43HJzbbqgQYFDZpf2TquEBYUhqOdN4,807
|
|
8
|
+
KekikStream/Core/Extractor/ExtractorBase.py,sha256=9Q79wULey2Nl254MUkiulhxZzGyb2C1H3mOUh4t0MN0,2077
|
|
9
|
+
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=GPGCmgFpDBywR8CsNw43-ddseZhSKTjAUETp1Ohbi6E,4796
|
|
10
|
+
KekikStream/Core/Extractor/ExtractorManager.py,sha256=VYkj4CCE5Puqsr6PCeN8i_OS0hfYKI4NScj98BLO39o,2644
|
|
11
|
+
KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6XBOc0HS0tXGDwajI,445
|
|
12
|
+
KekikStream/Core/Extractor/YTDLPCache.py,sha256=sRg5kwFxkRXA_8iRwsV29E51g9qQJvg8dWUnzfr7EwA,984
|
|
13
|
+
KekikStream/Core/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
|
|
14
|
+
KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
|
|
15
|
+
KekikStream/Core/Plugin/PluginBase.py,sha256=ciZGztbXzm2co3WZBjnghtbQuxH4jUMRmjInvS0WDeI,6692
|
|
16
|
+
KekikStream/Core/Plugin/PluginLoader.py,sha256=6LE5id0571bB-gJZxaLfd973XcG6oaGeMhLVcYYY7kw,3768
|
|
17
|
+
KekikStream/Core/Plugin/PluginManager.py,sha256=6a0Q2mHtzIpx1ttdSTsVHg2HfLJIO0r_iHjK3Kui1Rw,939
|
|
18
|
+
KekikStream/Core/Plugin/PluginModels.py,sha256=7g1uHjJstfnrdTabDgyrBnu1ojIQ025hsmw85cDXFS8,2353
|
|
19
|
+
KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
|
|
20
|
+
KekikStream/Extractors/CloseLoad.py,sha256=eoXr9Dxgfy3BUdQpXrvS69bqCFBmag95cmJLGhsHslE,1922
|
|
21
|
+
KekikStream/Extractors/ContentX.py,sha256=832xDeKoudQYJBRxJntOuJ0G8xYFVq2vHhycdnzcMeg,2539
|
|
22
|
+
KekikStream/Extractors/DonilasPlay.py,sha256=yIh6ZOVjXzHKc_Zi8j0Cpr4vWibwkSeoZxeFfU8IfmQ,1844
|
|
23
|
+
KekikStream/Extractors/DzenRu.py,sha256=tUrQexHkclw9EdoFD_ACejW-QwlOnTDFTxA0v-1jIVU,932
|
|
24
|
+
KekikStream/Extractors/ExPlay.py,sha256=hrG31pRFD5s_0wNls0fF8AdMn6ve5OD-mOAV32_1H2I,1324
|
|
25
|
+
KekikStream/Extractors/Filemoon.py,sha256=y3VQpTVR2o4PGbRfLEXOlxQ0NM-JblaMUpoFhpka5iI,2263
|
|
26
|
+
KekikStream/Extractors/HDMomPlayer.py,sha256=ui8aH9sc3NDlN2uKlhJiySUHA__mpSSvAPHRzde6F2k,1177
|
|
27
|
+
KekikStream/Extractors/HDPlayerSystem.py,sha256=hoPN7fqVRBK97BnQ7vF_5TlEO28BD3DrsngDW48rw5E,936
|
|
28
|
+
KekikStream/Extractors/HotStream.py,sha256=37H9pK4HSEqGR6QKgxz887JCBXfXB1NXDpBGuhvPmXo,1078
|
|
29
|
+
KekikStream/Extractors/JFVid.py,sha256=rdy0bmqZIruejn1G1YNxVM3wlqxkdFRd4zunxxZlev4,746
|
|
30
|
+
KekikStream/Extractors/JetTv.py,sha256=Cdx1XZEtQZkrmOdZdgM9E1iBkCNzVTExjrI_F-3Nv-I,1176
|
|
31
|
+
KekikStream/Extractors/MailRu.py,sha256=n87wBc9jQ4nP8OJbqS7LsHHCKuRxlsgdtL_xHVn0rdY,779
|
|
32
|
+
KekikStream/Extractors/MixPlayHD.py,sha256=otA2SKDnJisY4Zt9DCuNdjNVHtSquHoMVvP3_5Q0poY,1205
|
|
33
|
+
KekikStream/Extractors/MixTiger.py,sha256=kF_AKkJoyAS6peQ94eu3pLzS-VeZ_8IYjpaDrTo3x_I,1135
|
|
34
|
+
KekikStream/Extractors/MolyStream.py,sha256=L38rydMtnRxeqHjLK4vOLMC7FspbyTPdILEjE-gsbYc,1531
|
|
35
|
+
KekikStream/Extractors/Odnoklassniki.py,sha256=V790IUkMeYjim9Hx4hjWF0OWu6AhMTaLq3fMwAqtQNc,1577
|
|
36
|
+
KekikStream/Extractors/PeaceMakerst.py,sha256=0YE-IASOoSoQi4AITKkX7IyGcyfq_ZhmFmqw2q2TZ_U,1491
|
|
37
|
+
KekikStream/Extractors/PixelDrain.py,sha256=BYu8UmVNw3EL75Z1X8NszWPfFarmry_3chWRO1JoKCs,780
|
|
38
|
+
KekikStream/Extractors/PlayerFilmIzle.py,sha256=GVB2Ly3381IGIc1FztFS35mHVIMQjcc2_IW8KvWYBdI,1877
|
|
39
|
+
KekikStream/Extractors/RapidVid.py,sha256=4nWqTNfJ70Qq67LgaYjnUU4NrHwbeqRN9uldo0j941E,3028
|
|
40
|
+
KekikStream/Extractors/SetPlay.py,sha256=uWkXimWc5olsYLK46l440Pp8WgehbctM323n9PwoEJs,1556
|
|
41
|
+
KekikStream/Extractors/SetPrime.py,sha256=5xqB72D8FjH3JNrbynA75y_n_aUFZ2vXSr1MY3nZ4cU,1495
|
|
42
|
+
KekikStream/Extractors/SibNet.py,sha256=67FS1yLUWf_ZBkVehRiYu2pFkIdNO4-2EZEomCHo8Jk,692
|
|
43
|
+
KekikStream/Extractors/Sobreatsesuyp.py,sha256=IORS2fXauATYiN4sdU_WuSfsbFUhphxqsGq7C6mzaEw,1484
|
|
44
|
+
KekikStream/Extractors/TRsTX.py,sha256=l425nQZciyYEJjOJ1nyPhDnmD-4bI9O16V6lJhY98Os,1444
|
|
45
|
+
KekikStream/Extractors/TauVideo.py,sha256=2ai9BwwM6qlCgxK7E0B642LtOF5y4hEb9tQ2aDpbMtc,1112
|
|
46
|
+
KekikStream/Extractors/TurboImgz.py,sha256=-RyC4EWtJdK85Ei01lntqivnSmk4tXOlmSXv70cQJ70,679
|
|
47
|
+
KekikStream/Extractors/TurkeyPlayer.py,sha256=zdX0IOO3M-kgAYWex2WwJJu9aGf8WhOY-ZIrRmZRiC0,1246
|
|
48
|
+
KekikStream/Extractors/VCTPlay.py,sha256=MdCH9GhhKod4oPT3ePH8rhicUWuNT-GsE42S72o1NJ4,876
|
|
49
|
+
KekikStream/Extractors/VidHide.py,sha256=xJSferkaCLOQ-kLgsA_eDZCmGagiL2711boOdogOlWw,1918
|
|
50
|
+
KekikStream/Extractors/VidMoly.py,sha256=awrjBtxtP2xEr8xRTCH1JcnRattzIAdxGE2rDd9czDg,4132
|
|
51
|
+
KekikStream/Extractors/VidMoxy.py,sha256=qTkTFRqTgQVi-E94zY5lQC2-AYFhkl8LqaOJpgGdErc,1452
|
|
52
|
+
KekikStream/Extractors/VidPapi.py,sha256=yqjA5gadCE2lZ9ksT6zZOz-1zCcCYJxZsg0Ccgz2X10,1988
|
|
53
|
+
KekikStream/Extractors/VideoSeyred.py,sha256=sNxw5OHQ8AzRJIRGXGjql8nK1E6Cbg9qhKP5PuOyeM8,1216
|
|
54
|
+
KekikStream/Extractors/Videostr.py,sha256=CGL9GDzN0QzDir6ss8oUvDYYbGt2k8323P2_z5tVZVI,2563
|
|
55
|
+
KekikStream/Extractors/Vidoza.py,sha256=VSqCI-SYnLh6COnLHpg0feRX37t2WhPxbo08us5wCcc,655
|
|
56
|
+
KekikStream/Extractors/YTDLP.py,sha256=Hy8loCSFSquu2zaL3INord-Jm6T8CM6K2-VcDA2K79g,7390
|
|
57
|
+
KekikStream/Extractors/YildizKisaFilm.py,sha256=jeCCSIwZvQUr-CSylleUIP--JtN18_wUGl0vQXMCsV4,936
|
|
58
|
+
KekikStream/Plugins/BelgeselX.py,sha256=0LZYeV8ve2HGsNvuqACltP7eI_nZyjoCBjeYWMokUXY,9175
|
|
59
|
+
KekikStream/Plugins/DiziBox.py,sha256=F0X_vUVFbzFIgo504dyXjJkJIB6OxoHRxD3CCBUNsxg,10087
|
|
60
|
+
KekikStream/Plugins/DiziMom.py,sha256=0kOXekDk9-I-rRgQZmKH0pZmYDgfdkS2PXOBbTlhI0g,6776
|
|
61
|
+
KekikStream/Plugins/DiziPal.py,sha256=gDj_7iJaP5WIoRWKZmvF6Q6nbPm8TBw9jAjbk_E75NA,7352
|
|
62
|
+
KekikStream/Plugins/DiziYou.py,sha256=ZgHVTEeXhLC5aNP7MeeIcmLxqAPPzj0WWOiZHHpkAho,6550
|
|
63
|
+
KekikStream/Plugins/Dizilla.py,sha256=GmA__LCUAMTQ0tbbeWiH8h_aA6Rw7k2chAJZRsDifjg,12908
|
|
64
|
+
KekikStream/Plugins/FilmBip.py,sha256=gHdYHEZjDBPkajQjqBZGVhbs97zDr5mF_cVSUKn8ljE,6018
|
|
65
|
+
KekikStream/Plugins/FilmEkseni.py,sha256=odqu-PM2L8iEsO97MVNTsHmyVWTgnudOlVMv1o9izC8,5352
|
|
66
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=OGZHkNVx4jgsKvY1GpumtkNxKG9eAH9n9xOP3xyDC7g,6341
|
|
67
|
+
KekikStream/Plugins/FilmModu.py,sha256=yzGe0uMPgkq2n6bhuS2W7P_hIIeJPW1J4dHXmgkq6-8,7073
|
|
68
|
+
KekikStream/Plugins/Filmatek.py,sha256=TuTV4bl0NdgKjR_fQBVc8wzGWdHN0h-NDm2kbvWbMeg,7260
|
|
69
|
+
KekikStream/Plugins/Full4kizle.py,sha256=h0cwOiV1ELptDG1IzwJU4qdzQm7vzWI6sFFcbfmBXJk,7783
|
|
70
|
+
KekikStream/Plugins/FullHDFilm.py,sha256=MkobrrzHTc8t6AYdcSOD2rpUOdKnkpXsUZezcqICDhE,8183
|
|
71
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=BetcwSyMtNOrOT4tjmJ_Na8u4Popf3S4V1Gw5vys0jw,6470
|
|
72
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=WgwoqHpHYJUd78TR_hNfgJEc0raR7MDPsNo7A5nt3fc,11954
|
|
73
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=LQaOv70QOe6t7oQB2aao7eSBQjeCyFjNID2OESXXUOY,8280
|
|
74
|
+
KekikStream/Plugins/KultFilmler.py,sha256=KfsfvFwEJ_rgMOmBHA-5iSIEe-iCZtO-RG1nh1AOnJw,8559
|
|
75
|
+
KekikStream/Plugins/RecTV.py,sha256=MRoP8KQF2V9kVlRNTQkRz9YFkBmMy3_skiNE47-RAlk,7151
|
|
76
|
+
KekikStream/Plugins/RoketDizi.py,sha256=KiX7Xf5IyPPJ-CVcJLM9qc0M6Fi2dhg7zU3EgWkICXA,9318
|
|
77
|
+
KekikStream/Plugins/SelcukFlix.py,sha256=1_v7-aqbOrWPNUHUL0n1mpUm29wUXrtfRbMMvD9sL9k,14520
|
|
78
|
+
KekikStream/Plugins/SetFilmIzle.py,sha256=oj32n7QWersZMymjfwt9QPxWhWj2YlIhOtehnMMYqoY,9172
|
|
79
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=WCfMqoCX3_4mVF6_N5K5WzJIveb4jNmd0IrfM8pxqQ8,8511
|
|
80
|
+
KekikStream/Plugins/SineWix.py,sha256=z0r90lggAugEWE1g9vg8gZsInBObUZPnVFQwq7GYmJs,7052
|
|
81
|
+
KekikStream/Plugins/Sinefy.py,sha256=oLp2jtNa-3l_vS1Z8sqcsTyKmiY-xJq0-cFQ6KC8L4c,8603
|
|
82
|
+
KekikStream/Plugins/SinemaCX.py,sha256=q9ZNnkUxGotTzjslzoJu1GzZDF31J3RayzeUAfAsGzw,7688
|
|
83
|
+
KekikStream/Plugins/Sinezy.py,sha256=KHo8_vIW-aJh2ix72kGB54Wdw8PLmik78zzIwAxrspA,5811
|
|
84
|
+
KekikStream/Plugins/SuperFilmGeldi.py,sha256=wfhbZLNAuiz57KOarSrsoMLLpr9-zd6zjp7AmUisaBY,6402
|
|
85
|
+
KekikStream/Plugins/UgurFilm.py,sha256=WIdyu8X1ZdixigumEwEpZjtbM-melHfvT_u5N349oN4,5116
|
|
86
|
+
KekikStream/Plugins/Watch32.py,sha256=NeESk1unb5SYs6kwkb3dDymv2yYOkRU2QJCPI9izXKk,7915
|
|
87
|
+
KekikStream/Plugins/YabanciDizi.py,sha256=cTAREfia6df-rLeXDhxLCrKRHeZI_l_-nhjgIAD1jNA,9975
|
|
88
|
+
kekikstream-2.4.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
89
|
+
kekikstream-2.4.4.dist-info/METADATA,sha256=LuV2Kn0ryFqkcYJXMYXpUheRWJRsD8rTpAJRY0baJFw,10745
|
|
90
|
+
kekikstream-2.4.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
91
|
+
kekikstream-2.4.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
92
|
+
kekikstream-2.4.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
93
|
+
kekikstream-2.4.4.dist-info/RECORD,,
|