KekikStream 2.4.0__tar.gz → 2.4.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.
Potentially problematic release.
This version of KekikStream might be problematic. Click here for more details.
- kekikstream-2.4.1/KekikStream/Extractors/HotStream.py +45 -0
- kekikstream-2.4.1/KekikStream/Extractors/Vidoza.py +25 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/DiziMom.py +9 -10
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/Filmatek.py +19 -2
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/Full4kizle.py +101 -17
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/Watch32.py +26 -4
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream.egg-info/SOURCES.txt +2 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/PKG-INFO +1 -1
- {kekikstream-2.4.0 → kekikstream-2.4.1}/setup.py +1 -1
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/HTMLHelper.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/DonilasPlay.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/Filemoon.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/HDMomPlayer.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/JFVid.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/VCTPlay.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/Videostr.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/YTDLP.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/BelgeselX.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/FilmEkseni.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/SetFilmIzle.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/Plugins/YabanciDizi.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/__init__.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/__main__.py +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream/requirements.txt +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/LICENSE +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/MANIFEST.in +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/README.md +0 -0
- {kekikstream-2.4.0 → kekikstream-2.4.1}/setup.cfg +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
|
|
4
|
+
from Kekik.Sifreleme import AESManager
|
|
5
|
+
import re
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
class HotStream(ExtractorBase):
|
|
9
|
+
name = "HotStream"
|
|
10
|
+
main_url = "https://hotstream.club"
|
|
11
|
+
|
|
12
|
+
async def extract(self, url: str, referer: str = None) -> ExtractResult | None:
|
|
13
|
+
if referer:
|
|
14
|
+
self.httpx.headers.update({"Referer": referer})
|
|
15
|
+
|
|
16
|
+
istek = await self.httpx.get(url)
|
|
17
|
+
html = istek.text
|
|
18
|
+
helper = HTMLHelper(html)
|
|
19
|
+
|
|
20
|
+
m = re.search(r"bePlayer\('([^']+)',\s*'(\{[^']+\})'\)", html)
|
|
21
|
+
if not m:
|
|
22
|
+
# Try double quotes just in case
|
|
23
|
+
m = re.search(r'bePlayer\("([^"]+)",\s*"(\{[^"]+\})"\)', html)
|
|
24
|
+
|
|
25
|
+
if m:
|
|
26
|
+
pass_val = m.group(1)
|
|
27
|
+
data_val = m.group(2)
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
decrypted = AESManager.decrypt(data_val, pass_val)
|
|
31
|
+
if decrypted:
|
|
32
|
+
decrypted = decrypted.replace("\\", "")
|
|
33
|
+
# Search for video_location in decrypted string
|
|
34
|
+
m_loc = re.search(r'"video_location":"([^"]+)"', decrypted)
|
|
35
|
+
if m_loc:
|
|
36
|
+
video_url = m_loc.group(1).replace(r"\/", "/")
|
|
37
|
+
return ExtractResult(
|
|
38
|
+
name = self.name,
|
|
39
|
+
url = video_url,
|
|
40
|
+
referer = url
|
|
41
|
+
)
|
|
42
|
+
except Exception:
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
return None
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
|
|
4
|
+
|
|
5
|
+
class Vidoza(ExtractorBase):
|
|
6
|
+
name = "Vidoza"
|
|
7
|
+
main_url = "https://vidoza.net"
|
|
8
|
+
|
|
9
|
+
async def extract(self, url: str, referer: str = None) -> ExtractResult | None:
|
|
10
|
+
if referer:
|
|
11
|
+
self.httpx.headers.update({"Referer": referer})
|
|
12
|
+
|
|
13
|
+
istek = await self.httpx.get(url)
|
|
14
|
+
helper = HTMLHelper(istek.text)
|
|
15
|
+
|
|
16
|
+
video_url = helper.select_attr("source", "src")
|
|
17
|
+
|
|
18
|
+
if video_url:
|
|
19
|
+
return ExtractResult(
|
|
20
|
+
name = self.name,
|
|
21
|
+
url = video_url,
|
|
22
|
+
referer = url
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
return None
|
|
@@ -77,15 +77,16 @@ class DiziMom(PluginBase):
|
|
|
77
77
|
rating = None
|
|
78
78
|
actors = None
|
|
79
79
|
|
|
80
|
-
# Regex approach
|
|
81
|
-
#
|
|
82
|
-
|
|
83
|
-
if
|
|
84
|
-
|
|
80
|
+
# Regex approach based on debug output (multiline support)
|
|
81
|
+
# Context: <span class="dizimeta"><i class="fas fa-globe"></i> Yapım Yılı : </span>\n 2022
|
|
82
|
+
year_val_all = helper.regex_all(r"Yapım Yılı\s*:\s*(?:</span>)?\s*(\d{4})", flags=re.DOTALL)
|
|
83
|
+
if year_val_all:
|
|
84
|
+
year = int(year_val_all[0])
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
# Context: <span class="dizimeta"><i class="fas fa-star"></i> IMDB : </span>\n 4.5
|
|
87
|
+
rating_val_all = helper.regex_all(r"IMDB\s*:\s*(?:</span>)?\s*([\d\.]+)", flags=re.DOTALL)
|
|
88
|
+
if rating_val_all:
|
|
89
|
+
rating = rating_val_all[0]
|
|
89
90
|
|
|
90
91
|
actors_val = helper.regex_first(r"Oyuncular\s*:\s*(.+?)(?:</div>|<br|$)")
|
|
91
92
|
if not actors_val:
|
|
@@ -127,8 +128,6 @@ class DiziMom(PluginBase):
|
|
|
127
128
|
|
|
128
129
|
# Clean footer text start
|
|
129
130
|
# The footer block usually starts with "Dizimom, dizi ve film..."
|
|
130
|
-
# If we find "Dizimom," and it's not at the start (meaning it's part of the footer appended), split there.
|
|
131
|
-
# Note: The description might legitimately start with "Dizimom," strictly speaking, but unlikely for a series description.
|
|
132
131
|
if "Dizimom," in description_raw:
|
|
133
132
|
description = description_raw.split("Dizimom,")[0].strip()
|
|
134
133
|
elif "dizi izle film izle" in description_raw:
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, HTMLHelper
|
|
4
4
|
import re
|
|
5
5
|
from json import loads
|
|
6
|
+
from urllib.parse import unquote
|
|
6
7
|
|
|
7
8
|
class Filmatek(PluginBase):
|
|
8
9
|
name = "Filmatek"
|
|
@@ -97,8 +98,15 @@ class Filmatek(PluginBase):
|
|
|
97
98
|
year_text = helper.select_text("span.date")
|
|
98
99
|
year = year_text.strip()[-4:] if year_text else None
|
|
99
100
|
|
|
100
|
-
|
|
101
|
-
rating =
|
|
101
|
+
# Rating extraction updated
|
|
102
|
+
rating = helper.select_text("span.dt_rating_vgs") or helper.select_text("span.dt_rating_vmanual")
|
|
103
|
+
|
|
104
|
+
# Duration extraction
|
|
105
|
+
duration = None
|
|
106
|
+
duration_text = helper.select_text("span.runtime")
|
|
107
|
+
if duration_text:
|
|
108
|
+
# "80 Dak." -> "80"
|
|
109
|
+
duration = duration_text.split()[0]
|
|
102
110
|
|
|
103
111
|
tags = helper.select_all_text("div.sgeneros a")
|
|
104
112
|
|
|
@@ -118,6 +126,7 @@ class Filmatek(PluginBase):
|
|
|
118
126
|
poster = poster,
|
|
119
127
|
year = year,
|
|
120
128
|
rating = rating,
|
|
129
|
+
duration = duration,
|
|
121
130
|
tags = tags,
|
|
122
131
|
actors = actors
|
|
123
132
|
)
|
|
@@ -169,6 +178,14 @@ class Filmatek(PluginBase):
|
|
|
169
178
|
|
|
170
179
|
iframe_url = self.fix_url(iframe_url)
|
|
171
180
|
|
|
181
|
+
# Unwrap internal JWPlayer
|
|
182
|
+
if "jwplayer/?source=" in iframe_url:
|
|
183
|
+
try:
|
|
184
|
+
raw_source = iframe_url.split("source=")[1].split("&")[0]
|
|
185
|
+
iframe_url = unquote(raw_source)
|
|
186
|
+
except:
|
|
187
|
+
pass
|
|
188
|
+
|
|
172
189
|
extracted = await self.extract(iframe_url)
|
|
173
190
|
if extracted:
|
|
174
191
|
if isinstance(extracted, list):
|
|
@@ -11,16 +11,31 @@ class Full4kizle(PluginBase):
|
|
|
11
11
|
description = "Filmci Baba, film izleme sitesi 4k Full film izle, 1080p ve 4k kalite de sinema filmleri ve dizileri, tek parça hd kalitede türkçe dublajlı filmler seyret."
|
|
12
12
|
|
|
13
13
|
main_page = {
|
|
14
|
-
f"{main_url}/Kategori/en-populer-filmler/page"
|
|
15
|
-
f"{main_url}/Kategori/
|
|
16
|
-
f"{main_url}/Kategori/
|
|
17
|
-
f"{main_url}/Kategori/
|
|
18
|
-
f"{main_url}/Kategori/
|
|
19
|
-
f"{main_url}/Kategori/
|
|
20
|
-
f"{main_url}/Kategori/
|
|
21
|
-
f"{main_url}/Kategori/
|
|
14
|
+
f"{main_url}/Kategori/en-populer-filmler/page" : "En Popüler Filmler",
|
|
15
|
+
f"{main_url}/Kategori/tur/aksiyon-filmleri/page" : "Aksiyon",
|
|
16
|
+
f"{main_url}/Kategori/tur/macera-filmleri/page" : "Macera",
|
|
17
|
+
f"{main_url}/Kategori/tur/bilim-kurgu-filmleri/page" : "Bilim Kurgu",
|
|
18
|
+
f"{main_url}/Kategori/tur/fantastik-filmler/page" : "Fantastik",
|
|
19
|
+
f"{main_url}/Kategori/tur/korku-filmleri/page" : "Korku",
|
|
20
|
+
f"{main_url}/Kategori/tur/gerilim-filmleri-hd/page" : "Gerilim",
|
|
21
|
+
f"{main_url}/Kategori/tur/gizem-filmleri/page" : "Gizem",
|
|
22
|
+
f"{main_url}/Kategori/tur/dram-filmleri-hd/page" : "Dram",
|
|
23
|
+
f"{main_url}/Kategori/tur/komedi-filmleri-hd/page" : "Komedi",
|
|
24
|
+
f"{main_url}/Kategori/tur/romantik-filmler/page" : "Romantik",
|
|
25
|
+
f"{main_url}/Kategori/tur/aile-filmleri/page" : "Aile",
|
|
26
|
+
f"{main_url}/Kategori/tur/animasyon-filmleri/page" : "Animasyon",
|
|
27
|
+
f"{main_url}/Kategori/tur/biyografi-filmleri/page" : "Biyografi",
|
|
28
|
+
f"{main_url}/Kategori/tur/polisiye-suc-filmleri/page" : "Polisiye / Suç",
|
|
29
|
+
f"{main_url}/Kategori/tur/savas-filmleri/page" : "Savaş",
|
|
30
|
+
f"{main_url}/Kategori/tur/western-filmler/page" : "Western",
|
|
31
|
+
f"{main_url}/Kategori/tur/hint-filmleri/page" : "Hint Filmleri",
|
|
32
|
+
f"{main_url}/Kategori/tur/kore-filmleri/page" : "Kore Filmleri",
|
|
33
|
+
f"{main_url}/Kategori/tur/yerli-filmler-izle/page" : "Yerli Filmler",
|
|
34
|
+
f"{main_url}/Kategori/tur/yerli-diziler/page" : "Yerli Diziler",
|
|
35
|
+
f"{main_url}/Kategori/tur/18-erotik-filmler/page" : "+18 Erotik Filmler",
|
|
22
36
|
}
|
|
23
37
|
|
|
38
|
+
|
|
24
39
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
25
40
|
target_url = f"{url}/{page}/"
|
|
26
41
|
istek = await self.httpx.get(target_url)
|
|
@@ -92,14 +107,81 @@ class Full4kizle(PluginBase):
|
|
|
92
107
|
|
|
93
108
|
description = helper.select_text(".excerpt p")
|
|
94
109
|
|
|
95
|
-
|
|
96
|
-
|
|
110
|
+
# Robust metadata extraction using Regex
|
|
111
|
+
|
|
112
|
+
# Initialize year first
|
|
113
|
+
year = None
|
|
97
114
|
|
|
115
|
+
# Try .release first (legacy) or directly regex
|
|
116
|
+
rel_text = helper.select_text(".release")
|
|
117
|
+
if rel_text:
|
|
118
|
+
m_y = re.search(r"(\d{4})", rel_text)
|
|
119
|
+
if m_y: year = m_y.group(1)
|
|
120
|
+
|
|
121
|
+
# Year fallbacks
|
|
122
|
+
if not year:
|
|
123
|
+
# Try finding year in text like "Yapım: 2024" or just isolated year in release date
|
|
124
|
+
m_year = helper.regex_first(r"Yapım:\s*(\d{4})") or helper.regex_first(r"Yıl:\s*(\d{4})")
|
|
125
|
+
if m_year:
|
|
126
|
+
year = m_year
|
|
127
|
+
|
|
128
|
+
# Rating
|
|
98
129
|
rating_text = helper.select_text(".imdb-rating")
|
|
99
|
-
rating = None
|
|
100
130
|
if rating_text:
|
|
101
|
-
|
|
102
|
-
|
|
131
|
+
rating = rating_text.replace("IMDB Puanı", "").strip()
|
|
132
|
+
else:
|
|
133
|
+
rating = helper.regex_first(r"IMDB\s*:\s*([\d\.]+)")
|
|
134
|
+
|
|
135
|
+
# Duration
|
|
136
|
+
duration = None
|
|
137
|
+
duration_val = helper.regex_first(r"Süre:\s*(\d+)")
|
|
138
|
+
if duration_val:
|
|
139
|
+
duration = int(duration_val)
|
|
140
|
+
|
|
141
|
+
# Actors - Extract from actor links
|
|
142
|
+
actors = None
|
|
143
|
+
actors_list = []
|
|
144
|
+
|
|
145
|
+
# Site uses: <a href=".../oyuncular/...">Actor Name</a>
|
|
146
|
+
actor_els = helper.select("a[href*='/oyuncular/']")
|
|
147
|
+
if actor_els:
|
|
148
|
+
actors_list = [el.text(strip=True) for el in actor_els if el.text(strip=True)]
|
|
149
|
+
|
|
150
|
+
# Fallback: Try .cast-list selector
|
|
151
|
+
if not actors_list:
|
|
152
|
+
actor_els = helper.select(".cast-list .actor-name, .cast-list a")
|
|
153
|
+
if actor_els:
|
|
154
|
+
actors_list = [el.text(strip=True) for el in actor_els if el.text(strip=True)]
|
|
155
|
+
|
|
156
|
+
if actors_list:
|
|
157
|
+
actors = ", ".join(actors_list)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
# Tags (Genres) - Extract from genre links
|
|
161
|
+
tags = None
|
|
162
|
+
tags_list = []
|
|
163
|
+
|
|
164
|
+
# Site uses: <a href=".../tur/...">Genre Name</a> or <a href=".../Kategori/tur/...">
|
|
165
|
+
tag_els = helper.select("a[href*='/tur/'], a[href*='/Kategori/tur/']")
|
|
166
|
+
if tag_els:
|
|
167
|
+
tags_list = [el.text(strip=True) for el in tag_els if el.text(strip=True)]
|
|
168
|
+
|
|
169
|
+
# Fallback: Try .genres selector
|
|
170
|
+
if not tags_list:
|
|
171
|
+
tag_els = helper.select(".genres a, .genre a")
|
|
172
|
+
if tag_els:
|
|
173
|
+
tags_list = [el.text(strip=True) for el in tag_els if el.text(strip=True)]
|
|
174
|
+
|
|
175
|
+
# Remove duplicates while preserving order
|
|
176
|
+
if tags_list:
|
|
177
|
+
seen = set()
|
|
178
|
+
unique_tags = []
|
|
179
|
+
for tag in tags_list:
|
|
180
|
+
if tag not in seen:
|
|
181
|
+
seen.add(tag)
|
|
182
|
+
unique_tags.append(tag)
|
|
183
|
+
tags = unique_tags if unique_tags else None
|
|
184
|
+
|
|
103
185
|
|
|
104
186
|
# Check for Episodes to decide if Series or Movie
|
|
105
187
|
ep_elements = helper.select(".parts-middle a, .parts-middle .part.active")
|
|
@@ -113,8 +195,9 @@ class Full4kizle(PluginBase):
|
|
|
113
195
|
poster = poster,
|
|
114
196
|
year = year,
|
|
115
197
|
rating = rating,
|
|
116
|
-
|
|
117
|
-
|
|
198
|
+
duration = duration,
|
|
199
|
+
tags = tags,
|
|
200
|
+
actors = actors
|
|
118
201
|
)
|
|
119
202
|
else:
|
|
120
203
|
# Series
|
|
@@ -155,8 +238,9 @@ class Full4kizle(PluginBase):
|
|
|
155
238
|
poster = poster,
|
|
156
239
|
year = year,
|
|
157
240
|
rating = rating,
|
|
158
|
-
|
|
159
|
-
|
|
241
|
+
duration = duration,
|
|
242
|
+
tags = tags,
|
|
243
|
+
actors = actors,
|
|
160
244
|
episodes = episodes
|
|
161
245
|
)
|
|
162
246
|
|
|
@@ -12,12 +12,34 @@ class Watch32(PluginBase):
|
|
|
12
12
|
description = "Watch Your Favorite Movies & TV Shows Online - Streaming For Free. With Movies & TV Shows Full HD. Find Your Movies & Watch NOW!"
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
|
-
|
|
16
|
-
f"{main_url}/
|
|
17
|
-
f"{main_url}/
|
|
18
|
-
f"{main_url}/
|
|
15
|
+
# Main Categories
|
|
16
|
+
f"{main_url}/movie?page=" : "Popular Movies",
|
|
17
|
+
f"{main_url}/tv-show?page=" : "Popular TV Shows",
|
|
18
|
+
f"{main_url}/coming-soon?page=" : "Coming Soon",
|
|
19
|
+
f"{main_url}/top-imdb?page=" : "Top IMDB Rating",
|
|
20
|
+
# Genre Categories
|
|
21
|
+
f"{main_url}/genre/action?page=" : "Action",
|
|
22
|
+
f"{main_url}/genre/adventure?page=" : "Adventure",
|
|
23
|
+
f"{main_url}/genre/animation?page=" : "Animation",
|
|
24
|
+
f"{main_url}/genre/biography?page=" : "Biography",
|
|
25
|
+
f"{main_url}/genre/comedy?page=" : "Comedy",
|
|
26
|
+
f"{main_url}/genre/crime?page=" : "Crime",
|
|
27
|
+
f"{main_url}/genre/documentary?page=" : "Documentary",
|
|
28
|
+
f"{main_url}/genre/drama?page=" : "Drama",
|
|
29
|
+
f"{main_url}/genre/family?page=" : "Family",
|
|
30
|
+
f"{main_url}/genre/fantasy?page=" : "Fantasy",
|
|
31
|
+
f"{main_url}/genre/history?page=" : "History",
|
|
32
|
+
f"{main_url}/genre/horror?page=" : "Horror",
|
|
33
|
+
f"{main_url}/genre/music?page=" : "Music",
|
|
34
|
+
f"{main_url}/genre/mystery?page=" : "Mystery",
|
|
35
|
+
f"{main_url}/genre/romance?page=" : "Romance",
|
|
36
|
+
f"{main_url}/genre/science-fiction?page=" : "Science Fiction",
|
|
37
|
+
f"{main_url}/genre/thriller?page=" : "Thriller",
|
|
38
|
+
f"{main_url}/genre/war?page=" : "War",
|
|
39
|
+
f"{main_url}/genre/western?page=" : "Western",
|
|
19
40
|
}
|
|
20
41
|
|
|
42
|
+
|
|
21
43
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
22
44
|
istek = await self.httpx.get(f"{url}{page}")
|
|
23
45
|
helper = HTMLHelper(istek.text)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.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
|
|
@@ -35,6 +35,7 @@ KekikStream/Extractors/ExPlay.py
|
|
|
35
35
|
KekikStream/Extractors/Filemoon.py
|
|
36
36
|
KekikStream/Extractors/HDMomPlayer.py
|
|
37
37
|
KekikStream/Extractors/HDPlayerSystem.py
|
|
38
|
+
KekikStream/Extractors/HotStream.py
|
|
38
39
|
KekikStream/Extractors/JFVid.py
|
|
39
40
|
KekikStream/Extractors/JetTv.py
|
|
40
41
|
KekikStream/Extractors/MailRu.py
|
|
@@ -61,6 +62,7 @@ KekikStream/Extractors/VidMoxy.py
|
|
|
61
62
|
KekikStream/Extractors/VidPapi.py
|
|
62
63
|
KekikStream/Extractors/VideoSeyred.py
|
|
63
64
|
KekikStream/Extractors/Videostr.py
|
|
65
|
+
KekikStream/Extractors/Vidoza.py
|
|
64
66
|
KekikStream/Extractors/YTDLP.py
|
|
65
67
|
KekikStream/Extractors/YildizKisaFilm.py
|
|
66
68
|
KekikStream/Plugins/BelgeselX.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.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 = "2.4.
|
|
9
|
+
version = "2.4.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"],
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|