KekikStream 1.7.6__py3-none-any.whl → 1.9.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- KekikStream/Core/Extractor/ExtractorBase.py +2 -14
- KekikStream/Core/Extractor/ExtractorModels.py +5 -7
- KekikStream/Core/Media/MediaHandler.py +44 -26
- KekikStream/Core/Media/MediaManager.py +0 -3
- KekikStream/Core/Plugin/PluginBase.py +2 -15
- KekikStream/Core/Plugin/PluginModels.py +25 -26
- KekikStream/Extractors/CloseLoad.py +1 -2
- KekikStream/Extractors/ContentX.py +0 -2
- KekikStream/Extractors/DzenRu.py +0 -1
- KekikStream/Extractors/ExPlay.py +0 -1
- KekikStream/Extractors/FirePlayer.py +4 -5
- KekikStream/Extractors/HDPlayerSystem.py +0 -1
- KekikStream/Extractors/JetTv.py +0 -1
- KekikStream/Extractors/MailRu.py +1 -2
- KekikStream/Extractors/MixPlayHD.py +0 -1
- KekikStream/Extractors/MixTiger.py +1 -5
- KekikStream/Extractors/MolyStream.py +5 -5
- KekikStream/Extractors/Odnoklassniki.py +6 -6
- KekikStream/Extractors/PeaceMakerst.py +0 -1
- KekikStream/Extractors/PixelDrain.py +0 -1
- KekikStream/Extractors/PlayerFilmIzle.py +5 -5
- KekikStream/Extractors/RapidVid.py +0 -1
- KekikStream/Extractors/SetPlay.py +0 -1
- KekikStream/Extractors/SetPrime.py +0 -1
- KekikStream/Extractors/SibNet.py +0 -1
- KekikStream/Extractors/Sobreatsesuyp.py +0 -1
- KekikStream/Extractors/TRsTX.py +0 -1
- KekikStream/Extractors/TauVideo.py +0 -1
- KekikStream/Extractors/TurboImgz.py +0 -1
- KekikStream/Extractors/TurkeyPlayer.py +5 -5
- KekikStream/Extractors/VidHide.py +5 -5
- KekikStream/Extractors/VidMoly.py +0 -1
- KekikStream/Extractors/VidMoxy.py +0 -1
- KekikStream/Extractors/VidPapi.py +0 -1
- KekikStream/Extractors/VideoSeyred.py +0 -1
- KekikStream/Extractors/YTDLP.py +109 -0
- KekikStream/Extractors/YildizKisaFilm.py +0 -1
- KekikStream/Plugins/DiziBox.py +3 -8
- KekikStream/Plugins/DiziPal.py +5 -5
- KekikStream/Plugins/DiziYou.py +44 -19
- KekikStream/Plugins/Dizilla.py +38 -27
- KekikStream/Plugins/FilmBip.py +1 -1
- KekikStream/Plugins/FilmMakinesi.py +1 -5
- KekikStream/Plugins/FilmModu.py +3 -3
- KekikStream/Plugins/FullHDFilmizlesene.py +1 -5
- KekikStream/Plugins/HDFilmCehennemi.py +14 -21
- KekikStream/Plugins/JetFilmizle.py +2 -6
- KekikStream/Plugins/RecTV.py +12 -16
- KekikStream/Plugins/RoketDizi.py +105 -93
- KekikStream/Plugins/SelcukFlix.py +160 -67
- KekikStream/Plugins/SezonlukDizi.py +1 -5
- KekikStream/Plugins/SineWix.py +4 -8
- KekikStream/Plugins/Sinefy.py +72 -51
- KekikStream/Plugins/SinemaCX.py +4 -4
- KekikStream/Plugins/Sinezy.py +74 -42
- KekikStream/Plugins/UgurFilm.py +2 -6
- KekikStream/__init__.py +5 -8
- KekikStream/requirements.txt +2 -3
- kekikstream-1.9.0.dist-info/METADATA +290 -0
- kekikstream-1.9.0.dist-info/RECORD +86 -0
- kekikstream-1.7.6.dist-info/METADATA +0 -110
- kekikstream-1.7.6.dist-info/RECORD +0 -85
- {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/WHEEL +0 -0
- {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/entry_points.txt +0 -0
- {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/top_level.txt +0 -0
KekikStream/Plugins/Sinezy.py
CHANGED
|
@@ -5,95 +5,127 @@ from parsel import Selector
|
|
|
5
5
|
import re, base64
|
|
6
6
|
|
|
7
7
|
class Sinezy(PluginBase):
|
|
8
|
-
name
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
name = "Sinezy"
|
|
9
|
+
language = "tr"
|
|
10
|
+
main_url = "https://sinezy.fit"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Yerli ve yabancı film izle! Türkçe Dublaj ve Alt Yazılı Seçenekleriyle full hd film izlemek için En çok tercih edilen adres!"
|
|
13
|
+
|
|
12
14
|
main_page = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
|
|
16
|
+
f"{main_url}/izle/en-yi-filmler/" : "En İyi Filmler",
|
|
17
|
+
f"{main_url}/izle/aksiyon-filmleri/" : "Aksiyon ",
|
|
18
|
+
f"{main_url}/izle/animasyon-filmleri/" : "Animasyon",
|
|
19
|
+
f"{main_url}/izle/belgesel-izle/" : "Belgesel",
|
|
20
|
+
f"{main_url}/izle/bilim-kurgu-filmleri/" : "Bilim Kurgu ",
|
|
21
|
+
f"{main_url}/izle/biyografi-filmleri/" : "Biyografi ",
|
|
22
|
+
f"{main_url}/izle/dram-filmleri/" : "Dram",
|
|
23
|
+
f"{main_url}/izle/erotik-film-izle/" : "Erotik ",
|
|
24
|
+
f"{main_url}/izle/fantastik-filmler/" : "Fantastik",
|
|
25
|
+
f"{main_url}/izle/gelecek-filmler/" : "Yakında",
|
|
26
|
+
f"{main_url}/izle/gerilim-filmleri/" : "Gerilim ",
|
|
27
|
+
f"{main_url}/izle/gizem-filmleri/" : "Gizem ",
|
|
28
|
+
f"{main_url}/izle/komedi-filmleri/" : "Komedi ",
|
|
29
|
+
f"{main_url}/izle/korku-filmleri/" : "Korku ",
|
|
30
|
+
f"{main_url}/izle/macera-filmleri/" : "Macera ",
|
|
31
|
+
f"{main_url}/izle/muzikal-izle/" : "Müzikal",
|
|
32
|
+
f"{main_url}/izle/romantik-film/" : "Romantik ",
|
|
33
|
+
f"{main_url}/izle/savas-filmleri/" : "Savaş ",
|
|
34
|
+
f"{main_url}/izle/spor-filmleri/" : "Spor ",
|
|
35
|
+
f"{main_url}/izle/suc-filmleri/" : "Suç ",
|
|
36
|
+
f"{main_url}/izle/tarih-filmleri/" : "Tarih ",
|
|
37
|
+
f"{main_url}/izle/turkce-altyazili-promo/" : "Altyazılı Pro",
|
|
38
|
+
f"{main_url}/izle/yabanci-dizi/" : "Yabancı Dizi",
|
|
39
|
+
f"{main_url}/izle/en-iyi-filmler/" : "En İyi Filmler",
|
|
40
|
+
f"{main_url}/izle/en-yeni-filmler/" : "Yeni Filmler",
|
|
41
|
+
f"{main_url}/izle/yerli-filmler/" : "Yerli Filmler",
|
|
42
|
+
f"{main_url}/izle/yetiskin-film/" : "Yetişkin +18",
|
|
15
43
|
}
|
|
16
44
|
|
|
17
45
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
18
|
-
full_url = f"{
|
|
19
|
-
resp
|
|
20
|
-
sel
|
|
46
|
+
full_url = f"{url}page/{page}/"
|
|
47
|
+
resp = await self.httpx.get(full_url)
|
|
48
|
+
sel = Selector(resp.text)
|
|
21
49
|
|
|
22
50
|
results = []
|
|
23
51
|
for item in sel.css("div.container div.content div.movie_box.move_k"):
|
|
24
|
-
title
|
|
25
|
-
href
|
|
26
|
-
poster= item.css("img::attr(data-src)").get()
|
|
52
|
+
title = item.css("a::attr(title)").get()
|
|
53
|
+
href = item.css("a::attr(href)").get()
|
|
54
|
+
poster = item.css("img::attr(data-src)").get()
|
|
27
55
|
|
|
28
56
|
if title and href:
|
|
29
57
|
results.append(MainPageResult(
|
|
30
|
-
category=category,
|
|
31
|
-
title=title,
|
|
32
|
-
url=self.fix_url(href),
|
|
33
|
-
poster=self.fix_url(poster)
|
|
58
|
+
category = category,
|
|
59
|
+
title = title,
|
|
60
|
+
url = self.fix_url(href),
|
|
61
|
+
poster = self.fix_url(poster)
|
|
34
62
|
))
|
|
63
|
+
|
|
35
64
|
return results
|
|
36
65
|
|
|
37
66
|
async def search(self, query: str) -> list[SearchResult]:
|
|
38
|
-
url
|
|
67
|
+
url = f"{self.main_url}/arama/?s={query}"
|
|
39
68
|
resp = await self.httpx.get(url)
|
|
40
|
-
sel
|
|
41
|
-
|
|
69
|
+
sel = Selector(resp.text)
|
|
70
|
+
|
|
42
71
|
results = []
|
|
43
72
|
for item in sel.css("div.movie_box.move_k"):
|
|
44
|
-
title
|
|
45
|
-
href
|
|
46
|
-
poster= item.css("img::attr(data-src)").get()
|
|
47
|
-
|
|
73
|
+
title = item.css("a::attr(title)").get()
|
|
74
|
+
href = item.css("a::attr(href)").get()
|
|
75
|
+
poster = item.css("img::attr(data-src)").get()
|
|
76
|
+
|
|
48
77
|
if title and href:
|
|
49
78
|
results.append(SearchResult(
|
|
50
|
-
title=title,
|
|
51
|
-
url=self.fix_url(href),
|
|
52
|
-
poster=self.fix_url(poster)
|
|
79
|
+
title = title,
|
|
80
|
+
url = self.fix_url(href),
|
|
81
|
+
poster = self.fix_url(poster)
|
|
53
82
|
))
|
|
83
|
+
|
|
54
84
|
return results
|
|
55
85
|
|
|
56
86
|
async def load_item(self, url: str) -> MovieInfo:
|
|
57
87
|
resp = await self.httpx.get(url)
|
|
58
88
|
sel = Selector(resp.text)
|
|
59
|
-
|
|
89
|
+
|
|
60
90
|
title = sel.css("div.detail::attr(title)").get()
|
|
61
91
|
poster = sel.css("div.move_k img::attr(data-src)").get()
|
|
62
92
|
description = sel.css("div.desc.yeniscroll p::text").get()
|
|
63
93
|
rating = sel.css("span.info span.imdb::text").get()
|
|
64
|
-
|
|
65
|
-
tags
|
|
66
|
-
actors = sel.css("span.oyn p::text").getall()
|
|
67
|
-
|
|
94
|
+
|
|
95
|
+
tags = sel.css("div.detail span a::text").getall()
|
|
96
|
+
actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
|
|
97
|
+
|
|
68
98
|
return MovieInfo(
|
|
69
|
-
title=title,
|
|
70
|
-
url=url,
|
|
71
|
-
poster=self.fix_url(poster),
|
|
72
|
-
description=description,
|
|
73
|
-
tags=tags,
|
|
74
|
-
rating=rating,
|
|
75
|
-
actors=actors
|
|
99
|
+
title = title,
|
|
100
|
+
url = url,
|
|
101
|
+
poster = self.fix_url(poster),
|
|
102
|
+
description = description,
|
|
103
|
+
tags = tags,
|
|
104
|
+
rating = rating,
|
|
105
|
+
actors = actors
|
|
76
106
|
)
|
|
77
107
|
|
|
78
108
|
async def load_links(self, url: str) -> list[dict]:
|
|
79
109
|
resp = await self.httpx.get(url)
|
|
80
|
-
|
|
110
|
+
|
|
81
111
|
match = re.search(r"ilkpartkod\s*=\s*'([^']+)'", resp.text, re.IGNORECASE)
|
|
82
112
|
if match:
|
|
83
113
|
encoded = match.group(1)
|
|
84
114
|
try:
|
|
85
115
|
decoded = base64.b64decode(encoded).decode('utf-8')
|
|
86
116
|
iframe_match = re.search(r'src="([^"]*)"', decoded)
|
|
117
|
+
|
|
87
118
|
if iframe_match:
|
|
88
119
|
iframe = iframe_match.group(1)
|
|
89
120
|
iframe = self.fix_url(iframe)
|
|
90
121
|
|
|
91
122
|
extractor = self.ex_manager.find_extractor(iframe)
|
|
123
|
+
|
|
92
124
|
return [{
|
|
93
|
-
"url": iframe,
|
|
94
|
-
"name": extractor.name if extractor else "Iframe"
|
|
125
|
+
"url" : iframe,
|
|
126
|
+
"name" : extractor.name if extractor else "Iframe"
|
|
95
127
|
}]
|
|
96
128
|
except Exception:
|
|
97
129
|
pass
|
|
98
|
-
|
|
130
|
+
|
|
99
131
|
return []
|
KekikStream/Plugins/UgurFilm.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo
|
|
4
4
|
from parsel import Selector
|
|
5
5
|
|
|
6
6
|
class UgurFilm(PluginBase):
|
|
@@ -23,9 +23,8 @@ class UgurFilm(PluginBase):
|
|
|
23
23
|
f"{main_url}/category/erotik/page/" : "Erotik"
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
#@kekik_cache(ttl=60*60)
|
|
27
26
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
28
|
-
istek = await self.httpx.get(f"{url}{page}",
|
|
27
|
+
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
29
28
|
secici = Selector(istek.text)
|
|
30
29
|
|
|
31
30
|
return [
|
|
@@ -38,7 +37,6 @@ class UgurFilm(PluginBase):
|
|
|
38
37
|
for veri in secici.css("div.icerik div") if veri.css("span:nth-child(1)::text").get()
|
|
39
38
|
]
|
|
40
39
|
|
|
41
|
-
#@kekik_cache(ttl=60*60)
|
|
42
40
|
async def search(self, query: str) -> list[SearchResult]:
|
|
43
41
|
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
44
42
|
secici = Selector(istek.text)
|
|
@@ -60,7 +58,6 @@ class UgurFilm(PluginBase):
|
|
|
60
58
|
|
|
61
59
|
return results
|
|
62
60
|
|
|
63
|
-
#@kekik_cache(ttl=60*60)
|
|
64
61
|
async def load_item(self, url: str) -> MovieInfo:
|
|
65
62
|
istek = await self.httpx.get(url)
|
|
66
63
|
secici = Selector(istek.text)
|
|
@@ -82,7 +79,6 @@ class UgurFilm(PluginBase):
|
|
|
82
79
|
actors = actors,
|
|
83
80
|
)
|
|
84
81
|
|
|
85
|
-
#@kekik_cache(ttl=15*60)
|
|
86
82
|
async def load_links(self, url: str) -> list[dict]:
|
|
87
83
|
istek = await self.httpx.get(url)
|
|
88
84
|
secici = Selector(istek.text)
|
KekikStream/__init__.py
CHANGED
|
@@ -268,10 +268,11 @@ class KekikStream:
|
|
|
268
268
|
self.update_title(selected.get("name"))
|
|
269
269
|
|
|
270
270
|
await self.current_plugin.play(
|
|
271
|
-
name
|
|
272
|
-
url
|
|
273
|
-
|
|
274
|
-
|
|
271
|
+
name = self.media.get_title(),
|
|
272
|
+
url = selected.get("url"),
|
|
273
|
+
user_agent = selected.get("user_agent"),
|
|
274
|
+
referer = selected.get("referer"),
|
|
275
|
+
subtitles = selected.get("subtitles", [])
|
|
275
276
|
)
|
|
276
277
|
return await self.content_finished()
|
|
277
278
|
|
|
@@ -319,10 +320,6 @@ class KekikStream:
|
|
|
319
320
|
self.update_title(selected.get("name"))
|
|
320
321
|
self.update_title(extract_data.name)
|
|
321
322
|
|
|
322
|
-
self.media.set_headers(extract_data.headers)
|
|
323
|
-
if extract_data.referer and not extract_data.headers.get("Referer"):
|
|
324
|
-
self.media.set_headers({"Referer": extract_data.referer})
|
|
325
|
-
|
|
326
323
|
self.media.play_media(extract_data)
|
|
327
324
|
await self.content_finished()
|
|
328
325
|
|
KekikStream/requirements.txt
CHANGED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: KekikStream
|
|
3
|
+
Version: 1.9.0
|
|
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
|
+
Home-page: https://github.com/keyiflerolsun/KekikStream
|
|
6
|
+
Author: keyiflerolsun
|
|
7
|
+
Author-email: keyiflerolsun@gmail.com
|
|
8
|
+
License: GPLv3+
|
|
9
|
+
Keywords: KekikStream,KekikAkademi,keyiflerolsun
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Requires-Python: >=3.11
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Requires-Dist: setuptools
|
|
17
|
+
Requires-Dist: wheel
|
|
18
|
+
Requires-Dist: Kekik
|
|
19
|
+
Requires-Dist: httpx
|
|
20
|
+
Requires-Dist: cloudscraper
|
|
21
|
+
Requires-Dist: parsel
|
|
22
|
+
Requires-Dist: pydantic
|
|
23
|
+
Requires-Dist: InquirerPy
|
|
24
|
+
Requires-Dist: yt-dlp
|
|
25
|
+
Dynamic: author
|
|
26
|
+
Dynamic: author-email
|
|
27
|
+
Dynamic: classifier
|
|
28
|
+
Dynamic: description
|
|
29
|
+
Dynamic: description-content-type
|
|
30
|
+
Dynamic: home-page
|
|
31
|
+
Dynamic: keywords
|
|
32
|
+
Dynamic: license
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
Dynamic: requires-dist
|
|
35
|
+
Dynamic: requires-python
|
|
36
|
+
Dynamic: summary
|
|
37
|
+
|
|
38
|
+
# <img src="https://github.com/keyiflerolsun/KekikStream/raw/master/.github/icons/KekikStream.png?raw=True" height="32" align="center"> KekikStream
|
|
39
|
+
|
|
40
|
+
[](#)
|
|
41
|
+
[](#)
|
|
42
|
+
<a href="https://KekikAkademi.org/Kahve" target="_blank"><img src="https://img.shields.io/badge/☕️-Kahve Ismarla-ffdd00" title="☕️ Kahve Ismarla" style="padding-left:5px;"></a>
|
|
43
|
+
|
|
44
|
+
[](https://pypi.org/project/KekikStream)
|
|
45
|
+
[](https://pypi.org/project/KekikStream)
|
|
46
|
+
[](https://pypi.org/project/KekikStream)
|
|
47
|
+
|
|
48
|
+
[](#)
|
|
49
|
+
[](#)
|
|
50
|
+
[](#)
|
|
51
|
+
|
|
52
|
+
[](https://github.com/keyiflerolsun/KekikStream/actions/workflows/pypiYukle.yml)
|
|
53
|
+
|
|
54
|
+
**Modüler ve genişletilebilir medya streaming kütüphanesi**
|
|
55
|
+
Terminal üzerinden içerik arayın, VLC/MPV ile doğrudan izleyin veya kendi API’nizi kurun. 🚀
|
|
56
|
+
|
|
57
|
+
[](https://github.com/user-attachments/assets/63d31bb0-0b69-40b4-84aa-66623f2a253f)
|
|
58
|
+
|
|
59
|
+
[](https://www.python.org/)
|
|
60
|
+
[](https://GitHub.com/keyiflerolsun/)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 🚦 Ne Sunar?
|
|
65
|
+
|
|
66
|
+
KekikStream, Türkçe medya kaynaklarını tek CLI arayüzünde toplayarak hızlı arama ve oynatma sunar. Plugin mimarisi sayesinde yeni kaynaklar eklemek ve [KekikStreamAPI](https://github.com/keyiflerolsun/KekikStreamAPI) ile web/API üzerinden yayın yapmak kolaydır.
|
|
67
|
+
|
|
68
|
+
- 🎥 Çoklu kaynak desteği: Onlarca Türkçe medya sitesi
|
|
69
|
+
- 🔌 Plugin mimarisi: Yeni kaynak eklemek dakikalar sürer
|
|
70
|
+
- 🎬 Çoklu oynatıcı: VLC, MPV, MX Player
|
|
71
|
+
- 🖥️ CLI & kütüphane: Terminalde veya kod içinde kullanın
|
|
72
|
+
- 🌐 API/Web UI: KekikStreamAPI üzerinden uzak erişim
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 🚀 Hızlı Başlangıç
|
|
77
|
+
|
|
78
|
+
> Gereksinimler: Python 3.11+, sistemde VLC veya MPV kurulu olmalı (Android için MX Player + ADB).
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Kurulum
|
|
82
|
+
pip install KekikStream
|
|
83
|
+
|
|
84
|
+
# Güncelleme
|
|
85
|
+
pip install -U KekikStream
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Temel Kullanım
|
|
89
|
+
|
|
90
|
+
**CLI:**
|
|
91
|
+
```bash
|
|
92
|
+
KekikStream
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Kütüphane (örnek arama):**
|
|
96
|
+
```python
|
|
97
|
+
from KekikStream import Manager
|
|
98
|
+
results = Manager().search("vikings")
|
|
99
|
+
print(results[0].title)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## ✨ Özellikler
|
|
105
|
+
|
|
106
|
+
### 🔌 Plugin Sistemi
|
|
107
|
+
|
|
108
|
+
KekikStream modüler bir plugin mimarisi kullanır; her medya kaynağı bağımsız bir plugin'dir.
|
|
109
|
+
|
|
110
|
+
**Mevcut Pluginler (örnek):** Dizilla, HDFilmCehennemi, Dizipal, Dizifon, RoketDizi, Sinefy, Moviesseed, FullHDFilmizlesene, HDBestMovies, SuperFilmGeldi, Sinezy ve daha fazlası.
|
|
111
|
+
|
|
112
|
+
**Plugin Geliştirme:**
|
|
113
|
+
```python
|
|
114
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo
|
|
115
|
+
|
|
116
|
+
class MyPlugin(PluginBase):
|
|
117
|
+
name = "MyPlugin"
|
|
118
|
+
language = "en"
|
|
119
|
+
main_url = "https://example.com"
|
|
120
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
121
|
+
description = "MyPlugin description"
|
|
122
|
+
|
|
123
|
+
main_page = {
|
|
124
|
+
f"{main_url}/category/" : "Category Name"
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
128
|
+
return results
|
|
129
|
+
|
|
130
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
131
|
+
return results
|
|
132
|
+
|
|
133
|
+
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
134
|
+
return details
|
|
135
|
+
|
|
136
|
+
async def load_links(self, url: str) -> list[dict]:
|
|
137
|
+
return links
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 🎬 Oynatıcı Desteği
|
|
141
|
+
|
|
142
|
+
| Oynatıcı | Platform | Özellikler |
|
|
143
|
+
|----------|----------|------------|
|
|
144
|
+
| **VLC** | Desktop | Custom headers, subtitles, varsayılan |
|
|
145
|
+
| **MPV** | Desktop | Custom headers, subtitles |
|
|
146
|
+
| **MX Player** | Android | ADB üzerinden |
|
|
147
|
+
|
|
148
|
+
> Özel durumlar için (Google Drive vb.) arka planda otomatik olarak yt-dlp devreye girer.
|
|
149
|
+
|
|
150
|
+
### 🔗 Extractor Sistemi
|
|
151
|
+
|
|
152
|
+
Vidmoly, Filemoon, Sibnet, Sendvid, Voe, Doodstream, Streamtape, Upstream, Dailymotion, JWPlayer ve birçok kaynaktan direkt streaming linki çıkarır.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 🏗️ Mimari
|
|
157
|
+
|
|
158
|
+
```mermaid
|
|
159
|
+
graph TB
|
|
160
|
+
CLI[🖥️ CLI Interface]
|
|
161
|
+
Manager[🔌 Plugin Manager]
|
|
162
|
+
|
|
163
|
+
subgraph Plugins
|
|
164
|
+
P1[📺 Dizilla]
|
|
165
|
+
P2[🎬 HDFilmCehennemi]
|
|
166
|
+
P3[🍿 Dizipal]
|
|
167
|
+
PN[... 20+ Plugin]
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
subgraph Extractors
|
|
171
|
+
E1[🔗 Vidmoly]
|
|
172
|
+
E2[🔗 Filemoon]
|
|
173
|
+
E3[🔗 Sibnet]
|
|
174
|
+
EN[... Extractors]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
subgraph Players
|
|
178
|
+
VLC[🎥 VLC]
|
|
179
|
+
MPV[🎥 MPV]
|
|
180
|
+
MX[🎥 MX Player]
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
CLI --> Manager
|
|
184
|
+
Manager --> P1
|
|
185
|
+
Manager --> P2
|
|
186
|
+
Manager --> P3
|
|
187
|
+
Manager --> PN
|
|
188
|
+
|
|
189
|
+
%% Her plugin otomatik olarak ihtiyaç duyduğu extractor'ı kullanır
|
|
190
|
+
P1 -.-> E1
|
|
191
|
+
P1 -.-> E2
|
|
192
|
+
P1 -.-> E3
|
|
193
|
+
|
|
194
|
+
P2 -.-> E1
|
|
195
|
+
P2 -.-> E2
|
|
196
|
+
P2 -.-> E3
|
|
197
|
+
|
|
198
|
+
P3 -.-> E1
|
|
199
|
+
P3 -.-> E2
|
|
200
|
+
P3 -.-> E3
|
|
201
|
+
|
|
202
|
+
PN -.-> EN
|
|
203
|
+
|
|
204
|
+
E1 --> VLC
|
|
205
|
+
E2 --> VLC
|
|
206
|
+
E3 --> VLC
|
|
207
|
+
EN --> VLC
|
|
208
|
+
|
|
209
|
+
E1 --> MPV
|
|
210
|
+
E2 --> MPV
|
|
211
|
+
E3 --> MPV
|
|
212
|
+
EN --> MPV
|
|
213
|
+
|
|
214
|
+
E1 --> MX
|
|
215
|
+
E2 --> MX
|
|
216
|
+
E3 --> MX
|
|
217
|
+
EN --> MX
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 🛠️ Geliştirme
|
|
223
|
+
|
|
224
|
+
### Proje Yapısı
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
KekikStream/
|
|
228
|
+
├── KekikStream/
|
|
229
|
+
│ ├── Core/ # Temel sınıflar
|
|
230
|
+
│ ├── Libs/ # Yardımcı kütüphaneler
|
|
231
|
+
│ ├── Plugins/ # Medya kaynak pluginleri
|
|
232
|
+
│ ├── Extractors/ # Video extractorları
|
|
233
|
+
│ └── __init__.py # CLI entry point
|
|
234
|
+
├── Tests/ # Örnek kullanım
|
|
235
|
+
└── requirements.txt
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Yeni Plugin Ekleme
|
|
239
|
+
|
|
240
|
+
1. `KekikStream/Plugins/` altına yeni dosya oluşturun.
|
|
241
|
+
2. `PluginBase` sınıfından türetin.
|
|
242
|
+
3. `get_main_page`, `search`, `load_item`, `load_links` metodlarını implemente edin.
|
|
243
|
+
4. Plugin'i test edin (örnek: `Tests/Single.py`).
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 📊 Performans
|
|
248
|
+
|
|
249
|
+
| Metrik | Değer |
|
|
250
|
+
|--------|-------|
|
|
251
|
+
| Plugin Sayısı | 20+ |
|
|
252
|
+
| Extractor Sayısı | 40+ |
|
|
253
|
+
| Desteklenen Platform | Desktop, Android |
|
|
254
|
+
| Async Arama | ✅ |
|
|
255
|
+
| Cache Desteği | ✅ |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 🤝 Katkıda Bulunma
|
|
260
|
+
|
|
261
|
+
Projeyi geliştirmek için katkılarınızı bekliyoruz!
|
|
262
|
+
|
|
263
|
+
1. Yeni plugin ekleyin
|
|
264
|
+
2. Bug raporu açın
|
|
265
|
+
3. Feature request gönderin
|
|
266
|
+
4. Dokümantasyon iyileştirin
|
|
267
|
+
|
|
268
|
+
### 🎁 Teşekkürler
|
|
269
|
+
|
|
270
|
+
- [DeoDorqnt387/aniwatch-tr](https://github.com/DeoDorqnt387/aniwatch-tr)
|
|
271
|
+
|
|
272
|
+
### 💻 Genişletme Referansları
|
|
273
|
+
|
|
274
|
+
- [keyiflerolsun/Kekik-cloudstream](https://github.com/keyiflerolsun/Kekik-cloudstream)
|
|
275
|
+
- [keyiflerolsun/seyirTurk-Parser](https://github.com/keyiflerolsun/seyirTurk-Parser)
|
|
276
|
+
|
|
277
|
+
## 🌐 Telif Hakkı ve Lisans
|
|
278
|
+
|
|
279
|
+
*Copyright (C) 2024 by* [keyiflerolsun](https://github.com/keyiflerolsun) ❤️️
|
|
280
|
+
[GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007](https://github.com/keyiflerolsun/KekikStream/blob/master/LICENSE) *Koşullarına göre lisanslanmıştır..*
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
<p align="center">
|
|
285
|
+
Bu proje <a href="https://github.com/keyiflerolsun">@keyiflerolsun</a> tarafından <a href="https://t.me/KekikAkademi">@KekikAkademi</a> için geliştirilmiştir.
|
|
286
|
+
</p>
|
|
287
|
+
|
|
288
|
+
<p align="center">
|
|
289
|
+
<sub>⭐ Beğendiyseniz yıldız vermeyi unutmayın!</sub>
|
|
290
|
+
</p>
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
KekikStream/__init__.py,sha256=JcSKsLRyJM5ZPNHq4DLSaj4FzOjxSp8M8JuM3YN8Ye4,13456
|
|
2
|
+
KekikStream/__main__.py,sha256=B81dQoeGEb-T5Sycs3eNAmW7unvx0Mef0syCjs4nPds,137
|
|
3
|
+
KekikStream/requirements.txt,sha256=0fO-7byqgLMr4NyJO7fQBFOnLv0zcAeqk7tLhHXqonk,76
|
|
4
|
+
KekikStream/CLI/__init__.py,sha256=U6oLq_O7u5y2eHhBnmfhZNns_EqHHJXJmzl8jvZFUNY,230
|
|
5
|
+
KekikStream/CLI/pypi_kontrol.py,sha256=q6fNs6EKJDc5VuUFig9DBzLzNPp_kMD1vOVgLElcii8,1487
|
|
6
|
+
KekikStream/Core/__init__.py,sha256=ar2MZQF83ryfLfydEXcfjdwNe4Too_HT6bP-D_4TopA,710
|
|
7
|
+
KekikStream/Core/Extractor/ExtractorBase.py,sha256=Yj7CGvm2ZKxlvuUkZu0X1Pl0JMH250W7hyqv09duTmE,1637
|
|
8
|
+
KekikStream/Core/Extractor/ExtractorLoader.py,sha256=7uxUXTAuF65KKkmbI6iRiCiUhx-IqrronB7ixhchcTU,4289
|
|
9
|
+
KekikStream/Core/Extractor/ExtractorManager.py,sha256=4L1H3jiTnf0kTq4W6uS7n95bBYHlKJ8_hh0og8z4erQ,1244
|
|
10
|
+
KekikStream/Core/Extractor/ExtractorModels.py,sha256=Qj_gbIeGRewaZXNfYkTi4FFRRq6XBOc0HS0tXGDwajI,445
|
|
11
|
+
KekikStream/Core/Media/MediaHandler.py,sha256=MEn3spPAThVloN3WcoCwWhpoyMA7tAZvcwYjmjJsX3U,7678
|
|
12
|
+
KekikStream/Core/Media/MediaManager.py,sha256=AaUq2D7JSJIphjoAj2fjLOJjswm7Qf5hjYCbBdrbnDU,438
|
|
13
|
+
KekikStream/Core/Plugin/PluginBase.py,sha256=uzJb8DqJfXOteteSBhG9QWUrFgb4JTByV_GbODz-9gs,3872
|
|
14
|
+
KekikStream/Core/Plugin/PluginLoader.py,sha256=yZxMug-OcJ5RBm4fQkoquKrZxcBU7Pvt4IcY-d0WU8g,3393
|
|
15
|
+
KekikStream/Core/Plugin/PluginManager.py,sha256=CZVg1eegi8vfMfccx0DRV0Box8kXz-aoULTQLgbPbvM,893
|
|
16
|
+
KekikStream/Core/Plugin/PluginModels.py,sha256=Yvx-6Fkn8QCIcuqAkFbCP5EJcq3XBkK_P8S0tRNhS6E,2476
|
|
17
|
+
KekikStream/Core/UI/UIManager.py,sha256=T4V_kdTTWa-UDamgLSKa__dWJuzcvRK9NuwBlzU9Bzc,1693
|
|
18
|
+
KekikStream/Extractors/CloseLoad.py,sha256=NSDjcwEaQJ_Y3dSszmEFOyVeh3RA2TNlb_IfxAeJ5B8,884
|
|
19
|
+
KekikStream/Extractors/ContentX.py,sha256=u1sDdM79MNx9OdPTPcAA0OQDS7537IO8aJlffxhMi8c,2976
|
|
20
|
+
KekikStream/Extractors/DzenRu.py,sha256=X0Rhm1-W4YjQwVrJs8YFqVcCxMaZi8rsKiLhK_ZsYlU,1185
|
|
21
|
+
KekikStream/Extractors/ExPlay.py,sha256=EJNVKAbaIxlbOsCx7J9aLfNHKOFoqSLZZUw7W4QYeH0,1827
|
|
22
|
+
KekikStream/Extractors/FirePlayer.py,sha256=HlJjFgii0fGZK7cgwpoZAIoajabl7IQX6ZrAQT1fBIw,2188
|
|
23
|
+
KekikStream/Extractors/FourCX.py,sha256=4FrMj1IZBBpN_g1P6S3A-8eUu7QFwlt4fJXzJ7vfe0Q,221
|
|
24
|
+
KekikStream/Extractors/FourPichive.py,sha256=iq3BCUbih1UVF4y4BIWO--0hX5jP2nxqesNx3MGP3kQ,234
|
|
25
|
+
KekikStream/Extractors/FourPlayRu.py,sha256=wq1ylxKpsO_IBoYr_ALzB2dVrQpJ-jY9lf2zPhcAZX8,228
|
|
26
|
+
KekikStream/Extractors/HDPlayerSystem.py,sha256=EgnFzx5Q4PkuwAtuff5SYU9k59B-CyOdySl7lbCZ9hM,1312
|
|
27
|
+
KekikStream/Extractors/HDStreamAble.py,sha256=66n5EvIdX_or5cdnlJ_Uqmzi50n4rl9c5VCw8kBqhQk,245
|
|
28
|
+
KekikStream/Extractors/Hotlinger.py,sha256=NFMRgUmb6BCrJfa7Hi0VarDNYvCeVknBWEk24FKBBa0,224
|
|
29
|
+
KekikStream/Extractors/JetTv.py,sha256=oUHOwu77no1wRkOpfYzDYqlxuqTha26fUue0QDaHLZ8,1597
|
|
30
|
+
KekikStream/Extractors/MailRu.py,sha256=xQVCWwYqNoG5T43VAW1_m0v4e80FbO-1pNPKkwhTccU,1218
|
|
31
|
+
KekikStream/Extractors/MixPlayHD.py,sha256=POV_yq3KoZ6S6EqFsKYULEBz92NdUa2BpYKNo0eNQH8,1552
|
|
32
|
+
KekikStream/Extractors/MixTiger.py,sha256=mMEYhhr5-u6GgIrLESeFTRdwDykgSXKJO4KtkMML1bw,2124
|
|
33
|
+
KekikStream/Extractors/MolyStream.py,sha256=IeeBw9tJJrL5QQ-t2Yp-a-6lnDc3Y00UNiaN6m-o-7c,1160
|
|
34
|
+
KekikStream/Extractors/Odnoklassniki.py,sha256=EQAuCdr69vN11ZBE5uThuXqlR8NVWanROWYkubo22mo,3809
|
|
35
|
+
KekikStream/Extractors/OkRuHTTP.py,sha256=L-B0i_i_Vnm61GvUfd6cGIW-o_H4M-C7DO_cdw2rQPU,228
|
|
36
|
+
KekikStream/Extractors/OkRuSSL.py,sha256=FHJ5XZ1dO5ED3mIku3e3vnq8K0slrcr0jqhaUnHmfVk,227
|
|
37
|
+
KekikStream/Extractors/PeaceMakerst.py,sha256=ZKk454eNZpeamht61UH9yMYe00_zGb3MSyujfDlbVDc,2096
|
|
38
|
+
KekikStream/Extractors/Pichive.py,sha256=BSVYFwL3Ax6yGoS1WkpOWtngxNyuZLoKzpPwjibpu2s,221
|
|
39
|
+
KekikStream/Extractors/PixelDrain.py,sha256=Uk2pPvtBzaKtRXu1iNO8FLHd0EAuIOIzI1H_n02tg-U,964
|
|
40
|
+
KekikStream/Extractors/PlayRu.py,sha256=DQMZyCSJwLkrh-gfDD8T1DvUFNBAKUXpByeCAWuK6YY,215
|
|
41
|
+
KekikStream/Extractors/PlayerFilmIzle.py,sha256=WjClc7uNBc4kBT56Aya5T4Qku_Jy76hblMpyxs8SxLI,2428
|
|
42
|
+
KekikStream/Extractors/RapidVid.py,sha256=TxNnLUmYaAHi-rFkoLu4eQULzkUSvQnfoEZAjyzQFns,2917
|
|
43
|
+
KekikStream/Extractors/SetPlay.py,sha256=FsbLlYFXp7_28-ta6XAoqDQAEGYTVZOZayebkY1mWe8,1906
|
|
44
|
+
KekikStream/Extractors/SetPrime.py,sha256=ob09y-Sm91YR7rIRzikhZiMHX6D4Djm5QzFTg6KbO4k,1536
|
|
45
|
+
KekikStream/Extractors/SibNet.py,sha256=zJTkzlr34ufKCWzKKCgJrzhb2o-fpjTjFdi38gv6N6g,849
|
|
46
|
+
KekikStream/Extractors/Sobreatsesuyp.py,sha256=qlSQHUHjTjBoY0nsuZQWAjnfswbPORkBg6rUuP7SagA,2000
|
|
47
|
+
KekikStream/Extractors/TRsTX.py,sha256=mbSRGnQt26a73SbqwtY9rpiYFwgRgVbvA6bkGb_PvP8,2152
|
|
48
|
+
KekikStream/Extractors/TauVideo.py,sha256=2ai9BwwM6qlCgxK7E0B642LtOF5y4hEb9tQ2aDpbMtc,1112
|
|
49
|
+
KekikStream/Extractors/TurboImgz.py,sha256=nnWnP1K4JZbMj6S-YuXxej31UZtF4JcboSW4n7A4A5c,824
|
|
50
|
+
KekikStream/Extractors/TurkeyPlayer.py,sha256=FX_H3vzXjAD7IjK11bjJVVw_VdPQ4n6YQLfjQ6E3t7o,1247
|
|
51
|
+
KekikStream/Extractors/VidHide.py,sha256=TVoS9CMV1WSE83vPC4FFxsNE71n-_DtVJm66_1Wt8pU,2538
|
|
52
|
+
KekikStream/Extractors/VidMoly.py,sha256=bxzIymYHrms4gBdK2jfsoug2tjq-PuicOxeR2NjcAjw,3654
|
|
53
|
+
KekikStream/Extractors/VidMolyMe.py,sha256=ogLiFUJVqFbhtzQrZ1gSB9me85DiHvntjWtSvidYVS8,218
|
|
54
|
+
KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0Jcek,1771
|
|
55
|
+
KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
|
|
56
|
+
KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
|
|
57
|
+
KekikStream/Extractors/YTDLP.py,sha256=Ifaex6DTEaLPWjTmhLReilsFHEJRCH0Ghs-rFSvwiQk,3965
|
|
58
|
+
KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
|
|
59
|
+
KekikStream/Plugins/DiziBox.py,sha256=sxM7ckKeKwMrMkRNUAvh5wE9wdOuVda6Ag_zAdwSvi8,9935
|
|
60
|
+
KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
|
|
61
|
+
KekikStream/Plugins/DiziYou.py,sha256=xE0INtCLOZDo73sWQoYT6Su8T66hGK9rBD-gXnk8MiU,9016
|
|
62
|
+
KekikStream/Plugins/Dizilla.py,sha256=jDklWkUrrAGhDO9pMvgIXVcKdSHDHlguu0JgifM7Bx8,11546
|
|
63
|
+
KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
|
|
64
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=izPKGbqQuA6AmLAnFjlBoe8iwnNOrr0Pcy5L2dZfM78,5185
|
|
65
|
+
KekikStream/Plugins/FilmModu.py,sha256=b27hchMoYZwG3I-kM1sveW7rHKOF5OuepdjPgKIehEM,6706
|
|
66
|
+
KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
|
|
67
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=FAacwtXo72DIl_1bHWgHPIxqmqBJAVPtNQ3yIZPYjlU,6152
|
|
68
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=D2VvgNvCcHfjkitzSfA19OFp-mI0sgUm6OSVej0ZgTY,9544
|
|
69
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=3tcx4ZT7oQs_xolhQeiqgirpWtknBjP7J7Qgy0bvIeM,5963
|
|
70
|
+
KekikStream/Plugins/KultFilmler.py,sha256=VZET3RUoOVYKE-C2YbkMW8oNcxz6zE2pR7a3z-B4nD4,8987
|
|
71
|
+
KekikStream/Plugins/RecTV.py,sha256=dF3Ogf7KE_zpfLQRjVcEJQMuWtBtHo6iB73_ECQEJ58,7544
|
|
72
|
+
KekikStream/Plugins/RoketDizi.py,sha256=isVijJ6YRtsBQ6DVB2K3n6uV-1GXZahujLF7IWvBrqs,8472
|
|
73
|
+
KekikStream/Plugins/SelcukFlix.py,sha256=WYVtGMxngpqrXk7PX_B4ya6Pji7dOjQsXoukk30f2d0,12744
|
|
74
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=dT2xPPkdaYV43qsL4Le_5Yel8eoPkHtnXIOXqz-Ya-c,6326
|
|
75
|
+
KekikStream/Plugins/SineWix.py,sha256=xdTeg8GHUpyZsY6EQ5I1ZIT4-lB_qwBwvHQVmdMPpEI,7364
|
|
76
|
+
KekikStream/Plugins/Sinefy.py,sha256=YMwG7ykdjzAY_GEvV4xv9NJ6ubew7qeMLz4KkvYpaNk,9749
|
|
77
|
+
KekikStream/Plugins/SinemaCX.py,sha256=DUvYa7J4a2D5ivLO_sQiaStoV5FDxmz8onJyFwAidvY,7177
|
|
78
|
+
KekikStream/Plugins/Sinezy.py,sha256=EttAZogKoKMP8RP_X1fSfi8vVxA2RWizwgnLkmnhERQ,5675
|
|
79
|
+
KekikStream/Plugins/SuperFilmGeldi.py,sha256=Ohm21BPsJH_S1tx5i2APEgAOD25k2NiwRP7rSgAKvRs,5289
|
|
80
|
+
KekikStream/Plugins/UgurFilm.py,sha256=eKGzmSi8k_QbXnYPWXZRdmCxxc32zZh4rynmdxCbm1o,4832
|
|
81
|
+
kekikstream-1.9.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
82
|
+
kekikstream-1.9.0.dist-info/METADATA,sha256=Mgtks2nTdNgWNefPpw8g_8wihlF26PfcNXucneXAmh0,9035
|
|
83
|
+
kekikstream-1.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
84
|
+
kekikstream-1.9.0.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
85
|
+
kekikstream-1.9.0.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
86
|
+
kekikstream-1.9.0.dist-info/RECORD,,
|