KekikStream 0.0.2__py3-none-any.whl → 0.0.4__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/ExtractorBase.py +14 -1
- KekikStream/Core/MediaHandler.py +5 -1
- KekikStream/Extractors/CloseLoad.py +8 -6
- KekikStream/Extractors/MailRu.py +28 -26
- KekikStream/Extractors/VidMoxy.py +35 -0
- KekikStream/Plugins/FilmMakinesi.py +16 -16
- KekikStream/Plugins/FullHDFilmizlesene.py +77 -0
- KekikStream/Plugins/UgurFilm.py +18 -18
- KekikStream/__init__.py +11 -1
- {KekikStream-0.0.2.dist-info → KekikStream-0.0.4.dist-info}/METADATA +2 -2
- {KekikStream-0.0.2.dist-info → KekikStream-0.0.4.dist-info}/RECORD +15 -13
- {KekikStream-0.0.2.dist-info → KekikStream-0.0.4.dist-info}/LICENSE +0 -0
- {KekikStream-0.0.2.dist-info → KekikStream-0.0.4.dist-info}/WHEEL +0 -0
- {KekikStream-0.0.2.dist-info → KekikStream-0.0.4.dist-info}/entry_points.txt +0 -0
- {KekikStream-0.0.2.dist-info → KekikStream-0.0.4.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,7 @@
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
2
|
|
3
3
|
from abc import ABC, abstractmethod
|
4
|
+
from httpx import AsyncClient, Timeout
|
4
5
|
from typing import Optional
|
5
6
|
from .ExtractorModels import ExtractResult
|
6
7
|
|
@@ -8,6 +9,15 @@ class ExtractorBase(ABC):
|
|
8
9
|
name = "Extractor"
|
9
10
|
main_url = ""
|
10
11
|
|
12
|
+
def __init__(self):
|
13
|
+
self.oturum = AsyncClient(
|
14
|
+
headers = {
|
15
|
+
"User-Agent" : "keyiflerolsun/KekikStream",
|
16
|
+
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
17
|
+
},
|
18
|
+
timeout = Timeout(10.0),
|
19
|
+
)
|
20
|
+
|
11
21
|
def can_handle_url(self, url: str) -> bool:
|
12
22
|
"""URL'nin bu extractor tarafından işlenip işlenemeyeceğini kontrol eder."""
|
13
23
|
return self.main_url in url
|
@@ -15,4 +25,7 @@ class ExtractorBase(ABC):
|
|
15
25
|
@abstractmethod
|
16
26
|
async def extract(self, url: str, referer: Optional[str] = None) -> ExtractResult:
|
17
27
|
"""Bir URL'den medya bilgilerini çıkarır."""
|
18
|
-
pass
|
28
|
+
pass
|
29
|
+
|
30
|
+
async def close(self):
|
31
|
+
await self.oturum.aclose()
|
KekikStream/Core/MediaHandler.py
CHANGED
@@ -31,8 +31,10 @@ class MediaHandler:
|
|
31
31
|
subprocess.run(vlc_command, check=True)
|
32
32
|
except subprocess.CalledProcessError as e:
|
33
33
|
konsol.print(f"[red]VLC oynatma hatası: {e}[/red]")
|
34
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
34
35
|
except FileNotFoundError:
|
35
36
|
konsol.print("[red]VLC bulunamadı! VLC kurulu olduğundan emin olun.[/red]")
|
37
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
36
38
|
|
37
39
|
def play_with_mpv(self, extract_data: ExtractResult):
|
38
40
|
try:
|
@@ -54,5 +56,7 @@ class MediaHandler:
|
|
54
56
|
subprocess.run(mpv_command, check=True)
|
55
57
|
except subprocess.CalledProcessError as e:
|
56
58
|
konsol.print(f"[red]mpv oynatma hatası: {e}[/red]")
|
59
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
57
60
|
except FileNotFoundError:
|
58
|
-
konsol.print("[red]mpv bulunamadı! mpv kurulu olduğundan emin olun.[/red]")
|
61
|
+
konsol.print("[red]mpv bulunamadı! mpv kurulu olduğundan emin olun.[/red]")
|
62
|
+
konsol.print({"title": self.title, "url": extract_data.url, "headers": self.headers})
|
@@ -10,18 +10,20 @@ class CloseLoadExtractor(ExtractorBase):
|
|
10
10
|
main_url = "https://closeload.filmmakinesi.de"
|
11
11
|
|
12
12
|
async def extract(self, url, referer=None) -> ExtractResult:
|
13
|
-
|
14
|
-
|
15
|
-
response = await client.get(url, headers={"Referer": referer} if referer else {})
|
16
|
-
response.raise_for_status()
|
13
|
+
if referer:
|
14
|
+
self.oturum.headers.update({"Referer": referer})
|
17
15
|
|
18
|
-
|
19
|
-
|
16
|
+
istek = await self.oturum.get(url)
|
17
|
+
istek.raise_for_status()
|
18
|
+
|
19
|
+
secici = Selector(istek.text)
|
20
|
+
atob = secici.re(r"aHR0[0-9a-zA-Z+/=]*")
|
20
21
|
if not atob:
|
21
22
|
raise ValueError("Base64 kodu bulunamadı.")
|
22
23
|
|
23
24
|
m3u_link = b64decode(f"{atob[0]}===").decode("utf-8")
|
24
25
|
|
26
|
+
await self.close()
|
25
27
|
return ExtractResult(
|
26
28
|
name = self.name,
|
27
29
|
url = m3u_link,
|
KekikStream/Extractors/MailRu.py
CHANGED
@@ -9,32 +9,34 @@ class MailRuExtractor(ExtractorBase):
|
|
9
9
|
main_url = "https://my.mail.ru"
|
10
10
|
|
11
11
|
async def extract(self, url, referer=None) -> ExtractResult:
|
12
|
-
"""Mail.Ru URL'sinden medya bilgilerini çıkarır."""
|
13
12
|
vid_id = url.split("video/embed/")[-1].strip()
|
14
13
|
video_meta_url = f"{self.main_url}/+/video/meta/{vid_id}"
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
15
|
+
if referer:
|
16
|
+
self.oturum.headers.update({"Referer": referer})
|
17
|
+
|
18
|
+
istek = await self.oturum.get(video_meta_url)
|
19
|
+
istek.raise_for_status()
|
20
|
+
|
21
|
+
video_key = istek.cookies.get("video_key")
|
22
|
+
if not video_key:
|
23
|
+
raise ValueError("Video key bulunamadı.")
|
24
|
+
|
25
|
+
video_data = istek.json()
|
26
|
+
videos = video_data.get("videos", [])
|
27
|
+
if not videos:
|
28
|
+
raise ValueError("Videolar bulunamadı.")
|
29
|
+
|
30
|
+
video = videos[0]
|
31
|
+
video_url = video["url"]
|
32
|
+
if video_url.startswith("//"):
|
33
|
+
video_url = f"https:{video_url}"
|
34
|
+
|
35
|
+
await self.close()
|
36
|
+
return ExtractResult(
|
37
|
+
name = self.name,
|
38
|
+
url = video_url,
|
39
|
+
referer = self.main_url,
|
40
|
+
subtitles = [],
|
41
|
+
headers = {"Cookie": f"video_key={video_key}"}
|
42
|
+
)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
4
|
+
from httpx import AsyncClient
|
5
|
+
from Kekik.Sifreleme import Packer, HexCodec
|
6
|
+
import re
|
7
|
+
|
8
|
+
class VidMoxy(ExtractorBase):
|
9
|
+
name = "VidMoxy"
|
10
|
+
main_url = "https://vidmoxy.com"
|
11
|
+
|
12
|
+
async def extract(self, url, referer=None) -> ExtractResult:
|
13
|
+
self.oturum.headers.update({"User-Agent":"Mozilla/5.0"})
|
14
|
+
if referer:
|
15
|
+
self.oturum.headers.update({"Referer": referer})
|
16
|
+
|
17
|
+
istek = await self.oturum.get(url)
|
18
|
+
istek.raise_for_status()
|
19
|
+
|
20
|
+
try:
|
21
|
+
escaped_hex = re.findall(r'file": "(.*)",', istek.text)[0]
|
22
|
+
except Exception:
|
23
|
+
eval_jwsetup = re.compile(r'\};\s*(eval\(function[\s\S]*?)var played = \d+;').findall(istek.text)[0]
|
24
|
+
jwsetup = Packer.unpack(Packer.unpack(eval_jwsetup))
|
25
|
+
escaped_hex = re.findall(r'file":"(.*)","label', jwsetup)[0]
|
26
|
+
|
27
|
+
m3u_link = HexCodec.decode(escaped_hex)
|
28
|
+
|
29
|
+
await self.close()
|
30
|
+
return ExtractResult(
|
31
|
+
name = self.name,
|
32
|
+
url = m3u_link,
|
33
|
+
referer = self.main_url,
|
34
|
+
subtitles = []
|
35
|
+
)
|
@@ -8,11 +8,11 @@ class FilmMakinesi(PluginBase):
|
|
8
8
|
main_url = "https://filmmakinesi.de"
|
9
9
|
|
10
10
|
async def search(self, query: str) -> list[SearchResult]:
|
11
|
-
|
12
|
-
|
11
|
+
istek = await self.oturum.get(f"{self.main_url}/?s={query}")
|
12
|
+
secici = Selector(istek.text)
|
13
13
|
|
14
14
|
results = []
|
15
|
-
for article in
|
15
|
+
for article in secici.css("section#film_posts article"):
|
16
16
|
title = article.css("h6 a::text").get()
|
17
17
|
href = article.css("h6 a::attr(href)").get()
|
18
18
|
poster = article.css("img::attr(data-src)").get() or article.css("img::attr(src)").get()
|
@@ -29,17 +29,17 @@ class FilmMakinesi(PluginBase):
|
|
29
29
|
return results
|
30
30
|
|
31
31
|
async def load_item(self, url: str) -> MovieInfo:
|
32
|
-
|
33
|
-
|
32
|
+
istek = await self.oturum.get(url)
|
33
|
+
secici = Selector(istek.text)
|
34
34
|
|
35
|
-
title =
|
36
|
-
poster =
|
37
|
-
description =
|
38
|
-
tags =
|
39
|
-
rating =
|
40
|
-
year =
|
41
|
-
actors =
|
42
|
-
duration =
|
35
|
+
title = secici.css("h1.single_h1 a::text").get(default="").strip()
|
36
|
+
poster = secici.css("[property='og:image']::attr(content)").get(default="").strip()
|
37
|
+
description = secici.css("section#film_single article p:last-of-type::text").get(default="").strip()
|
38
|
+
tags = secici.css("dt:contains('Tür:') + dd a::text").get(default="").strip()
|
39
|
+
rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get(default="").strip()
|
40
|
+
year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get(default="").strip()
|
41
|
+
actors = secici.css("dt:contains('Oyuncular:') + dd::text").get(default="").strip()
|
42
|
+
duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get(default="").strip()
|
43
43
|
|
44
44
|
duration_minutes = 0
|
45
45
|
if duration and duration.startswith("PT") and duration.endswith("M"):
|
@@ -58,8 +58,8 @@ class FilmMakinesi(PluginBase):
|
|
58
58
|
)
|
59
59
|
|
60
60
|
async def load_links(self, url: str) -> list[str]:
|
61
|
-
|
62
|
-
|
61
|
+
istek = await self.oturum.get(url)
|
62
|
+
secici = Selector(istek.text)
|
63
63
|
|
64
|
-
iframe_src =
|
64
|
+
iframe_src = secici.css("div.player-div iframe::attr(src)").get() or secici.css("div.player-div iframe::attr(data-src)").get()
|
65
65
|
return [self.fix_url(iframe_src)] if iframe_src else []
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
2
|
+
|
3
|
+
from KekikStream.CLI import konsol
|
4
|
+
from KekikStream.Core import PluginBase, SearchResult, MovieInfo
|
5
|
+
from parsel import Selector
|
6
|
+
from Kekik.Sifreleme import StringCodec
|
7
|
+
import json, re
|
8
|
+
|
9
|
+
class FullHDFilmizlesene(PluginBase):
|
10
|
+
name = "FullHDFilmizlesene"
|
11
|
+
main_url = "https://www.fullhdfilmizlesene.de"
|
12
|
+
|
13
|
+
async def search(self, query: str) -> list[SearchResult]:
|
14
|
+
istek = await self.oturum.get(f"{self.main_url}/arama/{query}")
|
15
|
+
secici = Selector(istek.text)
|
16
|
+
|
17
|
+
results = []
|
18
|
+
for film in secici.css("li.film"):
|
19
|
+
title = film.css("span.film-title::text").get()
|
20
|
+
href = film.css("a::attr(href)").get()
|
21
|
+
poster = film.css("img::attr(data-src)").get()
|
22
|
+
|
23
|
+
if title and href:
|
24
|
+
results.append(
|
25
|
+
SearchResult(
|
26
|
+
title = title.strip(),
|
27
|
+
url = self.fix_url(href.strip()),
|
28
|
+
poster = self.fix_url(poster.strip()) if poster else None,
|
29
|
+
)
|
30
|
+
)
|
31
|
+
|
32
|
+
return results
|
33
|
+
|
34
|
+
async def load_item(self, url: str) -> MovieInfo:
|
35
|
+
istek = await self.oturum.get(url)
|
36
|
+
secici = Selector(istek.text)
|
37
|
+
|
38
|
+
title = secici.xpath("normalize-space(//div[@class='izle-titles'])").get().strip()
|
39
|
+
poster = secici.css("div img::attr(data-src)").get().strip()
|
40
|
+
description = secici.css("div.ozet-ic p::text").get().strip()
|
41
|
+
tags = secici.css("a[rel='category tag']::text").getall()
|
42
|
+
rating = secici.xpath("normalize-space(//div[@class='puanx-puan'])").get().split()[-1]
|
43
|
+
year = secici.css("div.dd a.category::text").get().strip().split()[0]
|
44
|
+
actors = secici.css("div.film-info ul li:nth-child(2) a > span::text").getall()
|
45
|
+
duration = secici.css("span.sure::text").get("0 Dakika").split()[0]
|
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
|
+
duration = duration
|
57
|
+
)
|
58
|
+
|
59
|
+
async def load_links(self, url: str) -> list[str]:
|
60
|
+
istek = await self.oturum.get(url)
|
61
|
+
secici = Selector(istek.text)
|
62
|
+
|
63
|
+
script = secici.xpath("(//script)[1]").get()
|
64
|
+
scx_data = json.loads(re.findall(r'scx = (.*?);', script)[0])
|
65
|
+
scx_keys = list(scx_data.keys())
|
66
|
+
|
67
|
+
link_list = []
|
68
|
+
for key in scx_keys:
|
69
|
+
t = scx_data[key]["sx"]["t"]
|
70
|
+
if isinstance(t, list):
|
71
|
+
link_list.extend(StringCodec.decode(elem) for elem in t)
|
72
|
+
if isinstance(t, dict):
|
73
|
+
link_list.extend(StringCodec.decode(v) for k, v in t.items())
|
74
|
+
|
75
|
+
link_list = [f"https:{link}" if link.startswith('//') else link for link in link_list]
|
76
|
+
# konsol.print(link_list)
|
77
|
+
return link_list
|
KekikStream/Plugins/UgurFilm.py
CHANGED
@@ -8,14 +8,14 @@ class UgurFilm(PluginBase):
|
|
8
8
|
main_url = "https://ugurfilm8.com"
|
9
9
|
|
10
10
|
async def search(self, query: str) -> list[SearchResult]:
|
11
|
-
|
12
|
-
|
11
|
+
istek = await self.oturum.get(f"{self.main_url}/?s={query}")
|
12
|
+
secici = Selector(istek.text)
|
13
13
|
|
14
14
|
results = []
|
15
|
-
for
|
16
|
-
title =
|
17
|
-
href =
|
18
|
-
poster =
|
15
|
+
for film in secici.css("div.icerik div"):
|
16
|
+
title = film.css("span:nth-child(1)::text").get()
|
17
|
+
href = film.css("a::attr(href)").get()
|
18
|
+
poster = film.css("img::attr(src)").get()
|
19
19
|
|
20
20
|
if title and href:
|
21
21
|
results.append(
|
@@ -29,15 +29,15 @@ class UgurFilm(PluginBase):
|
|
29
29
|
return results
|
30
30
|
|
31
31
|
async def load_item(self, url: str) -> MovieInfo:
|
32
|
-
|
33
|
-
|
32
|
+
istek = await self.oturum.get(url)
|
33
|
+
secici = Selector(istek.text)
|
34
34
|
|
35
|
-
title =
|
36
|
-
poster =
|
37
|
-
description =
|
38
|
-
tags =
|
39
|
-
year =
|
40
|
-
actors = [actor.css("span::text").get() for actor in
|
35
|
+
title = secici.css("div.bilgi h2::text").get(default="").strip()
|
36
|
+
poster = secici.css("div.resim img::attr(src)").get(default="").strip()
|
37
|
+
description = secici.css("div.slayt-aciklama::text").get(default="").strip()
|
38
|
+
tags = secici.css("p.tur a[href*='/category/']::text").getall()
|
39
|
+
year = secici.css("a[href*='/yil/']::text").re_first(r"\d+")
|
40
|
+
actors = [actor.css("span::text").get() for actor in secici.css("li.oyuncu-k")]
|
41
41
|
|
42
42
|
return MovieInfo(
|
43
43
|
url = self.fix_url(url),
|
@@ -50,11 +50,11 @@ class UgurFilm(PluginBase):
|
|
50
50
|
)
|
51
51
|
|
52
52
|
async def load_links(self, url: str) -> list[str]:
|
53
|
-
|
54
|
-
|
55
|
-
results
|
53
|
+
istek = await self.oturum.get(url)
|
54
|
+
secici = Selector(istek.text)
|
55
|
+
results = []
|
56
56
|
|
57
|
-
for part_link in
|
57
|
+
for part_link in secici.css("li.parttab a::attr(href)").getall():
|
58
58
|
sub_response = await self.oturum.get(part_link)
|
59
59
|
sub_selector = Selector(sub_response.text)
|
60
60
|
|
KekikStream/__init__.py
CHANGED
@@ -57,7 +57,12 @@ class KekikStream:
|
|
57
57
|
await self.show_details(selected_url)
|
58
58
|
|
59
59
|
async def show_details(self, url):
|
60
|
-
|
60
|
+
try:
|
61
|
+
media_info = await self.current_plugin.load_item(url)
|
62
|
+
except Exception as hata:
|
63
|
+
konsol.log(url)
|
64
|
+
hata_yakala(hata)
|
65
|
+
return
|
61
66
|
|
62
67
|
self.media_manager.set_title(f"{self.current_plugin.name} | {media_info.title}")
|
63
68
|
|
@@ -68,6 +73,11 @@ class KekikStream:
|
|
68
73
|
|
69
74
|
async def show_options(self, links):
|
70
75
|
mapping = self.extractor_manager.map_links_to_extractors(links)
|
76
|
+
if not mapping:
|
77
|
+
konsol.print("[bold red]Hiçbir Extractor bulunamadı![/bold red]")
|
78
|
+
konsol.print(links)
|
79
|
+
return
|
80
|
+
|
71
81
|
action = await self.ui_manager.select_from_list(
|
72
82
|
message = "Ne yapmak istersiniz?",
|
73
83
|
choices = ["İzle", "Geri Git", "Ana Menü"]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: KekikStream
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.4
|
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
|
@@ -10,7 +10,7 @@ Keywords: KekikStream,KekikAkademi,keyiflerolsun
|
|
10
10
|
Classifier: Development Status :: 5 - Production/Stable
|
11
11
|
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
13
|
-
Requires-Python: >=3.
|
13
|
+
Requires-Python: >=3.8
|
14
14
|
Description-Content-Type: text/markdown
|
15
15
|
License-File: LICENSE
|
16
16
|
Requires-Dist: setuptools
|
@@ -1,27 +1,29 @@
|
|
1
|
-
KekikStream/__init__.py,sha256=
|
1
|
+
KekikStream/__init__.py,sha256=69FPFbIT8ROAJlc86vyValOhpg-n0lHFRbjO-UpIc0Q,4488
|
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=so-9S3fmNAyHtZYYUTEI1YaUHPiQhVA6U-Q0grACaRg,178
|
5
|
-
KekikStream/Core/ExtractorBase.py,sha256=
|
5
|
+
KekikStream/Core/ExtractorBase.py,sha256=xwERFguGBKo_oznZaeI2d4OKvnVRHCh4AFTby5hBMJ8,1047
|
6
6
|
KekikStream/Core/ExtractorLoader.py,sha256=JovJJr6Clk3xpbRLlh7v_XOl3FGwVXCjTZivec1FktI,2533
|
7
7
|
KekikStream/Core/ExtractorModels.py,sha256=vJeh4qd05K7nbqdCCGU29UkGQpce6jXfsCm7LuDL1G8,454
|
8
|
-
KekikStream/Core/MediaHandler.py,sha256=
|
8
|
+
KekikStream/Core/MediaHandler.py,sha256=2kcRnGPuKhrdLQwbBYHR9fSY0RgHp763Q6QQnt7MWqg,2743
|
9
9
|
KekikStream/Core/PluginBase.py,sha256=HHkfncke3XY-OsFbKGicDAqkbOtBS_dnOaZT77xLCHU,1351
|
10
10
|
KekikStream/Core/PluginLoader.py,sha256=POayKsWOjAuReMbp6_aWbG5lIioQzpQT3u1LQXMqUwY,2574
|
11
11
|
KekikStream/Core/PluginModels.py,sha256=bokfnVqMwVgs65A4tFUM64u4f-xcLAAGPehrfC0TI6g,998
|
12
12
|
KekikStream/Core/__init__.py,sha256=tW3rP6d18BAD54p9QiIzrPBG396tYm2DlUCnmrPAmmI,385
|
13
|
-
KekikStream/Extractors/CloseLoad.py,sha256=
|
14
|
-
KekikStream/Extractors/MailRu.py,sha256
|
13
|
+
KekikStream/Extractors/CloseLoad.py,sha256=weCmuKmvJLjYxJv7mo16gd-br2H9NrRd6TZGPrpqHlI,1031
|
14
|
+
KekikStream/Extractors/MailRu.py,sha256=SWqFSW3TzajgcI_kF4WS1iFGM1ILjpqwVO-OyTllh74,1361
|
15
|
+
KekikStream/Extractors/VidMoxy.py,sha256=OSXrOWKUhhrrIEWl_aEyNRYQRDa8pCric48-tVqM74U,1234
|
15
16
|
KekikStream/Managers/ExtractorManager.py,sha256=4p5VaERx3qIIzvti9gl_khkCWYcVnzUNORmMP-OrQu0,925
|
16
17
|
KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
|
17
18
|
KekikStream/Managers/PluginManager.py,sha256=5O19YNCt4P7a6yVzlDvmxfZLA9SX9LxDs5bqqZ4i1rA,566
|
18
19
|
KekikStream/Managers/UIManager.py,sha256=81ZSGFdf1nKw1NjL-nqwgQTYAgzJqybBWXqWCNQ_JPc,1102
|
19
20
|
KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
|
20
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
21
|
-
KekikStream/Plugins/
|
22
|
-
KekikStream
|
23
|
-
KekikStream-0.0.
|
24
|
-
KekikStream-0.0.
|
25
|
-
KekikStream-0.0.
|
26
|
-
KekikStream-0.0.
|
27
|
-
KekikStream-0.0.
|
21
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=g4LRDP5Atn97PqbgnEdm0-wjVdXaJIVk1Ru0F8B66Ws,2902
|
22
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
|
23
|
+
KekikStream/Plugins/UgurFilm.py,sha256=U7ryNWpjSZJWuYlMGX1Be9uuyiM3SfuI9VJcEiXedNs,2960
|
24
|
+
KekikStream-0.0.4.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
25
|
+
KekikStream-0.0.4.dist-info/METADATA,sha256=y76I6MoAHOjuxcJawhEGwLSbVJ83ulp_6LKl9ZX403I,3685
|
26
|
+
KekikStream-0.0.4.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
27
|
+
KekikStream-0.0.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
28
|
+
KekikStream-0.0.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
29
|
+
KekikStream-0.0.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|