KekikStream 1.7.7__tar.gz → 1.8.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.
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Extractor/ExtractorModels.py +5 -7
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Media/MediaHandler.py +16 -20
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Media/MediaManager.py +0 -3
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Plugin/PluginModels.py +25 -26
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/CloseLoad.py +1 -2
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/ContentX.py +0 -2
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/DzenRu.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/ExPlay.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/FirePlayer.py +4 -5
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/HDPlayerSystem.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/JetTv.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/MailRu.py +1 -2
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/MixPlayHD.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/MixTiger.py +1 -5
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/MolyStream.py +5 -5
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/Odnoklassniki.py +5 -5
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/PeaceMakerst.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/PixelDrain.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/PlayerFilmIzle.py +5 -5
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/RapidVid.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/SetPlay.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/SetPrime.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/SibNet.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/Sobreatsesuyp.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/TRsTX.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/TauVideo.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/TurboImgz.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/TurkeyPlayer.py +5 -5
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/VidHide.py +5 -5
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/VidMoly.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/VidMoxy.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/VidPapi.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/VideoSeyred.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/YildizKisaFilm.py +0 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/DiziPal.py +4 -4
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/DiziYou.py +3 -3
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/FilmModu.py +3 -3
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/HDFilmCehennemi.py +3 -3
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/RecTV.py +11 -11
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/RoketDizi.py +32 -58
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/SineWix.py +3 -3
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/SinemaCX.py +4 -4
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/__init__.py +5 -8
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/PKG-INFO +1 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/setup.py +1 -1
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/Plugins/UgurFilm.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/__main__.py +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream/requirements.txt +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/LICENSE +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/MANIFEST.in +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/README.md +0 -0
- {kekikstream-1.7.7 → kekikstream-1.8.1}/setup.cfg +0 -0
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel
|
|
4
|
-
from typing import List, Optional
|
|
5
|
-
|
|
6
4
|
|
|
7
5
|
class Subtitle(BaseModel):
|
|
8
6
|
"""Altyazı modeli."""
|
|
@@ -12,8 +10,8 @@ class Subtitle(BaseModel):
|
|
|
12
10
|
|
|
13
11
|
class ExtractResult(BaseModel):
|
|
14
12
|
"""Extractor'ın döndürmesi gereken sonuç modeli."""
|
|
15
|
-
name
|
|
16
|
-
url
|
|
17
|
-
referer
|
|
18
|
-
|
|
19
|
-
subtitles
|
|
13
|
+
name : str
|
|
14
|
+
url : str
|
|
15
|
+
referer : str | None = None
|
|
16
|
+
user_agent : str | None = None
|
|
17
|
+
subtitles : list[Subtitle] = []
|
|
@@ -5,33 +5,29 @@ from ..Extractor.ExtractorModels import ExtractResult
|
|
|
5
5
|
import subprocess, os
|
|
6
6
|
|
|
7
7
|
class MediaHandler:
|
|
8
|
-
def __init__(self, title: str = "KekikStream"
|
|
9
|
-
# Varsayılan HTTP başlıklarını ayarla
|
|
10
|
-
if headers is None:
|
|
11
|
-
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"}
|
|
12
|
-
|
|
13
|
-
self.headers = headers
|
|
8
|
+
def __init__(self, title: str = "KekikStream"):
|
|
14
9
|
self.title = title
|
|
10
|
+
self.headers = {}
|
|
15
11
|
|
|
16
12
|
def play_media(self, extract_data: ExtractResult):
|
|
17
|
-
#
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
# user-agent ekle (varsayılan veya extract_data'dan)
|
|
14
|
+
user_agent = extract_data.user_agent or "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"
|
|
15
|
+
self.headers["user-agent"] = user_agent
|
|
20
16
|
|
|
21
|
-
#
|
|
22
|
-
if extract_data.
|
|
23
|
-
self.headers
|
|
17
|
+
# referer ekle
|
|
18
|
+
if extract_data.referer:
|
|
19
|
+
self.headers["referer"] = extract_data.referer
|
|
24
20
|
|
|
25
21
|
# Google Drive gibi özel durumlar için yt-dlp kullan
|
|
26
|
-
if
|
|
22
|
+
if user_agent in ["googleusercontent", "Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"]:
|
|
27
23
|
return self.play_with_ytdlp(extract_data)
|
|
28
24
|
|
|
29
25
|
# İşletim sistemine göre oynatıcı seç
|
|
30
26
|
if subprocess.check_output(['uname', '-o']).strip() == b'Android':
|
|
31
27
|
return self.play_with_android_mxplayer(extract_data)
|
|
32
28
|
|
|
33
|
-
#
|
|
34
|
-
if
|
|
29
|
+
# Alt yazılar varsa mpv kullan
|
|
30
|
+
if extract_data.subtitles:
|
|
35
31
|
return self.play_with_mpv(extract_data)
|
|
36
32
|
|
|
37
33
|
return self.play_with_vlc(extract_data) or self.play_with_mpv(extract_data)
|
|
@@ -48,11 +44,11 @@ class MediaHandler:
|
|
|
48
44
|
f"--input-title-format={self.title}"
|
|
49
45
|
])
|
|
50
46
|
|
|
51
|
-
if "
|
|
52
|
-
vlc_command.append(f"--http-user-agent={self.headers.get('
|
|
47
|
+
if "user-agent" in self.headers:
|
|
48
|
+
vlc_command.append(f"--http-user-agent={self.headers.get('user-agent')}")
|
|
53
49
|
|
|
54
|
-
if "
|
|
55
|
-
vlc_command.append(f"--http-referrer={self.headers.get('
|
|
50
|
+
if "referer" in self.headers:
|
|
51
|
+
vlc_command.append(f"--http-referrer={self.headers.get('referer')}")
|
|
56
52
|
|
|
57
53
|
vlc_command.extend(
|
|
58
54
|
f"--sub-file={subtitle.url}" for subtitle in extract_data.subtitles
|
|
@@ -162,4 +158,4 @@ class MediaHandler:
|
|
|
162
158
|
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
163
159
|
except FileNotFoundError:
|
|
164
160
|
konsol.print(f"Paket: {paket}, Hata: MX Player kurulu değil")
|
|
165
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
161
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
|
@@ -1,34 +1,33 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel, field_validator, model_validator
|
|
4
|
-
from typing import List, Optional
|
|
5
4
|
|
|
6
5
|
class MainPageResult(BaseModel):
|
|
7
6
|
"""Ana sayfa sonucunda dönecek veri modeli."""
|
|
8
7
|
category : str
|
|
9
8
|
title : str
|
|
10
9
|
url : str
|
|
11
|
-
poster :
|
|
10
|
+
poster : str | None = None
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
class SearchResult(BaseModel):
|
|
15
14
|
"""Arama sonucunda dönecek veri modeli."""
|
|
16
15
|
title : str
|
|
17
16
|
url : str
|
|
18
|
-
poster :
|
|
17
|
+
poster : str | None = None
|
|
19
18
|
|
|
20
19
|
|
|
21
20
|
class MovieInfo(BaseModel):
|
|
22
21
|
"""Bir medya öğesinin bilgilerini tutan model."""
|
|
23
22
|
url : str
|
|
24
|
-
poster :
|
|
25
|
-
title :
|
|
26
|
-
description :
|
|
27
|
-
tags :
|
|
28
|
-
rating :
|
|
29
|
-
year :
|
|
30
|
-
actors :
|
|
31
|
-
duration :
|
|
23
|
+
poster : str | None = None
|
|
24
|
+
title : str | None = None
|
|
25
|
+
description : str | None = None
|
|
26
|
+
tags : str | None = None
|
|
27
|
+
rating : str | None = None
|
|
28
|
+
year : str | None = None
|
|
29
|
+
actors : str | None = None
|
|
30
|
+
duration : int | None = None
|
|
32
31
|
|
|
33
32
|
@field_validator("tags", "actors", mode="before")
|
|
34
33
|
@classmethod
|
|
@@ -42,10 +41,10 @@ class MovieInfo(BaseModel):
|
|
|
42
41
|
|
|
43
42
|
|
|
44
43
|
class Episode(BaseModel):
|
|
45
|
-
season :
|
|
46
|
-
episode :
|
|
47
|
-
title :
|
|
48
|
-
url :
|
|
44
|
+
season : int | None = None
|
|
45
|
+
episode : int | None = None
|
|
46
|
+
title : str | None = None
|
|
47
|
+
url : str | None = None
|
|
49
48
|
|
|
50
49
|
@model_validator(mode="after")
|
|
51
50
|
def check_title(self) -> "Episode":
|
|
@@ -58,16 +57,16 @@ class Episode(BaseModel):
|
|
|
58
57
|
return self
|
|
59
58
|
|
|
60
59
|
class SeriesInfo(BaseModel):
|
|
61
|
-
url :
|
|
62
|
-
poster :
|
|
63
|
-
title :
|
|
64
|
-
description :
|
|
65
|
-
tags :
|
|
66
|
-
rating :
|
|
67
|
-
year :
|
|
68
|
-
actors :
|
|
69
|
-
duration :
|
|
70
|
-
episodes :
|
|
60
|
+
url : str | None = None
|
|
61
|
+
poster : str | None = None
|
|
62
|
+
title : str | None = None
|
|
63
|
+
description : str | None = None
|
|
64
|
+
tags : str | None = None
|
|
65
|
+
rating : str | None = None
|
|
66
|
+
year : str | None = None
|
|
67
|
+
actors : str | None = None
|
|
68
|
+
duration : int | None = None
|
|
69
|
+
episodes : list[Episode] | None = None
|
|
71
70
|
|
|
72
71
|
@field_validator("tags", "actors", mode="before")
|
|
73
72
|
@classmethod
|
|
@@ -77,4 +76,4 @@ class SeriesInfo(BaseModel):
|
|
|
77
76
|
@field_validator("rating", "year", mode="before")
|
|
78
77
|
@classmethod
|
|
79
78
|
def ensure_string(cls, value):
|
|
80
|
-
return str(value) if value is not None else value
|
|
79
|
+
return str(value) if value is not None else value
|
|
@@ -53,7 +53,6 @@ class ContentX(ExtractorBase):
|
|
|
53
53
|
name = self.name,
|
|
54
54
|
url = m3u_link,
|
|
55
55
|
referer = url,
|
|
56
|
-
headers = {},
|
|
57
56
|
subtitles = subtitles
|
|
58
57
|
)
|
|
59
58
|
]
|
|
@@ -74,7 +73,6 @@ class ContentX(ExtractorBase):
|
|
|
74
73
|
name = f"{self.name} Türkçe Dublaj",
|
|
75
74
|
url = dublaj_link,
|
|
76
75
|
referer = url,
|
|
77
|
-
headers = {},
|
|
78
76
|
subtitles = []
|
|
79
77
|
)
|
|
80
78
|
)
|
|
@@ -53,9 +53,8 @@ class FirePlayer(ExtractorBase):
|
|
|
53
53
|
raise ValueError("Could not find video URL in unpacked content")
|
|
54
54
|
|
|
55
55
|
return ExtractResult(
|
|
56
|
-
name
|
|
57
|
-
url
|
|
58
|
-
referer
|
|
59
|
-
|
|
56
|
+
name = self.name,
|
|
57
|
+
url = video_url,
|
|
58
|
+
referer = url,
|
|
59
|
+
user_agent = headers.get("User-Agent", "")
|
|
60
60
|
)
|
|
61
|
-
|
|
@@ -37,9 +37,6 @@ class MixTiger(ExtractorBase):
|
|
|
37
37
|
if not m3u_link:
|
|
38
38
|
raise ValueError("Video URL not found in response")
|
|
39
39
|
|
|
40
|
-
# disk.yandex için referer boş olmalı
|
|
41
|
-
final_referer = "" if "disk.yandex" in m3u_link else ext_ref
|
|
42
|
-
|
|
43
40
|
# Recursive extraction check
|
|
44
41
|
try:
|
|
45
42
|
from KekikStream.Core.Extractor.ExtractorManager import ExtractorManager
|
|
@@ -55,7 +52,6 @@ class MixTiger(ExtractorBase):
|
|
|
55
52
|
return ExtractResult(
|
|
56
53
|
name = self.name,
|
|
57
54
|
url = m3u_link,
|
|
58
|
-
referer =
|
|
59
|
-
headers = {},
|
|
55
|
+
referer = None if "disk.yandex" in m3u_link else ext_ref,
|
|
60
56
|
subtitles = []
|
|
61
57
|
)
|
|
@@ -26,9 +26,9 @@ class MolyStream(ExtractorBase):
|
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
return ExtractResult(
|
|
29
|
-
name
|
|
30
|
-
url
|
|
31
|
-
referer
|
|
32
|
-
|
|
33
|
-
subtitles
|
|
29
|
+
name = self.name,
|
|
30
|
+
url = video,
|
|
31
|
+
referer = video.replace("/sheila", ""),
|
|
32
|
+
user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0",
|
|
33
|
+
subtitles = subtitles
|
|
34
34
|
)
|
|
@@ -82,11 +82,11 @@ class Odnoklassniki(ExtractorBase):
|
|
|
82
82
|
best_video = f"https:{best_video}"
|
|
83
83
|
|
|
84
84
|
return ExtractResult(
|
|
85
|
-
name
|
|
86
|
-
url
|
|
87
|
-
referer
|
|
88
|
-
|
|
89
|
-
subtitles
|
|
85
|
+
name = self.name,
|
|
86
|
+
url = best_video,
|
|
87
|
+
referer = referer,
|
|
88
|
+
user_agent = headers.get("User-Agent", None),
|
|
89
|
+
subtitles = []
|
|
90
90
|
)
|
|
91
91
|
|
|
92
92
|
async def fetch_with_redirects(self, url, max_redirects=5):
|
|
@@ -54,9 +54,9 @@ class PlayerFilmIzle(ExtractorBase):
|
|
|
54
54
|
raise ValueError("PlayerFilmIzle: M3U8 linki bulunamadı")
|
|
55
55
|
|
|
56
56
|
return ExtractResult(
|
|
57
|
-
name
|
|
58
|
-
url
|
|
59
|
-
referer
|
|
60
|
-
|
|
61
|
-
subtitles
|
|
57
|
+
name = self.name,
|
|
58
|
+
url = m3u8_url,
|
|
59
|
+
referer = ext_ref,
|
|
60
|
+
user_agent = self.httpx.headers.get("User-Agent", None),
|
|
61
|
+
subtitles = subtitles
|
|
62
62
|
)
|
|
@@ -26,9 +26,9 @@ class TurkeyPlayer(ExtractorBase):
|
|
|
26
26
|
master_url = f"https://watch.turkeyplayer.com/m3u8/8/{video_md5}/master.txt?s=1&id={video_id}&cache=1"
|
|
27
27
|
|
|
28
28
|
return ExtractResult(
|
|
29
|
-
name
|
|
30
|
-
url
|
|
31
|
-
referer
|
|
32
|
-
|
|
33
|
-
subtitles
|
|
29
|
+
name = self.name,
|
|
30
|
+
url = master_url,
|
|
31
|
+
referer = referer or url,
|
|
32
|
+
user_agent = self.httpx.headers.get("User-Agent", ""),
|
|
33
|
+
subtitles = []
|
|
34
34
|
)
|
|
@@ -64,9 +64,9 @@ class VidHide(ExtractorBase):
|
|
|
64
64
|
raise ValueError(f"VidHide: Video URL bulunamadı. {url}")
|
|
65
65
|
|
|
66
66
|
return ExtractResult(
|
|
67
|
-
name
|
|
68
|
-
url
|
|
69
|
-
referer
|
|
70
|
-
|
|
71
|
-
subtitles
|
|
67
|
+
name = self.name,
|
|
68
|
+
url = self.fix_url(m3u8_url),
|
|
69
|
+
referer = f"{self.main_url}/",
|
|
70
|
+
user_agent = self.httpx.headers.get("User-Agent", ""),
|
|
71
|
+
subtitles = []
|
|
72
72
|
)
|
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
class DiziPal(PluginBase):
|
|
8
8
|
name = "DiziPal"
|
|
9
9
|
language = "tr"
|
|
10
|
-
main_url = "https://
|
|
10
|
+
main_url = "https://dizipal1223.com"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
12
|
description = "Yabancı Dizi ve Film izle."
|
|
13
13
|
|
|
@@ -237,9 +237,9 @@ class DiziPal(PluginBase):
|
|
|
237
237
|
|
|
238
238
|
return results
|
|
239
239
|
|
|
240
|
-
async def play(self,
|
|
241
|
-
extract_result = ExtractResult(
|
|
242
|
-
self.media_handler.title = name
|
|
240
|
+
async def play(self, **kwargs):
|
|
241
|
+
extract_result = ExtractResult(**kwargs)
|
|
242
|
+
self.media_handler.title = kwargs.get("name")
|
|
243
243
|
if self.name not in self.media_handler.title:
|
|
244
244
|
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
245
245
|
|
|
@@ -163,9 +163,9 @@ class DiziYou(PluginBase):
|
|
|
163
163
|
|
|
164
164
|
return results
|
|
165
165
|
|
|
166
|
-
async def play(self,
|
|
167
|
-
extract_result = ExtractResult(
|
|
168
|
-
self.media_handler.title = name
|
|
166
|
+
async def play(self, **kwargs):
|
|
167
|
+
extract_result = ExtractResult(**kwargs)
|
|
168
|
+
self.media_handler.title = kwargs.get("name")
|
|
169
169
|
if self.name not in self.media_handler.title:
|
|
170
170
|
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
171
171
|
|
|
@@ -129,9 +129,9 @@ class FilmModu(PluginBase):
|
|
|
129
129
|
|
|
130
130
|
return results
|
|
131
131
|
|
|
132
|
-
async def play(self,
|
|
133
|
-
extract_result = ExtractResult(
|
|
134
|
-
self.media_handler.title = name
|
|
132
|
+
async def play(self, **kwargs):
|
|
133
|
+
extract_result = ExtractResult(**kwargs)
|
|
134
|
+
self.media_handler.title = kwargs.get("name")
|
|
135
135
|
if self.name not in self.media_handler.title:
|
|
136
136
|
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
137
137
|
|
|
@@ -219,9 +219,9 @@ class HDFilmCehennemi(PluginBase):
|
|
|
219
219
|
|
|
220
220
|
return results
|
|
221
221
|
|
|
222
|
-
async def play(self,
|
|
223
|
-
extract_result = ExtractResult(
|
|
224
|
-
self.media_handler.title = name
|
|
222
|
+
async def play(self, **kwargs):
|
|
223
|
+
extract_result = ExtractResult(**kwargs)
|
|
224
|
+
self.media_handler.title = kwargs.get("name")
|
|
225
225
|
if self.name not in self.media_handler.title:
|
|
226
226
|
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
227
227
|
|
|
@@ -121,8 +121,6 @@ class RecTV(PluginBase):
|
|
|
121
121
|
|
|
122
122
|
#@kekik_cache(ttl=15*60)
|
|
123
123
|
async def load_links(self, url: str) -> list[dict]:
|
|
124
|
-
self.media_handler.headers.update({"User-Agent": "googleusercontent"})
|
|
125
|
-
|
|
126
124
|
try:
|
|
127
125
|
veri = loads(url)
|
|
128
126
|
except Exception:
|
|
@@ -132,9 +130,10 @@ class RecTV(PluginBase):
|
|
|
132
130
|
# Eğer dizi bölümü ise (bizim oluşturduğumuz yapı)
|
|
133
131
|
if veri.get("is_episode"):
|
|
134
132
|
return [{
|
|
135
|
-
"url"
|
|
136
|
-
"name"
|
|
137
|
-
"
|
|
133
|
+
"url" : veri.get("url"),
|
|
134
|
+
"name" : veri.get("title", "Bölüm"),
|
|
135
|
+
"user_agent" : "googleusercontent",
|
|
136
|
+
"referer" : "https://twitter.com/"
|
|
138
137
|
}]
|
|
139
138
|
|
|
140
139
|
# Film ise (RecTV API yapısı)
|
|
@@ -146,16 +145,17 @@ class RecTV(PluginBase):
|
|
|
146
145
|
continue
|
|
147
146
|
|
|
148
147
|
results.append({
|
|
149
|
-
"url"
|
|
150
|
-
"name"
|
|
151
|
-
"
|
|
148
|
+
"url" : video_link,
|
|
149
|
+
"name" : f"{veri.get('title')} - {kaynak.get('title')}",
|
|
150
|
+
"user_agent" : "googleusercontent",
|
|
151
|
+
"referer" : "https://twitter.com/"
|
|
152
152
|
})
|
|
153
153
|
|
|
154
154
|
return results
|
|
155
155
|
|
|
156
|
-
async def play(self,
|
|
157
|
-
extract_result = ExtractResult(
|
|
158
|
-
self.media_handler.title = name
|
|
156
|
+
async def play(self, **kwargs):
|
|
157
|
+
extract_result = ExtractResult(**kwargs)
|
|
158
|
+
self.media_handler.title = kwargs.get("name")
|
|
159
159
|
if self.name not in self.media_handler.title:
|
|
160
160
|
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
161
161
|
|
|
@@ -7,7 +7,7 @@ import re, base64, json, urllib.parse
|
|
|
7
7
|
class RoketDizi(PluginBase):
|
|
8
8
|
name = "RoketDizi"
|
|
9
9
|
lang = "tr"
|
|
10
|
-
main_url = "https://
|
|
10
|
+
main_url = "https://roketdizi.to"
|
|
11
11
|
|
|
12
12
|
# Domain doğrulama ve anti-bot mekanizmaları var
|
|
13
13
|
requires_cffi = True
|
|
@@ -25,56 +25,40 @@ class RoketDizi(PluginBase):
|
|
|
25
25
|
|
|
26
26
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
27
27
|
full_url = f"{self.main_url}/{url}?&page={page}"
|
|
28
|
-
resp
|
|
29
|
-
sel
|
|
28
|
+
resp = await self.cffi.get(full_url)
|
|
29
|
+
sel = Selector(resp.text)
|
|
30
30
|
|
|
31
31
|
results = []
|
|
32
32
|
|
|
33
33
|
for item in sel.css("div.w-full.p-4 span.bg-\\[\\#232323\\]"):
|
|
34
|
-
title
|
|
35
|
-
href
|
|
36
|
-
poster= item.css("img::attr(src)").get()
|
|
34
|
+
title = item.css("span.font-normal.line-clamp-1::text").get()
|
|
35
|
+
href = item.css("a::attr(href)").get()
|
|
36
|
+
poster = item.css("img::attr(src)").get()
|
|
37
37
|
|
|
38
38
|
if title and href:
|
|
39
39
|
results.append(MainPageResult(
|
|
40
|
-
category=category,
|
|
41
|
-
title=title,
|
|
42
|
-
url=self.fix_url(href),
|
|
43
|
-
poster=self.fix_url(poster)
|
|
40
|
+
category = category,
|
|
41
|
+
title = title,
|
|
42
|
+
url = self.fix_url(href),
|
|
43
|
+
poster = self.fix_url(poster)
|
|
44
44
|
))
|
|
45
45
|
return results
|
|
46
46
|
|
|
47
|
-
async def get_domain(self):
|
|
48
|
-
try:
|
|
49
|
-
domain_list = await self.cffi.get("https://raw.githubusercontent.com/Kraptor123/domainListesi/refs/heads/main/eklenti_domainleri.txt")
|
|
50
|
-
if domain_list.status_code == 200:
|
|
51
|
-
for line in domain_list.text.split("|"):
|
|
52
|
-
if line.strip().startswith("RoketDizi"):
|
|
53
|
-
domain = line.split(":")[-1].strip()
|
|
54
|
-
if "http" not in domain:
|
|
55
|
-
domain = f"https://{domain}"
|
|
56
|
-
return domain
|
|
57
|
-
except Exception:
|
|
58
|
-
pass
|
|
59
|
-
return self.main_url
|
|
60
|
-
|
|
61
47
|
async def search(self, query: str) -> list[SearchResult]:
|
|
62
|
-
current_domain = await self.get_domain()
|
|
63
|
-
|
|
64
48
|
# Get Cookies and Keys
|
|
65
|
-
main_req = await self.cffi.get(
|
|
49
|
+
main_req = await self.cffi.get(self.main_url)
|
|
66
50
|
sel = Selector(main_req.text)
|
|
67
51
|
|
|
68
52
|
c_key = sel.css("input[name='cKey']::attr(value)").get()
|
|
69
53
|
c_value = sel.css("input[name='cValue']::attr(value)").get()
|
|
70
54
|
|
|
71
|
-
post_url = f"{
|
|
55
|
+
post_url = f"{self.main_url}/api/bg/searchContent?searchterm={query}"
|
|
72
56
|
|
|
73
57
|
headers = {
|
|
74
|
-
"Accept": "application/json, text/javascript, */*; q=0.01",
|
|
75
|
-
"X-Requested-With": "XMLHttpRequest",
|
|
76
|
-
"Referer": f"{
|
|
77
|
-
"CNT": "vakTR"
|
|
58
|
+
"Accept" : "application/json, text/javascript, */*; q=0.01",
|
|
59
|
+
"X-Requested-With" : "XMLHttpRequest",
|
|
60
|
+
"Referer" : f"{self.main_url}/",
|
|
61
|
+
"CNT" : "vakTR"
|
|
78
62
|
}
|
|
79
63
|
|
|
80
64
|
data = {}
|
|
@@ -96,9 +80,9 @@ class RoketDizi(PluginBase):
|
|
|
96
80
|
|
|
97
81
|
for href, poster, title in items:
|
|
98
82
|
results.append(SearchResult(
|
|
99
|
-
title=title.strip(),
|
|
100
|
-
url=self.fix_url(href.strip()
|
|
101
|
-
poster=self.fix_url(poster.strip()
|
|
83
|
+
title = title.strip(),
|
|
84
|
+
url = self.fix_url(href.strip()),
|
|
85
|
+
poster = self.fix_url(poster.strip())
|
|
102
86
|
))
|
|
103
87
|
|
|
104
88
|
return results
|
|
@@ -141,22 +125,22 @@ class RoketDizi(PluginBase):
|
|
|
141
125
|
episode_num = int(ep_match.group(1)) if ep_match else 1
|
|
142
126
|
|
|
143
127
|
episodes.append(Episode(
|
|
144
|
-
season=season,
|
|
145
|
-
episode=episode_num,
|
|
146
|
-
title=f"{season}. Sezon {episode_num}. Bölüm", # Placeholder title
|
|
147
|
-
url=self.fix_url(u
|
|
128
|
+
season = season,
|
|
129
|
+
episode = episode_num,
|
|
130
|
+
title = f"{season}. Sezon {episode_num}. Bölüm", # Placeholder title
|
|
131
|
+
url = self.fix_url(u)
|
|
148
132
|
))
|
|
149
133
|
|
|
150
134
|
return SeriesInfo(
|
|
151
|
-
title=title,
|
|
152
|
-
url=url,
|
|
153
|
-
poster=self.fix_url(poster),
|
|
154
|
-
description=description,
|
|
155
|
-
tags=tags,
|
|
156
|
-
rating=rating,
|
|
157
|
-
actors=actors,
|
|
158
|
-
episodes=episodes,
|
|
159
|
-
year=year
|
|
135
|
+
title = title,
|
|
136
|
+
url = url,
|
|
137
|
+
poster = self.fix_url(poster),
|
|
138
|
+
description = description,
|
|
139
|
+
tags = tags,
|
|
140
|
+
rating = rating,
|
|
141
|
+
actors = actors,
|
|
142
|
+
episodes = episodes,
|
|
143
|
+
year = year
|
|
160
144
|
)
|
|
161
145
|
|
|
162
146
|
async def load_links(self, url: str) -> list[dict]:
|
|
@@ -195,13 +179,3 @@ class RoketDizi(PluginBase):
|
|
|
195
179
|
|
|
196
180
|
except Exception:
|
|
197
181
|
return []
|
|
198
|
-
|
|
199
|
-
def fix_url(self, url: str, domain:str=None) -> str:
|
|
200
|
-
if not url: return ""
|
|
201
|
-
if url.startswith("http"): return url
|
|
202
|
-
base = domain or self.main_url
|
|
203
|
-
return f"https:{url}" if url.startswith("//") else urllib.parse.urljoin(base, url)
|
|
204
|
-
|
|
205
|
-
def get_domain_sync(self, url:str):
|
|
206
|
-
parsed = urllib.parse.urlparse(url)
|
|
207
|
-
return f"{parsed.scheme}://{parsed.netloc}"
|
|
@@ -161,9 +161,9 @@ class SineWix(PluginBase):
|
|
|
161
161
|
|
|
162
162
|
return results
|
|
163
163
|
|
|
164
|
-
async def play(self,
|
|
165
|
-
extract_result = ExtractResult(
|
|
166
|
-
self.media_handler.title = name
|
|
164
|
+
async def play(self, **kwargs):
|
|
165
|
+
extract_result = ExtractResult(**kwargs)
|
|
166
|
+
self.media_handler.title = kwargs.get("name")
|
|
167
167
|
if self.name not in self.media_handler.title:
|
|
168
168
|
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
169
169
|
|
|
@@ -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.onl"
|
|
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
|
|
|
@@ -148,9 +148,9 @@ class SinemaCX(PluginBase):
|
|
|
148
148
|
|
|
149
149
|
return results
|
|
150
150
|
|
|
151
|
-
async def play(self,
|
|
152
|
-
extract_result = ExtractResult(
|
|
153
|
-
self.media_handler.title = name
|
|
151
|
+
async def play(self, **kwargs):
|
|
152
|
+
extract_result = ExtractResult(**kwargs)
|
|
153
|
+
self.media_handler.title = kwargs.get("name")
|
|
154
154
|
if self.name not in self.media_handler.title:
|
|
155
155
|
self.media_handler.title = f"{self.name} | {self.media_handler.title}"
|
|
156
156
|
|
|
@@ -268,10 +268,11 @@ class KekikStream:
|
|
|
268
268
|
self.update_title(selected.get("name"))
|
|
269
269
|
|
|
270
270
|
await self.current_plugin.play(
|
|
271
|
-
name
|
|
272
|
-
url
|
|
273
|
-
|
|
274
|
-
|
|
271
|
+
name = self.media.get_title(),
|
|
272
|
+
url = selected.get("url"),
|
|
273
|
+
user_agent = selected.get("user_agent"),
|
|
274
|
+
referer = selected.get("referer"),
|
|
275
|
+
subtitles = selected.get("subtitles", [])
|
|
275
276
|
)
|
|
276
277
|
return await self.content_finished()
|
|
277
278
|
|
|
@@ -319,10 +320,6 @@ class KekikStream:
|
|
|
319
320
|
self.update_title(selected.get("name"))
|
|
320
321
|
self.update_title(extract_data.name)
|
|
321
322
|
|
|
322
|
-
self.media.set_headers(extract_data.headers)
|
|
323
|
-
if extract_data.referer and not extract_data.headers.get("Referer"):
|
|
324
|
-
self.media.set_headers({"Referer": extract_data.referer})
|
|
325
|
-
|
|
326
323
|
self.media.play_media(extract_data)
|
|
327
324
|
await self.content_finished()
|
|
328
325
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.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 = "1.
|
|
9
|
+
version = "1.8.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
|