KekikStream 0.3.1__py3-none-any.whl → 0.3.3__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.
Files changed (34) hide show
  1. KekikStream/CLI/__init__.py +1 -1
  2. KekikStream/CLI/pypi_kontrol.py +29 -0
  3. KekikStream/Core/ExtractorBase.py +1 -1
  4. KekikStream/Core/ExtractorLoader.py +1 -2
  5. KekikStream/Core/ExtractorModels.py +2 -0
  6. KekikStream/Core/MediaHandler.py +1 -2
  7. KekikStream/Core/PluginBase.py +2 -5
  8. KekikStream/Core/PluginLoader.py +1 -3
  9. KekikStream/Extractors/ContentX.py +9 -10
  10. KekikStream/Extractors/MixPlayHD.py +15 -16
  11. KekikStream/Extractors/Odnoklassniki.py +13 -16
  12. KekikStream/Extractors/PeaceMakerst.py +3 -5
  13. KekikStream/Extractors/PixelDrain.py +1 -1
  14. KekikStream/Extractors/RapidVid.py +7 -8
  15. KekikStream/Extractors/SibNet.py +1 -1
  16. KekikStream/Extractors/Sobreatsesuyp.py +2 -3
  17. KekikStream/Extractors/TRsTX.py +2 -3
  18. KekikStream/Extractors/TauVideo.py +5 -6
  19. KekikStream/Extractors/TurboImgz.py +9 -12
  20. KekikStream/Extractors/VidMoly.py +6 -13
  21. KekikStream/Extractors/VidMoxy.py +1 -1
  22. KekikStream/Extractors/VideoSeyred.py +23 -29
  23. KekikStream/Plugins/DiziBox.py +11 -12
  24. KekikStream/Plugins/FilmMakinesi.py +8 -8
  25. KekikStream/Plugins/UgurFilm.py +3 -3
  26. KekikStream/__init__.py +5 -7
  27. {KekikStream-0.3.1.dist-info → KekikStream-0.3.3.dist-info}/METADATA +1 -1
  28. KekikStream-0.3.3.dist-info/RECORD +56 -0
  29. KekikStream/CLI/check_update.py +0 -33
  30. KekikStream-0.3.1.dist-info/RECORD +0 -56
  31. {KekikStream-0.3.1.dist-info → KekikStream-0.3.3.dist-info}/LICENSE +0 -0
  32. {KekikStream-0.3.1.dist-info → KekikStream-0.3.3.dist-info}/WHEEL +0 -0
  33. {KekikStream-0.3.1.dist-info → KekikStream-0.3.3.dist-info}/entry_points.txt +0 -0
  34. {KekikStream-0.3.1.dist-info → KekikStream-0.3.3.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from Kekik.cli import konsol, cikis_yap, hata_salla, log_salla, hata_yakala, bellek_temizle, temizle
4
- from .check_update import check_and_update_package
4
+ from .pypi_kontrol import pypi_kontrol_guncelle
@@ -0,0 +1,29 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from . import konsol
4
+ from rich.panel import Panel
5
+ from pkg_resources import get_distribution
6
+ from requests import get
7
+ from subprocess import check_call
8
+ import sys
9
+
10
+ def pypi_kontrol_guncelle(paket_adi: str):
11
+ try:
12
+ mevcut_surum = get_distribution(paket_adi).version
13
+ konsol.print(Panel(f"[cyan]Yüklü sürüm:[/cyan] [bold yellow]{mevcut_surum}[/bold yellow]"))
14
+
15
+ istek = get(f"https://pypi.org/pypi/{paket_adi}/json")
16
+ if istek.status_code == 200:
17
+ son_surum = istek.json()["info"]["version"]
18
+ konsol.print(Panel(f"[cyan]En son sürüm:[/cyan] [bold green]{son_surum}[/bold green]"))
19
+
20
+ if mevcut_surum != son_surum:
21
+ konsol.print(f"[bold red]{paket_adi} güncelleniyor...[/bold red]")
22
+ check_call([sys.executable, "-m", "pip", "install", "--upgrade", paket_adi, "--break-system-packages"])
23
+ konsol.print(f"[bold green]{paket_adi} güncellendi![/bold green]")
24
+ else:
25
+ konsol.print(f"[bold green]{paket_adi} zaten güncel.[/bold green]")
26
+ else:
27
+ konsol.print("[bold red]PyPI'ye erişilemiyor. Güncelleme kontrolü atlanıyor.[/bold red]")
28
+ except Exception as hata:
29
+ konsol.print(f"[bold red]Güncelleme kontrolü sırasında hata oluştu: {hata}[/bold red]")
@@ -15,7 +15,7 @@ class ExtractorBase(ABC):
15
15
  "User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)",
16
16
  "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
17
17
  },
18
- timeout = Timeout(10.0),
18
+ timeout = Timeout(10.0)
19
19
  )
20
20
 
21
21
  def can_handle_url(self, url: str) -> bool:
@@ -3,8 +3,7 @@
3
3
  from ..CLI import konsol, cikis_yap
4
4
  from .ExtractorBase import ExtractorBase
5
5
  from pathlib import Path
6
- import importlib.util
7
- import os
6
+ import os, importlib.util
8
7
 
9
8
  class ExtractorLoader:
10
9
  def __init__(self, extractors_dir: str):
@@ -3,11 +3,13 @@
3
3
  from pydantic import BaseModel
4
4
  from typing import List, Optional
5
5
 
6
+
6
7
  class Subtitle(BaseModel):
7
8
  """Altyazı modeli."""
8
9
  name : str
9
10
  url : str
10
11
 
12
+
11
13
  class ExtractResult(BaseModel):
12
14
  """Extractor'ın döndürmesi gereken sonuç modeli."""
13
15
  name : str
@@ -2,8 +2,7 @@
2
2
 
3
3
  from ..CLI import konsol
4
4
  from .ExtractorModels import ExtractResult
5
- import subprocess
6
- import os
5
+ import subprocess, os
7
6
 
8
7
  class MediaHandler:
9
8
  def __init__(self, title: str = "KekikStream", headers: dict = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)"}):
@@ -47,14 +47,11 @@ class PluginBase(ABC):
47
47
  def fix_url(self, url: str) -> str:
48
48
  if not url:
49
49
  return ""
50
-
50
+
51
51
  if url.startswith("http") or url.startswith("{\""):
52
52
  return url
53
53
 
54
- if url.startswith("//"):
55
- return f"https:{url}"
56
-
57
- return urljoin(self.main_url, url)
54
+ return f"https:{url}" if url.startswith("//") else urljoin(self.main_url, url)
58
55
 
59
56
  @staticmethod
60
57
  def clean_title(title: str) -> str:
@@ -3,9 +3,7 @@
3
3
  from ..CLI import konsol, cikis_yap
4
4
  from .PluginBase import PluginBase
5
5
  from pathlib import Path
6
- import importlib.util
7
- import os
8
- import traceback
6
+ import os, importlib.util, traceback
9
7
 
10
8
  class PluginLoader:
11
9
  def __init__(self, plugins_dir: str):
@@ -17,18 +17,18 @@ class ContentX(ExtractorBase):
17
17
 
18
18
  i_extract = re.search(r"window\.openPlayer\('([^']+)'\)", i_source)
19
19
  if not i_extract:
20
- raise ValueError("iExtract is null")
21
- i_extract_value = i_extract.group(1)
20
+ raise ValueError("i_extract is null")
21
+ i_extract_value = i_extract[1]
22
22
 
23
23
  subtitles = []
24
- sub_urls = set()
24
+ sub_urls = set()
25
25
  for match in re.finditer(r'"file":"([^"]+)","label":"([^"]+)"', i_source):
26
26
  sub_url, sub_lang = match.groups()
27
27
 
28
28
  if sub_url in sub_urls:
29
29
  continue
30
- sub_urls.add(sub_url)
31
30
 
31
+ sub_urls.add(sub_url)
32
32
  subtitles.append(
33
33
  Subtitle(
34
34
  name = sub_lang.replace("\\u0131", "ı")
@@ -46,9 +46,9 @@ class ContentX(ExtractorBase):
46
46
  vid_extract = re.search(r'file":"([^"]+)"', vid_source)
47
47
  if not vid_extract:
48
48
  raise ValueError("vidExtract is null")
49
- m3u_link = vid_extract.group(1).replace("\\", "")
50
49
 
51
- results = [
50
+ m3u_link = vid_extract[1].replace("\\", "")
51
+ results = [
52
52
  ExtractResult(
53
53
  name = self.name,
54
54
  url = m3u_link,
@@ -57,9 +57,8 @@ class ContentX(ExtractorBase):
57
57
  )
58
58
  ]
59
59
 
60
- i_dublaj = re.search(r',\"([^"]+)\",\"Türkçe"', i_source)
61
- if i_dublaj:
62
- dublaj_value = i_dublaj.group(1)
60
+ if i_dublaj := re.search(r',\"([^"]+)\",\"Türkçe"', i_source):
61
+ dublaj_value = i_dublaj[1]
63
62
  dublaj_source_request = await self.oturum.get(f"{self.main_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or self.main_url})
64
63
  dublaj_source_request.raise_for_status()
65
64
 
@@ -67,8 +66,8 @@ class ContentX(ExtractorBase):
67
66
  dublaj_extract = re.search(r'file":"([^"]+)"', dublaj_source)
68
67
  if not dublaj_extract:
69
68
  raise ValueError("dublajExtract is null")
70
- dublaj_link = dublaj_extract.group(1).replace("\\", "")
71
69
 
70
+ dublaj_link = dublaj_extract[1].replace("\\", "")
72
71
  results.append(
73
72
  ExtractResult(
74
73
  name = f"{self.name} Türkçe Dublaj",
@@ -2,8 +2,7 @@
2
2
 
3
3
  from KekikStream.Core import ExtractorBase, ExtractResult
4
4
  from Kekik.Sifreleme import AESManager
5
- import re
6
- import json
5
+ import re, json
7
6
 
8
7
  class MixPlayHD(ExtractorBase):
9
8
  name = "MixPlayHD"
@@ -20,8 +19,8 @@ class MixPlayHD(ExtractorBase):
20
19
  if not be_player_match:
21
20
  raise ValueError("bePlayer not found in the response.")
22
21
 
23
- be_player_pass = be_player_match.group(1)
24
- be_player_data = be_player_match.group(2)
22
+ be_player_pass = be_player_match[1]
23
+ be_player_data = be_player_match[2]
25
24
 
26
25
  try:
27
26
  decrypted_data = AESManager.decrypt(be_player_data, be_player_pass).replace("\\", "")
@@ -29,15 +28,15 @@ class MixPlayHD(ExtractorBase):
29
28
  except Exception as e:
30
29
  raise RuntimeError(f"Decryption failed: {e}")
31
30
 
32
- video_url_match = re.search(r'"video_location":"([^"]+)"', decrypted_json.get("schedule", {}).get("client", ""))
33
- if not video_url_match:
34
- raise ValueError("M3U8 video URL not found in the decrypted data.")
35
-
36
- video_url = video_url_match.group(1)
37
-
38
- return ExtractResult(
39
- name = self.name,
40
- url = video_url,
41
- referer = self.main_url,
42
- subtitles = []
43
- )
31
+ if video_url_match := re.search(
32
+ pattern = r'"video_location":"([^"]+)"',
33
+ string = decrypted_json.get("schedule", {}).get("client", ""),
34
+ ):
35
+ return ExtractResult(
36
+ name = self.name,
37
+ url = video_url_match[1],
38
+ referer = self.main_url,
39
+ subtitles = []
40
+ )
41
+ else:
42
+ raise ValueError("M3U8 video URL not found in the decrypted data.")
@@ -1,9 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from KekikStream.CLI import konsol
4
3
  from KekikStream.Core import ExtractorBase, ExtractResult
5
- import re
6
- import json
4
+ import re, json
7
5
 
8
6
  class Odnoklassniki(ExtractorBase):
9
7
  name = "Odnoklassniki"
@@ -33,7 +31,7 @@ class Odnoklassniki(ExtractorBase):
33
31
  )
34
32
  response_text = re.sub(
35
33
  r"\\u([0-9A-Fa-f]{4})",
36
- lambda match: chr(int(match.group(1), 16)),
34
+ lambda match: chr(int(match[1], 16)),
37
35
  response_text
38
36
  )
39
37
 
@@ -41,9 +39,8 @@ class Odnoklassniki(ExtractorBase):
41
39
  if not videos_match:
42
40
  raise ValueError("No video data found in the response.")
43
41
 
44
- videos_str = videos_match.group(1)
45
42
  try:
46
- videos = json.loads(videos_str)
43
+ videos = json.loads(videos_match[1])
47
44
  except json.JSONDecodeError:
48
45
  raise ValueError("Failed to parse video data.")
49
46
 
@@ -92,18 +89,18 @@ class Odnoklassniki(ExtractorBase):
92
89
  redirects = 0
93
90
  while redirects < max_redirects:
94
91
  istek = await self.oturum.get(url, follow_redirects=False)
95
-
96
- if istek.status_code in [301, 302]: # Yönlendirme varsa
97
- redirected_url = istek.headers.get("Location")
98
- print(redirected_url)
99
- if not redirected_url:
100
- raise ValueError("Redirect location not found.")
101
-
102
- url = redirected_url if redirected_url.startswith("http") else f"https://{redirected_url}"
103
- redirects += 1
104
- else:
92
+
93
+ if istek.status_code not in [301, 302]:
105
94
  break # Yönlendirme yoksa çık
106
95
 
96
+ redirected_url = istek.headers.get("Location")
97
+ if not redirected_url:
98
+ raise ValueError("Redirect location not found.")
99
+
100
+ url = redirected_url if redirected_url.startswith("http") else f"https://{redirected_url}"
101
+ redirects += 1
102
+
107
103
  if redirects == max_redirects:
108
104
  raise RuntimeError(f"Max redirects ({max_redirects}) reached.")
105
+
109
106
  return istek
@@ -1,8 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import ExtractorBase, ExtractResult
4
- import re
5
- import json
4
+ import re, json
6
5
 
7
6
  class PeaceMakerst(ExtractorBase):
8
7
  name = "PeaceMakerst"
@@ -31,7 +30,7 @@ class PeaceMakerst(ExtractorBase):
31
30
  m3u_link = None
32
31
 
33
32
  if "teve2.com.tr\\/embed\\/" in response_text:
34
- teve2_id = re.search(r"teve2\.com\.tr\\\/embed\\\/(\d+)", response_text).group(1)
33
+ teve2_id = re.search(r"teve2\.com\.tr\\\/embed\\\/(\d+)", response_text)[1]
35
34
  teve2_url = f"https://www.teve2.com.tr/action/media/{teve2_id}"
36
35
 
37
36
  teve2_response = await self.oturum.get(teve2_url, headers={"Referer": f"https://www.teve2.com.tr/embed/{teve2_id}"})
@@ -42,8 +41,7 @@ class PeaceMakerst(ExtractorBase):
42
41
  else:
43
42
  try:
44
43
  video_response = response.json()
45
- video_sources = video_response.get("videoSources", [])
46
- if video_sources:
44
+ if video_sources := video_response.get("videoSources", []):
47
45
  m3u_link = video_sources[-1]["file"]
48
46
  except (json.JSONDecodeError, KeyError):
49
47
  raise ValueError("Peace response is invalid or null.")
@@ -15,7 +15,7 @@ class PixelDrain(ExtractorBase):
15
15
  if not pixel_id_match:
16
16
  raise ValueError("PixelDrain bağlantısından ID çıkarılamadı.")
17
17
 
18
- pixel_id = pixel_id_match.group(1)
18
+ pixel_id = pixel_id_match[1]
19
19
  download_link = f"{self.main_url}/api/file/{pixel_id}?download"
20
20
  referer_link = f"{self.main_url}/u/{pixel_id}?download"
21
21
 
@@ -22,8 +22,8 @@ class RapidVid(ExtractorBase):
22
22
  for sub_url, sub_lang in subtitle_matches:
23
23
  if sub_url in seen_subtitles:
24
24
  continue
25
- seen_subtitles.add(sub_url)
26
25
 
26
+ seen_subtitles.add(sub_url)
27
27
  decoded_lang = (
28
28
  sub_lang.replace("\\u0131", "ı")
29
29
  .replace("\\u0130", "İ")
@@ -33,21 +33,20 @@ class RapidVid(ExtractorBase):
33
33
  subtitles.append(Subtitle(name=decoded_lang, url=sub_url.replace("\\", "")))
34
34
 
35
35
  try:
36
- extracted_value = re.search(r'file": "(.*)",', istek.text)
37
- if extracted_value:
38
- escaped_hex = extracted_value.group(1)
36
+ if extracted_value := re.search(r'file": "(.*)",', istek.text):
37
+ escaped_hex = extracted_value[1]
39
38
  decoded_url = HexCodec.decode(escaped_hex)
40
39
  else:
41
40
  eval_jwsetup = re.search(r'\};\s*(eval\(function[\s\S]*?)var played = \d+;', istek.text)
42
41
  if not eval_jwsetup:
43
42
  raise ValueError("JWPlayer setup not found.")
44
-
45
- unpacked_jwsetup = Packer.unpack(Packer.unpack(eval_jwsetup.group(1)))
43
+
44
+ unpacked_jwsetup = Packer.unpack(Packer.unpack(eval_jwsetup[1]))
46
45
  extracted_value = re.search(r'file":"(.*)","label', unpacked_jwsetup)
47
46
  if not extracted_value:
48
47
  raise ValueError("File URL not found in unpacked JWPlayer setup.")
49
-
50
- escaped_hex = extracted_value.group(1).replace("\\\\x", "")
48
+
49
+ escaped_hex = extracted_value[1].replace("\\\\x", "")
51
50
  decoded_url = bytes.fromhex(escaped_hex).decode("utf-8")
52
51
  except Exception as e:
53
52
  raise RuntimeError(f"Extraction failed: {e}")
@@ -18,7 +18,7 @@ class SibNet(ExtractorBase):
18
18
  if not match:
19
19
  raise ValueError("m3u bağlantısı bulunamadı.")
20
20
 
21
- m3u_link = f"{self.main_url}{match.group(1)}"
21
+ m3u_link = f"{self.main_url}{match[1]}"
22
22
 
23
23
  await self.close()
24
24
  return ExtractResult(
@@ -1,8 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import ExtractorBase, ExtractResult
4
- import re
5
- import json
4
+ import re, json
6
5
 
7
6
  class Sobreatsesuyp(ExtractorBase):
8
7
  name = "Sobreatsesuyp"
@@ -19,7 +18,7 @@ class Sobreatsesuyp(ExtractorBase):
19
18
  if not file_match:
20
19
  raise ValueError("File not found in response.")
21
20
 
22
- file_path = file_match.group(1).replace("\\", "")
21
+ file_path = file_match[1].replace("\\", "")
23
22
  post_link = f"{self.main_url}/{file_path}"
24
23
 
25
24
  post_istek = await self.oturum.post(post_link)
@@ -1,8 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from KekikStream.Core import ExtractorBase, ExtractResult
4
- import re
5
- import json
4
+ import re, json
6
5
 
7
6
  class TRsTX(ExtractorBase):
8
7
  name = "TRsTX"
@@ -19,7 +18,7 @@ class TRsTX(ExtractorBase):
19
18
  if not file_match:
20
19
  raise ValueError("File not found in response.")
21
20
 
22
- file_path = file_match.group(1).replace("\\", "")
21
+ file_path = file_match[1].replace("\\", "")
23
22
  post_link = f"{self.main_url}/{file_path}"
24
23
 
25
24
  post_istek = await self.oturum.post(post_link)
@@ -21,13 +21,12 @@ class TauVideo(ExtractorBase):
21
21
  if "urls" not in api_data:
22
22
  raise ValueError("API yanıtında 'urls' bulunamadı.")
23
23
 
24
- results = []
25
- for video in api_data["urls"]:
26
- results.append(ExtractResult(
24
+ return [
25
+ ExtractResult(
27
26
  name = f"{self.name} - {video['label']}",
28
27
  url = video["url"],
29
28
  referer = referer or self.main_url,
30
29
  subtitles = []
31
- ))
32
-
33
- return results
30
+ )
31
+ for video in api_data["urls"]
32
+ ]
@@ -14,15 +14,12 @@ class TurboImgz(ExtractorBase):
14
14
  istek = await self.oturum.get(url)
15
15
  istek.raise_for_status()
16
16
 
17
- video_match = re.search(r'file: "(.*)",', istek.text)
18
- if not video_match:
19
- raise ValueError("File not found in response.")
20
-
21
- video_link = video_match.group(1)
22
-
23
- return ExtractResult(
24
- name = self.name,
25
- url = video_link,
26
- referer = referer or self.main_url,
27
- subtitles = []
28
- )
17
+ if video_match := re.search(r'file: "(.*)",', istek.text):
18
+ return ExtractResult(
19
+ name = self.name,
20
+ url = video_match[1],
21
+ referer = referer or self.main_url,
22
+ subtitles = []
23
+ )
24
+ else:
25
+ raise ValueError("File not found in response.")
@@ -2,9 +2,7 @@
2
2
  # ! https://github.com/recloudstream/cloudstream/blob/master/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vidmoly.kt
3
3
 
4
4
  from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
5
- import re
6
- import asyncio
7
- import json
5
+ import re, asyncio, contextlib, json
8
6
 
9
7
  class VidMoly(ExtractorBase):
10
8
  name = "VidMoly"
@@ -31,7 +29,7 @@ class VidMoly(ExtractorBase):
31
29
  response.raise_for_status()
32
30
 
33
31
  script_match = re.search(r"sources:\s*\[(.*?)\],", response.text, re.DOTALL)
34
- script_content = script_match.group(1) if script_match else None
32
+ script_content = script_match[1] if script_match else None
35
33
  if not script_content:
36
34
  await asyncio.sleep(0.5)
37
35
 
@@ -47,13 +45,12 @@ class VidMoly(ExtractorBase):
47
45
 
48
46
  # Altyazı kaynaklarını ayrıştır
49
47
  subtitles = []
50
- subtitle_match = re.search(r"tracks:\s*\[(.*?)\]", response.text, re.DOTALL)
51
- if subtitle_match:
52
- subtitle_data = self._add_marks(subtitle_match.group(1), "file")
48
+ if subtitle_match := re.search(r"tracks:\s*\[(.*?)\]", response.text, re.DOTALL):
49
+ subtitle_data = self._add_marks(subtitle_match[1], "file")
53
50
  subtitle_data = self._add_marks(subtitle_data, "label")
54
51
  subtitle_data = self._add_marks(subtitle_data, "kind")
55
52
 
56
- try:
53
+ with contextlib.suppress(json.JSONDecodeError):
57
54
  subtitle_sources = json.loads(f"[{subtitle_data}]")
58
55
  subtitles = [
59
56
  Subtitle(
@@ -63,14 +60,10 @@ class VidMoly(ExtractorBase):
63
60
  for sub in subtitle_sources
64
61
  if sub.get("kind") == "captions"
65
62
  ]
66
- except json.JSONDecodeError:
67
- pass
68
-
69
63
  # İlk video kaynağını al
70
64
  video_url = None
71
65
  for source in video_sources:
72
- file_url = source.get("file")
73
- if file_url:
66
+ if file_url := source.get("file"):
74
67
  video_url = file_url
75
68
  break
76
69
 
@@ -22,8 +22,8 @@ class VidMoxy(ExtractorBase):
22
22
  for sub_url, sub_lang in subtitle_matches:
23
23
  if sub_url in seen_subtitles:
24
24
  continue
25
- seen_subtitles.add(sub_url)
26
25
 
26
+ seen_subtitles.add(sub_url)
27
27
  decoded_lang = (
28
28
  sub_lang.replace("\\u0131", "ı")
29
29
  .replace("\\u0130", "İ")
@@ -11,43 +11,37 @@ class VideoSeyred(ExtractorBase):
11
11
  if referer:
12
12
  self.oturum.headers.update({"Referer": referer})
13
13
 
14
- video_id = url.split("embed/")[1].split("?")[0]
14
+ video_id = url.split("embed/")[1].split("?")[0]
15
15
  video_url = f"{self.main_url}/playlist/{video_id}.json"
16
16
 
17
17
  response = await self.oturum.get(video_url)
18
18
  response.raise_for_status()
19
19
 
20
20
  try:
21
- response_list = json.loads(response.text)
22
- if not response_list:
21
+ if response_list := json.loads(response.text):
22
+ response_data = response_list[0]
23
+ else:
23
24
  raise ValueError("Empty response from VideoSeyred.")
24
- response_data = response_list[0]
25
+
25
26
  except (json.JSONDecodeError, IndexError) as e:
26
27
  raise RuntimeError(f"Failed to parse response: {e}")
27
28
 
28
- subtitles = []
29
- for track in response_data.get("tracks", []):
30
- if track.get("kind") == "captions" and track.get("label"):
31
- subtitles.append(
32
- Subtitle(
33
- name = track["label"],
34
- url = self.fix_url(track["file"])
35
- )
36
- )
37
-
38
- video_links = []
39
- for source in response_data.get("sources", []):
40
- video_links.append(
41
- ExtractResult(
42
- name = self.name,
43
- url = self.fix_url(source["file"]),
44
- referer = self.main_url,
45
- subtitles = subtitles
46
- )
29
+ subtitles = [
30
+ Subtitle(name=track["label"], url=self.fix_url(track["file"]))
31
+ for track in response_data.get("tracks", [])
32
+ if track.get("kind") == "captions" and track.get("label")
33
+ ]
34
+
35
+ if video_links := [
36
+ ExtractResult(
37
+ name = self.name,
38
+ url = self.fix_url(source["file"]),
39
+ referer = self.main_url,
40
+ subtitles = subtitles,
47
41
  )
48
-
49
- if not video_links:
50
- raise ValueError("No video links found in the response.")
51
-
52
- # En yüksek kaliteli videoyu döndür (varsayılan olarak ilk video)
53
- return video_links[0] if len(video_links) == 1 else video_links
42
+ for source in response_data.get("sources", [])
43
+ ]:
44
+ # En yüksek kaliteli videoyu döndür (varsayılan olarak ilk video)
45
+ return video_links[0] if len(video_links) == 1 else video_links
46
+ else:
47
+ raise ValueError("No video links found in the response.")
@@ -24,7 +24,7 @@ class DiziBox(PluginBase):
24
24
  url = self.fix_url(item.css("h3 a::attr(href)").get()),
25
25
  poster = self.fix_url(item.css("img::attr(src)").get()),
26
26
  )
27
- for item in secici.css("article.detailed-article")
27
+ for item in secici.css("article.detailed-article")
28
28
  ]
29
29
 
30
30
  async def load_item(self, url: str) -> SeriesInfo:
@@ -46,10 +46,12 @@ class DiziBox(PluginBase):
46
46
  sezon_secici = Selector(sezon_istek.text)
47
47
 
48
48
  for bolum in sezon_secici.css("article.grid-box"):
49
- ep_title = bolum.css("div.post-title a::text").get()
49
+ ep_secici = bolum.css("div.post-title a::text")
50
+
51
+ ep_title = ep_secici.get()
50
52
  ep_href = self.fix_url(bolum.css("div.post-title a::attr(href)").get())
51
- ep_season = bolum.css("div.post-title a::text").re_first(r"(\d+)\. ?Sezon")
52
- ep_episode = bolum.css("div.post-title a::text").re_first(r"(\d+)\. ?Bölüm")
53
+ ep_season = ep_secici.re_first(r"(\d+)\. ?Sezon")
54
+ ep_episode = ep_secici.re_first(r"(\d+)\. ?Bölüm")
53
55
 
54
56
  if ep_title and ep_href:
55
57
  episodes.append(Episode(
@@ -85,8 +87,8 @@ class DiziBox(PluginBase):
85
87
  self.oturum.headers.update({"Referer": self.main_url})
86
88
  istek = await self.oturum.get(iframe)
87
89
 
88
- crypt_data = re.search(r"CryptoJS\.AES\.decrypt\(\"(.*)\",\"", istek.text).group(1)
89
- crypt_pass = re.search(r"\",\"(.*)\"\);", istek.text).group(1)
90
+ crypt_data = re.search(r"CryptoJS\.AES\.decrypt\(\"(.*)\",\"", istek.text)[1]
91
+ crypt_pass = re.search(r"\",\"(.*)\"\);", istek.text)[1]
90
92
 
91
93
  results.append(CryptoJS.decrypt(crypt_pass, crypt_data))
92
94
 
@@ -96,7 +98,7 @@ class DiziBox(PluginBase):
96
98
  istek = await self.oturum.get(iframe_link)
97
99
 
98
100
  if atob_data := re.search(r"unescape\(\"(.*)\"\)", istek.text):
99
- decoded_atob = urllib.parse.unquote(atob_data.group(1))
101
+ decoded_atob = urllib.parse.unquote(atob_data[1])
100
102
  str_atob = base64.b64decode(decoded_atob).decode('utf-8')
101
103
 
102
104
  if iframe := Selector(str_atob).css("div#Player iframe::attr(src)").get():
@@ -113,8 +115,7 @@ class DiziBox(PluginBase):
113
115
  secici = Selector(istek.text)
114
116
 
115
117
  iframes = []
116
- main_iframe = secici.css("div#video-area iframe::attr(src)").get()
117
- if main_iframe:
118
+ if main_iframe := secici.css("div#video-area iframe::attr(src)").get():
118
119
  if decoded := await self._iframe_decode(self.name, main_iframe, url):
119
120
  iframes.extend(decoded)
120
121
 
@@ -130,9 +131,7 @@ class DiziBox(PluginBase):
130
131
  alt_istek.raise_for_status()
131
132
 
132
133
  alt_secici = Selector(alt_istek.text)
133
- alt_iframe = alt_secici.css("div#video-area iframe::attr(src)").get()
134
-
135
- if alt_iframe:
134
+ if alt_iframe := alt_secici.css("div#video-area iframe::attr(src)").get():
136
135
  if decoded := await self._iframe_decode(alt_name, alt_iframe, url):
137
136
  iframes.extend(decoded)
138
137
 
@@ -32,14 +32,14 @@ class FilmMakinesi(PluginBase):
32
32
  istek = await self.oturum.get(url)
33
33
  secici = Selector(istek.text)
34
34
 
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()
35
+ title = secici.css("h1.single_h1 a::text").get().strip()
36
+ poster = secici.css("[property='og:image']::attr(content)").get().strip()
37
+ description = secici.css("section#film_single article p:last-of-type::text").get().strip()
38
+ tags = secici.css("dt:contains('Tür:') + dd a::text").get().strip()
39
+ rating = secici.css("dt:contains('IMDB Puanı:') + dd::text").get().strip()
40
+ year = secici.css("dt:contains('Yapım Yılı:') + dd a::text").get().strip()
41
+ actors = secici.css("dt:contains('Oyuncular:') + dd::text").get().strip()
42
+ duration = secici.css("dt:contains('Film Süresi:') + dd time::attr(datetime)").get().strip()
43
43
 
44
44
  duration_minutes = 0
45
45
  if duration and duration.startswith("PT") and duration.endswith("M"):
@@ -32,9 +32,9 @@ class UgurFilm(PluginBase):
32
32
  istek = await self.oturum.get(url)
33
33
  secici = Selector(istek.text)
34
34
 
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()
35
+ title = secici.css("div.bilgi h2::text").get().strip()
36
+ poster = secici.css("div.resim img::attr(src)").get().strip()
37
+ description = secici.css("div.slayt-aciklama::text").get().strip()
38
38
  tags = secici.css("p.tur a[href*='/category/']::text").getall()
39
39
  year = secici.css("a[href*='/yil/']::text").re_first(r"\d+")
40
40
  actors = [actor.css("span::text").get() for actor in secici.css("li.oyuncu-k")]
KekikStream/__init__.py CHANGED
@@ -60,7 +60,7 @@ class KekikStream:
60
60
 
61
61
  if not results:
62
62
  konsol.print("[bold red]Arama sonucu bulunamadı![/bold red]")
63
- return
63
+ return await self.handle_no_results()
64
64
 
65
65
  selected_result = await self.select_result(results)
66
66
 
@@ -75,7 +75,7 @@ class KekikStream:
75
75
  results = await self.search_all_plugins(query)
76
76
 
77
77
  if not results:
78
- return
78
+ return await self.handle_no_results()
79
79
 
80
80
  selected_result = await self.select_from_all_results(results)
81
81
 
@@ -239,19 +239,17 @@ class KekikStream:
239
239
  for res in results
240
240
  ]
241
241
 
242
- selected_result = await self.ui_manager.select_from_fuzzy(
242
+ return await self.ui_manager.select_from_fuzzy(
243
243
  message = "Arama sonuçlarından bir içerik seçin:",
244
244
  choices = choices
245
245
  )
246
246
 
247
- return selected_result
248
-
249
- from .CLI import check_and_update_package
247
+ from .CLI import pypi_kontrol_guncelle
250
248
 
251
249
  def basla():
252
250
  try:
253
251
  konsol.print("[bold cyan]Güncelleme kontrol ediliyor...[/bold cyan]")
254
- check_and_update_package("KekikStream")
252
+ pypi_kontrol_guncelle("KekikStream")
255
253
 
256
254
  app = KekikStream()
257
255
  run(app.run())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: KekikStream
3
- Version: 0.3.1
3
+ Version: 0.3.3
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
@@ -0,0 +1,56 @@
1
+ KekikStream/__init__.py,sha256=nzsNRqo1iXjS_rqf7Ct8cC7TPjcTofZcpYZ3FlDC0Zs,10354
2
+ KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
3
+ KekikStream/requirements.txt,sha256=gS_TUUQx5A7FUmRGxj2dQedxheD7qA6AswdUb2y_Ub8,70
4
+ KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
5
+ KekikStream/CLI/pypi_kontrol.py,sha256=K5EPhpAu4XYqhFsXKK27mUoiN7iiFRktR43XZmYKzzM,1423
6
+ KekikStream/Core/ExtractorBase.py,sha256=-3jadehq2wIa4jwwn38ojkGHay2qAYgweSYIBqVGwNU,1068
7
+ KekikStream/Core/ExtractorLoader.py,sha256=rrll3F2CyVmx3foa57PG0FocQMrFuMpdlG0Uf0-2Fz4,3915
8
+ KekikStream/Core/ExtractorModels.py,sha256=huIcPQ5VIRfMx0LcL5SS1u4dldZbHjzHKEdSEtOPlc0,456
9
+ KekikStream/Core/MediaHandler.py,sha256=hEnJpLAAMRDhFda4k8iaZlApFysZLxIHU-6Wfy4zK0A,3253
10
+ KekikStream/Core/PluginBase.py,sha256=ZQx6adxOKuX50TPN5pxE8oG9FD-ZjPXSHpSiW086QPQ,2479
11
+ KekikStream/Core/PluginLoader.py,sha256=4gucz-9RKIGYiwvcvxqHNf4NVRGVwEj9sg1rKX3LZ58,2584
12
+ KekikStream/Core/PluginModels.py,sha256=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
13
+ KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
14
+ KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
15
+ KekikStream/Extractors/ContentX.py,sha256=0u2Tz80q_k6deLb9t4Q8uYabj_uWFfFftRnbpRL84dU,2945
16
+ KekikStream/Extractors/FourCX.py,sha256=4FrMj1IZBBpN_g1P6S3A-8eUu7QFwlt4fJXzJ7vfe0Q,221
17
+ KekikStream/Extractors/FourPichive.py,sha256=iq3BCUbih1UVF4y4BIWO--0hX5jP2nxqesNx3MGP3kQ,234
18
+ KekikStream/Extractors/FourPlayRu.py,sha256=wq1ylxKpsO_IBoYr_ALzB2dVrQpJ-jY9lf2zPhcAZX8,228
19
+ KekikStream/Extractors/HDStreamAble.py,sha256=66n5EvIdX_or5cdnlJ_Uqmzi50n4rl9c5VCw8kBqhQk,245
20
+ KekikStream/Extractors/Hotlinger.py,sha256=NFMRgUmb6BCrJfa7Hi0VarDNYvCeVknBWEk24FKBBa0,224
21
+ KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
22
+ KekikStream/Extractors/MixPlayHD.py,sha256=pfqtbrSz4JbEFROcCLhfZ-24XuV9KsQQZ6-ALhm53KU,1538
23
+ KekikStream/Extractors/Odnoklassniki.py,sha256=N8qPDAoMj8UV3TmFRHNiUng4agjRzIAUkKl0Hk4Ghp0,3559
24
+ KekikStream/Extractors/OkRuHTTP.py,sha256=L-B0i_i_Vnm61GvUfd6cGIW-o_H4M-C7DO_cdw2rQPU,228
25
+ KekikStream/Extractors/OkRuSSL.py,sha256=FHJ5XZ1dO5ED3mIku3e3vnq8K0slrcr0jqhaUnHmfVk,227
26
+ KekikStream/Extractors/PeaceMakerst.py,sha256=c9D2IUYR04nJ6WnRMPIJpUvJ7JDHgDrDe5tSVdPbKSc,2082
27
+ KekikStream/Extractors/Pichive.py,sha256=BSVYFwL3Ax6yGoS1WkpOWtngxNyuZLoKzpPwjibpu2s,221
28
+ KekikStream/Extractors/PixelDrain.py,sha256=1kf1kKKxcYwLVPo_8Fg1Za3E2kOplqqVFM41xBT52KY,992
29
+ KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
30
+ KekikStream/Extractors/RapidVid.py,sha256=MEffqeSsg6RK-KAWtNOXEw99LVisXgM-obQo8rKE-Ls,2353
31
+ KekikStream/Extractors/SibNet.py,sha256=Jrl93OdKwEhssG348-F2BKaj-XUS7v-Qw3dKMh_ZMRQ,878
32
+ KekikStream/Extractors/Sobreatsesuyp.py,sha256=MZTdRPx1i4O56pL3Q2QfakCHTUQ1v2lBN6ek-MkgsDw,1941
33
+ KekikStream/Extractors/TRsTX.py,sha256=KxcQsJ-sby90DdS1HtE-pQ0VygolvJUwp_192NWvQV0,2093
34
+ KekikStream/Extractors/TauVideo.py,sha256=ID-QwdPnl62wTECSzTFA8Z0P7Rv9LELd6xdvBz5ALiQ,1018
35
+ KekikStream/Extractors/TurboImgz.py,sha256=VXx9vZZRTdQiVNER0LcXm2nsv2OaXnxuPpslG-sEKD0,826
36
+ KekikStream/Extractors/VidMoly.py,sha256=m8a_doZiTYaTQTevAQ1mJh7LogYK9uWRIsoa841Zfx8,3350
37
+ KekikStream/Extractors/VidMoxy.py,sha256=_K6BA7Uo59DA3ty_tsayCUZjXmRoDBTghekVNXiuZ7g,1800
38
+ KekikStream/Extractors/VideoSeyred.py,sha256=FCTVKeQfivklVRljymg7CkdHR_FQgB9zHN-p3Diphfw,1764
39
+ KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
40
+ KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
41
+ KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
42
+ KekikStream/Managers/UIManager.py,sha256=OrGxzbhRPTCqiLEXjipLb8ChF7saV3fvFIUXLKT9w6Q,1612
43
+ KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
44
+ KekikStream/Plugins/DiziBox.py,sha256=RXw83392Nv-1F1wBC60fEakxo87CQP0CAuEhBNZoRig,5722
45
+ KekikStream/Plugins/FilmMakinesi.py,sha256=rz8TQeL41PJbeEmksgPHIhp6J-4vbSCBTeEH0ukExz4,2822
46
+ KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
47
+ KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
48
+ KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
49
+ KekikStream/Plugins/SineWix.py,sha256=ZtcIwPW0ONGkSjT7Ye8b71RWdHZMUZefX-JTWu6uGSs,4854
50
+ KekikStream/Plugins/UgurFilm.py,sha256=yYXee5uxwNnPqFJZ6s6cRkmUyqS3Vv8x-iesPalc4j4,2930
51
+ KekikStream-0.3.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
52
+ KekikStream-0.3.3.dist-info/METADATA,sha256=Mmln1g9uoz9U-N5qGAZ_w26MHGhhWElLZNhqv9HFuyU,3987
53
+ KekikStream-0.3.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
54
+ KekikStream-0.3.3.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
55
+ KekikStream-0.3.3.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
56
+ KekikStream-0.3.3.dist-info/RECORD,,
@@ -1,33 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import konsol
4
- from rich.panel import Panel
5
- from pkg_resources import get_distribution
6
- from requests import get
7
- from subprocess import check_call
8
- import sys
9
-
10
- def check_and_update_package(package_name: str):
11
- """Paketi kontrol et ve gerekirse güncelle."""
12
- try:
13
- # Mevcut sürümü al
14
- current_version = get_distribution(package_name).version
15
- konsol.print(Panel(f"[cyan]Yüklü sürüm:[/cyan] [bold yellow]{current_version}[/bold yellow]"))
16
-
17
- # PyPI'den en son sürümü al
18
- response = get(f"https://pypi.org/pypi/{package_name}/json")
19
- if response.status_code == 200:
20
- latest_version = response.json()["info"]["version"]
21
- konsol.print(Panel(f"[cyan]En son sürüm:[/cyan] [bold green]{latest_version}[/bold green]"))
22
-
23
- # Eğer güncel değilse güncelle
24
- if current_version != latest_version:
25
- konsol.print(f"[bold red]{package_name} güncelleniyor...[/bold red]")
26
- check_call([sys.executable, "-m", "pip", "install", "--upgrade", package_name, "--break-system-packages"])
27
- konsol.print(f"[bold green]{package_name} güncellendi![/bold green]")
28
- else:
29
- konsol.print(f"[bold green]{package_name} zaten güncel.[/bold green]")
30
- else:
31
- konsol.print("[bold red]PyPI'ye erişilemiyor. Güncelleme kontrolü atlanıyor.[/bold red]")
32
- except Exception as e:
33
- konsol.print(f"[bold red]Güncelleme kontrolü sırasında hata oluştu: {e}[/bold red]")
@@ -1,56 +0,0 @@
1
- KekikStream/__init__.py,sha256=SZzntUwOYPjSWgtjGmoF2Iu77Y_7A4BtgwV_UX-abHk,10341
2
- KekikStream/__main__.py,sha256=4U-NO1f0Mts5Mf_QnWhWqRbTsRBy2y2VPlpHyaqG9_I,137
3
- KekikStream/requirements.txt,sha256=gS_TUUQx5A7FUmRGxj2dQedxheD7qA6AswdUb2y_Ub8,70
4
- KekikStream/CLI/__init__.py,sha256=9YlF135BVff85y492hX4sq2WY2CNqa4BuVzF9hIIaKE,233
5
- KekikStream/CLI/check_update.py,sha256=rOa16bO9sGN-p78yaTRaccFoNfhHWEfDgGZNavpcwNI,1642
6
- KekikStream/Core/ExtractorBase.py,sha256=SPXKZPfpzvgkJeMds-USzgpm8-qb0vgZjjLDs58NfGU,1069
7
- KekikStream/Core/ExtractorLoader.py,sha256=1S0XaZDJnpFX9dUC4eoqRXx9la6Nlxk6EemJvvSknPA,3921
8
- KekikStream/Core/ExtractorModels.py,sha256=vJeh4qd05K7nbqdCCGU29UkGQpce6jXfsCm7LuDL1G8,454
9
- KekikStream/Core/MediaHandler.py,sha256=6n83qnM9C38xC4dp1Z8IjLM7gCBbuO84NYn78zeXbZE,3259
10
- KekikStream/Core/PluginBase.py,sha256=44sJRS8LqkOo0Ul7lE8R4A464wxyym4UplqkpMUJXqY,2511
11
- KekikStream/Core/PluginLoader.py,sha256=og5EPfnVqrb2kUkeGU65AY0fU43IbiUo_h3ix6ZiINY,2596
12
- KekikStream/Core/PluginModels.py,sha256=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
13
- KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
14
- KekikStream/Extractors/CloseLoad.py,sha256=YmDB3YvuDaCUbQ0T_tmhnkEsC5mSdEN6GNoAR662fl8,990
15
- KekikStream/Extractors/ContentX.py,sha256=t6E36ZB2qXUKqY5VSceTrUdw2s-Uv9LF3yjGt48Xfmc,2982
16
- KekikStream/Extractors/FourCX.py,sha256=4FrMj1IZBBpN_g1P6S3A-8eUu7QFwlt4fJXzJ7vfe0Q,221
17
- KekikStream/Extractors/FourPichive.py,sha256=iq3BCUbih1UVF4y4BIWO--0hX5jP2nxqesNx3MGP3kQ,234
18
- KekikStream/Extractors/FourPlayRu.py,sha256=wq1ylxKpsO_IBoYr_ALzB2dVrQpJ-jY9lf2zPhcAZX8,228
19
- KekikStream/Extractors/HDStreamAble.py,sha256=66n5EvIdX_or5cdnlJ_Uqmzi50n4rl9c5VCw8kBqhQk,245
20
- KekikStream/Extractors/Hotlinger.py,sha256=NFMRgUmb6BCrJfa7Hi0VarDNYvCeVknBWEk24FKBBa0,224
21
- KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
22
- KekikStream/Extractors/MixPlayHD.py,sha256=4sSHingB3gquakFesnbC0LmkJZWW2Jvv5F4kOdo58tA,1528
23
- KekikStream/Extractors/Odnoklassniki.py,sha256=xt8gWi750ykkWVkFiP6o7HQc-0RwrSx1FxxuoNUU-Js,3765
24
- KekikStream/Extractors/OkRuHTTP.py,sha256=L-B0i_i_Vnm61GvUfd6cGIW-o_H4M-C7DO_cdw2rQPU,228
25
- KekikStream/Extractors/OkRuSSL.py,sha256=FHJ5XZ1dO5ED3mIku3e3vnq8K0slrcr0jqhaUnHmfVk,227
26
- KekikStream/Extractors/PeaceMakerst.py,sha256=1l5Y5AQB_P53upVqgBuJTnjNV7nHVMr56tp673Q8omU,2123
27
- KekikStream/Extractors/Pichive.py,sha256=BSVYFwL3Ax6yGoS1WkpOWtngxNyuZLoKzpPwjibpu2s,221
28
- KekikStream/Extractors/PixelDrain.py,sha256=JLNaTdFJfXj5ExB_OjjyjwBZBD_gCOmL3fO_TWbHe90,998
29
- KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
30
- KekikStream/Extractors/RapidVid.py,sha256=HmSXDWhE1EXZRhNCxrqqEBbyJKbqFtTFRtq-zYg3G2c,2430
31
- KekikStream/Extractors/SibNet.py,sha256=w0Rv1cYB_Ho6M9Aho9n38Thp6mAfKPNe-eKFC_DbGuE,884
32
- KekikStream/Extractors/Sobreatsesuyp.py,sha256=7JUbqHLMWFkHuzH3NG2ogaV53e9fUmGvAr7h83yRtxs,1953
33
- KekikStream/Extractors/TRsTX.py,sha256=jhPcQq7KPxL0SPvEFL4MG7oDXDpBbt6Qh8vRJ_bLQMU,2105
34
- KekikStream/Extractors/TauVideo.py,sha256=bBjrZFSi4QqSJhRB0sDWMA0Saio-zpoAb6Ss4QZmBeY,1045
35
- KekikStream/Extractors/TurboImgz.py,sha256=0d9t6bj4prVt1_LIbzwcfuqrSRB7SMvc4RKvE25BtW4,851
36
- KekikStream/Extractors/VidMoly.py,sha256=uzYArLNLTI8mZpMsOABWUOhJtT3FaY6GBrDnQ3Oyl90,3424
37
- KekikStream/Extractors/VidMoxy.py,sha256=UnVrCEI4XNiONE2aLV9dGUhRqQ9ELJTnYVXyG81N11A,1800
38
- KekikStream/Extractors/VideoSeyred.py,sha256=Sx1qHNBMboGgU_bXHVgx3MlxtyKpR_LBJIQWX3nKxb4,1937
39
- KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
40
- KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
41
- KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
42
- KekikStream/Managers/UIManager.py,sha256=OrGxzbhRPTCqiLEXjipLb8ChF7saV3fvFIUXLKT9w6Q,1612
43
- KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
44
- KekikStream/Plugins/DiziBox.py,sha256=9iCAnHsbNdoz08CHrT_aBZiyj8j6THoXvwHGd3ikrMo,5791
45
- KekikStream/Plugins/FilmMakinesi.py,sha256=g4LRDP5Atn97PqbgnEdm0-wjVdXaJIVk1Ru0F8B66Ws,2902
46
- KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
47
- KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
48
- KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
49
- KekikStream/Plugins/SineWix.py,sha256=ZtcIwPW0ONGkSjT7Ye8b71RWdHZMUZefX-JTWu6uGSs,4854
50
- KekikStream/Plugins/UgurFilm.py,sha256=U7ryNWpjSZJWuYlMGX1Be9uuyiM3SfuI9VJcEiXedNs,2960
51
- KekikStream-0.3.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
52
- KekikStream-0.3.1.dist-info/METADATA,sha256=iQ8OchH0QGu7zSUNbzPVqRozp-zwoq3RmOssZWqlF7o,3987
53
- KekikStream-0.3.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
54
- KekikStream-0.3.1.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
55
- KekikStream-0.3.1.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
56
- KekikStream-0.3.1.dist-info/RECORD,,