KekikStream 1.8.1__py3-none-any.whl → 1.8.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.
- KekikStream/Plugins/DiziBox.py +2 -6
- KekikStream/Plugins/DiziPal.py +1 -1
- KekikStream/Plugins/DiziYou.py +40 -14
- KekikStream/Plugins/Dizilla.py +39 -26
- KekikStream/Plugins/FilmBip.py +1 -1
- KekikStream/Plugins/FilmMakinesi.py +0 -3
- KekikStream/Plugins/FullHDFilmizlesene.py +0 -3
- KekikStream/Plugins/HDFilmCehennemi.py +0 -3
- KekikStream/Plugins/JetFilmizle.py +0 -3
- KekikStream/Plugins/RecTV.py +0 -3
- KekikStream/Plugins/RoketDizi.py +76 -37
- KekikStream/Plugins/SezonlukDizi.py +0 -3
- KekikStream/Plugins/SineWix.py +0 -3
- KekikStream/Plugins/UgurFilm.py +0 -3
- {kekikstream-1.8.1.dist-info → kekikstream-1.8.3.dist-info}/METADATA +1 -1
- {kekikstream-1.8.1.dist-info → kekikstream-1.8.3.dist-info}/RECORD +20 -20
- {kekikstream-1.8.1.dist-info → kekikstream-1.8.3.dist-info}/WHEEL +0 -0
- {kekikstream-1.8.1.dist-info → kekikstream-1.8.3.dist-info}/entry_points.txt +0 -0
- {kekikstream-1.8.1.dist-info → kekikstream-1.8.3.dist-info}/licenses/LICENSE +0 -0
- {kekikstream-1.8.1.dist-info → kekikstream-1.8.3.dist-info}/top_level.txt +0 -0
KekikStream/Plugins/DiziBox.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, SeriesInfo, Episode
|
|
4
4
|
from Kekik.Sifreleme import CryptoJS
|
|
5
5
|
from parsel import Selector
|
|
6
6
|
import re, urllib.parse, base64, contextlib, asyncio, time
|
|
@@ -40,7 +40,6 @@ class DiziBox(PluginBase):
|
|
|
40
40
|
f"{main_url}/dizi-arsivi/page/SAYFA/?tur[0]=yarisma&yil&imdb" : "Yarışma"
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
#@kekik_cache(ttl=60*60)
|
|
44
43
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
45
44
|
self.httpx.cookies.update({
|
|
46
45
|
"isTrustedUser" : "true",
|
|
@@ -62,7 +61,6 @@ class DiziBox(PluginBase):
|
|
|
62
61
|
for veri in secici.css("article.detailed-article")
|
|
63
62
|
]
|
|
64
63
|
|
|
65
|
-
#@kekik_cache(ttl=60*60)
|
|
66
64
|
async def search(self, query: str) -> list[SearchResult]:
|
|
67
65
|
self.httpx.cookies.update({
|
|
68
66
|
"isTrustedUser" : "true",
|
|
@@ -80,7 +78,6 @@ class DiziBox(PluginBase):
|
|
|
80
78
|
for item in secici.css("article.detailed-article")
|
|
81
79
|
]
|
|
82
80
|
|
|
83
|
-
#@kekik_cache(ttl=60*60)
|
|
84
81
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
85
82
|
istek = await self.httpx.get(url)
|
|
86
83
|
secici = Selector(istek.text)
|
|
@@ -127,7 +124,6 @@ class DiziBox(PluginBase):
|
|
|
127
124
|
actors = actors,
|
|
128
125
|
)
|
|
129
126
|
|
|
130
|
-
#@kekik_cache(ttl=60*60)
|
|
131
127
|
async def _iframe_decode(self, name:str, iframe_link:str, referer:str) -> list[str]:
|
|
132
128
|
results = []
|
|
133
129
|
|
|
@@ -214,4 +210,4 @@ class DiziBox(PluginBase):
|
|
|
214
210
|
"name" : f"{extractor.name if extractor else alt_name}"
|
|
215
211
|
})
|
|
216
212
|
|
|
217
|
-
return results
|
|
213
|
+
return results
|
KekikStream/Plugins/DiziPal.py
CHANGED
|
@@ -9,7 +9,7 @@ class DiziPal(PluginBase):
|
|
|
9
9
|
language = "tr"
|
|
10
10
|
main_url = "https://dizipal1223.com"
|
|
11
11
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
-
description = "
|
|
12
|
+
description = "dizipal güncel, dizipal yeni ve gerçek adresi. dizipal en yeni dizi ve filmleri güvenli ve hızlı şekilde sunar."
|
|
13
13
|
|
|
14
14
|
main_page = {
|
|
15
15
|
f"{main_url}/diziler/son-bolumler" : "Son Bölümler",
|
KekikStream/Plugins/DiziYou.py
CHANGED
|
@@ -29,7 +29,6 @@ class DiziYou(PluginBase):
|
|
|
29
29
|
f"{main_url}/dizi-arsivi/page/SAYFA/?tur=Vah%C5%9Fi+Bat%C4%B1" : "Vahşi Batı"
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
#@kekik_cache(ttl=60*60)
|
|
33
32
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
34
33
|
istek = await self.httpx.get(f"{url.replace('SAYFA', str(page))}")
|
|
35
34
|
secici = Selector(istek.text)
|
|
@@ -44,7 +43,6 @@ class DiziYou(PluginBase):
|
|
|
44
43
|
for veri in secici.css("div.single-item")
|
|
45
44
|
]
|
|
46
45
|
|
|
47
|
-
#@kekik_cache(ttl=60*60)
|
|
48
46
|
async def search(self, query: str) -> list[SearchResult]:
|
|
49
47
|
istek = await self.httpx.get(f"{self.main_url}/?s={query}")
|
|
50
48
|
secici = Selector(istek.text)
|
|
@@ -53,18 +51,28 @@ class DiziYou(PluginBase):
|
|
|
53
51
|
SearchResult(
|
|
54
52
|
title = afis.css("div#categorytitle a::text").get().strip(),
|
|
55
53
|
url = self.fix_url(afis.css("div#categorytitle a::attr(href)").get()),
|
|
56
|
-
poster = self.fix_url(afis.css("img::attr(src)").get())
|
|
54
|
+
poster = self.fix_url(afis.css("img::attr(src)").get() or afis.css("img::attr(data-src)").get())
|
|
57
55
|
)
|
|
58
56
|
for afis in secici.css("div.incontent div#list-series")
|
|
59
57
|
]
|
|
60
58
|
|
|
61
|
-
#@kekik_cache(ttl=60*60)
|
|
62
59
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
63
60
|
istek = await self.httpx.get(url)
|
|
64
61
|
secici = Selector(istek.text)
|
|
65
62
|
|
|
66
|
-
title
|
|
67
|
-
|
|
63
|
+
# Title - div.title h1 içinde
|
|
64
|
+
title_raw = secici.css("div.title h1::text").get()
|
|
65
|
+
title = title_raw.strip() if title_raw else ""
|
|
66
|
+
|
|
67
|
+
# Fallback: Eğer title boşsa URL'den çıkar (telif kısıtlaması olan sayfalar için)
|
|
68
|
+
if not title:
|
|
69
|
+
# URL'den slug'ı al: https://www.diziyou.one/jasmine/ -> jasmine -> Jasmine
|
|
70
|
+
slug = url.rstrip('/').split('/')[-1]
|
|
71
|
+
title = slug.replace('-', ' ').title()
|
|
72
|
+
|
|
73
|
+
# Poster
|
|
74
|
+
poster_raw = secici.css("div.category_image img::attr(src)").get()
|
|
75
|
+
poster = self.fix_url(poster_raw) if poster_raw else ""
|
|
68
76
|
year = secici.xpath("//span[contains(., 'Yapım Yılı')]/following-sibling::text()[1]").get()
|
|
69
77
|
description = secici.css("div.diziyou_desc::text").get()
|
|
70
78
|
if description:
|
|
@@ -75,13 +83,21 @@ class DiziYou(PluginBase):
|
|
|
75
83
|
actors = [actor.strip() for actor in _actors.split(",")] if _actors else []
|
|
76
84
|
|
|
77
85
|
episodes = []
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
86
|
+
# Episodes - bolumust her bölüm için bir <a> içinde
|
|
87
|
+
# :has() parsel'de çalışmıyor, XPath kullanıyoruz
|
|
88
|
+
for link in secici.xpath('//a[div[@class="bolumust"]]'):
|
|
89
|
+
ep_name_raw = link.css("div.baslik::text").get()
|
|
90
|
+
if not ep_name_raw:
|
|
91
|
+
continue
|
|
92
|
+
ep_name = ep_name_raw.strip()
|
|
93
|
+
|
|
94
|
+
ep_href = self.fix_url(link.css("::attr(href)").get())
|
|
95
|
+
if not ep_href:
|
|
82
96
|
continue
|
|
83
97
|
|
|
84
|
-
|
|
98
|
+
# Bölüm ismi varsa al
|
|
99
|
+
ep_name_raw_clean = link.css("div.bolumismi::text").get()
|
|
100
|
+
ep_name_clean = ep_name_raw_clean.strip().replace("(", "").replace(")", "").strip() if ep_name_raw_clean else ep_name
|
|
85
101
|
|
|
86
102
|
ep_episode = re.search(r"(\d+)\. Bölüm", ep_name)[1]
|
|
87
103
|
ep_season = re.search(r"(\d+)\. Sezon", ep_name)[1]
|
|
@@ -112,9 +128,19 @@ class DiziYou(PluginBase):
|
|
|
112
128
|
istek = await self.httpx.get(url)
|
|
113
129
|
secici = Selector(istek.text)
|
|
114
130
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
131
|
+
# Title ve episode name - None kontrolü ekle
|
|
132
|
+
item_title_raw = secici.css("div.title h1::text").get()
|
|
133
|
+
item_title = item_title_raw.strip() if item_title_raw else ""
|
|
134
|
+
|
|
135
|
+
ep_name_raw = secici.css("div#bolum-ismi::text").get()
|
|
136
|
+
ep_name = ep_name_raw.strip() if ep_name_raw else ""
|
|
137
|
+
|
|
138
|
+
# Player src'den item_id çıkar
|
|
139
|
+
player_src = secici.css("iframe#diziyouPlayer::attr(src)").get()
|
|
140
|
+
if not player_src:
|
|
141
|
+
return [] # Player bulunamadıysa boş liste döndür
|
|
142
|
+
|
|
143
|
+
item_id = player_src.split("/")[-1].replace(".html", "")
|
|
118
144
|
|
|
119
145
|
subtitles = []
|
|
120
146
|
stream_urls = []
|
KekikStream/Plugins/Dizilla.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from Kekik.cli import konsol
|
|
4
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode
|
|
4
5
|
from parsel import Selector
|
|
5
6
|
from json import loads
|
|
6
7
|
from urllib.parse import urlparse, urlunparse
|
|
@@ -12,36 +13,47 @@ class Dizilla(PluginBase):
|
|
|
12
13
|
language = "tr"
|
|
13
14
|
main_url = "https://dizilla40.com"
|
|
14
15
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
15
|
-
description = "
|
|
16
|
+
description = "1080p yabancı dizi izle. Türkçe altyazılı veya dublaj seçenekleriyle 1080p çözünürlükte yabancı dizilere anında ulaş. Popüler dizileri kesintisiz izle."
|
|
16
17
|
|
|
17
18
|
main_page = {
|
|
18
|
-
f"{main_url}/tum-bolumler"
|
|
19
|
-
f"{main_url}/
|
|
20
|
-
f"{main_url}/
|
|
21
|
-
f"{main_url}/
|
|
22
|
-
f"{main_url}/
|
|
23
|
-
f"{main_url}/
|
|
24
|
-
f"{main_url}/
|
|
19
|
+
f"{main_url}/tum-bolumler" : "Altyazılı Bölümler",
|
|
20
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=15&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Aile",
|
|
21
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=9&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Aksiyon",
|
|
22
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=17&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Animasyon",
|
|
23
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=5&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Bilim Kurgu",
|
|
24
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=2&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Dram",
|
|
25
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=12&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Fantastik",
|
|
26
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=18&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Gerilim",
|
|
27
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=3&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Gizem",
|
|
28
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=4&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Komedi",
|
|
29
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=8&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Korku",
|
|
30
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=24&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Macera",
|
|
31
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=7&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Romantik",
|
|
32
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=26&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Savaş",
|
|
33
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=1&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Suç",
|
|
34
|
+
f"{main_url}/api/bg/findSeries?releaseYearStart=1900&releaseYearEnd=2050&imdbPointMin=0&imdbPointMax=10&categoryIdsComma=11&countryIdsComma=&orderType=date_desc&languageId=-1¤tPage=SAYFA¤tPageCount=24&queryStr=&categorySlugsComma=&countryCodesComma=" : "Western",
|
|
25
35
|
}
|
|
26
36
|
|
|
27
|
-
#@kekik_cache(ttl=60*60)
|
|
28
37
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
29
|
-
istek = await self.httpx.get(url)
|
|
30
|
-
secici = Selector(istek.text)
|
|
31
|
-
|
|
32
38
|
ana_sayfa = []
|
|
33
39
|
|
|
34
|
-
if "
|
|
40
|
+
if "api/bg" in url:
|
|
41
|
+
istek = await self.httpx.post(url.replace("SAYFA", str(page)))
|
|
42
|
+
decrypted = await self.decrypt_response(istek.json().get("response"))
|
|
43
|
+
veriler = decrypted.get("result", [])
|
|
35
44
|
ana_sayfa.extend([
|
|
36
45
|
MainPageResult(
|
|
37
46
|
category = category,
|
|
38
|
-
title = veri.
|
|
39
|
-
url = self.fix_url(veri.
|
|
40
|
-
poster = self.fix_url(veri.
|
|
47
|
+
title = veri.get("original_title"),
|
|
48
|
+
url = self.fix_url(f"{self.main_url}/{veri.get('used_slug')}"),
|
|
49
|
+
poster = self.fix_url(veri.get("object_poster_url")),
|
|
41
50
|
)
|
|
42
|
-
for veri in
|
|
51
|
+
for veri in veriler
|
|
43
52
|
])
|
|
44
53
|
else:
|
|
54
|
+
istek = await self.httpx.get(url.replace("SAYFA", str(page)))
|
|
55
|
+
secici = Selector(istek.text)
|
|
56
|
+
|
|
45
57
|
for veri in secici.css("div.tab-content > div.grid a"):
|
|
46
58
|
name = veri.css("h2::text").get()
|
|
47
59
|
ep_name = veri.xpath("normalize-space(//div[contains(@class, 'opacity-80')])").get()
|
|
@@ -88,7 +100,6 @@ class Dizilla(PluginBase):
|
|
|
88
100
|
# JSON decode
|
|
89
101
|
return loads(decrypted.decode("utf-8"))
|
|
90
102
|
|
|
91
|
-
#@kekik_cache(ttl=60*60)
|
|
92
103
|
async def search(self, query: str) -> list[SearchResult]:
|
|
93
104
|
arama_istek = await self.httpx.post(f"{self.main_url}/api/bg/searchcontent?searchterm={query}")
|
|
94
105
|
decrypted = await self.decrypt_response(arama_istek.json().get("response"))
|
|
@@ -103,7 +114,6 @@ class Dizilla(PluginBase):
|
|
|
103
114
|
for veri in arama_veri
|
|
104
115
|
]
|
|
105
116
|
|
|
106
|
-
#@kekik_cache(ttl=60*60)
|
|
107
117
|
async def url_base_degis(self, eski_url:str, yeni_base:str) -> str:
|
|
108
118
|
parsed_url = urlparse(eski_url)
|
|
109
119
|
parsed_yeni_base = urlparse(yeni_base)
|
|
@@ -114,22 +124,25 @@ class Dizilla(PluginBase):
|
|
|
114
124
|
|
|
115
125
|
return urlunparse(yeni_url)
|
|
116
126
|
|
|
117
|
-
#@kekik_cache(ttl=60*60)
|
|
118
127
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
119
128
|
istek = await self.httpx.get(url)
|
|
120
129
|
secici = Selector(istek.text)
|
|
121
130
|
veri = loads(secici.xpath("//script[@type='application/ld+json']/text()").getall()[-1])
|
|
122
131
|
|
|
123
|
-
title
|
|
132
|
+
title = veri.get("name")
|
|
124
133
|
if alt_title := veri.get("alternateName"):
|
|
125
134
|
title += f" - ({alt_title})"
|
|
126
135
|
|
|
127
136
|
poster = self.fix_url(veri.get("image"))
|
|
128
137
|
description = veri.get("description")
|
|
129
138
|
year = veri.get("datePublished").split("-")[0]
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
139
|
+
|
|
140
|
+
# Tags extraction from page content (h3 tag)
|
|
141
|
+
tags_raw = secici.css("h3.text-white.opacity-60::text").get()
|
|
142
|
+
tags = [t.strip() for t in tags_raw.split(",")] if tags_raw else []
|
|
143
|
+
|
|
144
|
+
rating = veri.get("aggregateRating", {}).get("ratingValue")
|
|
145
|
+
actors = [actor.get("name") for actor in veri.get("actor", []) if actor.get("name")]
|
|
133
146
|
|
|
134
147
|
bolumler = []
|
|
135
148
|
sezonlar = veri.get("containsSeason") if isinstance(veri.get("containsSeason"), list) else [veri.get("containsSeason")]
|
|
@@ -181,4 +194,4 @@ class Dizilla(PluginBase):
|
|
|
181
194
|
"name" : f"{extractor.name if extractor else 'Main Player'} | {result.get('language_name')}",
|
|
182
195
|
})
|
|
183
196
|
|
|
184
|
-
return links
|
|
197
|
+
return links
|
KekikStream/Plugins/FilmBip.py
CHANGED
|
@@ -8,7 +8,7 @@ class FilmBip(PluginBase):
|
|
|
8
8
|
language = "tr"
|
|
9
9
|
main_url = "https://filmbip.com"
|
|
10
10
|
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
11
|
-
description = "
|
|
11
|
+
description = "FilmBip adlı film sitemizde Full HD film izle. Yerli ve yabancı filmleri Türkçe dublaj veya altyazılı şekilde 1080p yüksek kalite film izle"
|
|
12
12
|
|
|
13
13
|
main_page = {
|
|
14
14
|
f"{main_url}/filmler/SAYFA" : "Yeni Filmler",
|
|
@@ -34,7 +34,6 @@ class FilmMakinesi(PluginBase):
|
|
|
34
34
|
f"{main_url}/tur/western-fm1/film/" : "Western"
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
#@kekik_cache(ttl=60*60)
|
|
38
37
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
39
38
|
istek = self.cloudscraper.get(f"{url}{'' if page == 1 else f'page/{page}/'}")
|
|
40
39
|
secici = Selector(istek.text)
|
|
@@ -51,7 +50,6 @@ class FilmMakinesi(PluginBase):
|
|
|
51
50
|
for veri in veriler
|
|
52
51
|
]
|
|
53
52
|
|
|
54
|
-
#@kekik_cache(ttl=60*60)
|
|
55
53
|
async def search(self, query: str) -> list[SearchResult]:
|
|
56
54
|
istek = await self.httpx.get(f"{self.main_url}/arama/?s={query}")
|
|
57
55
|
secici = Selector(istek.text)
|
|
@@ -73,7 +71,6 @@ class FilmMakinesi(PluginBase):
|
|
|
73
71
|
|
|
74
72
|
return results
|
|
75
73
|
|
|
76
|
-
#@kekik_cache(ttl=60*60)
|
|
77
74
|
async def load_item(self, url: str) -> MovieInfo:
|
|
78
75
|
istek = await self.httpx.get(url)
|
|
79
76
|
secici = Selector(istek.text)
|
|
@@ -40,7 +40,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
40
40
|
f"{main_url}/filmizle/yerli-filmler-hd-izle/" : "Yerli Filmler"
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
#@kekik_cache(ttl=60*60)
|
|
44
43
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
45
44
|
istek = self.cloudscraper.get(f"{url}{page}")
|
|
46
45
|
secici = Selector(istek.text)
|
|
@@ -55,7 +54,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
55
54
|
for veri in secici.css("li.film")
|
|
56
55
|
]
|
|
57
56
|
|
|
58
|
-
#@kekik_cache(ttl=60*60)
|
|
59
57
|
async def search(self, query: str) -> list[SearchResult]:
|
|
60
58
|
istek = await self.httpx.get(f"{self.main_url}/arama/{query}")
|
|
61
59
|
secici = Selector(istek.text)
|
|
@@ -77,7 +75,6 @@ class FullHDFilmizlesene(PluginBase):
|
|
|
77
75
|
|
|
78
76
|
return results
|
|
79
77
|
|
|
80
|
-
#@kekik_cache(ttl=60*60)
|
|
81
78
|
async def load_item(self, url: str) -> MovieInfo:
|
|
82
79
|
istek = await self.httpx.get(url)
|
|
83
80
|
secici = Selector(istek.text)
|
|
@@ -32,7 +32,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
32
32
|
f"{main_url}/tur/romantik-filmleri-izle-1" : "Romantik Filmleri"
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
#@kekik_cache(ttl=60*60)
|
|
36
35
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
37
36
|
istek = await self.cffi.get(f"{url}", allow_redirects=True)
|
|
38
37
|
secici = Selector(istek.text)
|
|
@@ -47,7 +46,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
47
46
|
for veri in secici.css("div.section-content a.poster")
|
|
48
47
|
]
|
|
49
48
|
|
|
50
|
-
#@kekik_cache(ttl=60*60)
|
|
51
49
|
async def search(self, query: str) -> list[SearchResult]:
|
|
52
50
|
istek = await self.cffi.get(
|
|
53
51
|
url = f"{self.main_url}/search/?q={query}",
|
|
@@ -76,7 +74,6 @@ class HDFilmCehennemi(PluginBase):
|
|
|
76
74
|
|
|
77
75
|
return results
|
|
78
76
|
|
|
79
|
-
#@kekik_cache(ttl=60*60)
|
|
80
77
|
async def load_item(self, url: str) -> MovieInfo:
|
|
81
78
|
istek = await self.cffi.get(url, headers = {"Referer": f"{self.main_url}/"})
|
|
82
79
|
secici = Selector(istek.text)
|
|
@@ -19,7 +19,6 @@ class JetFilmizle(PluginBase):
|
|
|
19
19
|
f"{main_url}/kategoriler/yesilcam-filmleri-izlee/page/" : "Yeşilçam Filmleri"
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
#@kekik_cache(ttl=60*60)
|
|
23
22
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
24
23
|
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
25
24
|
secici = Selector(istek.text)
|
|
@@ -34,7 +33,6 @@ class JetFilmizle(PluginBase):
|
|
|
34
33
|
for veri in secici.css("article.movie") if veri.css("h2 a::text, h3 a::text, h4 a::text, h5 a::text, h6 a::text").get()
|
|
35
34
|
]
|
|
36
35
|
|
|
37
|
-
#@kekik_cache(ttl=60*60)
|
|
38
36
|
async def search(self, query: str) -> list[SearchResult]:
|
|
39
37
|
istek = await self.httpx.post(
|
|
40
38
|
url = f"{self.main_url}/filmara.php",
|
|
@@ -60,7 +58,6 @@ class JetFilmizle(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)
|
KekikStream/Plugins/RecTV.py
CHANGED
|
@@ -30,7 +30,6 @@ class RecTV(PluginBase):
|
|
|
30
30
|
f"{main_url}/api/movie/by/filtres/5/created/SAYFA/{sw_key}/" : "Romantik"
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
#@kekik_cache(ttl=60*60)
|
|
34
33
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
35
34
|
self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
|
|
36
35
|
istek = await self.httpx.get(f"{url.replace('SAYFA', str(int(page) - 1))}")
|
|
@@ -46,7 +45,6 @@ class RecTV(PluginBase):
|
|
|
46
45
|
for veri in veriler
|
|
47
46
|
]
|
|
48
47
|
|
|
49
|
-
#@kekik_cache(ttl=60*60)
|
|
50
48
|
async def search(self, query: str) -> list[SearchResult]:
|
|
51
49
|
self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
|
|
52
50
|
istek = await self.httpx.get(f"{self.main_url}/api/search/{query}/{self.sw_key}/")
|
|
@@ -67,7 +65,6 @@ class RecTV(PluginBase):
|
|
|
67
65
|
for veri in tum_veri
|
|
68
66
|
]
|
|
69
67
|
|
|
70
|
-
#@kekik_cache(ttl=60*60)
|
|
71
68
|
async def load_item(self, url: str) -> MovieInfo:
|
|
72
69
|
self.httpx.headers.update({"user-agent": "okhttp/4.12.0"})
|
|
73
70
|
veri = loads(url)
|
KekikStream/Plugins/RoketDizi.py
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, SeriesInfo, Episode, MovieInfo
|
|
4
4
|
from parsel import Selector
|
|
5
|
-
import re, base64, json
|
|
5
|
+
import re, base64, json
|
|
6
6
|
|
|
7
7
|
class RoketDizi(PluginBase):
|
|
8
8
|
name = "RoketDizi"
|
|
9
9
|
lang = "tr"
|
|
10
10
|
main_url = "https://roketdizi.to"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Türkiye'nin en tatlış yabancı dizi izleme sitesi. Türkçe dublaj, altyazılı, eski ve yeni yabancı dizilerin yanı sıra kore (asya) dizileri izleyebilirsiniz."
|
|
11
13
|
|
|
12
14
|
# Domain doğrulama ve anti-bot mekanizmaları var
|
|
13
15
|
requires_cffi = True
|
|
@@ -45,45 +47,50 @@ class RoketDizi(PluginBase):
|
|
|
45
47
|
return results
|
|
46
48
|
|
|
47
49
|
async def search(self, query: str) -> list[SearchResult]:
|
|
48
|
-
# Get Cookies and Keys
|
|
49
|
-
main_req = await self.cffi.get(self.main_url)
|
|
50
|
-
sel = Selector(main_req.text)
|
|
51
|
-
|
|
52
|
-
c_key = sel.css("input[name='cKey']::attr(value)").get()
|
|
53
|
-
c_value = sel.css("input[name='cValue']::attr(value)").get()
|
|
54
|
-
|
|
55
50
|
post_url = f"{self.main_url}/api/bg/searchContent?searchterm={query}"
|
|
56
51
|
|
|
57
52
|
headers = {
|
|
58
53
|
"Accept" : "application/json, text/javascript, */*; q=0.01",
|
|
59
54
|
"X-Requested-With" : "XMLHttpRequest",
|
|
60
55
|
"Referer" : f"{self.main_url}/",
|
|
61
|
-
"CNT" : "vakTR"
|
|
62
56
|
}
|
|
63
|
-
|
|
64
|
-
data = {}
|
|
65
|
-
if c_key and c_value:
|
|
66
|
-
data = {"cKey": c_key, "cValue": c_value}
|
|
67
57
|
|
|
68
|
-
search_req = await self.cffi.post(post_url,
|
|
58
|
+
search_req = await self.cffi.post(post_url, headers=headers)
|
|
69
59
|
|
|
70
60
|
try:
|
|
71
61
|
resp_json = search_req.json()
|
|
72
|
-
|
|
62
|
+
|
|
63
|
+
# Response is base64 encoded!
|
|
64
|
+
if not resp_json.get("success"):
|
|
65
|
+
return []
|
|
66
|
+
|
|
67
|
+
encoded_response = resp_json.get("response", "")
|
|
68
|
+
if not encoded_response:
|
|
69
|
+
return []
|
|
70
|
+
|
|
71
|
+
# Decode base64
|
|
72
|
+
decoded = base64.b64decode(encoded_response).decode('utf-8')
|
|
73
|
+
data = json.loads(decoded)
|
|
74
|
+
|
|
75
|
+
if not data.get("state"):
|
|
73
76
|
return []
|
|
74
77
|
|
|
75
|
-
html_content = resp_json.get("html", "").strip()
|
|
76
|
-
sel_results = Selector(html_content)
|
|
77
|
-
|
|
78
78
|
results = []
|
|
79
|
-
|
|
79
|
+
result_items = data.get("result", [])
|
|
80
80
|
|
|
81
|
-
for
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
for item in result_items:
|
|
82
|
+
title = item.get("object_name", "")
|
|
83
|
+
slug = item.get("used_slug", "")
|
|
84
|
+
poster = item.get("object_poster_url", "")
|
|
85
|
+
|
|
86
|
+
if title and slug:
|
|
87
|
+
# Construct full URL from slug
|
|
88
|
+
full_url = f"{self.main_url}/{slug}"
|
|
89
|
+
results.append(SearchResult(
|
|
90
|
+
title = title.strip(),
|
|
91
|
+
url = full_url,
|
|
92
|
+
poster = self.fix_url(poster) if poster else None
|
|
93
|
+
))
|
|
87
94
|
|
|
88
95
|
return results
|
|
89
96
|
|
|
@@ -99,14 +106,41 @@ class RoketDizi(PluginBase):
|
|
|
99
106
|
poster = sel.css("div.w-full.page-top img::attr(src)").get()
|
|
100
107
|
description = sel.css("div.mt-2.text-sm::text").get()
|
|
101
108
|
|
|
102
|
-
|
|
109
|
+
# Tags - genre bilgileri (Detaylar bölümünde)
|
|
110
|
+
tags = []
|
|
111
|
+
genre_text = sel.css("h3.text-white.opacity-90::text").get()
|
|
112
|
+
if genre_text:
|
|
113
|
+
tags = [t.strip() for t in genre_text.split(",")]
|
|
103
114
|
|
|
104
|
-
|
|
105
|
-
if tags:
|
|
106
|
-
tags = [t.strip() for t in tags.split(",")]
|
|
107
|
-
|
|
115
|
+
# Rating
|
|
108
116
|
rating = sel.css("div.flex.items-center span.text-white.text-sm::text").get()
|
|
109
|
-
|
|
117
|
+
|
|
118
|
+
# Year ve Actors - Detaylar (Details) bölümünden
|
|
119
|
+
year = None
|
|
120
|
+
actors = []
|
|
121
|
+
|
|
122
|
+
# Detaylar bölümündeki tüm flex-col div'leri al
|
|
123
|
+
detail_items = sel.css("div.flex.flex-col")
|
|
124
|
+
for item in detail_items:
|
|
125
|
+
# Label ve value yapısı: span.text-base ve span.text-sm.opacity-90
|
|
126
|
+
label = item.css("span.text-base::text").get()
|
|
127
|
+
value = item.css("span.text-sm.opacity-90::text").get()
|
|
128
|
+
|
|
129
|
+
if label and value:
|
|
130
|
+
label = label.strip()
|
|
131
|
+
value = value.strip()
|
|
132
|
+
|
|
133
|
+
# Yayın tarihi (yıl)
|
|
134
|
+
if label == "Yayın tarihi":
|
|
135
|
+
# "16 Ekim 2018" formatından yılı çıkar
|
|
136
|
+
year_match = re.search(r'\d{4}', value)
|
|
137
|
+
if year_match:
|
|
138
|
+
year = year_match.group()
|
|
139
|
+
|
|
140
|
+
# Yaratıcılar veya Oyuncular
|
|
141
|
+
elif label in ["Yaratıcılar", "Oyuncular"]:
|
|
142
|
+
if value:
|
|
143
|
+
actors.append(value)
|
|
110
144
|
|
|
111
145
|
# Check urls for episodes
|
|
112
146
|
all_urls = re.findall(r'"url":"([^"]*)"', resp.text)
|
|
@@ -114,22 +148,27 @@ class RoketDizi(PluginBase):
|
|
|
114
148
|
|
|
115
149
|
episodes = []
|
|
116
150
|
if is_series:
|
|
117
|
-
|
|
151
|
+
# Dict kullanarak duplicate'leri önle ama sıralı tut
|
|
152
|
+
episodes_dict = {}
|
|
118
153
|
for u in all_urls:
|
|
119
|
-
if "bolum" in u and u not in
|
|
120
|
-
seen_eps.add(u)
|
|
154
|
+
if "bolum" in u and u not in episodes_dict:
|
|
121
155
|
season_match = re.search(r'/sezon-(\d+)', u)
|
|
122
156
|
ep_match = re.search(r'/bolum-(\d+)', u)
|
|
123
157
|
|
|
124
158
|
season = int(season_match.group(1)) if season_match else 1
|
|
125
159
|
episode_num = int(ep_match.group(1)) if ep_match else 1
|
|
126
160
|
|
|
127
|
-
|
|
161
|
+
# Key olarak (season, episode) tuple kullan
|
|
162
|
+
key = (season, episode_num)
|
|
163
|
+
episodes_dict[key] = Episode(
|
|
128
164
|
season = season,
|
|
129
165
|
episode = episode_num,
|
|
130
|
-
title = f"{season}. Sezon {episode_num}. Bölüm",
|
|
166
|
+
title = f"{season}. Sezon {episode_num}. Bölüm",
|
|
131
167
|
url = self.fix_url(u)
|
|
132
|
-
)
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
# Sıralı liste oluştur
|
|
171
|
+
episodes = [episodes_dict[key] for key in sorted(episodes_dict.keys())]
|
|
133
172
|
|
|
134
173
|
return SeriesInfo(
|
|
135
174
|
title = title,
|
|
@@ -21,7 +21,6 @@ class SezonlukDizi(PluginBase):
|
|
|
21
21
|
f"{main_url}/diziler.asp?siralama_tipi=id&kat=6&s=" : "Belgeseller",
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
#@kekik_cache(ttl=60*60)
|
|
25
24
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
26
25
|
istek = await self.httpx.get(f"{url}{page}")
|
|
27
26
|
secici = Selector(istek.text)
|
|
@@ -36,7 +35,6 @@ class SezonlukDizi(PluginBase):
|
|
|
36
35
|
for veri in secici.css("div.afis a") if veri.css("div.description::text").get()
|
|
37
36
|
]
|
|
38
37
|
|
|
39
|
-
#@kekik_cache(ttl=60*60)
|
|
40
38
|
async def search(self, query: str) -> list[SearchResult]:
|
|
41
39
|
istek = await self.httpx.get(f"{self.main_url}/diziler.asp?adi={query}")
|
|
42
40
|
secici = Selector(istek.text)
|
|
@@ -50,7 +48,6 @@ class SezonlukDizi(PluginBase):
|
|
|
50
48
|
for afis in secici.css("div.afis a.column")
|
|
51
49
|
]
|
|
52
50
|
|
|
53
|
-
#@kekik_cache(ttl=60*60)
|
|
54
51
|
async def load_item(self, url: str) -> SeriesInfo:
|
|
55
52
|
istek = await self.httpx.get(url)
|
|
56
53
|
secici = Selector(istek.text)
|
KekikStream/Plugins/SineWix.py
CHANGED
|
@@ -35,7 +35,6 @@ class SineWix(PluginBase):
|
|
|
35
35
|
f"{main_url}/sinewix/movies/36" : "Tarih",
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
#@kekik_cache(ttl=60*60)
|
|
39
38
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
40
39
|
istek = await self.httpx.get(f"{url}/{page}")
|
|
41
40
|
veriler = istek.json()
|
|
@@ -50,7 +49,6 @@ class SineWix(PluginBase):
|
|
|
50
49
|
for veri in veriler.get("data")
|
|
51
50
|
]
|
|
52
51
|
|
|
53
|
-
#@kekik_cache(ttl=60*60)
|
|
54
52
|
async def search(self, query: str) -> list[SearchResult]:
|
|
55
53
|
istek = await self.httpx.get(f"{self.main_url}/sinewix/search/{query}")
|
|
56
54
|
|
|
@@ -63,7 +61,6 @@ class SineWix(PluginBase):
|
|
|
63
61
|
for veri in istek.json().get("search")
|
|
64
62
|
]
|
|
65
63
|
|
|
66
|
-
#@kekik_cache(ttl=60*60)
|
|
67
64
|
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
68
65
|
item_type = url.split("?type=")[-1].split("&id=")[0]
|
|
69
66
|
item_id = url.split("&id=")[-1]
|
KekikStream/Plugins/UgurFilm.py
CHANGED
|
@@ -23,7 +23,6 @@ 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
27
|
istek = await self.httpx.get(f"{url}{page}", follow_redirects=True)
|
|
29
28
|
secici = Selector(istek.text)
|
|
@@ -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)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: KekikStream
|
|
3
|
-
Version: 1.8.
|
|
3
|
+
Version: 1.8.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
|
|
@@ -55,31 +55,31 @@ KekikStream/Extractors/VidMoxy.py,sha256=LT7wTKBtuuagXwfGjWZwQF2NQGuChurZJ-I6gM0
|
|
|
55
55
|
KekikStream/Extractors/VidPapi.py,sha256=g9ohdL9VJrxy4N7xerbIRz3ZxjsXFHlJWy0NaZ31hFY,3259
|
|
56
56
|
KekikStream/Extractors/VideoSeyred.py,sha256=M6QPZ_isX9vM_7LPo-2I_8Cf1vB9awHw8vvzBODtoiQ,1977
|
|
57
57
|
KekikStream/Extractors/YildizKisaFilm.py,sha256=R_JlrOVeMiDlXYcuTdItnKvidyx8_u3B14fSrxew2aE,1316
|
|
58
|
-
KekikStream/Plugins/DiziBox.py,sha256=
|
|
59
|
-
KekikStream/Plugins/DiziPal.py,sha256=
|
|
60
|
-
KekikStream/Plugins/DiziYou.py,sha256=
|
|
61
|
-
KekikStream/Plugins/Dizilla.py,sha256=
|
|
62
|
-
KekikStream/Plugins/FilmBip.py,sha256=
|
|
63
|
-
KekikStream/Plugins/FilmMakinesi.py,sha256=
|
|
58
|
+
KekikStream/Plugins/DiziBox.py,sha256=XjEYhce_nv5onATzK9o0K9ezmOrGjwFwUZ0X7yR5uT4,9964
|
|
59
|
+
KekikStream/Plugins/DiziPal.py,sha256=MBONjermWBm3sN-8ZSILnfXI2F_V2kH65gpTNOuL9dI,10198
|
|
60
|
+
KekikStream/Plugins/DiziYou.py,sha256=0vupi1IHuMqUutnBxveMy4PIwf5tS7xzpHKr2Bu1aQA,9058
|
|
61
|
+
KekikStream/Plugins/Dizilla.py,sha256=DOvr-zqAKbxbUNB_vPPwBiQyAav0Gbi7sKZfdX3SW08,11604
|
|
62
|
+
KekikStream/Plugins/FilmBip.py,sha256=Tfx2dUc1Qs7ZQoJtsBtjOJXCKmTe56m74lNhuUYYU14,6182
|
|
63
|
+
KekikStream/Plugins/FilmMakinesi.py,sha256=HUxSNuu95EILjG8k-QmktTBeSm068NKESygvs1w9uRM,5227
|
|
64
64
|
KekikStream/Plugins/FilmModu.py,sha256=b27hchMoYZwG3I-kM1sveW7rHKOF5OuepdjPgKIehEM,6706
|
|
65
65
|
KekikStream/Plugins/FullHDFilm.py,sha256=kkb-JtWf23uiEzP9f_uds0tROYiKOyxcX0D-jNtQFi0,7005
|
|
66
|
-
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=
|
|
67
|
-
KekikStream/Plugins/HDFilmCehennemi.py,sha256=
|
|
68
|
-
KekikStream/Plugins/JetFilmizle.py,sha256=
|
|
66
|
+
KekikStream/Plugins/FullHDFilmizlesene.py,sha256=eoQO61lHweWNd7oQsLrinSaHQlYByIMiCaW0GUKCWfQ,6194
|
|
67
|
+
KekikStream/Plugins/HDFilmCehennemi.py,sha256=gqj5RxbI8SJmifIIRI_qHq1ufTu5O32XZQDdgdFiTKI,9740
|
|
68
|
+
KekikStream/Plugins/JetFilmizle.py,sha256=78AS3wNEcGBWQMPIyLHoEWQnL-TK_ILoJDNUlkZctz4,6005
|
|
69
69
|
KekikStream/Plugins/KultFilmler.py,sha256=VZET3RUoOVYKE-C2YbkMW8oNcxz6zE2pR7a3z-B4nD4,8987
|
|
70
|
-
KekikStream/Plugins/RecTV.py,sha256=
|
|
71
|
-
KekikStream/Plugins/RoketDizi.py,sha256=
|
|
70
|
+
KekikStream/Plugins/RecTV.py,sha256=n_X6ymzCXk6sBeEB-iNCKzuRScNEM5Jug4QiO1WDPts,7586
|
|
71
|
+
KekikStream/Plugins/RoketDizi.py,sha256=C6ID2sfEwf0Tw8_tO-pc1nx8TB0Ii_rCVRzlHA7E-oA,8547
|
|
72
72
|
KekikStream/Plugins/SelcukFlix.py,sha256=F3Rv2TRpfM-SZUAqjTPsQChS_Ejoh5q1Mo5fBFlsLy0,9013
|
|
73
|
-
KekikStream/Plugins/SezonlukDizi.py,sha256=
|
|
74
|
-
KekikStream/Plugins/SineWix.py,sha256=
|
|
73
|
+
KekikStream/Plugins/SezonlukDizi.py,sha256=7PG-QjT6C765EougAS47KpqlK9xGrdJX2mN4RAg9W5Q,6368
|
|
74
|
+
KekikStream/Plugins/SineWix.py,sha256=HE8GAwHoeYRfNFdG1RfgqxK242kExVJK9PjgVh-ZI9k,7406
|
|
75
75
|
KekikStream/Plugins/Sinefy.py,sha256=mRwtQYiH7I_1k4EZS0g4MhnRDEx0NXwY8sa5tI33dog,8368
|
|
76
76
|
KekikStream/Plugins/SinemaCX.py,sha256=DUvYa7J4a2D5ivLO_sQiaStoV5FDxmz8onJyFwAidvY,7177
|
|
77
77
|
KekikStream/Plugins/Sinezy.py,sha256=t7InHEtKdIVyBQj8HJWwWcHhRP9AXKKXYE0O3YD8MYg,3647
|
|
78
78
|
KekikStream/Plugins/SuperFilmGeldi.py,sha256=Ohm21BPsJH_S1tx5i2APEgAOD25k2NiwRP7rSgAKvRs,5289
|
|
79
|
-
KekikStream/Plugins/UgurFilm.py,sha256=
|
|
80
|
-
kekikstream-1.8.
|
|
81
|
-
kekikstream-1.8.
|
|
82
|
-
kekikstream-1.8.
|
|
83
|
-
kekikstream-1.8.
|
|
84
|
-
kekikstream-1.8.
|
|
85
|
-
kekikstream-1.8.
|
|
79
|
+
KekikStream/Plugins/UgurFilm.py,sha256=zD_PtNRUAVlA39MqCWN7Cw-A-x6NUtqx2pESN07_t2w,4874
|
|
80
|
+
kekikstream-1.8.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
81
|
+
kekikstream-1.8.3.dist-info/METADATA,sha256=gj5Vqz8oO_hdA81YkOWY4xw6WvUXxCRSQsL2IkSkEGs,4983
|
|
82
|
+
kekikstream-1.8.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
83
|
+
kekikstream-1.8.3.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
|
|
84
|
+
kekikstream-1.8.3.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
|
|
85
|
+
kekikstream-1.8.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|