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.
Files changed (66) hide show
  1. KekikStream/Core/Extractor/ExtractorBase.py +2 -14
  2. KekikStream/Core/Extractor/ExtractorModels.py +5 -7
  3. KekikStream/Core/Media/MediaHandler.py +44 -26
  4. KekikStream/Core/Media/MediaManager.py +0 -3
  5. KekikStream/Core/Plugin/PluginBase.py +2 -15
  6. KekikStream/Core/Plugin/PluginModels.py +25 -26
  7. KekikStream/Extractors/CloseLoad.py +1 -2
  8. KekikStream/Extractors/ContentX.py +0 -2
  9. KekikStream/Extractors/DzenRu.py +0 -1
  10. KekikStream/Extractors/ExPlay.py +0 -1
  11. KekikStream/Extractors/FirePlayer.py +4 -5
  12. KekikStream/Extractors/HDPlayerSystem.py +0 -1
  13. KekikStream/Extractors/JetTv.py +0 -1
  14. KekikStream/Extractors/MailRu.py +1 -2
  15. KekikStream/Extractors/MixPlayHD.py +0 -1
  16. KekikStream/Extractors/MixTiger.py +1 -5
  17. KekikStream/Extractors/MolyStream.py +5 -5
  18. KekikStream/Extractors/Odnoklassniki.py +6 -6
  19. KekikStream/Extractors/PeaceMakerst.py +0 -1
  20. KekikStream/Extractors/PixelDrain.py +0 -1
  21. KekikStream/Extractors/PlayerFilmIzle.py +5 -5
  22. KekikStream/Extractors/RapidVid.py +0 -1
  23. KekikStream/Extractors/SetPlay.py +0 -1
  24. KekikStream/Extractors/SetPrime.py +0 -1
  25. KekikStream/Extractors/SibNet.py +0 -1
  26. KekikStream/Extractors/Sobreatsesuyp.py +0 -1
  27. KekikStream/Extractors/TRsTX.py +0 -1
  28. KekikStream/Extractors/TauVideo.py +0 -1
  29. KekikStream/Extractors/TurboImgz.py +0 -1
  30. KekikStream/Extractors/TurkeyPlayer.py +5 -5
  31. KekikStream/Extractors/VidHide.py +5 -5
  32. KekikStream/Extractors/VidMoly.py +0 -1
  33. KekikStream/Extractors/VidMoxy.py +0 -1
  34. KekikStream/Extractors/VidPapi.py +0 -1
  35. KekikStream/Extractors/VideoSeyred.py +0 -1
  36. KekikStream/Extractors/YTDLP.py +109 -0
  37. KekikStream/Extractors/YildizKisaFilm.py +0 -1
  38. KekikStream/Plugins/DiziBox.py +3 -8
  39. KekikStream/Plugins/DiziPal.py +5 -5
  40. KekikStream/Plugins/DiziYou.py +44 -19
  41. KekikStream/Plugins/Dizilla.py +38 -27
  42. KekikStream/Plugins/FilmBip.py +1 -1
  43. KekikStream/Plugins/FilmMakinesi.py +1 -5
  44. KekikStream/Plugins/FilmModu.py +3 -3
  45. KekikStream/Plugins/FullHDFilmizlesene.py +1 -5
  46. KekikStream/Plugins/HDFilmCehennemi.py +14 -21
  47. KekikStream/Plugins/JetFilmizle.py +2 -6
  48. KekikStream/Plugins/RecTV.py +12 -16
  49. KekikStream/Plugins/RoketDizi.py +105 -93
  50. KekikStream/Plugins/SelcukFlix.py +160 -67
  51. KekikStream/Plugins/SezonlukDizi.py +1 -5
  52. KekikStream/Plugins/SineWix.py +4 -8
  53. KekikStream/Plugins/Sinefy.py +72 -51
  54. KekikStream/Plugins/SinemaCX.py +4 -4
  55. KekikStream/Plugins/Sinezy.py +74 -42
  56. KekikStream/Plugins/UgurFilm.py +2 -6
  57. KekikStream/__init__.py +5 -8
  58. KekikStream/requirements.txt +2 -3
  59. kekikstream-1.9.0.dist-info/METADATA +290 -0
  60. kekikstream-1.9.0.dist-info/RECORD +86 -0
  61. kekikstream-1.7.6.dist-info/METADATA +0 -110
  62. kekikstream-1.7.6.dist-info/RECORD +0 -85
  63. {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/WHEEL +0 -0
  64. {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/entry_points.txt +0 -0
  65. {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/licenses/LICENSE +0 -0
  66. {kekikstream-1.7.6.dist-info → kekikstream-1.9.0.dist-info}/top_level.txt +0 -0
@@ -5,95 +5,127 @@ from parsel import Selector
5
5
  import re, base64
6
6
 
7
7
  class Sinezy(PluginBase):
8
- name = "Sinezy"
9
- main_url = "https://sinezy.site"
10
- lang = "tr"
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
- "izle/en-yeni-filmler/" : "Yeni Filmler",
14
- "izle/en-yi-filmler/" : "En İyi Filmler"
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"{self.main_url}/{url}page/{page}/"
19
- resp = await self.httpx.get(full_url)
20
- sel = Selector(resp.text)
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 = item.css("a::attr(title)").get()
25
- href = item.css("a::attr(href)").get()
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 = f"{self.main_url}/arama/?s={query}"
67
+ url = f"{self.main_url}/arama/?s={query}"
39
68
  resp = await self.httpx.get(url)
40
- sel = Selector(resp.text)
41
-
69
+ sel = Selector(resp.text)
70
+
42
71
  results = []
43
72
  for item in sel.css("div.movie_box.move_k"):
44
- title = item.css("a::attr(title)").get()
45
- href = item.css("a::attr(href)").get()
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 = sel.css("div.detail span a::text").getall()
66
- actors = sel.css("span.oyn p::text").getall() # Might need splitting logic
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 []
@@ -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 kekik_cache, PluginBase, MainPageResult, SearchResult, MovieInfo
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}", allow_redirects=True)
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 = self.media.get_title(),
272
- url = selected.get("url"),
273
- referer = selected.get("referer"),
274
- subtitles = selected.get("subtitles", [])
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
 
@@ -1,10 +1,9 @@
1
1
  setuptools
2
2
  wheel
3
-
4
3
  Kekik
5
- curl-cffi
6
- cloudscraper
7
4
  httpx
5
+ cloudscraper
8
6
  parsel
9
7
  pydantic
10
8
  InquirerPy
9
+ yt-dlp
@@ -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
+ [![Boyut](https://img.shields.io/github/repo-size/keyiflerolsun/KekikStream?logo=git&logoColor=white&label=Boyut)](#)
41
+ [![Görüntülenme](https://visitor-badge.laobi.icu/badge?page_id=keyiflerolsun/KekikStream&title=Görüntülenme)](#)
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
+ [![PyPI](https://img.shields.io/pypi/v/KekikStream?logo=pypi&logoColor=white&label=PyPI)](https://pypi.org/project/KekikStream)
45
+ [![PyPI - Yüklenme](https://img.shields.io/pypi/dm/KekikStream?logo=pypi&logoColor=white&label=Yüklenme)](https://pypi.org/project/KekikStream)
46
+ [![PyPI - Wheel](https://img.shields.io/pypi/wheel/KekikStream?logo=pypi&logoColor=white&label=Wheel)](https://pypi.org/project/KekikStream)
47
+
48
+ [![Python Version](https://img.shields.io/pypi/pyversions/KekikStream?logo=python&logoColor=white&label=Python)](#)
49
+ [![Lisans](https://img.shields.io/pypi/l/KekikStream?logo=gnu&logoColor=white&label=Lisans)](#)
50
+ [![Durum](https://img.shields.io/pypi/status/KekikStream?logo=windowsterminal&logoColor=white&label=Durum)](#)
51
+
52
+ [![PyPI Yükle](https://github.com/keyiflerolsun/KekikStream/actions/workflows/pypiYukle.yml/badge.svg)](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
+ [![Video](https://github.com/user-attachments/assets/63d31bb0-0b69-40b4-84aa-66623f2a253f)](https://github.com/user-attachments/assets/63d31bb0-0b69-40b4-84aa-66623f2a253f)
58
+
59
+ [![ForTheBadge made-with-python](https://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/)
60
+ [![ForTheBadge built-with-love](https://ForTheBadge.com/images/badges/built-with-love.svg)](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,,