KekikStream 0.2.4__py3-none-any.whl → 0.2.6__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.
@@ -0,0 +1,81 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
4
+ import re
5
+
6
+ class ContentX(ExtractorBase):
7
+ name = "ContentX"
8
+ main_url = "https://contentx.me"
9
+
10
+ async def extract(self, url, referer=None) -> list[ExtractResult]:
11
+ if referer:
12
+ self.oturum.headers.update({"Referer": referer})
13
+
14
+ istek = await self.oturum.get(url)
15
+ istek.raise_for_status()
16
+ i_source = istek.text
17
+
18
+ i_extract = re.search(r"window\.openPlayer\('([^']+)'\)", i_source)
19
+ if not i_extract:
20
+ raise ValueError("iExtract is null")
21
+ i_extract_value = i_extract.group(1)
22
+
23
+ subtitles = []
24
+ sub_urls = set()
25
+ for match in re.finditer(r'"file":"([^"]+)","label":"([^"]+)"', i_source):
26
+ sub_url, sub_lang = match.groups()
27
+
28
+ if sub_url in sub_urls:
29
+ continue
30
+ sub_urls.add(sub_url)
31
+
32
+ subtitles.append(
33
+ Subtitle(
34
+ name = sub_lang.replace("\\u0131", "ı")
35
+ .replace("\\u0130", "İ")
36
+ .replace("\\u00fc", "ü")
37
+ .replace("\\u00e7", "ç"),
38
+ url = self.fix_url(sub_url.replace("\\", ""))
39
+ )
40
+ )
41
+
42
+ vid_source_request = await self.oturum.get(f"{self.main_url}/source2.php?v={i_extract_value}", headers={"Referer": referer or self.main_url})
43
+ vid_source_request.raise_for_status()
44
+
45
+ vid_source = vid_source_request.text
46
+ vid_extract = re.search(r'file":"([^"]+)"', vid_source)
47
+ if not vid_extract:
48
+ raise ValueError("vidExtract is null")
49
+ m3u_link = vid_extract.group(1).replace("\\", "")
50
+
51
+ results = [
52
+ ExtractResult(
53
+ name = self.name,
54
+ url = m3u_link,
55
+ referer = url,
56
+ subtitles = subtitles
57
+ )
58
+ ]
59
+
60
+ i_dublaj = re.search(r',\"([^"]+)\",\"Türkçe"', i_source)
61
+ if i_dublaj:
62
+ dublaj_value = i_dublaj.group(1)
63
+ dublaj_source_request = await self.oturum.get(f"{self.main_url}/source2.php?v={dublaj_value}", headers={"Referer": referer or self.main_url})
64
+ dublaj_source_request.raise_for_status()
65
+
66
+ dublaj_source = dublaj_source_request.text
67
+ dublaj_extract = re.search(r'file":"([^"]+)"', dublaj_source)
68
+ if not dublaj_extract:
69
+ raise ValueError("dublajExtract is null")
70
+ dublaj_link = dublaj_extract.group(1).replace("\\", "")
71
+
72
+ results.append(
73
+ ExtractResult(
74
+ name = f"{self.name} Türkçe Dublaj",
75
+ url = dublaj_link,
76
+ referer = url,
77
+ subtitles = []
78
+ )
79
+ )
80
+
81
+ return results
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.ContentX import ContentX
4
+
5
+ class FourCX(ContentX):
6
+ name = "FourCX"
7
+ main_url = "https://four.contentx.me"
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.ContentX import ContentX
4
+
5
+ class FourPichive(ContentX):
6
+ name = "FourPichive"
7
+ main_url = "https://four.pichive.online"
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.ContentX import ContentX
4
+
5
+ class FourPlayRu(ContentX):
6
+ name = "FourPlayRu"
7
+ main_url = "https://four.playru.net"
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.PeaceMakerst import PeaceMakerst
4
+
5
+ class HDStreamAble(PeaceMakerst):
6
+ name = "HDStreamAble"
7
+ main_url = "https://hdstreamable.com"
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.ContentX import ContentX
4
+
5
+ class Hotlinger(ContentX):
6
+ name = "Hotlinger"
7
+ main_url = "https://hotlinger.com"
@@ -0,0 +1,43 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult
4
+ from Kekik.Sifreleme import AESManager
5
+ import re
6
+ import json
7
+
8
+ class MixPlayHD(ExtractorBase):
9
+ name = "MixPlayHD"
10
+ main_url = "https://mixplayhd.com"
11
+
12
+ async def extract(self, url, referer=None) -> ExtractResult:
13
+ if referer:
14
+ self.oturum.headers.update({"Referer": referer})
15
+
16
+ istek = await self.oturum.get(url)
17
+ istek.raise_for_status()
18
+
19
+ be_player_match = re.search(r"bePlayer\('([^']+)',\s*'(\{[^\}]+\})'\);", istek.text)
20
+ if not be_player_match:
21
+ raise ValueError("bePlayer not found in the response.")
22
+
23
+ be_player_pass = be_player_match.group(1)
24
+ be_player_data = be_player_match.group(2)
25
+
26
+ try:
27
+ decrypted_data = AESManager.decrypt(be_player_data, be_player_pass).replace("\\", "")
28
+ decrypted_json = json.loads(decrypted_data)
29
+ except Exception as e:
30
+ raise RuntimeError(f"Decryption failed: {e}")
31
+
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
+ )
@@ -0,0 +1,94 @@
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 Odnoklassniki(ExtractorBase):
8
+ name = "Odnoklassniki"
9
+ main_url = "https://odnoklassniki.ru"
10
+
11
+ async def extract(self, url, referer=None) -> ExtractResult:
12
+ if referer:
13
+ self.oturum.headers.update({"Referer": referer})
14
+
15
+ self.oturum.headers.update({
16
+ "User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"
17
+ })
18
+
19
+ try:
20
+ # İlk isteği yap, ancak yönlendirmeyi manuel olarak kontrol et.
21
+ istek = await self.oturum.get(url, follow_redirects=False)
22
+ if istek.status_code == 302: # Yönlendirme varsa
23
+ redirected_url = istek.headers.get("Location")
24
+ if not redirected_url:
25
+ raise ValueError("Redirect location not found.")
26
+
27
+ # Yönlendirilmiş URL'yi kullanarak isteği yeniden yap.
28
+ url = redirected_url if redirected_url.startswith("http") else f"https://{redirected_url}"
29
+ istek = await self.oturum.get(url)
30
+
31
+ istek.raise_for_status()
32
+ except Exception as e:
33
+ raise RuntimeError(f"Failed to fetch the URL: {url}, Error: {e}")
34
+
35
+ response_text = (
36
+ istek.text.replace("\\"", "\"")
37
+ .replace("\\\\", "\\")
38
+ .replace(r"\\u", "\\u")
39
+ )
40
+ response_text = re.sub(
41
+ r"\\u([0-9A-Fa-f]{4})",
42
+ lambda match: chr(int(match.group(1), 16)),
43
+ response_text
44
+ )
45
+
46
+ videos_match = re.search(r'"videos":(\[.*?\])', response_text)
47
+ if not videos_match:
48
+ raise ValueError("No video data found in the response.")
49
+
50
+ videos_str = videos_match.group(1)
51
+ try:
52
+ videos = json.loads(videos_str)
53
+ except json.JSONDecodeError:
54
+ raise ValueError("Failed to parse video data.")
55
+
56
+ quality_order = {
57
+ "ULTRA": 6, # 4K veya daha yüksek
58
+ "QUAD": 5, # 1440p
59
+ "FULL": 4, # 1080p
60
+ "HD": 3, # 720p
61
+ "SD": 2, # 480p
62
+ "LOW": 1, # 360p
63
+ "MOBILE": 0 # 144p
64
+ }
65
+
66
+ # Kaliteye göre en iyi videoyu seçme
67
+ best_video = None
68
+ best_quality_score = -1
69
+
70
+ for video in videos:
71
+ video_url = video.get("url")
72
+ quality_name = video.get("name", "").upper()
73
+
74
+ if not video_url or not quality_name:
75
+ continue
76
+
77
+ # Kalite sıralamasına göre puanla
78
+ quality_score = quality_order.get(quality_name, -1)
79
+ if quality_score > best_quality_score:
80
+ best_quality_score = quality_score
81
+ best_video = video_url
82
+
83
+ if not best_video:
84
+ raise ValueError("No valid video URLs found.")
85
+
86
+ if best_video.startswith("//"):
87
+ best_video = f"https:{best_video}"
88
+
89
+ return ExtractResult(
90
+ name = self.name,
91
+ url = best_video,
92
+ referer = self.main_url,
93
+ subtitles = []
94
+ )
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.Odnoklassniki import Odnoklassniki
4
+
5
+ class OkRuHTTP(Odnoklassniki):
6
+ name = "OkRuHTTP"
7
+ main_url = "http://ok.ru"
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.Odnoklassniki import Odnoklassniki
4
+
5
+ class OkRuSSL(Odnoklassniki):
6
+ name = "OkRuSSL"
7
+ main_url = "https://ok.ru"
@@ -0,0 +1,59 @@
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 PeaceMakerst(ExtractorBase):
8
+ name = "PeaceMakerst"
9
+ main_url = "https://peacemakerst.com"
10
+
11
+ async def extract(self, url, referer=None) -> ExtractResult:
12
+ if referer:
13
+ self.oturum.headers.update({"Referer": referer})
14
+
15
+ self.oturum.headers.update({
16
+ "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",
17
+ "X-Requested-With" : "XMLHttpRequest"
18
+ })
19
+
20
+ response = await self.oturum.post(
21
+ url = f"{url}?do=getVideo",
22
+ data = {
23
+ "hash" : url.split("video/")[-1],
24
+ "r" : referer or "",
25
+ "s" : ""
26
+ }
27
+ )
28
+ response.raise_for_status()
29
+
30
+ response_text = response.text
31
+ m3u_link = None
32
+
33
+ if "teve2.com.tr\\/embed\\/" in response_text:
34
+ teve2_id = re.search(r"teve2\.com\.tr\\\/embed\\\/(\d+)", response_text).group(1)
35
+ teve2_url = f"https://www.teve2.com.tr/action/media/{teve2_id}"
36
+
37
+ teve2_response = await self.oturum.get(teve2_url, headers={"Referer": f"https://www.teve2.com.tr/embed/{teve2_id}"})
38
+ teve2_response.raise_for_status()
39
+ teve2_json = teve2_response.json()
40
+
41
+ m3u_link = f"{teve2_json['Media']['Link']['ServiceUrl']}//{teve2_json['Media']['Link']['SecurePath']}"
42
+ else:
43
+ try:
44
+ video_response = response.json()
45
+ video_sources = video_response.get("videoSources", [])
46
+ if video_sources:
47
+ m3u_link = video_sources[-1]["file"]
48
+ except (json.JSONDecodeError, KeyError):
49
+ raise ValueError("Peace response is invalid or null.")
50
+
51
+ if not m3u_link:
52
+ raise ValueError("m3u link not found.")
53
+
54
+ return ExtractResult(
55
+ name = self.name,
56
+ url = m3u_link,
57
+ referer = url,
58
+ subtitles = []
59
+ )
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.ContentX import ContentX
4
+
5
+ class Pichive(ContentX):
6
+ name = "Pichive"
7
+ main_url = "https://pichive.online"
@@ -0,0 +1,7 @@
1
+ # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Extractors.ContentX import ContentX
4
+
5
+ class PlayRu(ContentX):
6
+ name = "PlayRu"
7
+ main_url = "https://playru.net"
@@ -14,24 +14,23 @@ class VidMoly(ExtractorBase):
14
14
  if referer:
15
15
  self.oturum.headers.update({"Referer": referer})
16
16
 
17
- headers = {
18
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
19
- "Sec-Fetch-Dest": "iframe",
20
- }
17
+ self.oturum.headers.update({
18
+ "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
19
+ "Sec-Fetch-Dest" : "iframe",
20
+ })
21
21
 
22
22
  # Embed URL oluştur
23
- embed_url = (
24
- url.replace("/w/", "/embed-") + "-920x360.html" if "/w/" in url else url
25
- )
23
+ embed_url = url.replace("/w/", "/embed-") + "-920x360.html" if "/w/" in url else url
26
24
  script_content = None
27
- attempts = 0
25
+ attempts = 0
28
26
 
29
27
  # Script verisini almak için deneme yap
30
28
  while attempts < 10 and not script_content:
31
29
  attempts += 1
32
- response = await self.oturum.get(embed_url, headers=headers)
30
+ response = await self.oturum.get(embed_url)
33
31
  response.raise_for_status()
34
- script_match = re.search(r"sources:\s*\[(.*?)\],", response.text, re.DOTALL)
32
+
33
+ script_match = re.search(r"sources:\s*\[(.*?)\],", response.text, re.DOTALL)
35
34
  script_content = script_match.group(1) if script_match else None
36
35
  if not script_content:
37
36
  await asyncio.sleep(0.5)
@@ -58,11 +57,11 @@ class VidMoly(ExtractorBase):
58
57
  subtitle_sources = json.loads(f"[{subtitle_data}]")
59
58
  subtitles = [
60
59
  Subtitle(
61
- name=sub.get("label"),
62
- url=self.fix_url(sub.get("file")),
60
+ name = sub.get("label"),
61
+ url = self.fix_url(sub.get("file")),
63
62
  )
64
- for sub in subtitle_sources
65
- if sub.get("kind") == "captions"
63
+ for sub in subtitle_sources
64
+ if sub.get("kind") == "captions"
66
65
  ]
67
66
  except json.JSONDecodeError:
68
67
  pass
@@ -80,10 +79,10 @@ class VidMoly(ExtractorBase):
80
79
 
81
80
  await self.close()
82
81
  return ExtractResult(
83
- name=self.name,
84
- url=video_url,
85
- referer=self.main_url,
86
- subtitles=subtitles,
82
+ name = self.name,
83
+ url = video_url,
84
+ referer = self.main_url,
85
+ subtitles = subtitles
87
86
  )
88
87
 
89
88
  def _add_marks(self, text: str, field: str) -> str:
@@ -0,0 +1,53 @@
1
+ # ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
4
+ import json
5
+
6
+ class VideoSeyred(ExtractorBase):
7
+ name = "VideoSeyred"
8
+ main_url = "https://videoseyred.in"
9
+
10
+ async def extract(self, url, referer=None) -> ExtractResult:
11
+ if referer:
12
+ self.oturum.headers.update({"Referer": referer})
13
+
14
+ video_id = url.split("embed/")[1].split("?")[0]
15
+ video_url = f"{self.main_url}/playlist/{video_id}.json"
16
+
17
+ response = await self.oturum.get(video_url)
18
+ response.raise_for_status()
19
+
20
+ try:
21
+ response_list = json.loads(response.text)
22
+ if not response_list:
23
+ raise ValueError("Empty response from VideoSeyred.")
24
+ response_data = response_list[0]
25
+ except (json.JSONDecodeError, IndexError) as e:
26
+ raise RuntimeError(f"Failed to parse response: {e}")
27
+
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
+ )
47
+ )
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
@@ -13,7 +13,7 @@ class UIManager:
13
13
 
14
14
  @staticmethod
15
15
  async def select_from_list(message, choices):
16
- return await inquirer.select(message=message, choices=choices, max_height="60%").execute_async()
16
+ return await inquirer.select(message=message, choices=choices, max_height="75%").execute_async()
17
17
 
18
18
  @staticmethod
19
19
  async def select_from_fuzzy(message, choices):
@@ -22,7 +22,7 @@ class UIManager:
22
22
  choices = choices,
23
23
  validate = lambda result: result in [choice if isinstance(choice, str) else choice["value"] for choice in choices],
24
24
  filter = lambda result: result,
25
- max_height = "60%"
25
+ max_height = "75%"
26
26
  ).execute_async()
27
27
 
28
28
  @staticmethod
@@ -50,6 +50,9 @@ class SineWix(PluginBase):
50
50
  episodes = []
51
51
  for season in veri.get("seasons"):
52
52
  for episode in season.get("episodes"):
53
+ if not episode.get("videos"):
54
+ continue
55
+
53
56
  ep_model = Episode(
54
57
  season = season.get("season_number"),
55
58
  episode = episode.get("episode_number"),
KekikStream/__init__.py CHANGED
@@ -25,6 +25,20 @@ class KekikStream:
25
25
  finally:
26
26
  await self.plugin_manager.close_plugins()
27
27
 
28
+ async def handle_no_results(self):
29
+ action = await self.ui_manager.select_from_list(
30
+ message = "Ne yapmak istersiniz?",
31
+ choices = ["Geri Git", "Ana Menü", "Çıkış"]
32
+ )
33
+
34
+ match action:
35
+ case "Geri Git":
36
+ await self.search_all()
37
+ case "Ana Menü":
38
+ await self.run()
39
+ case "Çıkış":
40
+ cikis_yap(False)
41
+
28
42
  async def select_plugin(self):
29
43
  plugin_name = await self.ui_manager.select_from_fuzzy(
30
44
  message = "Arama yapılacak eklentiyi seçin:",
@@ -113,6 +127,10 @@ class KekikStream:
113
127
  await self.show_options(links)
114
128
 
115
129
  async def show_options(self, links):
130
+ if not links:
131
+ konsol.print("[bold red]Hiçbir bağlantı bulunamadı![/bold red]")
132
+ return await self.handle_no_results()
133
+
116
134
  mapping = self.extractor_manager.map_links_to_extractors(links)
117
135
  has_play_method = hasattr(self.current_plugin, "play") and callable(getattr(self.current_plugin, "play", None))
118
136
  # ! DEBUG
@@ -120,7 +138,7 @@ class KekikStream:
120
138
  if not mapping and not has_play_method:
121
139
  konsol.print("[bold red]Hiçbir Extractor bulunamadı![/bold red]")
122
140
  konsol.print(links)
123
- return
141
+ return await self.handle_no_results()
124
142
 
125
143
  if not mapping:
126
144
  selected_link = await self.ui_manager.select_from_list(
@@ -146,7 +164,7 @@ class KekikStream:
146
164
  await self.play_media(selected_link)
147
165
 
148
166
  case "Geri Git":
149
- await self.search()
167
+ await self.search_all()
150
168
 
151
169
  case _:
152
170
  await self.run()
@@ -203,6 +221,7 @@ class KekikStream:
203
221
 
204
222
  if not all_results:
205
223
  konsol.print("[bold red]Hiçbir sonuç bulunamadı![/bold red]")
224
+ await self.handle_no_results()
206
225
  return []
207
226
 
208
227
  return all_results
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: KekikStream
3
- Version: 0.2.4
3
+ Version: 0.2.6
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=51EpuqJ5H7CU9aA-K2V1DN2iOF9eRp_y776mhv1E8ls,9328
1
+ KekikStream/__init__.py,sha256=9oTVlq0MbL5E5w_mSPjuC3Fi4dYn_Mgzww3fld3zjiQ,9993
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
@@ -12,30 +12,44 @@ KekikStream/Core/PluginLoader.py,sha256=og5EPfnVqrb2kUkeGU65AY0fU43IbiUo_h3ix6Zi
12
12
  KekikStream/Core/PluginModels.py,sha256=WWPEz8PpZZ4bLMDJzTE19BsQEJObkyhaYjDkyLaF2Ck,2365
13
13
  KekikStream/Core/__init__.py,sha256=HZpXs3MKy4joO0sDpIGcZ2DrUKwK49IKG-GQgKbO2jk,416
14
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
15
21
  KekikStream/Extractors/MailRu.py,sha256=lB3Xy912EaSEUw7Im65L5TwtIeM7OLFV1_9lan39g40,1308
22
+ KekikStream/Extractors/MixPlayHD.py,sha256=4sSHingB3gquakFesnbC0LmkJZWW2Jvv5F4kOdo58tA,1528
23
+ KekikStream/Extractors/Odnoklassniki.py,sha256=rP9jzJ42PGyguoEckpm-9nMtfqyXTN2lVzWgG-WYVaI,3296
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
16
28
  KekikStream/Extractors/PixelDrain.py,sha256=JLNaTdFJfXj5ExB_OjjyjwBZBD_gCOmL3fO_TWbHe90,998
29
+ KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
17
30
  KekikStream/Extractors/RapidVid.py,sha256=HmSXDWhE1EXZRhNCxrqqEBbyJKbqFtTFRtq-zYg3G2c,2430
18
31
  KekikStream/Extractors/SibNet.py,sha256=w0Rv1cYB_Ho6M9Aho9n38Thp6mAfKPNe-eKFC_DbGuE,884
19
32
  KekikStream/Extractors/Sobreatsesuyp.py,sha256=7JUbqHLMWFkHuzH3NG2ogaV53e9fUmGvAr7h83yRtxs,1953
20
33
  KekikStream/Extractors/TRsTX.py,sha256=jhPcQq7KPxL0SPvEFL4MG7oDXDpBbt6Qh8vRJ_bLQMU,2105
21
34
  KekikStream/Extractors/TauVideo.py,sha256=bBjrZFSi4QqSJhRB0sDWMA0Saio-zpoAb6Ss4QZmBeY,1045
22
35
  KekikStream/Extractors/TurboImgz.py,sha256=0d9t6bj4prVt1_LIbzwcfuqrSRB7SMvc4RKvE25BtW4,851
23
- KekikStream/Extractors/VidMoly.py,sha256=a2ElfpEcTWBpBT0mADWcEF2T8l9WjAEuX8Dux0hiYrU,3390
36
+ KekikStream/Extractors/VidMoly.py,sha256=uzYArLNLTI8mZpMsOABWUOhJtT3FaY6GBrDnQ3Oyl90,3424
24
37
  KekikStream/Extractors/VidMoxy.py,sha256=UnVrCEI4XNiONE2aLV9dGUhRqQ9ELJTnYVXyG81N11A,1800
38
+ KekikStream/Extractors/VideoSeyred.py,sha256=Sx1qHNBMboGgU_bXHVgx3MlxtyKpR_LBJIQWX3nKxb4,1937
25
39
  KekikStream/Managers/ExtractorManager.py,sha256=9rGlUsnedJ7fwIeObN5Vsm8H5VLal0ODO7F93dDRx8w,976
26
40
  KekikStream/Managers/MediaManager.py,sha256=F7mkSvAttAaMHRvnDcxnV2K1D_sK644BCSrEaAmMl_U,522
27
41
  KekikStream/Managers/PluginManager.py,sha256=YDBLHB_Fh79A3Pei0ny2KLVY4VSihdNiKBh_w5tBl-0,637
28
- KekikStream/Managers/UIManager.py,sha256=RNsvfwker2Pwel9Ur14Bo0oY7Xg5XmlpvFAWdHQJJMc,1590
42
+ KekikStream/Managers/UIManager.py,sha256=PmGabWjHACnaOZLyIfOd0j4cfqpuV34RO58QeeIbF6E,1590
29
43
  KekikStream/Managers/__init__.py,sha256=3085I_9Sa2L_Vq6Z-QvYUYn1BapkN4sQqBo8ITZoD_4,251
30
44
  KekikStream/Plugins/FilmMakinesi.py,sha256=g4LRDP5Atn97PqbgnEdm0-wjVdXaJIVk1Ru0F8B66Ws,2902
31
45
  KekikStream/Plugins/FullHDFilmizlesene.py,sha256=HJzHDXHhhMpvXxiD2SjpoZEYs7dmnPymE8EXCSvLKVo,3106
32
46
  KekikStream/Plugins/JetFilmizle.py,sha256=DPdvTEns8r2MI9pHY8d9EEsUZmlQU7N2C9yr8ox80qU,4016
33
47
  KekikStream/Plugins/SezonlukDizi.py,sha256=5BZVzQ2eQtymHxO0bzjA2ho4FFNahPFQly4hoHuH8lo,4441
34
- KekikStream/Plugins/SineWix.py,sha256=RJxggTrZxBimQHI4ehtJipVeIBpfHy85NW-ixE2iF2k,4762
48
+ KekikStream/Plugins/SineWix.py,sha256=ZtcIwPW0ONGkSjT7Ye8b71RWdHZMUZefX-JTWu6uGSs,4854
35
49
  KekikStream/Plugins/UgurFilm.py,sha256=U7ryNWpjSZJWuYlMGX1Be9uuyiM3SfuI9VJcEiXedNs,2960
36
- KekikStream-0.2.4.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
37
- KekikStream-0.2.4.dist-info/METADATA,sha256=pSLDjBdGobd9AgKWe-LgcePL6drmPglNSMIwskFS5gI,3959
38
- KekikStream-0.2.4.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
39
- KekikStream-0.2.4.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
40
- KekikStream-0.2.4.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
41
- KekikStream-0.2.4.dist-info/RECORD,,
50
+ KekikStream-0.2.6.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
51
+ KekikStream-0.2.6.dist-info/METADATA,sha256=nK2CRluVQ5_BU8FG7jfDzFkQRWOQrmsE580vh_-Mvzc,3959
52
+ KekikStream-0.2.6.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
53
+ KekikStream-0.2.6.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
54
+ KekikStream-0.2.6.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
55
+ KekikStream-0.2.6.dist-info/RECORD,,