KekikStream 0.1.6__py3-none-any.whl → 0.1.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- KekikStream/Core/PluginBase.py +38 -4
- KekikStream/Extractors/PixelDrain.py +28 -0
- KekikStream/Extractors/SibNet.py +29 -0
- KekikStream/Extractors/Sobreatsesuyp.py +60 -0
- KekikStream/Extractors/TRsTX.py +68 -0
- KekikStream/Extractors/TauVideo.py +33 -0
- KekikStream/Managers/ExtractorManager.py +1 -1
- KekikStream/Plugins/JetFilmizle.py +96 -0
- KekikStream/__init__.py +24 -15
- {KekikStream-0.1.6.dist-info → KekikStream-0.1.8.dist-info}/METADATA +1 -1
- {KekikStream-0.1.6.dist-info → KekikStream-0.1.8.dist-info}/RECORD +15 -9
- {KekikStream-0.1.6.dist-info → KekikStream-0.1.8.dist-info}/LICENSE +0 -0
- {KekikStream-0.1.6.dist-info → KekikStream-0.1.8.dist-info}/WHEEL +0 -0
- {KekikStream-0.1.6.dist-info → KekikStream-0.1.8.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.1.6.dist-info → KekikStream-0.1.8.dist-info}/top_level.txt +0 -0
KekikStream/Core/PluginBase.py
CHANGED
@@ -4,6 +4,8 @@ from abc import ABC, abstractmethod
|
|
4
4
|
from httpx import AsyncClient, Timeout
|
5
5
|
from .PluginModels import SearchResult, MovieInfo
|
6
6
|
from .MediaHandler import MediaHandler
|
7
|
+
from urllib.parse import urljoin
|
8
|
+
import re
|
7
9
|
|
8
10
|
class PluginBase(ABC):
|
9
11
|
name = "Plugin"
|
@@ -38,8 +40,40 @@ class PluginBase(ABC):
|
|
38
40
|
async def close(self):
|
39
41
|
await self.oturum.aclose()
|
40
42
|
|
41
|
-
def fix_url(self,
|
42
|
-
if
|
43
|
-
return
|
43
|
+
def fix_url(self, url: str) -> str:
|
44
|
+
if not url:
|
45
|
+
return ""
|
46
|
+
|
47
|
+
if url.startswith("http") or url.startswith("{\""):
|
48
|
+
return url
|
44
49
|
|
45
|
-
|
50
|
+
if url.startswith("//"):
|
51
|
+
return f"https:{url}"
|
52
|
+
|
53
|
+
return urljoin(self.main_url, url)
|
54
|
+
|
55
|
+
@staticmethod
|
56
|
+
def clean_title(title: str) -> str:
|
57
|
+
suffixes = [
|
58
|
+
" izle",
|
59
|
+
" full film",
|
60
|
+
" filmini full",
|
61
|
+
" full türkçe",
|
62
|
+
" alt yazılı",
|
63
|
+
" altyazılı",
|
64
|
+
" tr dublaj",
|
65
|
+
" hd türkçe",
|
66
|
+
" türkçe dublaj",
|
67
|
+
" yeşilçam ",
|
68
|
+
" erotik fil",
|
69
|
+
" türkçe",
|
70
|
+
" yerli",
|
71
|
+
" tüekçe dublaj",
|
72
|
+
]
|
73
|
+
|
74
|
+
cleaned_title = title.strip()
|
75
|
+
|
76
|
+
for suffix in suffixes:
|
77
|
+
cleaned_title = re.sub(f"{re.escape(suffix)}.*$", "", cleaned_title, flags=re.IGNORECASE).strip()
|
78
|
+
|
79
|
+
return cleaned_title
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
import re
|
5
|
+
|
6
|
+
class PixelDrain(ExtractorBase):
|
7
|
+
name = "PixelDrain"
|
8
|
+
main_url = "https://pixeldrain.com"
|
9
|
+
|
10
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
11
|
+
if referer:
|
12
|
+
self.oturum.headers.update({"Referer": referer})
|
13
|
+
|
14
|
+
pixel_id_match = re.search(r"/u/([^/?]+)|([^\/]+)(?=\?download)", url)
|
15
|
+
if not pixel_id_match:
|
16
|
+
raise ValueError("PixelDrain bağlantısından ID çıkarılamadı.")
|
17
|
+
|
18
|
+
pixel_id = pixel_id_match.group(1)
|
19
|
+
download_link = f"{self.main_url}/api/file/{pixel_id}?download"
|
20
|
+
referer_link = f"{self.main_url}/u/{pixel_id}?download"
|
21
|
+
|
22
|
+
await self.close()
|
23
|
+
return ExtractResult(
|
24
|
+
name = f"{self.name} - {pixel_id}",
|
25
|
+
url = download_link,
|
26
|
+
referer = referer_link,
|
27
|
+
subtitles = []
|
28
|
+
)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
import re
|
5
|
+
|
6
|
+
class SibNet(ExtractorBase):
|
7
|
+
name = "SibNet"
|
8
|
+
main_url = "https://video.sibnet.ru"
|
9
|
+
|
10
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
11
|
+
if referer:
|
12
|
+
self.oturum.headers.update({"Referer": referer})
|
13
|
+
|
14
|
+
response = await self.oturum.get(url)
|
15
|
+
response.raise_for_status()
|
16
|
+
|
17
|
+
match = re.search(r'player\.src\(\[\{src: \"([^\"]+)\"', response.text)
|
18
|
+
if not match:
|
19
|
+
raise ValueError("m3u bağlantısı bulunamadı.")
|
20
|
+
|
21
|
+
m3u_link = f"{self.main_url}{match.group(1)}"
|
22
|
+
|
23
|
+
await self.close()
|
24
|
+
return ExtractResult(
|
25
|
+
name = self.name,
|
26
|
+
url = m3u_link,
|
27
|
+
referer = url,
|
28
|
+
subtitles = []
|
29
|
+
)
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
import re
|
5
|
+
import json
|
6
|
+
|
7
|
+
class Sobreatsesuyp(ExtractorBase):
|
8
|
+
name = "Sobreatsesuyp"
|
9
|
+
main_url = "https://sobreatsesuyp.com"
|
10
|
+
|
11
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
12
|
+
if referer:
|
13
|
+
self.oturum.headers.update({"Referer": referer})
|
14
|
+
|
15
|
+
istek = await self.oturum.get(url)
|
16
|
+
istek.raise_for_status()
|
17
|
+
|
18
|
+
file_match = re.search(r'file\":\"([^\"]+)', istek.text)
|
19
|
+
if not file_match:
|
20
|
+
raise ValueError("File not found in response.")
|
21
|
+
|
22
|
+
file_path = file_match.group(1).replace("\\", "")
|
23
|
+
post_link = f"{self.main_url}/{file_path}"
|
24
|
+
|
25
|
+
post_istek = await self.oturum.post(post_link)
|
26
|
+
post_istek.raise_for_status()
|
27
|
+
|
28
|
+
try:
|
29
|
+
post_json = json.loads(post_istek.text)
|
30
|
+
except json.JSONDecodeError:
|
31
|
+
raise ValueError("Failed to parse JSON response.")
|
32
|
+
|
33
|
+
video_data_list = post_json[1:] if isinstance(post_json, list) else []
|
34
|
+
|
35
|
+
all_results = []
|
36
|
+
|
37
|
+
for item in video_data_list:
|
38
|
+
title = item.get("title")
|
39
|
+
file = item.get("file")
|
40
|
+
|
41
|
+
if not title or not file:
|
42
|
+
continue
|
43
|
+
|
44
|
+
playlist_url = f"{self.main_url}/playlist/{file.lstrip('/')}.txt"
|
45
|
+
playlist_request = await self.oturum.post(playlist_url, headers={"Referer": referer or self.main_url})
|
46
|
+
playlist_request.raise_for_status()
|
47
|
+
|
48
|
+
all_results.append(
|
49
|
+
ExtractResult(
|
50
|
+
name = f"{self.name} - {title}",
|
51
|
+
url = playlist_request.text,
|
52
|
+
referer = self.main_url,
|
53
|
+
subtitles = []
|
54
|
+
)
|
55
|
+
)
|
56
|
+
|
57
|
+
if not all_results:
|
58
|
+
raise ValueError("No videos found in response.")
|
59
|
+
|
60
|
+
return all_results
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
import re
|
5
|
+
import json
|
6
|
+
|
7
|
+
class TRsTX(ExtractorBase):
|
8
|
+
name = "TRsTX"
|
9
|
+
main_url = "https://trstx.org"
|
10
|
+
|
11
|
+
async def extract(self, url, referer=None) -> list[ExtractResult]:
|
12
|
+
if referer:
|
13
|
+
self.oturum.headers.update({"Referer": referer})
|
14
|
+
|
15
|
+
istek = await self.oturum.get(url)
|
16
|
+
istek.raise_for_status()
|
17
|
+
|
18
|
+
file_match = re.search(r'file\":\"([^\"]+)', istek.text)
|
19
|
+
if not file_match:
|
20
|
+
raise ValueError("File not found in response.")
|
21
|
+
|
22
|
+
file_path = file_match.group(1).replace("\\", "")
|
23
|
+
post_link = f"{self.main_url}/{file_path}"
|
24
|
+
|
25
|
+
post_istek = await self.oturum.post(post_link)
|
26
|
+
post_istek.raise_for_status()
|
27
|
+
|
28
|
+
try:
|
29
|
+
post_json = json.loads(post_istek.text)
|
30
|
+
except json.JSONDecodeError:
|
31
|
+
raise ValueError("Failed to parse JSON response.")
|
32
|
+
|
33
|
+
video_data_list = post_json[1:] if isinstance(post_json, list) else []
|
34
|
+
|
35
|
+
video_links = set()
|
36
|
+
all_results = []
|
37
|
+
|
38
|
+
for item in video_data_list:
|
39
|
+
title = item.get("title")
|
40
|
+
file = item.get("file")
|
41
|
+
|
42
|
+
if not title or not file:
|
43
|
+
continue
|
44
|
+
|
45
|
+
playlist_url = f"{self.main_url}/playlist/{file.lstrip('/')}.txt"
|
46
|
+
playlist_request = await self.oturum.post(playlist_url, headers={"Referer": referer or self.main_url})
|
47
|
+
playlist_request.raise_for_status()
|
48
|
+
|
49
|
+
video_data = playlist_request.text
|
50
|
+
|
51
|
+
if video_data in video_links:
|
52
|
+
continue
|
53
|
+
|
54
|
+
video_links.add(video_data)
|
55
|
+
|
56
|
+
all_results.append(
|
57
|
+
ExtractResult(
|
58
|
+
name = f"{self.name} - {title}",
|
59
|
+
url = video_data,
|
60
|
+
referer = self.main_url,
|
61
|
+
subtitles = []
|
62
|
+
)
|
63
|
+
)
|
64
|
+
|
65
|
+
if not all_results:
|
66
|
+
raise ValueError("No videos found in response.")
|
67
|
+
|
68
|
+
return all_results
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
|
5
|
+
class TauVideo(ExtractorBase):
|
6
|
+
name = "TauVideo"
|
7
|
+
main_url = "https://tau-video.xyz"
|
8
|
+
|
9
|
+
async def extract(self, url, referer=None) -> list[ExtractResult]:
|
10
|
+
if referer:
|
11
|
+
self.oturum.headers.update({"Referer": referer})
|
12
|
+
|
13
|
+
video_key = url.split("/")[-1]
|
14
|
+
api_url = f"{self.main_url}/api/video/{video_key}"
|
15
|
+
|
16
|
+
response = await self.oturum.get(api_url)
|
17
|
+
response.raise_for_status()
|
18
|
+
|
19
|
+
api_data = response.json()
|
20
|
+
|
21
|
+
if "urls" not in api_data:
|
22
|
+
raise ValueError("API yanıtında 'urls' bulunamadı.")
|
23
|
+
|
24
|
+
results = []
|
25
|
+
for video in api_data["urls"]:
|
26
|
+
results.append(ExtractResult(
|
27
|
+
name = f"{self.name} - {video['label']}",
|
28
|
+
url = video["url"],
|
29
|
+
referer = referer or self.main_url,
|
30
|
+
subtitles = []
|
31
|
+
))
|
32
|
+
|
33
|
+
return results
|
@@ -21,7 +21,7 @@ class ExtractorManager:
|
|
21
21
|
for extractor_cls in self.extractors:
|
22
22
|
extractor:ExtractorBase = extractor_cls()
|
23
23
|
if extractor.can_handle_url(link):
|
24
|
-
mapping[link] = extractor.name
|
24
|
+
mapping[link] = f"{extractor.name:<30} » {link.replace(extractor.main_url, '')}"
|
25
25
|
break
|
26
26
|
|
27
27
|
return mapping
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import PluginBase, SearchResult, MovieInfo
|
4
|
+
from parsel import Selector
|
5
|
+
|
6
|
+
class JetFilmizle(PluginBase):
|
7
|
+
name = "JetFilmizle"
|
8
|
+
main_url = "https://jetfilmizle.media"
|
9
|
+
|
10
|
+
async def search(self, query: str) -> list[SearchResult]:
|
11
|
+
istek = await self.oturum.post(
|
12
|
+
url = f"{self.main_url}/filmara.php",
|
13
|
+
data = {"s": query},
|
14
|
+
headers = {"Referer": f"{self.main_url}/"}
|
15
|
+
)
|
16
|
+
secici = Selector(istek.text)
|
17
|
+
|
18
|
+
results = []
|
19
|
+
for article in secici.css("article.movie"):
|
20
|
+
title = self.clean_title(article.css("h2 a::text, h3 a::text, h4 a::text, h5 a::text, h6 a::text").get())
|
21
|
+
href = article.css("a::attr(href)").get()
|
22
|
+
poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
|
23
|
+
|
24
|
+
if title and href:
|
25
|
+
results.append(
|
26
|
+
SearchResult(
|
27
|
+
title = title.strip(),
|
28
|
+
url = self.fix_url(href.strip()),
|
29
|
+
poster = self.fix_url(poster.strip()) if poster else None,
|
30
|
+
)
|
31
|
+
)
|
32
|
+
|
33
|
+
return results
|
34
|
+
|
35
|
+
async def load_item(self, url: str) -> MovieInfo:
|
36
|
+
istek = await self.oturum.get(url)
|
37
|
+
secici = Selector(istek.text)
|
38
|
+
|
39
|
+
title = self.clean_title(secici.css("div.movie-exp-title::text").get())
|
40
|
+
poster = secici.css("section.movie-exp img::attr(data-src), section.movie-exp img::attr(src)").get().strip()
|
41
|
+
description = secici.css("section.movie-exp p.aciklama::text").get().strip()
|
42
|
+
tags = secici.css("section.movie-exp div.catss a::text").getall()
|
43
|
+
rating = secici.css("section.movie-exp div.imdb_puan span::text").get().strip()
|
44
|
+
year = secici.xpath("//div[@class='yap' and (contains(., 'Vizyon') or contains(., 'Yapım'))]/text()").get().strip()
|
45
|
+
actors = secici.css("div[itemprop='actor'] a span::text").getall()
|
46
|
+
|
47
|
+
return MovieInfo(
|
48
|
+
url = url,
|
49
|
+
poster = self.fix_url(poster),
|
50
|
+
title = title,
|
51
|
+
description = description,
|
52
|
+
tags = tags,
|
53
|
+
rating = rating,
|
54
|
+
year = year,
|
55
|
+
actors = actors
|
56
|
+
)
|
57
|
+
|
58
|
+
async def load_links(self, url: str) -> list[str]:
|
59
|
+
istek = await self.oturum.get(url)
|
60
|
+
secici = Selector(istek.text)
|
61
|
+
|
62
|
+
iframes = []
|
63
|
+
main_iframe = secici.css("div#movie iframe::attr(data-src), div#movie iframe::attr(data), div#movie iframe::attr(src)").get()
|
64
|
+
if main_iframe:
|
65
|
+
iframes.append(self.fix_url(main_iframe))
|
66
|
+
|
67
|
+
for part in secici.css("div.film_part a"):
|
68
|
+
part_href = part.attrib.get("href")
|
69
|
+
if not part_href:
|
70
|
+
continue
|
71
|
+
|
72
|
+
part_istek = await self.oturum.get(part_href)
|
73
|
+
part_secici = Selector(part_istek.text)
|
74
|
+
|
75
|
+
iframe = part_secici.css("div#movie iframe::attr(data-src), div#movie iframe::attr(data), div#movie iframe::attr(src)").get()
|
76
|
+
if iframe:
|
77
|
+
iframes.append(self.fix_url(iframe))
|
78
|
+
else:
|
79
|
+
for link in part_secici.css("div#movie p a"):
|
80
|
+
download_link = link.attrib.get("href")
|
81
|
+
if download_link:
|
82
|
+
iframes.append(self.fix_url(download_link))
|
83
|
+
|
84
|
+
processed_iframes = []
|
85
|
+
for iframe in iframes:
|
86
|
+
if "jetv.xyz" in iframe:
|
87
|
+
jetv_istek = await self.oturum.get(iframe)
|
88
|
+
jetv_secici = Selector(jetv_istek.text)
|
89
|
+
|
90
|
+
jetv_iframe = jetv_secici.css("iframe::attr(src)").get()
|
91
|
+
if jetv_iframe:
|
92
|
+
processed_iframes.append(self.fix_url(jetv_iframe))
|
93
|
+
else:
|
94
|
+
processed_iframes.append(iframe)
|
95
|
+
|
96
|
+
return processed_iframes
|
KekikStream/__init__.py
CHANGED
@@ -27,7 +27,7 @@ class KekikStream:
|
|
27
27
|
|
28
28
|
async def select_plugin(self):
|
29
29
|
plugin_name = await self.ui_manager.select_from_fuzzy(
|
30
|
-
message = "
|
30
|
+
message = "Arama yapılacak eklentiyi seçin:",
|
31
31
|
choices = ["Tüm Eklentilerde Ara", *self.plugin_manager.get_plugin_names()]
|
32
32
|
)
|
33
33
|
|
@@ -70,7 +70,7 @@ class KekikStream:
|
|
70
70
|
|
71
71
|
async def select_result(self, results):
|
72
72
|
selected_url = await self.ui_manager.select_from_fuzzy(
|
73
|
-
message = "
|
73
|
+
message = "İçerik sonuçlarından birini seçin:",
|
74
74
|
choices = [{"name": res.title, "value": res.url} for res in results]
|
75
75
|
)
|
76
76
|
|
@@ -99,10 +99,10 @@ class KekikStream:
|
|
99
99
|
|
100
100
|
if isinstance(media_info, SeriesInfo):
|
101
101
|
selected_episode = await self.ui_manager.select_from_fuzzy(
|
102
|
-
message="
|
103
|
-
choices=[
|
102
|
+
message = "İzlemek istediğiniz bölümü seçin:",
|
103
|
+
choices = [
|
104
104
|
{"name": f"{episode.season}. Sezon {episode.episode}. Bölüm - {episode.title}", "value": episode.url}
|
105
|
-
|
105
|
+
for episode in media_info.episodes
|
106
106
|
]
|
107
107
|
)
|
108
108
|
if selected_episode:
|
@@ -124,7 +124,7 @@ class KekikStream:
|
|
124
124
|
|
125
125
|
if not mapping:
|
126
126
|
selected_link = await self.ui_manager.select_from_list(
|
127
|
-
message = "Doğrudan bir bağlantı seçin:",
|
127
|
+
message = "Doğrudan oynatmak için bir bağlantı seçin:",
|
128
128
|
choices = [{"name": self.current_plugin.name, "value": link} for link in links]
|
129
129
|
)
|
130
130
|
if selected_link:
|
@@ -139,7 +139,7 @@ class KekikStream:
|
|
139
139
|
match action:
|
140
140
|
case "İzle":
|
141
141
|
selected_link = await self.ui_manager.select_from_list(
|
142
|
-
message = "
|
142
|
+
message = "İzlemek için bir bağlantı seçin:",
|
143
143
|
choices = [{"name": extractor_name, "value": link} for link, extractor_name in mapping.items()]
|
144
144
|
)
|
145
145
|
if selected_link:
|
@@ -161,18 +161,27 @@ class KekikStream:
|
|
161
161
|
)
|
162
162
|
return
|
163
163
|
|
164
|
-
extractor:ExtractorBase = self.extractor_manager.find_extractor(selected_link)
|
164
|
+
extractor: ExtractorBase = self.extractor_manager.find_extractor(selected_link)
|
165
165
|
if not extractor:
|
166
166
|
konsol.print("[bold red]Uygun Extractor bulunamadı.[/bold red]")
|
167
167
|
return
|
168
168
|
|
169
169
|
extract_data = await extractor.extract(selected_link, referer=self.current_plugin.main_url)
|
170
|
-
if extract_data.headers.get("Cookie"):
|
171
|
-
self.media_manager.set_headers({"Cookie": extract_data.headers.get("Cookie")})
|
172
170
|
|
173
|
-
|
174
|
-
|
175
|
-
|
171
|
+
if isinstance(extract_data, list):
|
172
|
+
selected_data = await self.ui_manager.select_from_list(
|
173
|
+
message = "Birden fazla bağlantı bulundu, lütfen birini seçin:",
|
174
|
+
choices = [{"name": data.name, "value": data} for data in extract_data]
|
175
|
+
)
|
176
|
+
else:
|
177
|
+
selected_data = extract_data
|
178
|
+
|
179
|
+
if selected_data.headers.get("Cookie"):
|
180
|
+
self.media_manager.set_headers({"Cookie": selected_data.headers.get("Cookie")})
|
181
|
+
|
182
|
+
self.media_manager.set_title(f"{self.media_manager.get_title()} | {selected_data.name}")
|
183
|
+
self.media_manager.set_headers({"Referer": selected_data.referer})
|
184
|
+
self.media_manager.play_media(selected_data)
|
176
185
|
|
177
186
|
async def search_all_plugins(self, query: str):
|
178
187
|
all_results = []
|
@@ -201,11 +210,11 @@ class KekikStream:
|
|
201
210
|
async def select_from_all_results(self, results):
|
202
211
|
choices = [
|
203
212
|
{"name": f"[{res['plugin']}] {res['title']}", "value": res}
|
204
|
-
|
213
|
+
for res in results
|
205
214
|
]
|
206
215
|
|
207
216
|
selected_result = await self.ui_manager.select_from_fuzzy(
|
208
|
-
message = "
|
217
|
+
message = "Arama sonuçlarından bir içerik seçin:",
|
209
218
|
choices = choices
|
210
219
|
)
|
211
220
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.8
|
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,4 +1,4 @@
|
|
1
|
-
KekikStream/__init__.py,sha256=
|
1
|
+
KekikStream/__init__.py,sha256=NE4oTbIL42S9IUdjKgh9rIgKsL2D-MRkMB5xmoLlH_c,9347
|
2
2
|
KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
|
3
3
|
KekikStream/requirements.txt,sha256=Kh3E0NzIkAmhVODtIwRVffVOHLiElO6Ua9kIgjbocPE,57
|
4
4
|
KekikStream/CLI/__init__.py,sha256=9YlF135BVff85y492hX4sq2WY2CNqa4BuVzF9hIIaKE,233
|
@@ -7,27 +7,33 @@ KekikStream/Core/ExtractorBase.py,sha256=SPXKZPfpzvgkJeMds-USzgpm8-qb0vgZjjLDs58
|
|
7
7
|
KekikStream/Core/ExtractorLoader.py,sha256=JovJJr6Clk3xpbRLlh7v_XOl3FGwVXCjTZivec1FktI,2533
|
8
8
|
KekikStream/Core/ExtractorModels.py,sha256=vJeh4qd05K7nbqdCCGU29UkGQpce6jXfsCm7LuDL1G8,454
|
9
9
|
KekikStream/Core/MediaHandler.py,sha256=Q_9LMc4Wnmv8PhMfoo2IgxpHLeikUgrqp_B_Rfs217U,3005
|
10
|
-
KekikStream/Core/PluginBase.py,sha256=
|
10
|
+
KekikStream/Core/PluginBase.py,sha256=MmhGy0XtbkWxE5SNvsag0M_jNehMxPGtVyZFOKlJPM8,2304
|
11
11
|
KekikStream/Core/PluginLoader.py,sha256=og5EPfnVqrb2kUkeGU65AY0fU43IbiUo_h3ix6ZiINY,2596
|
12
12
|
KekikStream/Core/PluginModels.py,sha256=-V4Be9ebnUQsQtGzLxg0kGK13RJTmpB7bvAUwsE-ir0,2208
|
13
13
|
KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
|
14
14
|
KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
|
15
15
|
KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
|
16
|
+
KekikStream/Extractors/PixelDrain.py,sha256=JLNaTdFJfXj5ExB_OjjyjwBZBD_gCOmL3fO_TWbHe90,998
|
16
17
|
KekikStream/Extractors/RapidVid.py,sha256=HmSXDWhE1EXZRhNCxrqqEBbyJKbqFtTFRtq-zYg3G2c,2430
|
18
|
+
KekikStream/Extractors/SibNet.py,sha256=w0Rv1cYB_Ho6M9Aho9n38Thp6mAfKPNe-eKFC_DbGuE,884
|
19
|
+
KekikStream/Extractors/Sobreatsesuyp.py,sha256=7JUbqHLMWFkHuzH3NG2ogaV53e9fUmGvAr7h83yRtxs,1953
|
20
|
+
KekikStream/Extractors/TRsTX.py,sha256=jhPcQq7KPxL0SPvEFL4MG7oDXDpBbt6Qh8vRJ_bLQMU,2105
|
21
|
+
KekikStream/Extractors/TauVideo.py,sha256=bBjrZFSi4QqSJhRB0sDWMA0Saio-zpoAb6Ss4QZmBeY,1045
|
17
22
|
KekikStream/Extractors/TurboImgz.py,sha256=0d9t6bj4prVt1_LIbzwcfuqrSRB7SMvc4RKvE25BtW4,851
|
18
23
|
KekikStream/Extractors/VidMoxy.py,sha256=UnVrCEI4XNiONE2aLV9dGUhRqQ9ELJTnYVXyG81N11A,1800
|
19
|
-
KekikStream/Managers/ExtractorManager.py,sha256=
|
24
|
+
KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
|
20
25
|
KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
|
21
26
|
KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
|
22
27
|
KekikStream/Managers/UIManager.py,sha256=PmGabWjHACnaOZLyIfOd0j4cfqpuV34RO58QeeIbF6E,1590
|
23
28
|
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
24
29
|
KekikStream/Plugins/FilmMakinesi.py,sha256=g4LRDP5Atn97PqbgnEdm0-wjVdXaJIVk1Ru0F8B66Ws,2902
|
25
30
|
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
|
31
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
|
26
32
|
KekikStream/Plugins/SineWix.py,sha256=RJxggTrZxBimQHI4ehtJipVeIBpfHy85NW-ixE2iF2k,4762
|
27
33
|
KekikStream/Plugins/UgurFilm.py,sha256=U7ryNWpjSZJWuYlMGX1Be9uuyiM3SfuI9VJcEiXedNs,2960
|
28
|
-
KekikStream-0.1.
|
29
|
-
KekikStream-0.1.
|
30
|
-
KekikStream-0.1.
|
31
|
-
KekikStream-0.1.
|
32
|
-
KekikStream-0.1.
|
33
|
-
KekikStream-0.1.
|
34
|
+
KekikStream-0.1.8.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
35
|
+
KekikStream-0.1.8.dist-info/METADATA,sha256=x9zouqWIPAlgPfpKwsqczRyIbquHJG6wM3ybNRqEgV8,3961
|
36
|
+
KekikStream-0.1.8.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
37
|
+
KekikStream-0.1.8.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
38
|
+
KekikStream-0.1.8.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
39
|
+
KekikStream-0.1.8.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|