KekikStream 0.1.6__py3-none-any.whl → 0.1.8__py3-none-any.whl

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