KekikStream 2.3.3__py3-none-any.whl → 2.3.5__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/HTMLHelper.py +134 -0
- KekikStream/Core/Plugin/PluginBase.py +12 -2
- KekikStream/Core/__init__.py +2 -0
- KekikStream/Extractors/CloseLoad.py +12 -13
- KekikStream/Extractors/ContentX.py +33 -31
- KekikStream/Extractors/DonilasPlay.py +10 -10
- KekikStream/Extractors/DzenRu.py +3 -3
- KekikStream/Extractors/ExPlay.py +10 -10
- KekikStream/Extractors/Filemoon.py +11 -16
- KekikStream/Extractors/JetTv.py +4 -4
- KekikStream/Extractors/MixPlayHD.py +10 -11
- KekikStream/Extractors/MolyStream.py +15 -9
- KekikStream/Extractors/Odnoklassniki.py +4 -4
- KekikStream/Extractors/PeaceMakerst.py +3 -3
- KekikStream/Extractors/PixelDrain.py +6 -5
- KekikStream/Extractors/PlayerFilmIzle.py +6 -10
- KekikStream/Extractors/RapidVid.py +8 -7
- KekikStream/Extractors/SetPlay.py +10 -10
- KekikStream/Extractors/SetPrime.py +3 -6
- KekikStream/Extractors/SibNet.py +4 -5
- KekikStream/Extractors/Sobreatsesuyp.py +5 -5
- KekikStream/Extractors/TRsTX.py +5 -5
- KekikStream/Extractors/TurboImgz.py +3 -4
- KekikStream/Extractors/TurkeyPlayer.py +5 -5
- KekikStream/Extractors/VidHide.py +4 -7
- KekikStream/Extractors/VidMoly.py +24 -25
- KekikStream/Extractors/VidMoxy.py +8 -9
- KekikStream/Extractors/VidPapi.py +5 -7
- KekikStream/Extractors/VideoSeyred.py +3 -3
- KekikStream/Plugins/BelgeselX.py +40 -51
- KekikStream/Plugins/DiziBox.py +53 -81
- KekikStream/Plugins/DiziPal.py +41 -74
- KekikStream/Plugins/DiziWatch.py +217 -0
- KekikStream/Plugins/DiziYou.py +95 -88
- KekikStream/Plugins/Dizilla.py +54 -72
- KekikStream/Plugins/FilmBip.py +24 -49
- KekikStream/Plugins/FilmMakinesi.py +35 -52
- KekikStream/Plugins/FilmModu.py +27 -41
- KekikStream/Plugins/FullHDFilm.py +50 -72
- KekikStream/Plugins/FullHDFilmizlesene.py +35 -51
- KekikStream/Plugins/HDFilmCehennemi.py +48 -62
- KekikStream/Plugins/JetFilmizle.py +32 -50
- KekikStream/Plugins/KultFilmler.py +42 -67
- KekikStream/Plugins/RecTV.py +7 -4
- KekikStream/Plugins/RoketDizi.py +30 -50
- KekikStream/Plugins/SelcukFlix.py +15 -29
- KekikStream/Plugins/SetFilmIzle.py +41 -70
- KekikStream/Plugins/SezonlukDizi.py +47 -65
- KekikStream/Plugins/Sinefy.py +39 -50
- KekikStream/Plugins/SinemaCX.py +31 -55
- KekikStream/Plugins/Sinezy.py +27 -54
- KekikStream/Plugins/SuperFilmGeldi.py +25 -44
- KekikStream/Plugins/UgurFilm.py +23 -48
- KekikStream/Plugins/YabanciDizi.py +274 -0
- {kekikstream-2.3.3.dist-info → kekikstream-2.3.5.dist-info}/METADATA +1 -1
- kekikstream-2.3.5.dist-info/RECORD +85 -0
- kekikstream-2.3.3.dist-info/RECORD +0 -82
- {kekikstream-2.3.3.dist-info → kekikstream-2.3.5.dist-info}/WHEEL +0 -0
- {kekikstream-2.3.3.dist-info → kekikstream-2.3.5.dist-info}/entry_points.txt +0 -0
- {kekikstream-2.3.3.dist-info → kekikstream-2.3.5.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-2.3.3.dist-info → kekikstream-2.3.5.dist-info}/top_level.txt +0 -0
KekikStream/Plugins/SinemaCX.py
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, Subtitle, ExtractResult
|
|
4
|
-
from
|
|
5
|
-
import re
|
|
4
|
+
from KekikStream.Core.HTMLHelper import HTMLHelper
|
|
6
5
|
|
|
7
6
|
class SinemaCX(PluginBase):
|
|
8
7
|
name = "SinemaCX"
|
|
@@ -39,23 +38,16 @@ class SinemaCX(PluginBase):
|
|
|
39
38
|
|
|
40
39
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
41
40
|
istek = await self.httpx.get(url.replace("SAYFA", str(page)))
|
|
42
|
-
secici =
|
|
41
|
+
secici = HTMLHelper(istek.text)
|
|
43
42
|
|
|
44
43
|
results = []
|
|
45
|
-
for veri in secici.
|
|
46
|
-
|
|
47
|
-
if not span_el:
|
|
48
|
-
continue
|
|
49
|
-
|
|
50
|
-
title = span_el.text(strip=True)
|
|
44
|
+
for veri in secici.select("div.son div.frag-k, div.icerik div.frag-k"):
|
|
45
|
+
title = secici.select_text("div.yanac span", veri)
|
|
51
46
|
if not title:
|
|
52
47
|
continue
|
|
53
48
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
href = link_el.attrs.get("href") if link_el else None
|
|
58
|
-
poster = (img_el.attrs.get("data-src") or img_el.attrs.get("src")) if img_el else None
|
|
49
|
+
href = secici.select_attr("div.yanac a", "href", veri)
|
|
50
|
+
poster = secici.select_attr("a.resim img", "data-src", veri) or secici.select_attr("a.resim img", "src", veri)
|
|
59
51
|
|
|
60
52
|
results.append(MainPageResult(
|
|
61
53
|
category = category,
|
|
@@ -68,23 +60,16 @@ class SinemaCX(PluginBase):
|
|
|
68
60
|
|
|
69
61
|
async def search(self, query: str) -> list[SearchResult]:
|
|
70
62
|
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
71
|
-
secici =
|
|
63
|
+
secici = HTMLHelper(istek.text)
|
|
72
64
|
|
|
73
65
|
results = []
|
|
74
|
-
for veri in secici.
|
|
75
|
-
|
|
76
|
-
if not span_el:
|
|
77
|
-
continue
|
|
78
|
-
|
|
79
|
-
title = span_el.text(strip=True)
|
|
66
|
+
for veri in secici.select("div.icerik div.frag-k"):
|
|
67
|
+
title = secici.select_text("div.yanac span", veri)
|
|
80
68
|
if not title:
|
|
81
69
|
continue
|
|
82
70
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
href = link_el.attrs.get("href") if link_el else None
|
|
87
|
-
poster = (img_el.attrs.get("data-src") or img_el.attrs.get("src")) if img_el else None
|
|
71
|
+
href = secici.select_attr("div.yanac a", "href", veri)
|
|
72
|
+
poster = secici.select_attr("a.resim img", "data-src", veri) or secici.select_attr("a.resim img", "src", veri)
|
|
88
73
|
|
|
89
74
|
results.append(SearchResult(
|
|
90
75
|
title = title,
|
|
@@ -96,29 +81,21 @@ class SinemaCX(PluginBase):
|
|
|
96
81
|
|
|
97
82
|
async def load_item(self, url: str) -> MovieInfo:
|
|
98
83
|
istek = await self.httpx.get(url)
|
|
99
|
-
secici =
|
|
84
|
+
secici = HTMLHelper(istek.text)
|
|
100
85
|
|
|
101
|
-
duration_match =
|
|
86
|
+
duration_match = secici.regex_first(r"Süre:.*?(\d+)\s*Dakika")
|
|
102
87
|
|
|
103
|
-
|
|
104
|
-
description = desc_el.text(strip=True) if desc_el else None
|
|
88
|
+
description = secici.select_text("div.ackl div.scroll-liste")
|
|
105
89
|
|
|
106
|
-
|
|
107
|
-
poster = link_el.attrs.get("href") if link_el else None
|
|
90
|
+
poster = secici.select_attr("link[rel='image_src']", "href")
|
|
108
91
|
|
|
109
|
-
|
|
110
|
-
title = title_el.text(strip=True) if title_el else None
|
|
92
|
+
title = secici.select_text("div.f-bilgi h1")
|
|
111
93
|
|
|
112
|
-
tags
|
|
94
|
+
tags = secici.select_all_text("div.f-bilgi div.tur a")
|
|
113
95
|
|
|
114
|
-
|
|
115
|
-
year = year_el.text(strip=True) if year_el else None
|
|
96
|
+
year = secici.select_text("div.f-bilgi ul.detay a[href*='yapim']")
|
|
116
97
|
|
|
117
|
-
actors
|
|
118
|
-
for li in secici.css("li.oync li.oyuncu-k"):
|
|
119
|
-
isim_el = li.css_first("span.isim")
|
|
120
|
-
if isim_el and isim_el.text(strip=True):
|
|
121
|
-
actors.append(isim_el.text(strip=True))
|
|
98
|
+
actors = secici.select_all_text("li.oync li.oyuncu-k span.isim")
|
|
122
99
|
|
|
123
100
|
return MovieInfo(
|
|
124
101
|
url = url,
|
|
@@ -128,14 +105,14 @@ class SinemaCX(PluginBase):
|
|
|
128
105
|
tags = tags,
|
|
129
106
|
year = year,
|
|
130
107
|
actors = actors,
|
|
131
|
-
duration = int(duration_match
|
|
108
|
+
duration = int(duration_match) if duration_match else None,
|
|
132
109
|
)
|
|
133
110
|
|
|
134
111
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
135
112
|
istek = await self.httpx.get(url)
|
|
136
|
-
secici =
|
|
113
|
+
secici = HTMLHelper(istek.text)
|
|
137
114
|
|
|
138
|
-
iframe_list =
|
|
115
|
+
iframe_list = secici.select_all_attr("iframe", "data-vsrc")
|
|
139
116
|
|
|
140
117
|
# Sadece fragman varsa /2/ sayfasından dene
|
|
141
118
|
has_only_trailer = all(
|
|
@@ -146,8 +123,9 @@ class SinemaCX(PluginBase):
|
|
|
146
123
|
if has_only_trailer:
|
|
147
124
|
alt_url = url.rstrip("/") + "/2/"
|
|
148
125
|
alt_istek = await self.httpx.get(alt_url)
|
|
149
|
-
|
|
150
|
-
|
|
126
|
+
alt_istek = await self.httpx.get(alt_url)
|
|
127
|
+
alt_sec = HTMLHelper(alt_istek.text)
|
|
128
|
+
iframe_list = alt_sec.select_all_attr("iframe", "data-vsrc")
|
|
151
129
|
|
|
152
130
|
if not iframe_list:
|
|
153
131
|
return []
|
|
@@ -164,17 +142,15 @@ class SinemaCX(PluginBase):
|
|
|
164
142
|
iframe_text = iframe_istek.text
|
|
165
143
|
|
|
166
144
|
subtitles = []
|
|
167
|
-
|
|
168
|
-
if
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
subtitles.append(Subtitle(name=sub[1], url=self.fix_url(sub[2])))
|
|
145
|
+
sub_section = HTMLHelper(iframe_text).regex_first(r'playerjsSubtitle\s*=\s*"(.+?)"')
|
|
146
|
+
if sub_section:
|
|
147
|
+
for lang, link in HTMLHelper(sub_section).regex_all(r'\[(.*?)](https?://[^\s\",]+)'):
|
|
148
|
+
subtitles.append(Subtitle(name=lang, url=self.fix_url(link)))
|
|
172
149
|
|
|
173
150
|
# player.filmizle.in kontrolü
|
|
174
151
|
if "player.filmizle.in" in iframe.lower():
|
|
175
|
-
|
|
176
|
-
if
|
|
177
|
-
base_url = base_match[1]
|
|
152
|
+
base_url = HTMLHelper(iframe).regex_first(r"https?://([^/]+)")
|
|
153
|
+
if base_url:
|
|
178
154
|
vid_id = iframe.split("/")[-1]
|
|
179
155
|
|
|
180
156
|
self.httpx.headers.update({"X-Requested-With": "XMLHttpRequest"})
|
KekikStream/Plugins/Sinezy.py
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult
|
|
4
|
-
|
|
5
|
-
import re, base64
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
|
|
4
|
+
import base64
|
|
6
5
|
|
|
7
6
|
class Sinezy(PluginBase):
|
|
8
7
|
name = "Sinezy"
|
|
@@ -45,16 +44,13 @@ class Sinezy(PluginBase):
|
|
|
45
44
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
46
45
|
full_url = f"{url}page/{page}/"
|
|
47
46
|
resp = await self.httpx.get(full_url)
|
|
48
|
-
|
|
47
|
+
secici = HTMLHelper(resp.text)
|
|
49
48
|
|
|
50
49
|
results = []
|
|
51
|
-
for item in
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
title = link_el.attrs.get("title") if link_el else None
|
|
56
|
-
href = link_el.attrs.get("href") if link_el else None
|
|
57
|
-
poster = img_el.attrs.get("data-src") if img_el else None
|
|
50
|
+
for item in secici.select("div.container div.content div.movie_box.move_k"):
|
|
51
|
+
title = secici.select_attr("a", "title", item)
|
|
52
|
+
href = secici.select_attr("a", "href", item)
|
|
53
|
+
poster = secici.select_attr("img", "data-src", item)
|
|
58
54
|
|
|
59
55
|
if title and href:
|
|
60
56
|
results.append(MainPageResult(
|
|
@@ -69,16 +65,13 @@ class Sinezy(PluginBase):
|
|
|
69
65
|
async def search(self, query: str) -> list[SearchResult]:
|
|
70
66
|
url = f"{self.main_url}/arama/?s={query}"
|
|
71
67
|
resp = await self.httpx.get(url)
|
|
72
|
-
|
|
68
|
+
secici = HTMLHelper(resp.text)
|
|
73
69
|
|
|
74
70
|
results = []
|
|
75
|
-
for item in
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
title = link_el.attrs.get("title") if link_el else None
|
|
80
|
-
href = link_el.attrs.get("href") if link_el else None
|
|
81
|
-
poster = img_el.attrs.get("data-src") if img_el else None
|
|
71
|
+
for item in secici.select("div.movie_box.move_k"):
|
|
72
|
+
title = secici.select_attr("a", "title", item)
|
|
73
|
+
href = secici.select_attr("a", "href", item)
|
|
74
|
+
poster = secici.select_attr("img", "data-src", item)
|
|
82
75
|
|
|
83
76
|
if title and href:
|
|
84
77
|
results.append(SearchResult(
|
|
@@ -91,38 +84,19 @@ class Sinezy(PluginBase):
|
|
|
91
84
|
|
|
92
85
|
async def load_item(self, url: str) -> MovieInfo:
|
|
93
86
|
resp = await self.httpx.get(url)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
detail_el = sel.css_first("div.detail")
|
|
97
|
-
title = detail_el.attrs.get("title") if detail_el else None
|
|
98
|
-
|
|
99
|
-
poster_el = sel.css_first("div.move_k img")
|
|
100
|
-
poster = poster_el.attrs.get("data-src") if poster_el else None
|
|
87
|
+
secici = HTMLHelper(resp.text)
|
|
101
88
|
|
|
102
|
-
|
|
103
|
-
|
|
89
|
+
title = secici.select_attr("div.detail", "title")
|
|
90
|
+
poster = secici.select_attr("div.move_k img", "data-src")
|
|
91
|
+
description = secici.select_text("div.desc.yeniscroll p")
|
|
92
|
+
rating = secici.select_text("span.info span.imdb")
|
|
104
93
|
|
|
105
|
-
|
|
106
|
-
|
|
94
|
+
tags = secici.select_all_text("div.detail span a")
|
|
95
|
+
actors = secici.select_all_text("span.oyn p")
|
|
107
96
|
|
|
108
|
-
|
|
109
|
-
actors = [p.text(strip=True) for p in sel.css("span.oyn p") if p.text(strip=True)]
|
|
110
|
-
|
|
111
|
-
year = None
|
|
112
|
-
info_el = sel.css_first("span.info")
|
|
113
|
-
info_text = info_el.text(strip=True) if info_el else ""
|
|
114
|
-
if info_text:
|
|
115
|
-
year_match = re.search(r'\b(19\d{2}|20\d{2})\b', info_text)
|
|
116
|
-
if year_match:
|
|
117
|
-
year = year_match.group(1)
|
|
118
|
-
|
|
119
|
-
# Bulunamadıysa tüm sayfada ara
|
|
97
|
+
year = secici.regex_first(r"\b(19\d{2}|20\d{2})\b")
|
|
120
98
|
if not year:
|
|
121
|
-
|
|
122
|
-
year_match = re.search(r'\b(19\d{2}|20\d{2})\b', all_text)
|
|
123
|
-
if year_match:
|
|
124
|
-
year = year_match.group(1)
|
|
125
|
-
|
|
99
|
+
year = secici.regex_first(r"\b(19\d{2}|20\d{2})\b", secici.html)
|
|
126
100
|
return MovieInfo(
|
|
127
101
|
title = title,
|
|
128
102
|
url = url,
|
|
@@ -136,18 +110,17 @@ class Sinezy(PluginBase):
|
|
|
136
110
|
|
|
137
111
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
138
112
|
resp = await self.httpx.get(url)
|
|
113
|
+
secici = HTMLHelper(resp.text)
|
|
139
114
|
|
|
140
|
-
|
|
141
|
-
if
|
|
142
|
-
encoded = match.group(1)
|
|
115
|
+
encoded = secici.regex_first(r"ilkpartkod\s*=\s*'([^']+)'", secici.html)
|
|
116
|
+
if encoded:
|
|
143
117
|
try:
|
|
144
118
|
decoded = base64.b64decode(encoded).decode('utf-8')
|
|
145
|
-
|
|
119
|
+
decoded_sec = HTMLHelper(decoded)
|
|
120
|
+
iframe = decoded_sec.select_attr('iframe', 'src')
|
|
146
121
|
|
|
147
|
-
if
|
|
148
|
-
iframe = iframe_match.group(1)
|
|
122
|
+
if iframe:
|
|
149
123
|
iframe = self.fix_url(iframe)
|
|
150
|
-
|
|
151
124
|
data = await self.extract(iframe)
|
|
152
125
|
if data:
|
|
153
126
|
return [data]
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult
|
|
4
|
-
from selectolax.parser import HTMLParser
|
|
5
|
-
import re
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
|
|
6
4
|
|
|
7
5
|
class SuperFilmGeldi(PluginBase):
|
|
8
6
|
name = "SuperFilmGeldi"
|
|
@@ -36,21 +34,16 @@ class SuperFilmGeldi(PluginBase):
|
|
|
36
34
|
|
|
37
35
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
38
36
|
istek = await self.httpx.get(url.replace("SAYFA", str(page)))
|
|
39
|
-
secici =
|
|
37
|
+
secici = HTMLHelper(istek.text)
|
|
40
38
|
|
|
41
39
|
results = []
|
|
42
|
-
for veri in secici.
|
|
43
|
-
|
|
44
|
-
if not link_el:
|
|
45
|
-
continue
|
|
46
|
-
|
|
47
|
-
title_text = link_el.text(strip=True)
|
|
40
|
+
for veri in secici.select("div.movie-preview-content"):
|
|
41
|
+
title_text = secici.select_text("span.movie-title a", veri)
|
|
48
42
|
if not title_text:
|
|
49
43
|
continue
|
|
50
44
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
poster = img_el.attrs.get("src") if img_el else None
|
|
45
|
+
href = secici.select_attr("span.movie-title a", "href", veri)
|
|
46
|
+
poster = secici.select_attr("img", "src", veri)
|
|
54
47
|
|
|
55
48
|
results.append(MainPageResult(
|
|
56
49
|
category = category,
|
|
@@ -63,21 +56,16 @@ class SuperFilmGeldi(PluginBase):
|
|
|
63
56
|
|
|
64
57
|
async def search(self, query: str) -> list[SearchResult]:
|
|
65
58
|
istek = await self.httpx.get(f"{self.main_url}?s={query}")
|
|
66
|
-
secici =
|
|
59
|
+
secici = HTMLHelper(istek.text)
|
|
67
60
|
|
|
68
61
|
results = []
|
|
69
|
-
for veri in secici.
|
|
70
|
-
|
|
71
|
-
if not link_el:
|
|
72
|
-
continue
|
|
73
|
-
|
|
74
|
-
title_text = link_el.text(strip=True)
|
|
62
|
+
for veri in secici.select("div.movie-preview-content"):
|
|
63
|
+
title_text = secici.select_text("span.movie-title a", veri)
|
|
75
64
|
if not title_text:
|
|
76
65
|
continue
|
|
77
66
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
poster = img_el.attrs.get("src") if img_el else None
|
|
67
|
+
href = secici.select_attr("span.movie-title a", "href", veri)
|
|
68
|
+
poster = secici.select_attr("img", "src", veri)
|
|
81
69
|
|
|
82
70
|
results.append(SearchResult(
|
|
83
71
|
title = self.clean_title(title_text.split(" izle")[0]),
|
|
@@ -89,26 +77,19 @@ class SuperFilmGeldi(PluginBase):
|
|
|
89
77
|
|
|
90
78
|
async def load_item(self, url: str) -> MovieInfo:
|
|
91
79
|
istek = await self.httpx.get(url)
|
|
92
|
-
secici =
|
|
80
|
+
secici = HTMLHelper(istek.text)
|
|
93
81
|
|
|
94
|
-
|
|
95
|
-
title
|
|
96
|
-
title = self.clean_title(title.split(" izle")[0]) if title else ""
|
|
82
|
+
title = secici.select_text("div.title h1") or ""
|
|
83
|
+
title = self.clean_title(title.split(" izle")[0]) if title else ""
|
|
97
84
|
|
|
98
|
-
|
|
99
|
-
poster = poster_el.attrs.get("src") if poster_el else None
|
|
85
|
+
poster = secici.select_attr("div.poster img", "src")
|
|
100
86
|
|
|
101
|
-
|
|
102
|
-
year_el = secici.css_first("div.release a")
|
|
103
|
-
year_text = year_el.text(strip=True) if year_el else ""
|
|
104
|
-
year_match = re.search(r"(\d{4})", year_text)
|
|
105
|
-
year = year_match.group(1) if year_match else None
|
|
87
|
+
year = secici.extract_year("div.release a")
|
|
106
88
|
|
|
107
|
-
|
|
108
|
-
description = desc_el.text(strip=True) if desc_el else None
|
|
89
|
+
description = secici.select_text("div.excerpt p")
|
|
109
90
|
|
|
110
|
-
tags
|
|
111
|
-
actors =
|
|
91
|
+
tags = secici.select_all_text("div.categories a")
|
|
92
|
+
actors = secici.select_all_text("div.actor a")
|
|
112
93
|
|
|
113
94
|
return MovieInfo(
|
|
114
95
|
url = url,
|
|
@@ -122,11 +103,10 @@ class SuperFilmGeldi(PluginBase):
|
|
|
122
103
|
|
|
123
104
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
124
105
|
istek = await self.httpx.get(url)
|
|
125
|
-
secici =
|
|
106
|
+
secici = HTMLHelper(istek.text)
|
|
126
107
|
|
|
127
|
-
|
|
128
|
-
iframe
|
|
129
|
-
iframe = self.fix_url(iframe) if iframe else None
|
|
108
|
+
iframe = secici.select_attr("div#vast iframe", "src")
|
|
109
|
+
iframe = self.fix_url(iframe) if iframe else None
|
|
130
110
|
|
|
131
111
|
if not iframe:
|
|
132
112
|
return []
|
|
@@ -136,10 +116,11 @@ class SuperFilmGeldi(PluginBase):
|
|
|
136
116
|
# Mix player özel işleme
|
|
137
117
|
if "mix" in iframe and "index.php?data=" in iframe:
|
|
138
118
|
iframe_istek = await self.httpx.get(iframe, headers={"Referer": f"{self.main_url}/"})
|
|
139
|
-
|
|
119
|
+
iframe_sec = HTMLHelper(iframe_istek.text)
|
|
120
|
+
mix_point = iframe_sec.regex_first(r'videoUrl"\s*:\s*"(.*?)"\s*,\s*"videoServer')
|
|
140
121
|
|
|
141
122
|
if mix_point:
|
|
142
|
-
mix_point = mix_point
|
|
123
|
+
mix_point = mix_point.replace("\\", "")
|
|
143
124
|
|
|
144
125
|
# Endpoint belirleme
|
|
145
126
|
if "mixlion" in iframe:
|
KekikStream/Plugins/UgurFilm.py
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult
|
|
4
|
-
from selectolax.parser import HTMLParser
|
|
5
|
-
import re
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, ExtractResult, HTMLHelper
|
|
6
4
|
|
|
7
5
|
class UgurFilm(PluginBase):
|
|
8
6
|
name = "UgurFilm"
|
|
@@ -26,21 +24,17 @@ class UgurFilm(PluginBase):
|
|
|
26
24
|
|
|
27
25
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
28
26
|
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
29
|
-
secici =
|
|
27
|
+
secici = HTMLHelper(istek.text)
|
|
30
28
|
|
|
31
29
|
results = []
|
|
32
|
-
for veri in secici.
|
|
30
|
+
for veri in secici.select("div.icerik div"):
|
|
33
31
|
# Title is in the second span (a.baslik > span), not the first span (class="sol" which is empty)
|
|
34
|
-
|
|
35
|
-
title = title_el.text(strip=True) if title_el else None
|
|
32
|
+
title = secici.select_text("a.baslik span", veri)
|
|
36
33
|
if not title:
|
|
37
34
|
continue
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
href = link_el.attrs.get("href") if link_el else None
|
|
43
|
-
poster = img_el.attrs.get("src") if img_el else None
|
|
36
|
+
href = secici.select_attr("a", "href", veri)
|
|
37
|
+
poster = secici.select_attr("img", "src", veri)
|
|
44
38
|
|
|
45
39
|
results.append(MainPageResult(
|
|
46
40
|
category = category,
|
|
@@ -53,19 +47,13 @@ class UgurFilm(PluginBase):
|
|
|
53
47
|
|
|
54
48
|
async def search(self, query: str) -> list[SearchResult]:
|
|
55
49
|
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
56
|
-
secici =
|
|
50
|
+
secici = HTMLHelper(istek.text)
|
|
57
51
|
|
|
58
52
|
results = []
|
|
59
|
-
for film in secici.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
link_el = film.css_first("a")
|
|
65
|
-
img_el = film.css_first("img")
|
|
66
|
-
|
|
67
|
-
href = link_el.attrs.get("href") if link_el else None
|
|
68
|
-
poster = img_el.attrs.get("src") if img_el else None
|
|
53
|
+
for film in secici.select("div.icerik div"):
|
|
54
|
+
title = secici.select_text("a.baslik span", film)
|
|
55
|
+
href = secici.select_attr("a", "href", film)
|
|
56
|
+
poster = secici.select_attr("img", "src", film)
|
|
69
57
|
|
|
70
58
|
if title and href:
|
|
71
59
|
results.append(SearchResult(
|
|
@@ -78,30 +66,18 @@ class UgurFilm(PluginBase):
|
|
|
78
66
|
|
|
79
67
|
async def load_item(self, url: str) -> MovieInfo:
|
|
80
68
|
istek = await self.httpx.get(url)
|
|
81
|
-
secici =
|
|
82
|
-
|
|
83
|
-
title_el = secici.css_first("div.bilgi h2")
|
|
84
|
-
title = title_el.text(strip=True) if title_el else ""
|
|
85
|
-
|
|
86
|
-
poster_el = secici.css_first("div.resim img")
|
|
87
|
-
poster = poster_el.attrs.get("src", "").strip() if poster_el else ""
|
|
69
|
+
secici = HTMLHelper(istek.text)
|
|
88
70
|
|
|
89
|
-
|
|
90
|
-
|
|
71
|
+
title = secici.select_text("div.bilgi h2") or ""
|
|
72
|
+
poster = secici.select_attr("div.resim img", "src") or ""
|
|
73
|
+
description = secici.select_text("div.slayt-aciklama") or ""
|
|
91
74
|
|
|
92
|
-
tags =
|
|
75
|
+
tags = secici.select_all_text("p.tur a[href*='/category/']")
|
|
93
76
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
year_text = year_el.text(strip=True) if year_el else ""
|
|
97
|
-
year_match = re.search(r"\d+", year_text)
|
|
98
|
-
year = year_match.group() if year_match else None
|
|
77
|
+
year_val = secici.extract_year("a[href*='/yil/']")
|
|
78
|
+
year = str(year_val) if year_val else None
|
|
99
79
|
|
|
100
|
-
actors =
|
|
101
|
-
for actor in secici.css("li.oyuncu-k"):
|
|
102
|
-
span_el = actor.css_first("span")
|
|
103
|
-
if span_el and span_el.text(strip=True):
|
|
104
|
-
actors.append(span_el.text(strip=True))
|
|
80
|
+
actors = secici.select_all_text("li.oyuncu-k span")
|
|
105
81
|
|
|
106
82
|
return MovieInfo(
|
|
107
83
|
url = self.fix_url(url),
|
|
@@ -115,17 +91,16 @@ class UgurFilm(PluginBase):
|
|
|
115
91
|
|
|
116
92
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
117
93
|
istek = await self.httpx.get(url)
|
|
118
|
-
secici =
|
|
94
|
+
secici = HTMLHelper(istek.text)
|
|
119
95
|
results = []
|
|
120
96
|
|
|
121
|
-
part_links =
|
|
97
|
+
part_links = secici.select_all_attr("li.parttab a", "href")
|
|
122
98
|
|
|
123
99
|
for part_link in part_links:
|
|
124
100
|
sub_response = await self.httpx.get(part_link)
|
|
125
|
-
sub_selector =
|
|
101
|
+
sub_selector = HTMLHelper(sub_response.text)
|
|
126
102
|
|
|
127
|
-
|
|
128
|
-
iframe = iframe_el.attrs.get("src") if iframe_el else None
|
|
103
|
+
iframe = sub_selector.select_attr("div#vast iframe", "src")
|
|
129
104
|
|
|
130
105
|
if iframe and self.main_url in iframe:
|
|
131
106
|
post_data = {
|