KekikStream 1.9.4__tar.gz → 1.9.9__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.
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorBase.py +1 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorManager.py +5 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginBase.py +1 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/JetTv.py +1 -1
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PlayerFilmIzle.py +3 -3
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/RoketDizi.py +97 -84
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SinemaCX.py +1 -1
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-1.9.4 → kekikstream-1.9.9}/PKG-INFO +1 -1
- {kekikstream-1.9.4 → kekikstream-1.9.9}/setup.py +1 -1
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FirePlayer.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidHide.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/YTDLP.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/DiziPal.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/__init__.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/__main__.py +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream/requirements.txt +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/LICENSE +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/MANIFEST.in +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/README.md +0 -0
- {kekikstream-1.9.4 → kekikstream-1.9.9}/setup.cfg +0 -0
|
@@ -23,6 +23,7 @@ class ExtractorBase(ABC):
|
|
|
23
23
|
)
|
|
24
24
|
self.httpx.headers.update(self.cloudscraper.headers)
|
|
25
25
|
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
26
|
+
self.httpx.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
|
|
26
27
|
|
|
27
28
|
def can_handle_url(self, url: str) -> bool:
|
|
28
29
|
# URL'nin bu çıkarıcı tarafından işlenip işlenemeyeceğini kontrol et
|
|
@@ -47,7 +47,9 @@ class ExtractorManager:
|
|
|
47
47
|
"""
|
|
48
48
|
Verilen bağlantıyı işleyebilecek çıkarıcıyı bul
|
|
49
49
|
"""
|
|
50
|
+
# Lazy loading: İlk kullanımda extractorları initialize et
|
|
50
51
|
self._ensure_initialized()
|
|
52
|
+
|
|
51
53
|
# Cached instance'ları kullan
|
|
52
54
|
for extractor in self._extractor_instances:
|
|
53
55
|
if extractor.can_handle_url(link):
|
|
@@ -59,6 +61,9 @@ class ExtractorManager:
|
|
|
59
61
|
"""
|
|
60
62
|
Bağlantıları uygun çıkarıcılarla eşleştir
|
|
61
63
|
"""
|
|
64
|
+
# Lazy loading: İlk kullanımda extractorları initialize et
|
|
65
|
+
self._ensure_initialized()
|
|
66
|
+
|
|
62
67
|
mapping = {}
|
|
63
68
|
for link in links:
|
|
64
69
|
# Cached instance'ları kullan
|
|
@@ -34,6 +34,7 @@ class PluginBase(ABC):
|
|
|
34
34
|
)
|
|
35
35
|
self.httpx.headers.update(self.cloudscraper.headers)
|
|
36
36
|
self.httpx.cookies.update(self.cloudscraper.cookies)
|
|
37
|
+
self.httpx.headers.update({"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:135.0) Gecko/20100101 Firefox/135.0"})
|
|
37
38
|
|
|
38
39
|
self.media_handler = MediaHandler()
|
|
39
40
|
self.ex_manager = ExtractorManager()
|
|
@@ -31,7 +31,7 @@ class JetTv(ExtractorBase):
|
|
|
31
31
|
|
|
32
32
|
# 2. Yöntem: Regex Fallback
|
|
33
33
|
if not master_url:
|
|
34
|
-
if match := re.search(r"file: '([^']*)'", document, re.
|
|
34
|
+
if match := re.search(r"file: '([^']*)'", document, re.IGNORECASE):
|
|
35
35
|
master_url = match.group(1)
|
|
36
36
|
|
|
37
37
|
if not master_url:
|
|
@@ -16,7 +16,7 @@ class PlayerFilmIzle(ExtractorBase):
|
|
|
16
16
|
video_req = istek.text
|
|
17
17
|
|
|
18
18
|
subtitles = []
|
|
19
|
-
if sub_match := re.search(r'playerjsSubtitle = "([^"]*)"', video_req, re.
|
|
19
|
+
if sub_match := re.search(r'playerjsSubtitle = "([^"]*)"', video_req, re.IGNORECASE):
|
|
20
20
|
sub_yakala = sub_match.group(1)
|
|
21
21
|
# Format örneği: [dil]url
|
|
22
22
|
# Kotlin kodunda: subYakala.substringAfter("]") -> url
|
|
@@ -27,7 +27,7 @@ class PlayerFilmIzle(ExtractorBase):
|
|
|
27
27
|
subtitles.append(Subtitle(name=sub_lang, url=sub_url))
|
|
28
28
|
|
|
29
29
|
# Data yakalama: FirePlayer|DATA|...
|
|
30
|
-
data_match = re.search(r'FirePlayer\|([^|]+)\|', video_req, re.
|
|
30
|
+
data_match = re.search(r'FirePlayer\|([^|]+)\|', video_req, re.IGNORECASE)
|
|
31
31
|
data_val = data_match.group(1) if data_match else None
|
|
32
32
|
|
|
33
33
|
if not data_val:
|
|
@@ -47,7 +47,7 @@ class PlayerFilmIzle(ExtractorBase):
|
|
|
47
47
|
get_url = response.text.replace("\\", "")
|
|
48
48
|
|
|
49
49
|
m3u8_url = ""
|
|
50
|
-
if url_yakala := re.search(r'"securedLink":"([^"]*)"', get_url, re.
|
|
50
|
+
if url_yakala := re.search(r'"securedLink":"([^"]*)"', get_url, re.IGNORECASE):
|
|
51
51
|
m3u8_url = url_yakala.group(1)
|
|
52
52
|
|
|
53
53
|
if not m3u8_url:
|
|
@@ -11,86 +11,74 @@ class RoketDizi(PluginBase):
|
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
12
|
description = "Türkiye'nin en tatlış yabancı dizi izleme sitesi. Türkçe dublaj, altyazılı, eski ve yeni yabancı dizilerin yanı sıra kore (asya) dizileri izleyebilirsiniz."
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
14
|
main_page = {
|
|
17
|
-
"dizi/tur/aksiyon" : "Aksiyon",
|
|
18
|
-
"dizi/tur/bilim-kurgu" : "Bilim Kurgu",
|
|
19
|
-
"dizi/tur/gerilim" : "Gerilim",
|
|
20
|
-
"dizi/tur/fantastik" : "Fantastik",
|
|
21
|
-
"dizi/tur/komedi" : "Komedi",
|
|
22
|
-
"dizi/tur/korku" : "Korku",
|
|
23
|
-
"dizi/tur/macera" : "Macera",
|
|
24
|
-
"dizi/tur/suc" : "Suç"
|
|
15
|
+
f"{main_url}/dizi/tur/aksiyon" : "Aksiyon",
|
|
16
|
+
f"{main_url}/dizi/tur/bilim-kurgu" : "Bilim Kurgu",
|
|
17
|
+
f"{main_url}/dizi/tur/gerilim" : "Gerilim",
|
|
18
|
+
f"{main_url}/dizi/tur/fantastik" : "Fantastik",
|
|
19
|
+
f"{main_url}/dizi/tur/komedi" : "Komedi",
|
|
20
|
+
f"{main_url}/dizi/tur/korku" : "Korku",
|
|
21
|
+
f"{main_url}/dizi/tur/macera" : "Macera",
|
|
22
|
+
f"{main_url}/dizi/tur/suc" : "Suç"
|
|
25
23
|
}
|
|
26
24
|
|
|
27
25
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
sel = Selector(resp.text)
|
|
26
|
+
istek = await self.httpx.get(f"{url}?&page={page}")
|
|
27
|
+
secici = Selector(istek.text)
|
|
31
28
|
|
|
32
29
|
results = []
|
|
33
30
|
|
|
34
|
-
for item in
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
31
|
+
for item in secici.css("div.w-full.p-4 span.bg-\\[\\#232323\\]"):
|
|
32
|
+
title = item.css("span.font-normal.line-clamp-1::text").get()
|
|
33
|
+
href = item.css("a::attr(href)").get()
|
|
34
|
+
poster = item.css("img::attr(src)").get()
|
|
35
|
+
|
|
36
|
+
if title and href:
|
|
37
|
+
results.append(MainPageResult(
|
|
38
|
+
category = category,
|
|
39
|
+
title = self.clean_title(title),
|
|
40
|
+
url = self.fix_url(href),
|
|
41
|
+
poster = self.fix_url(poster)
|
|
42
|
+
))
|
|
43
|
+
|
|
46
44
|
return results
|
|
47
45
|
|
|
48
46
|
async def search(self, query: str) -> list[SearchResult]:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
search_req = await self.httpx.post(post_url, headers=headers)
|
|
47
|
+
istek = await self.httpx.post(
|
|
48
|
+
url = f"{self.main_url}/api/bg/searchContent?searchterm={query}",
|
|
49
|
+
headers = {
|
|
50
|
+
"Accept" : "application/json, text/javascript, */*; q=0.01",
|
|
51
|
+
"X-Requested-With" : "XMLHttpRequest",
|
|
52
|
+
"Referer" : f"{self.main_url}/",
|
|
53
|
+
}
|
|
54
|
+
)
|
|
58
55
|
|
|
59
56
|
try:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if not resp_json.get("success"):
|
|
64
|
-
return []
|
|
65
|
-
|
|
66
|
-
encoded_response = resp_json.get("response", "")
|
|
67
|
-
if not encoded_response:
|
|
57
|
+
veri = istek.json()
|
|
58
|
+
encoded = veri.get("response", "")
|
|
59
|
+
if not encoded:
|
|
68
60
|
return []
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if not data.get("state"):
|
|
61
|
+
|
|
62
|
+
decoded = base64.b64decode(encoded).decode("utf-8")
|
|
63
|
+
veri = json.loads(decoded)
|
|
64
|
+
|
|
65
|
+
if not veri.get("state"):
|
|
75
66
|
return []
|
|
76
|
-
|
|
67
|
+
|
|
77
68
|
results = []
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
slug = item.get("used_slug", "")
|
|
69
|
+
|
|
70
|
+
for item in veri.get("result", []):
|
|
71
|
+
title = item.get("object_name", "")
|
|
72
|
+
slug = item.get("used_slug", "")
|
|
83
73
|
poster = item.get("object_poster_url", "")
|
|
84
|
-
|
|
74
|
+
|
|
85
75
|
if title and slug:
|
|
86
|
-
# Construct full URL from slug
|
|
87
|
-
full_url = f"{self.main_url}/{slug}"
|
|
88
76
|
results.append(SearchResult(
|
|
89
|
-
title = title.strip(),
|
|
90
|
-
url =
|
|
77
|
+
title = self.clean_title(title.strip()),
|
|
78
|
+
url = self.fix_url(f"{self.main_url}/{slug}"),
|
|
91
79
|
poster = self.fix_url(poster) if poster else None
|
|
92
80
|
))
|
|
93
|
-
|
|
81
|
+
|
|
94
82
|
return results
|
|
95
83
|
|
|
96
84
|
except Exception:
|
|
@@ -100,24 +88,24 @@ class RoketDizi(PluginBase):
|
|
|
100
88
|
# Note: Handling both Movie and Series logic in one, returning SeriesInfo generally or MovieInfo
|
|
101
89
|
resp = await self.httpx.get(url)
|
|
102
90
|
sel = Selector(resp.text)
|
|
103
|
-
|
|
91
|
+
|
|
104
92
|
title = sel.css("h1.text-white::text").get()
|
|
105
93
|
poster = sel.css("div.w-full.page-top img::attr(src)").get()
|
|
106
94
|
description = sel.css("div.mt-2.text-sm::text").get()
|
|
107
|
-
|
|
95
|
+
|
|
108
96
|
# Tags - genre bilgileri (Detaylar bölümünde)
|
|
109
97
|
tags = []
|
|
110
98
|
genre_text = sel.css("h3.text-white.opacity-90::text").get()
|
|
111
99
|
if genre_text:
|
|
112
100
|
tags = [t.strip() for t in genre_text.split(",")]
|
|
113
|
-
|
|
101
|
+
|
|
114
102
|
# Rating
|
|
115
|
-
rating = sel.css("
|
|
116
|
-
|
|
103
|
+
rating = sel.css("span.text-white.text-sm.font-bold::text").get()
|
|
104
|
+
|
|
117
105
|
# Year ve Actors - Detaylar (Details) bölümünden
|
|
118
106
|
year = None
|
|
119
107
|
actors = []
|
|
120
|
-
|
|
108
|
+
|
|
121
109
|
# Detaylar bölümündeki tüm flex-col div'leri al
|
|
122
110
|
detail_items = sel.css("div.flex.flex-col")
|
|
123
111
|
for item in detail_items:
|
|
@@ -144,7 +132,7 @@ class RoketDizi(PluginBase):
|
|
|
144
132
|
# Check urls for episodes
|
|
145
133
|
all_urls = re.findall(r'"url":"([^"]*)"', resp.text)
|
|
146
134
|
is_series = any("bolum-" in u for u in all_urls)
|
|
147
|
-
|
|
135
|
+
|
|
148
136
|
episodes = []
|
|
149
137
|
if is_series:
|
|
150
138
|
# Dict kullanarak duplicate'leri önle ama sıralı tut
|
|
@@ -153,10 +141,10 @@ class RoketDizi(PluginBase):
|
|
|
153
141
|
if "bolum" in u and u not in episodes_dict:
|
|
154
142
|
season_match = re.search(r'/sezon-(\d+)', u)
|
|
155
143
|
ep_match = re.search(r'/bolum-(\d+)', u)
|
|
156
|
-
|
|
144
|
+
|
|
157
145
|
season = int(season_match.group(1)) if season_match else 1
|
|
158
146
|
episode_num = int(ep_match.group(1)) if ep_match else 1
|
|
159
|
-
|
|
147
|
+
|
|
160
148
|
# Key olarak (season, episode) tuple kullan
|
|
161
149
|
key = (season, episode_num)
|
|
162
150
|
episodes_dict[key] = Episode(
|
|
@@ -165,10 +153,10 @@ class RoketDizi(PluginBase):
|
|
|
165
153
|
title = f"{season}. Sezon {episode_num}. Bölüm",
|
|
166
154
|
url = self.fix_url(u)
|
|
167
155
|
)
|
|
168
|
-
|
|
156
|
+
|
|
169
157
|
# Sıralı liste oluştur
|
|
170
158
|
episodes = [episodes_dict[key] for key in sorted(episodes_dict.keys())]
|
|
171
|
-
|
|
159
|
+
|
|
172
160
|
return SeriesInfo(
|
|
173
161
|
title = title,
|
|
174
162
|
url = url,
|
|
@@ -188,31 +176,56 @@ class RoketDizi(PluginBase):
|
|
|
188
176
|
next_data = sel.css("script#__NEXT_DATA__::text").get()
|
|
189
177
|
if not next_data:
|
|
190
178
|
return []
|
|
191
|
-
|
|
179
|
+
|
|
192
180
|
try:
|
|
193
181
|
data = json.loads(next_data)
|
|
194
182
|
secure_data = data["props"]["pageProps"]["secureData"]
|
|
195
|
-
|
|
196
|
-
|
|
183
|
+
decoded_json = json.loads(base64.b64decode(secure_data).decode('utf-8'))
|
|
184
|
+
|
|
185
|
+
# secureData içindeki RelatedResults -> getEpisodeSources -> result dizisini al
|
|
186
|
+
sources = decoded_json.get("RelatedResults", {}).get("getEpisodeSources", {}).get("result", [])
|
|
187
|
+
|
|
197
188
|
results = []
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
189
|
+
for source in sources:
|
|
190
|
+
source_content = source.get("source_content", "")
|
|
191
|
+
|
|
192
|
+
# iframe URL'ini source_content'ten çıkar
|
|
193
|
+
iframe_match = re.search(r'<iframe[^>]*src=["\']([^"\']*)["\']', source_content)
|
|
194
|
+
if not iframe_match:
|
|
195
|
+
continue
|
|
196
|
+
|
|
197
|
+
iframe_url = iframe_match.group(1)
|
|
201
198
|
if "http" not in iframe_url:
|
|
202
199
|
if iframe_url.startswith("//"):
|
|
203
200
|
iframe_url = "https:" + iframe_url
|
|
204
201
|
else:
|
|
205
|
-
iframe_url = "https://" + iframe_url
|
|
206
|
-
|
|
202
|
+
iframe_url = "https://" + iframe_url
|
|
203
|
+
|
|
207
204
|
# Check extractor
|
|
208
205
|
extractor = self.ex_manager.find_extractor(iframe_url)
|
|
209
|
-
|
|
210
|
-
|
|
206
|
+
ext_name = extractor.name if extractor else ""
|
|
207
|
+
|
|
208
|
+
# Metadata'dan bilgileri al
|
|
209
|
+
source_name = source.get("source_name", "")
|
|
210
|
+
language_name = source.get("language_name", "")
|
|
211
|
+
quality_name = source.get("quality_name", "")
|
|
212
|
+
|
|
213
|
+
# İsmi oluştur
|
|
214
|
+
name_parts = []
|
|
215
|
+
if source_name:
|
|
216
|
+
name_parts.append(source_name)
|
|
217
|
+
if ext_name:
|
|
218
|
+
name_parts.append(ext_name)
|
|
219
|
+
if language_name:
|
|
220
|
+
name_parts.append(language_name)
|
|
221
|
+
if quality_name:
|
|
222
|
+
name_parts.append(quality_name)
|
|
223
|
+
|
|
211
224
|
results.append({
|
|
212
|
-
"url": iframe_url,
|
|
213
|
-
"name":
|
|
225
|
+
"url" : iframe_url,
|
|
226
|
+
"name" : " | ".join(name_parts)
|
|
214
227
|
})
|
|
215
|
-
|
|
228
|
+
|
|
216
229
|
return results
|
|
217
230
|
|
|
218
231
|
except Exception:
|
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
class SinemaCX(PluginBase):
|
|
8
8
|
name = "SinemaCX"
|
|
9
9
|
language = "tr"
|
|
10
|
-
main_url = "https://www.sinema.
|
|
10
|
+
main_url = "https://www.sinema.fit"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
12
|
description = "HD Film izle, Türkçe Dublaj ve Altyazılı filmler."
|
|
13
13
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.9
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.9
|
|
4
4
|
Summary: terminal üzerinden medya içeriği aramanızı ve VLC/MPV gibi popüler medya oynatıcılar aracılığıyla doğrudan izlemenizi sağlayan modüler ve genişletilebilir bir bıdı bıdı
|
|
5
5
|
Home-page: https://github.com/keyiflerolsun/KekikStream
|
|
6
6
|
Author: keyiflerolsun
|
|
@@ -6,7 +6,7 @@ from io import open
|
|
|
6
6
|
setup(
|
|
7
7
|
# ? Genel Bilgiler
|
|
8
8
|
name = "KekikStream",
|
|
9
|
-
version = "1.9.
|
|
9
|
+
version = "1.9.9",
|
|
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
|