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.
@@ -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()
@@ -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
- """Bir URL'den medya bilgilerini çıkarır."""
14
- async with AsyncClient() as client:
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
- selector = Selector(response.text)
19
- atob = selector.re(r"aHR0[0-9a-zA-Z+/=]*")
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,
@@ -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
- async with AsyncClient() as client:
17
- response = await client.get(video_meta_url, headers={"Referer": url} if referer else {})
18
- response.raise_for_status()
19
-
20
- video_key = response.cookies.get("video_key")
21
- if not video_key:
22
- raise ValueError("Video key bulunamadı.")
23
-
24
- video_data = json.loads(response.text)
25
- videos = video_data.get("videos", [])
26
- if not videos:
27
- raise ValueError("Videolar bulunamadı.")
28
-
29
- video = videos[0]
30
- video_url = video["url"]
31
- if video_url.startswith("//"):
32
- video_url = f"https:{video_url}"
33
-
34
- return ExtractResult(
35
- name = self.name,
36
- url = video_url,
37
- referer = self.main_url,
38
- subtitles = [],
39
- headers = {"Cookie": f"video_key={video_key}"}
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
- response = await self.oturum.get(f"{self.main_url}/?s={query}")
12
- selector = Selector(response.text)
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 selector.css("section#film_posts article"):
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
- response = await self.oturum.get(url)
33
- selector = Selector(response.text)
32
+ istek = await self.oturum.get(url)
33
+ secici = Selector(istek.text)
34
34
 
35
- title = selector.css("h1.single_h1 a::text").get(default="").strip()
36
- poster = selector.css("[property='og:image']::attr(content)").get(default="").strip()
37
- description = selector.css("section#film_single article p:last-of-type::text").get(default="").strip()
38
- tags = selector.css("dt:contains('Tür:') + dd a::text").get(default="").strip()
39
- rating = selector.css("dt:contains('IMDB Puanı:') + dd::text").get(default="").strip()
40
- year = selector.css("dt:contains('Yapım Yılı:') + dd a::text").get(default="").strip()
41
- actors = selector.css("dt:contains('Oyuncular:') + dd::text").get(default="").strip()
42
- duration = selector.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get(default="").strip()
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
- response = await self.oturum.get(url)
62
- selector = Selector(response.text)
61
+ istek = await self.oturum.get(url)
62
+ secici = Selector(istek.text)
63
63
 
64
- iframe_src = selector.css("div.player-div iframe::attr(src)").get() or selector.css("div.player-div iframe::attr(data-src)").get()
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
@@ -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
- response = await self.oturum.get(f"{self.main_url}/?s={query}")
12
- selector = Selector(response.text)
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 selector.css("div.icerik div"):
16
- title = article.css("span:nth-child(1)::text").get()
17
- href = article.css("a::attr(href)").get()
18
- poster = article.css("img::attr(src)").get()
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
- response = await self.oturum.get(url)
33
- selector = Selector(response.text)
32
+ istek = await self.oturum.get(url)
33
+ secici = Selector(istek.text)
34
34
 
35
- title = selector.css("div.bilgi h2::text").get(default="").strip()
36
- poster = selector.css("div.resim img::attr(src)").get(default="").strip()
37
- description = selector.css("div.slayt-aciklama::text").get(default="").strip()
38
- tags = selector.css("p.tur a[href*='/category/']::text").getall()
39
- year = selector.css("a[href*='/yil/']::text").re_first(r"\d+")
40
- actors = [actor.css("span::text").get() for actor in selector.css("li.oyuncu-k")]
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
- response = await self.oturum.get(url)
54
- selector = Selector(response.text)
55
- results = []
53
+ istek = await self.oturum.get(url)
54
+ secici = Selector(istek.text)
55
+ results = []
56
56
 
57
- for part_link in selector.css("li.parttab a::attr(href)").getall():
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
- media_info = await self.current_plugin.load_item(url)
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.2
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.12
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=eS2UrTYgs9jGdDoGe6JyCyJMBV-8ymXVcEAXDylrJAs,4204
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=SJd8pujIB69FJ-kWxqroJiV2sToUgyuUOoYd9ZyImr0,630
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=kbkQDsTw6F1qOFszSLcAkW0iHCrhNHC-OGWotI6D_aI,2350
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=CWsKliU-JebMrA09GrBrZ3xJXBRTu1298UJ0ZRhdSxE,1089
14
- KekikStream/Extractors/MailRu.py,sha256=-i5Y3-c4DQuJgRseh0q0vln6wMbI_42d6lLPlk4aZV8,1501
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=is0TurL8ChWuWiMmIVxKFWa--yNYyFzFfBRldlUt_jg,2945
21
- KekikStream/Plugins/UgurFilm.py,sha256=-90rdlvCu6NLyeYDrtmYKcEoWT_mBtzz4sQ6iZcaz54,3008
22
- KekikStream-0.0.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
23
- KekikStream-0.0.2.dist-info/METADATA,sha256=8bMNH05ccVHx_UGx0gruqfQ990M0Qf-xN2z7nb0x6bs,3686
24
- KekikStream-0.0.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
25
- KekikStream-0.0.2.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
26
- KekikStream-0.0.2.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
27
- KekikStream-0.0.2.dist-info/RECORD,,
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,,