KekikStream 1.7.6__tar.gz → 1.8.0__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.6 → kekikstream-1.8.0}/KekikStream/Core/Extractor/ExtractorModels.py +5 -7
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Media/MediaHandler.py +41 -43
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Media/MediaManager.py +0 -3
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Plugin/PluginModels.py +25 -26
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/CloseLoad.py +1 -2
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/ContentX.py +0 -2
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/DzenRu.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/ExPlay.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/FirePlayer.py +4 -5
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/HDPlayerSystem.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/JetTv.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/MailRu.py +1 -2
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/MixPlayHD.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/MixTiger.py +1 -5
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/MolyStream.py +5 -5
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/Odnoklassniki.py +6 -6
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/PeaceMakerst.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/PixelDrain.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/PlayerFilmIzle.py +5 -5
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/RapidVid.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/SetPlay.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/SetPrime.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/SibNet.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/Sobreatsesuyp.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/TRsTX.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/TauVideo.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/TurboImgz.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/TurkeyPlayer.py +5 -5
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/VidHide.py +5 -5
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/VidMoly.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/VidMoxy.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/VidPapi.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/VideoSeyred.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/YildizKisaFilm.py +0 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/DiziBox.py +1 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/DiziPal.py +3 -3
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/DiziYou.py +3 -3
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/FilmModu.py +3 -3
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/HDFilmCehennemi.py +3 -3
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/JetFilmizle.py +1 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/RecTV.py +11 -11
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/SineWix.py +3 -3
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/SinemaCX.py +3 -3
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/UgurFilm.py +1 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/__init__.py +5 -8
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream.egg-info/PKG-INFO +1 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/PKG-INFO +1 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/setup.py +1 -1
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/FourCX.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/FourPichive.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/FourPlayRu.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/HDStreamAble.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/Hotlinger.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/OkRuHTTP.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/OkRuSSL.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/Pichive.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/PlayRu.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Extractors/VidMolyMe.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/FilmBip.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/FullHDFilm.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/Sinezy.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/Plugins/SuperFilmGeldi.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/__main__.py +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream/requirements.txt +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream.egg-info/SOURCES.txt +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream.egg-info/dependency_links.txt +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream.egg-info/entry_points.txt +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream.egg-info/requires.txt +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/KekikStream.egg-info/top_level.txt +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/LICENSE +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/MANIFEST.in +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/README.md +0 -0
- {kekikstream-1.7.6 → kekikstream-1.8.0}/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,40 +5,38 @@ from ..Extractor.ExtractorModels import ExtractResult
|
|
|
5
5
|
import subprocess, os
|
|
6
6
|
|
|
7
7
|
class MediaHandler:
|
|
8
|
-
def __init__(self, title: str = "KekikStream"
|
|
9
|
-
|
|
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
|
|
14
|
-
self.title = title
|
|
8
|
+
def __init__(self, title: str = "KekikStream"):
|
|
9
|
+
self.title = title
|
|
15
10
|
|
|
16
11
|
def play_media(self, extract_data: ExtractResult):
|
|
17
|
-
#
|
|
12
|
+
# Headers dict'ini user_agent ve referer'dan oluştur
|
|
13
|
+
headers = {}
|
|
14
|
+
|
|
15
|
+
# user-agent ekle (varsayılan veya extract_data'dan)
|
|
16
|
+
user_agent = extract_data.user_agent or "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"
|
|
17
|
+
headers["user-agent"] = user_agent
|
|
18
|
+
|
|
19
|
+
# referer ekle
|
|
18
20
|
if extract_data.referer:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# ExtractResult'tan gelen headers'ları ekle
|
|
22
|
-
if extract_data.headers:
|
|
23
|
-
self.headers.update(extract_data.headers)
|
|
24
|
-
|
|
21
|
+
headers["referer"] = extract_data.referer
|
|
22
|
+
|
|
25
23
|
# Google Drive gibi özel durumlar için yt-dlp kullan
|
|
26
|
-
if
|
|
27
|
-
return self.play_with_ytdlp(extract_data)
|
|
24
|
+
if user_agent in ["googleusercontent", "Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"]:
|
|
25
|
+
return self.play_with_ytdlp(extract_data, headers)
|
|
28
26
|
|
|
29
27
|
# İşletim sistemine göre oynatıcı seç
|
|
30
28
|
if subprocess.check_output(['uname', '-o']).strip() == b'Android':
|
|
31
|
-
return self.play_with_android_mxplayer(extract_data)
|
|
29
|
+
return self.play_with_android_mxplayer(extract_data, headers)
|
|
32
30
|
|
|
33
|
-
#
|
|
34
|
-
if
|
|
35
|
-
return self.play_with_mpv(extract_data)
|
|
31
|
+
# Alt yazılar varsa mpv kullan
|
|
32
|
+
if extract_data.subtitles:
|
|
33
|
+
return self.play_with_mpv(extract_data, headers)
|
|
36
34
|
|
|
37
|
-
return self.play_with_vlc(extract_data) or self.play_with_mpv(extract_data)
|
|
35
|
+
return self.play_with_vlc(extract_data, headers) or self.play_with_mpv(extract_data, headers)
|
|
38
36
|
|
|
39
|
-
def play_with_vlc(self, extract_data: ExtractResult):
|
|
37
|
+
def play_with_vlc(self, extract_data: ExtractResult, headers: dict):
|
|
40
38
|
konsol.log(f"[yellow][»] VLC ile Oynatılıyor : {extract_data.url}")
|
|
41
|
-
# konsol.print(
|
|
39
|
+
# konsol.print(headers)
|
|
42
40
|
try:
|
|
43
41
|
vlc_command = ["vlc", "--quiet"]
|
|
44
42
|
|
|
@@ -48,11 +46,11 @@ class MediaHandler:
|
|
|
48
46
|
f"--input-title-format={self.title}"
|
|
49
47
|
])
|
|
50
48
|
|
|
51
|
-
if "
|
|
52
|
-
vlc_command.append(f"--http-user-agent={
|
|
49
|
+
if "user-agent" in headers:
|
|
50
|
+
vlc_command.append(f"--http-user-agent={headers.get('user-agent')}")
|
|
53
51
|
|
|
54
|
-
if "
|
|
55
|
-
vlc_command.append(f"--http-referrer={
|
|
52
|
+
if "referer" in headers:
|
|
53
|
+
vlc_command.append(f"--http-referrer={headers.get('referer')}")
|
|
56
54
|
|
|
57
55
|
vlc_command.extend(
|
|
58
56
|
f"--sub-file={subtitle.url}" for subtitle in extract_data.subtitles
|
|
@@ -65,23 +63,23 @@ class MediaHandler:
|
|
|
65
63
|
return True
|
|
66
64
|
except subprocess.CalledProcessError as hata:
|
|
67
65
|
konsol.print(f"[red]VLC oynatma hatası: {hata}[/red]")
|
|
68
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
66
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": headers})
|
|
69
67
|
return False
|
|
70
68
|
except FileNotFoundError:
|
|
71
69
|
konsol.print("[red]VLC bulunamadı! VLC kurulu olduğundan emin olun.[/red]")
|
|
72
|
-
# konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
70
|
+
# konsol.print({"title": self.title, "url": extract_data.url, "headers": headers})
|
|
73
71
|
return False
|
|
74
72
|
|
|
75
|
-
def play_with_mpv(self, extract_data: ExtractResult):
|
|
73
|
+
def play_with_mpv(self, extract_data: ExtractResult, headers: dict):
|
|
76
74
|
konsol.log(f"[yellow][»] MPV ile Oynatılıyor : {extract_data.url}")
|
|
77
|
-
# konsol.print(
|
|
75
|
+
# konsol.print(headers)
|
|
78
76
|
try:
|
|
79
77
|
mpv_command = ["mpv"]
|
|
80
78
|
|
|
81
79
|
if self.title:
|
|
82
80
|
mpv_command.append(f"--force-media-title={self.title}")
|
|
83
81
|
|
|
84
|
-
for key, value in
|
|
82
|
+
for key, value in headers.items():
|
|
85
83
|
mpv_command.append(f"--http-header-fields={key}: {value}")
|
|
86
84
|
|
|
87
85
|
mpv_command.extend(
|
|
@@ -94,18 +92,18 @@ class MediaHandler:
|
|
|
94
92
|
|
|
95
93
|
except subprocess.CalledProcessError as hata:
|
|
96
94
|
konsol.print(f"[red]mpv oynatma hatası: {hata}[/red]")
|
|
97
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
95
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": headers})
|
|
98
96
|
except FileNotFoundError:
|
|
99
97
|
konsol.print("[red]mpv bulunamadı! mpv kurulu olduğundan emin olun.[/red]")
|
|
100
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
98
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": headers})
|
|
101
99
|
|
|
102
|
-
def play_with_ytdlp(self, extract_data: ExtractResult):
|
|
100
|
+
def play_with_ytdlp(self, extract_data: ExtractResult, headers: dict):
|
|
103
101
|
konsol.log(f"[yellow][»] yt-dlp ile Oynatılıyor : {extract_data.url}")
|
|
104
|
-
# konsol.print(
|
|
102
|
+
# konsol.print(headers)
|
|
105
103
|
try:
|
|
106
104
|
ytdlp_command = ["yt-dlp", "--quiet", "--no-warnings"]
|
|
107
105
|
|
|
108
|
-
for key, value in
|
|
106
|
+
for key, value in headers.items():
|
|
109
107
|
ytdlp_command.extend(["--add-header", f"{key}: {value}"])
|
|
110
108
|
|
|
111
109
|
ytdlp_command.extend([
|
|
@@ -127,14 +125,14 @@ class MediaHandler:
|
|
|
127
125
|
|
|
128
126
|
except subprocess.CalledProcessError as hata:
|
|
129
127
|
konsol.print(f"[red]Oynatma hatası: {hata}[/red]")
|
|
130
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
128
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": headers})
|
|
131
129
|
except FileNotFoundError:
|
|
132
130
|
konsol.print("[red]yt-dlp veya mpv bulunamadı! Kurulumlarından emin olun.[/red]")
|
|
133
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
131
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": headers})
|
|
134
132
|
|
|
135
|
-
def play_with_android_mxplayer(self, extract_data: ExtractResult):
|
|
133
|
+
def play_with_android_mxplayer(self, extract_data: ExtractResult, headers: dict):
|
|
136
134
|
konsol.log(f"[yellow][»] MxPlayer ile Oynatılıyor : {extract_data.url}")
|
|
137
|
-
# konsol.print(
|
|
135
|
+
# konsol.print(headers)
|
|
138
136
|
paketler = [
|
|
139
137
|
"com.mxtech.videoplayer.ad/.ActivityScreen", # Free sürüm
|
|
140
138
|
"com.mxtech.videoplayer.pro/.ActivityScreen" # Pro sürüm
|
|
@@ -159,7 +157,7 @@ class MediaHandler:
|
|
|
159
157
|
|
|
160
158
|
except subprocess.CalledProcessError as hata:
|
|
161
159
|
konsol.print(f"[red]{paket} oynatma hatası: {hata}[/red]")
|
|
162
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
160
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": headers})
|
|
163
161
|
except FileNotFoundError:
|
|
164
162
|
konsol.print(f"Paket: {paket}, Hata: MX Player kurulu değil")
|
|
165
|
-
konsol.print({"title": self.title, "url": extract_data.url, "headers":
|
|
163
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": 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,18 +82,18 @@ 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):
|
|
93
93
|
"""Yönlendirmeleri takip eden bir fonksiyon"""
|
|
94
94
|
redirects = 0
|
|
95
95
|
while redirects < max_redirects:
|
|
96
|
-
istek = await self.httpx.get(url,
|
|
96
|
+
istek = await self.httpx.get(url, follow_redirects=False)
|
|
97
97
|
|
|
98
98
|
if istek.status_code not in [301, 302]:
|
|
99
99
|
break # Yönlendirme yoksa çık
|
|
@@ -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
|
)
|
|
@@ -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
|
|
|
@@ -21,7 +21,7 @@ class JetFilmizle(PluginBase):
|
|
|
21
21
|
|
|
22
22
|
#@kekik_cache(ttl=60*60)
|
|
23
23
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
24
|
-
istek = await self.httpx.get(f"{url}{page}",
|
|
24
|
+
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
25
25
|
secici = Selector(istek.text)
|
|
26
26
|
|
|
27
27
|
return [
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -25,7 +25,7 @@ class UgurFilm(PluginBase):
|
|
|
25
25
|
|
|
26
26
|
#@kekik_cache(ttl=60*60)
|
|
27
27
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
28
|
-
istek = await self.httpx.get(f"{url}{page}",
|
|
28
|
+
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
29
29
|
secici = Selector(istek.text)
|
|
30
30
|
|
|
31
31
|
return [
|
|
@@ -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.0
|
|
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.0
|
|
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.0",
|
|
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
|