KekikStream 1.4.0__py3-none-any.whl → 1.4.2__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 (34) hide show
  1. KekikStream/Plugins/RecTV.py +1 -1
  2. {kekikstream-1.4.0.dist-info → kekikstream-1.4.2.dist-info}/METADATA +1 -6
  3. {kekikstream-1.4.0.dist-info → kekikstream-1.4.2.dist-info}/RECORD +7 -33
  4. {kekikstream-1.4.0.dist-info → kekikstream-1.4.2.dist-info}/entry_points.txt +0 -1
  5. kekikstream-1.4.2.dist-info/top_level.txt +1 -0
  6. KekikStreamAPI/AYAR.yml +0 -8
  7. KekikStreamAPI/CLI/__init__.py +0 -3
  8. KekikStreamAPI/Core/Modules/_IP_Log.py +0 -27
  9. KekikStreamAPI/Core/Modules/_hata.py +0 -12
  10. KekikStreamAPI/Core/Modules/_istek.py +0 -131
  11. KekikStreamAPI/Core/Motor.py +0 -13
  12. KekikStreamAPI/Core/__init__.py +0 -24
  13. KekikStreamAPI/Public/API/v1/Libs/__init__.py +0 -7
  14. KekikStreamAPI/Public/API/v1/Routers/__init__.py +0 -25
  15. KekikStreamAPI/Public/API/v1/Routers/extract.py +0 -26
  16. KekikStreamAPI/Public/API/v1/Routers/get_main_page.py +0 -33
  17. KekikStreamAPI/Public/API/v1/Routers/get_plugin.py +0 -39
  18. KekikStreamAPI/Public/API/v1/Routers/get_plugin_names.py +0 -13
  19. KekikStreamAPI/Public/API/v1/Routers/load_item.py +0 -34
  20. KekikStreamAPI/Public/API/v1/Routers/load_links.py +0 -41
  21. KekikStreamAPI/Public/API/v1/Routers/search.py +0 -31
  22. KekikStreamAPI/Public/Home/Routers/__init__.py +0 -9
  23. KekikStreamAPI/Public/Home/Routers/ana_sayfa.py +0 -14
  24. KekikStreamAPI/Public/Home/Static/CSS/stil.css +0 -85
  25. KekikStreamAPI/Public/Home/Static/JS/bakalim.js +0 -1
  26. KekikStreamAPI/Public/Home/Static/favicon.ico +0 -0
  27. KekikStreamAPI/Public/Home/Templates/_html_taban.html +0 -50
  28. KekikStreamAPI/Public/Home/Templates/index.html +0 -33
  29. KekikStreamAPI/README.md +0 -9
  30. KekikStreamAPI/Settings/__init__.py +0 -11
  31. KekikStreamAPI/__init__.py +0 -18
  32. kekikstream-1.4.0.dist-info/top_level.txt +0 -2
  33. {kekikstream-1.4.0.dist-info → kekikstream-1.4.2.dist-info}/LICENSE +0 -0
  34. {kekikstream-1.4.0.dist-info → kekikstream-1.4.2.dist-info}/WHEEL +0 -0
@@ -8,7 +8,7 @@ import re
8
8
  class RecTV(PluginBase):
9
9
  name = "RecTV"
10
10
  language = "tr"
11
- main_url = "https://a.prectv35.sbs"
11
+ main_url = "https://z.prectv36.sbs"
12
12
  favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
13
13
  description = "RecTv APK, Türkiye’deki en popüler Çevrimiçi Medya Akış platformlarından biridir. Filmlerin, Canlı Sporların, Web Dizilerinin ve çok daha fazlasının keyfini ücretsiz çıkarın."
14
14
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: KekikStream
3
- Version: 1.4.0
3
+ Version: 1.4.2
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
@@ -22,11 +22,6 @@ Requires-Dist: parsel
22
22
  Requires-Dist: pydantic
23
23
  Requires-Dist: InquirerPy
24
24
  Requires-Dist: yt-dlp
25
- Requires-Dist: fastapi
26
- Requires-Dist: Jinja2
27
- Requires-Dist: uvicorn
28
- Requires-Dist: user_agents
29
- Requires-Dist: PyYAML
30
25
  Dynamic: author
31
26
  Dynamic: author-email
32
27
  Dynamic: classifier
@@ -50,40 +50,14 @@ KekikStream/Plugins/FilmMakinesi.py,sha256=J4v35Ln3RehWPai3I-9nWrasRLx3hN3IgrWVp
50
50
  KekikStream/Plugins/FullHDFilmizlesene.py,sha256=AO9Il0PE77JUvg1AN4Vxl95pTrCBbOjclqFGWuzo7cY,6271
51
51
  KekikStream/Plugins/HDFilmCehennemi.py,sha256=w-sGlRb60PMHO75ZlreP1fpjeA048VzNJIiXEV1oFe4,9908
52
52
  KekikStream/Plugins/JetFilmizle.py,sha256=Hi_yzjUyTQryx-4kTfxNdNSqqQcwodc_JJULOTKTrBA,5483
53
- KekikStream/Plugins/RecTV.py,sha256=rjsaz1OZGqJAHHvmm1rzpD99K23jb9rx55zhu03BPOk,7247
53
+ KekikStream/Plugins/RecTV.py,sha256=Rnl4sYRfgMSfXzOHURHDTJdJlgVxtSiupx0ez8vieTM,7247
54
54
  KekikStream/Plugins/SezonlukDizi.py,sha256=IvmOB6qCEHBy41BS4KFBjsTegmzEF6l-2l_CvamYrW8,6099
55
55
  KekikStream/Plugins/Shorten.py,sha256=dDYt89WX-CcDhJAAV2A4zaD4xcZa8aN6-YcAcseyVo4,8948
56
56
  KekikStream/Plugins/SineWix.py,sha256=cFqwn8B4M-WJWJlMuCrvv0JyKPv953iDqCLbGyy8Xu0,7145
57
57
  KekikStream/Plugins/UgurFilm.py,sha256=tChGgiAeQeVUqHqrVXDz_eMIyghOHqKuHJb0pCQqs1M,4724
58
- KekikStreamAPI/AYAR.yml,sha256=YM_mcSc30HLBn_YSuWML9wp-_7qtlFkmL9e0-h8O87k,193
59
- KekikStreamAPI/README.md,sha256=DTJb7TyXl6Mpg_ZUQ1iUQ4DcMZepsuyJclHBCQwDbVo,219
60
- KekikStreamAPI/__init__.py,sha256=QIZ7zR7xG_K7-8knKKG071tqX0JrRGJaOAXg-aiRSAc,410
61
- KekikStreamAPI/CLI/__init__.py,sha256=ZAjwuA3P1aUdScFNekhAFccAwgfv0MpBIBbC-MP5avk,169
62
- KekikStreamAPI/Core/Motor.py,sha256=oy3yk6TjN6EhVh6jHpoAqb_fVl_hXQ_zE6ASdBSGE7o,669
63
- KekikStreamAPI/Core/__init__.py,sha256=OgFhcs4NrXgRDEQaz5lnCiYzUy6naD2E-caKhnnI9lM,905
64
- KekikStreamAPI/Core/Modules/_IP_Log.py,sha256=NwbAQTOEwsuKhZmjHzPXax7g6EL4Q1Q81ZadbVm8DXI,918
65
- KekikStreamAPI/Core/Modules/_hata.py,sha256=puMONN0Aa9wIjLhAmTqLHXa4sn8pKwROUdhmVnS8JxI,627
66
- KekikStreamAPI/Core/Modules/_istek.py,sha256=UQqKiNpe49LepBv_M7obB66IPtF-DJrGE0-4Va0wr-8,4700
67
- KekikStreamAPI/Public/API/v1/Libs/__init__.py,sha256=y0iEyUs5OUvBzMXDnfCqJMFG67OOtt13NhnuVX5Zngo,286
68
- KekikStreamAPI/Public/API/v1/Routers/__init__.py,sha256=bZRpDwIXweGR9BcCUObMe6T9cy9NV0M_vYmiB7ACchM,738
69
- KekikStreamAPI/Public/API/v1/Routers/extract.py,sha256=ZSbJ3nlPZaL4HzZkvqiga8bsnH8xgHUSlLiVZ_iPiWs,1092
70
- KekikStreamAPI/Public/API/v1/Routers/get_main_page.py,sha256=l8lrZUQQQLg_k8mOkD8fry8E3PrnGL2QcXuAx0g_v8A,1538
71
- KekikStreamAPI/Public/API/v1/Routers/get_plugin.py,sha256=Pq2qfZEh1Syy_YZ2VeB2MR1Mj0LAnJdudCmZtK3qcN8,1407
72
- KekikStreamAPI/Public/API/v1/Routers/get_plugin_names.py,sha256=KH6X2Kb-TU2YtztRSdguIuFwllGtSpmwCfZ9q73rMOQ,493
73
- KekikStreamAPI/Public/API/v1/Routers/load_item.py,sha256=5v4G7JuIJKSgKxXEFzZ5c7ICWNtlATGRoPo2IVt4eBY,1350
74
- KekikStreamAPI/Public/API/v1/Routers/load_links.py,sha256=FZ7EMGuAsV8N0p8KbNTX4hbBTtCqSTHVoi8ugiDl_RY,1705
75
- KekikStreamAPI/Public/API/v1/Routers/search.py,sha256=OH4ANqsQV_srwDtXF9E6gbccu-V1PfAUULnbC3tod6I,1178
76
- KekikStreamAPI/Public/Home/Routers/__init__.py,sha256=KFRUmzYedYdboxfiw-cwDvpUMm1EGOp9SeLinWip4aU,287
77
- KekikStreamAPI/Public/Home/Routers/ana_sayfa.py,sha256=SkcHijyC8zQvOsAGrZssNFqoVGm_U7kBBQ9KEXT3GDI,507
78
- KekikStreamAPI/Public/Home/Static/favicon.ico,sha256=b34L2enj9j-jIb82m80I-LBFWg9tN2vKo3tNkb9ynmc,15086
79
- KekikStreamAPI/Public/Home/Static/CSS/stil.css,sha256=BuNAg-apDVQnV77oq9qaKgoCAHP_Hdtf3_jzVKy6cnw,1480
80
- KekikStreamAPI/Public/Home/Static/JS/bakalim.js,sha256=1EkIAxNeX1irQIJ0hTwlXCpHN5yn8ujhU66JpvW7860,78
81
- KekikStreamAPI/Public/Home/Templates/_html_taban.html,sha256=dW0Z4tTU2Fm07nz7u4o2TFFxOmCWmRq4CqMsdnpbneE,2600
82
- KekikStreamAPI/Public/Home/Templates/index.html,sha256=BqI3MfuiNnWjQxksaviYZUeMwrOh3uuvYCRPnewysJg,1307
83
- KekikStreamAPI/Settings/__init__.py,sha256=nmxsb7qwBuXEjG2PC5b8Jl9UOj_mAUVt98rfWnBl25I,365
84
- kekikstream-1.4.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
85
- kekikstream-1.4.0.dist-info/METADATA,sha256=Kf617CXGR4jdKZ_B8p3aCD-Pn9OzVa0Jj5sVfqe4au4,5090
86
- kekikstream-1.4.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
87
- kekikstream-1.4.0.dist-info/entry_points.txt,sha256=UpmG0Vp32rFbTsV22loNZugX3cfO5Scdr7j_eyWOr4E,88
88
- kekikstream-1.4.0.dist-info/top_level.txt,sha256=VHi7CEC3z7vCAdeRLxLn00sb-xosSvSFsT0TJRZVDw4,27
89
- kekikstream-1.4.0.dist-info/RECORD,,
58
+ kekikstream-1.4.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
59
+ kekikstream-1.4.2.dist-info/METADATA,sha256=KekQOD3PNSlsxCmUgUSRk1CTmWT8yRRDmIg234NclPg,4973
60
+ kekikstream-1.4.2.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
61
+ kekikstream-1.4.2.dist-info/entry_points.txt,sha256=dFwdiTx8djyehI0Gsz-rZwjAfZzUzoBSrmzRu9ubjJc,50
62
+ kekikstream-1.4.2.dist-info/top_level.txt,sha256=DNmGJDXl27Drdfobrak8KYLmocW_uznVYFJOzcjUgmY,12
63
+ kekikstream-1.4.2.dist-info/RECORD,,
@@ -1,3 +1,2 @@
1
1
  [console_scripts]
2
2
  KekikStream = KekikStream:basla
3
- KekikStreamAPI = KekikStreamAPI:basla
@@ -0,0 +1 @@
1
+ KekikStream
KekikStreamAPI/AYAR.yml DELETED
@@ -1,8 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- PROJE : KekikStreamAPI
4
- APP :
5
- HOST : 0.0.0.0
6
- PORT : 3310
7
- WORKERS : 1
8
- CACHE : 15 # ! Minutes
@@ -1,3 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from Kekik.cli import konsol, cikis_yap, hata_salla, log_salla, hata_yakala, bellek_temizle
@@ -1,27 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from httpx import AsyncClient
4
- from Core import kekik_cache
5
- from Settings import CACHE_TIME
6
-
7
- @kekik_cache(ttl=CACHE_TIME)
8
- async def ip_log(hedef_ip:str) -> dict[str, str]:
9
- try:
10
- oturum = AsyncClient(timeout=3)
11
-
12
- istek = await oturum.get(f"http://ip-api.com/json/{hedef_ip}")
13
- veri = istek.json()
14
-
15
- if veri["status"] != "fail":
16
- return {
17
- "ulke" : veri["country"] or "",
18
- "il" : veri["regionName"] or "",
19
- "ilce" : veri["city"] or "",
20
- "isp" : veri["isp"] or "",
21
- "sirket" : veri["org"] or "",
22
- "host" : veri["as"] or ""
23
- }
24
- else:
25
- return {"hata": "Veri Bulunamadı.."}
26
- except Exception as hata:
27
- return {"hata": f"{type(hata).__name__} » {hata}"}
@@ -1,12 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from Core import KekikStreamAPI, Request, RedirectResponse, JSONResponse, FileResponse
4
- from starlette.exceptions import HTTPException as StarletteHTTPException
5
-
6
- @KekikStreamAPI.exception_handler(StarletteHTTPException)
7
- async def custom_http_exception_handler(request:Request, exc):
8
- return RedirectResponse("/") if exc.status_code != 410 else JSONResponse(status_code=exc.status_code, content={"detail": exc.detail})
9
-
10
- @KekikStreamAPI.get("/favicon.ico")
11
- def get_favicon():
12
- return FileResponse("Public/Home/Static/favicon.ico")
@@ -1,131 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from CLI import konsol
4
- from Core import KekikStreamAPI, Request, JSONResponse
5
- from time import time
6
- from user_agents import parse
7
- from ._IP_Log import ip_log
8
- import asyncio
9
-
10
- @KekikStreamAPI.middleware("http")
11
- async def istekten_once_sonra(request: Request, call_next):
12
- baslangic_zamani = time()
13
-
14
- if request.method == "GET":
15
- request.state.req_veri = dict(request.query_params) if request.query_params else None
16
- else:
17
- try:
18
- request.state.req_veri = await request.json()
19
- except Exception:
20
- form_data = await request.form()
21
- request.state.req_veri = dict(form_data.items())
22
-
23
- try:
24
- ua_header = request.headers.get("User-Agent")
25
- parsed_ua = parse(ua_header)
26
- cihaz = ua_header if str(parsed_ua).split("/")[2].strip() == "Other" else parsed_ua
27
- except Exception:
28
- cihaz = request.headers.get("User-Agent")
29
-
30
- log_ip = request.headers.get("X-Forwarded-For") or request.client.host
31
- ip_w_cf = (
32
- f"{request.headers.get('Cf-Connecting-Ip')} [yellow]| CF: ({log_ip})[/]"
33
- if request.headers.get("Cf-Connecting-Ip")
34
- else log_ip
35
- )
36
-
37
- log_veri = {
38
- "id" : request.headers.get("X-Request-ID") or "",
39
- "method" : request.method,
40
- "url" : str(request.url).rstrip("?").split("?")[0],
41
- "veri" : request.state.req_veri,
42
- "kod" : None,
43
- "sure" : None,
44
- "ip" : log_ip,
45
- "cihaz" : cihaz,
46
- "host" : request.url.hostname,
47
- }
48
-
49
- try:
50
- # async with asyncio.timeout(7.5):
51
- response = await asyncio.wait_for(call_next(request), timeout=7.5)
52
- if response:
53
- log_veri["kod"] = response.status_code
54
- else:
55
- log_veri["kod"] = 502
56
- response = JSONResponse(status_code=log_veri["kod"], content={"ups": "Yanit Gelmedi.."})
57
- except asyncio.TimeoutError:
58
- log_veri["kod"] = 504
59
- response = JSONResponse(status_code=log_veri["kod"], content={"ups": "Zaman Aşımı.."})
60
-
61
- for skip_path in ("/favicon.ico", "/static", "/webfonts"):
62
- if skip_path in request.url.path:
63
- return response
64
-
65
- log_veri["sure"] = round(time() - baslangic_zamani, 2)
66
- await log_salla(log_veri, request)
67
-
68
- return response
69
-
70
- async def log_salla(log_veri: dict, request: Request):
71
- log_url = (
72
- log_veri['url'].replace(request.url.scheme, request.headers.get("X-Forwarded-Proto"))
73
- if request.headers.get("X-Forwarded-Proto")
74
- else log_veri['url']
75
- )
76
-
77
- LABEL_WIDTH = 5
78
- durum_label = f"[green]{'durum':<{LABEL_WIDTH}}:[/]"
79
- ip_label = f"[green]{'ip':<{LABEL_WIDTH}}:[/]"
80
- konum_label = f"[green]{'konum':<{LABEL_WIDTH}}:[/]"
81
- cihaz_label = f"[green]{'cihaz':<{LABEL_WIDTH}}:[/]"
82
-
83
- log_lines = []
84
-
85
- log_lines.append(f"[bold blue]»[/] [bold turquoise2]{log_url}[/]")
86
-
87
- if log_veri["veri"]:
88
- log_lines.append(f"[bold magenta]»[/] [bold cyan]{log_veri['veri']}[/]")
89
-
90
- durum_line = (
91
- f" {durum_label} [bold green]{log_veri['method']}[/]"
92
- f" [blue]-[/] [bold bright_yellow]{log_veri['kod']}[/]"
93
- f" [blue]-[/] [bold yellow2]{log_veri['sure']} sn[/]"
94
- )
95
- log_lines.append(durum_line)
96
-
97
- if log_veri["id"]:
98
- ip_line = (
99
- f" {ip_label} [bold bright_blue]{log_veri['id']}[/]"
100
- f"[bold green]@[/][bold red]{log_veri['ip']}[/]"
101
- )
102
- else:
103
- ip_line = f" {ip_label} [bold red]{log_veri['ip']}[/]"
104
- log_lines.append(ip_line)
105
-
106
- ip_detay = await ip_log(log_veri["ip"].split()[0].replace(",", ""))
107
- if ("hata" not in ip_detay) and ip_detay.get("ulke"):
108
- il = ip_detay["il"].replace(" Province", "")
109
- ilce = ip_detay["ilce"]
110
-
111
- host_str = " ".join(ip_detay["host"].split()[1:4])
112
-
113
- if il != ilce:
114
- konum_line = (
115
- f" {konum_label} [bold chartreuse3]{ip_detay['ulke']}[/]"
116
- f" [blue]|[/] [bold chartreuse3]{il}[/]"
117
- f" [blue]|[/] [bold chartreuse3]{ilce}[/]"
118
- f" [blue]|[/] [bold chartreuse3]{host_str}[/]"
119
- )
120
- else:
121
- konum_line = (
122
- f" {konum_label} [bold chartreuse3]{ip_detay['ulke']}[/]"
123
- f" [blue]|[/] [bold chartreuse3]{il}[/]"
124
- f" [blue]|[/] [bold chartreuse3]{host_str}[/]"
125
- )
126
- log_lines.append(konum_line)
127
-
128
- log_lines.append(f" {cihaz_label} [magenta]{log_veri['cihaz']}[/]")
129
-
130
- final_log = "\n".join(log_lines)
131
- konsol.log(final_log + "\n")
@@ -1,13 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from CLI import konsol
4
- from Settings import AYAR, HOST, PORT, WORKERS
5
- from sys import version_info
6
- import uvicorn
7
-
8
- def basla():
9
- surum = f"{version_info[0]}.{version_info[1]}"
10
- konsol.print(f"\n[bold gold1]{AYAR['PROJE']}[/] [yellow]:bird:[/] [turquoise2]Python {surum}[/] [bold yellow2]uvicorn[/]", width=70, justify="center")
11
- konsol.print(f"[red]{HOST}[light_coral]:[/]{PORT}[pale_green1] başlatılmıştır...[/]\n", width=70, justify="center")
12
-
13
- uvicorn.run("Core:KekikStreamAPI", host=HOST, port=PORT, forwarded_allow_ips="*", workers=WORKERS, log_level="error")
@@ -1,24 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from fastapi import FastAPI, Request, Response, HTTPException
4
- from fastapi.staticfiles import StaticFiles
5
- from fastapi.responses import JSONResponse, HTMLResponse, RedirectResponse, PlainTextResponse, FileResponse
6
- from Kekik.cache import kekik_cache
7
-
8
- KekikStreamAPI = FastAPI(
9
- title = "KekikStreamAPI",
10
- openapi_url = None,
11
- docs_url = None,
12
- redoc_url = None
13
- )
14
-
15
- # ! ----------------------------------------» Routers
16
-
17
- from Core.Modules import _istek, _hata
18
- from Public.Home.Routers import home_router
19
- from Public.API.v1.Routers import api_v1_router
20
-
21
- KekikStreamAPI.include_router(home_router, prefix="")
22
- KekikStreamAPI.mount("/static/home", StaticFiles(directory="Public/Home/Static"), name="static_home")
23
-
24
- KekikStreamAPI.include_router(api_v1_router, prefix="/api/v1")
@@ -1,7 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from KekikStream.Core import PluginManager, ExtractorManager, MediaManager, MovieInfo, SeriesInfo
4
-
5
- plugin_manager = PluginManager()
6
- extractor_manager = ExtractorManager()
7
- media_manager = MediaManager()
@@ -1,25 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from fastapi import APIRouter
4
- from Core import Request, kekik_cache
5
- from Settings import CACHE_TIME
6
-
7
- api_v1_router = APIRouter()
8
- api_v1_global_message = {
9
- "with" : "https://github.com/keyiflerolsun/KekikStream"
10
- }
11
-
12
- @api_v1_router.get("")
13
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
14
- async def get_api_v1_router(request: Request):
15
- return api_v1_global_message
16
-
17
-
18
- # ! ----------------------------------------» Routers
19
- from .get_plugin_names import *
20
- from .get_plugin import *
21
- from .get_main_page import *
22
- from .search import *
23
- from .load_item import *
24
- from .load_links import *
25
- from .extract import *
@@ -1,26 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import api_v1_router, api_v1_global_message
4
- from Core import Request, JSONResponse, kekik_cache
5
- from ..Libs import extractor_manager
6
- from Settings import CACHE_TIME
7
-
8
- @api_v1_router.get("/extract")
9
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
10
- async def extract(request:Request):
11
- istek = request.state.req_veri
12
- if not istek:
13
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?_encoded_url=&_encoded_referer="})
14
-
15
- _encoded_url = istek.get("encoded_url")
16
- _encoded_referer = istek.get("encoded_referer")
17
- if not _encoded_url:
18
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?_encoded_url=&_encoded_referer="})
19
-
20
- extractor = extractor_manager.find_extractor(_encoded_url)
21
- if not extractor:
22
- return JSONResponse(status_code=404, content={"hata": "Extractor bulunamadı."})
23
-
24
- result = await extractor.extract(_encoded_url, _encoded_referer)
25
-
26
- return {**api_v1_global_message, "result": result}
@@ -1,33 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import api_v1_router, api_v1_global_message
4
- from Core import Request, JSONResponse, kekik_cache
5
- from ..Libs import plugin_manager
6
- from Settings import CACHE_TIME
7
-
8
- from random import choice
9
- from urllib.parse import quote_plus
10
-
11
- @api_v1_router.get("/get_main_page")
12
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
13
- async def get_main_page(request:Request):
14
- istek = request.state.req_veri
15
- plugin_names = plugin_manager.get_plugin_names()
16
- if not istek:
17
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={choice(plugin_names)}&page=1&encoded_url=&encoded_category="})
18
-
19
- _plugin = istek.get("plugin")
20
- _plugin = _plugin if _plugin in plugin_names else None
21
- _page = istek.get("page")
22
- _page = int(_page) if _page.isdigit() else None
23
- _encoded_url = istek.get("encoded_url")
24
- _encoded_category = istek.get("encoded_category")
25
- if not _plugin or not _page or not _encoded_url or not _encoded_category:
26
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={_plugin or choice(plugin_names)}&page=1&encoded_url=&encoded_category="})
27
-
28
- plugin = plugin_manager.select_plugin(_plugin)
29
- result = await plugin.get_main_page(_page, _encoded_url, _encoded_category)
30
- for icerik in result:
31
- icerik.url = quote_plus(icerik.url)
32
-
33
- return {**api_v1_global_message, "result": result}
@@ -1,39 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import api_v1_router, api_v1_global_message
4
- from Core import Request, JSONResponse, kekik_cache
5
- from ..Libs import plugin_manager
6
- from Settings import CACHE_TIME
7
-
8
- from random import choice
9
- from urllib.parse import quote_plus
10
-
11
- @api_v1_router.get("/get_plugin")
12
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
13
- async def get_plugin(request:Request):
14
- istek = request.state.req_veri
15
- plugin_names = plugin_manager.get_plugin_names()
16
- if not istek:
17
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={choice(plugin_names)}"})
18
-
19
- _plugin = istek.get("plugin")
20
- _plugin = _plugin if _plugin in plugin_names else None
21
- if not _plugin:
22
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={_plugin or choice(plugin_names)}"})
23
-
24
- plugin = plugin_manager.select_plugin(_plugin)
25
-
26
- main_page = {}
27
- for url, category in plugin.main_page.items():
28
- main_page[quote_plus(url)] = quote_plus(category)
29
-
30
- result = {
31
- "name" : plugin.name,
32
- "language" : plugin.language,
33
- "main_url" : plugin.main_url,
34
- "favicon" : plugin.favicon,
35
- "description" : plugin.description,
36
- "main_page" : main_page
37
- }
38
-
39
- return {**api_v1_global_message, "result": result}
@@ -1,13 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import api_v1_router, api_v1_global_message
4
- from Core import Request, kekik_cache
5
- from ..Libs import plugin_manager
6
- from Settings import CACHE_TIME
7
-
8
- @api_v1_router.get("/get_plugin_names")
9
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
10
- async def get_plugin_names(request: Request):
11
- plugin_names = plugin_manager.get_plugin_names()
12
-
13
- return {**api_v1_global_message, "result": plugin_names}
@@ -1,34 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import api_v1_router, api_v1_global_message
4
- from Core import Request, JSONResponse, kekik_cache
5
- from ..Libs import plugin_manager, SeriesInfo
6
- from Settings import CACHE_TIME
7
-
8
- from random import choice
9
- from urllib.parse import quote_plus
10
-
11
- @api_v1_router.get("/load_item")
12
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
13
- async def load_item(request:Request):
14
- istek = request.state.req_veri
15
- plugin_names = plugin_manager.get_plugin_names()
16
- if not istek:
17
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={choice(plugin_names)}&encoded_url="})
18
-
19
- _plugin = istek.get("plugin")
20
- _plugin = _plugin if _plugin in plugin_names else None
21
- _encoded_url = istek.get("encoded_url")
22
- if not _plugin or not _encoded_url:
23
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={_plugin or choice(plugin_names)}&encoded_url="})
24
-
25
- plugin = plugin_manager.select_plugin(_plugin)
26
- result = await plugin.load_item(_encoded_url)
27
-
28
- result.url = quote_plus(result.url)
29
-
30
- if isinstance(result, SeriesInfo):
31
- for episode in result.episodes:
32
- episode.url = quote_plus(episode.url)
33
-
34
- return {**api_v1_global_message, "result": result}
@@ -1,41 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import api_v1_router, api_v1_global_message
4
- from Core import Request, JSONResponse, kekik_cache
5
- from ..Libs import plugin_manager
6
- from Settings import CACHE_TIME
7
-
8
- from random import choice
9
- from urllib.parse import quote_plus
10
-
11
- @api_v1_router.get("/load_links")
12
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
13
- async def load_links(request:Request):
14
- istek = request.state.req_veri
15
- plugin_names = plugin_manager.get_plugin_names()
16
- if not istek:
17
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={choice(plugin_names)}&encoded_url="})
18
-
19
- _plugin = istek.get("plugin")
20
- _plugin = _plugin if _plugin in plugin_names else None
21
- _encoded_url = istek.get("encoded_url")
22
- if not _plugin or not _encoded_url:
23
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={_plugin or choice(plugin_names)}&encoded_url="})
24
-
25
- plugin = plugin_manager.select_plugin(_plugin)
26
- links = await plugin.load_links(_encoded_url)
27
-
28
- if hasattr(plugin, "play") and callable(getattr(plugin, "play", None)):
29
- result = []
30
- for link in links:
31
- data = plugin._data.get(link, {})
32
- result.append({
33
- "name" : data.get("name"),
34
- "url" : link,
35
- "referer" : data.get("referer"),
36
- "subtitles" : data.get("subtitles")
37
- })
38
-
39
- return {**api_v1_global_message, "must_extract": False, "result": result}
40
-
41
- return {**api_v1_global_message, "must_extract": True, "result": [quote_plus(link) for link in links]}
@@ -1,31 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from . import api_v1_router, api_v1_global_message
4
- from Core import Request, JSONResponse, kekik_cache
5
- from ..Libs import plugin_manager
6
- from Settings import CACHE_TIME
7
-
8
- from random import choice
9
- from urllib.parse import quote_plus
10
-
11
- @api_v1_router.get("/search")
12
- @kekik_cache(ttl=CACHE_TIME, is_fastapi=True)
13
- async def search(request:Request):
14
- istek = request.state.req_veri
15
- plugin_names = plugin_manager.get_plugin_names()
16
- if not istek:
17
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={choice(plugin_names)}&query="})
18
-
19
- _plugin = istek.get("plugin")
20
- _plugin = _plugin if _plugin in plugin_names else None
21
- _query = istek.get("query")
22
- if not _plugin or not _query:
23
- return JSONResponse(status_code=410, content={"hata": f"{request.url.path}?plugin={_plugin or choice(plugin_names)}&query="})
24
-
25
- plugin = plugin_manager.select_plugin(_plugin)
26
- result = await plugin.search(_query)
27
-
28
- for elem in result:
29
- elem.url = quote_plus(elem.url)
30
-
31
- return {**api_v1_global_message, "result": result}
@@ -1,9 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from fastapi import APIRouter
4
- from fastapi.templating import Jinja2Templates
5
-
6
- home_router = APIRouter()
7
- home_template = Jinja2Templates(directory="Public/Home/Templates")
8
-
9
- from .ana_sayfa import *
@@ -1,14 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from Core import Request, HTMLResponse
4
- from . import home_router, home_template
5
-
6
- @home_router.get("/", response_class=HTMLResponse)
7
- async def ana_sayfa(request: Request):
8
- context = {
9
- "request" : request,
10
- "baslik" : "keyiflerolsun - Ömer Faruk Sancak | KekikAkademi",
11
- "aciklama" : "siz hayal edin, biz geliştirelim.. 🕊"
12
- }
13
-
14
- return home_template.TemplateResponse("index.html", context)
@@ -1,85 +0,0 @@
1
- /* Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. */
2
-
3
- @import "https://fonts.googleapis.com/css2?family=Mulish:wght@300;400;500;600;700;800;900&display=swap";
4
-
5
- * {
6
- padding: 0;
7
- margin: 0;
8
- list-style: none;
9
- border: 0;
10
- outline: none;
11
- text-decoration: none !important;
12
- box-sizing: border-box;
13
- -webkit-font-smoothing: antialiased
14
- }
15
-
16
- html, body {
17
- color: #EF7F1A;
18
- height: 100%
19
- }
20
-
21
- body {
22
- background-color: #2B2A29;
23
- display: flex;
24
- flex-direction: column;
25
- align-items: center;
26
- justify-content: center
27
- }
28
-
29
- h2 {
30
- font-family: "Mulish", sans-serif;
31
- color:#d3d3d3;
32
- }
33
-
34
- h3 {
35
- text-align: center;
36
- color: #d3d3d3 ;
37
- font-size: 50px;
38
- font-weight: 900;
39
- margin-bottom: 30px
40
- }
41
-
42
- h3 a {
43
- color: #EF7F1A;
44
- }
45
-
46
- h3 a:hover {
47
- color: #0087A3;
48
- }
49
-
50
- @media only screen and (max-width: 600px) {
51
- body {
52
- text-align: center;
53
- flex-wrap: wrap;
54
- }
55
-
56
- form h3 {
57
- font-size: 33px !important;
58
- }
59
- }
60
-
61
- .hover {
62
- text-decoration: none !important;
63
- color: #d3d3d3;
64
- transition: color 1s;
65
- }
66
-
67
- .hover:hover {
68
- color: #2B2A29;
69
- background: #EF7F1A;
70
- text-decoration: none !important;
71
- border: 0.5px solid #EF7F1A;
72
- }
73
-
74
- .links-footer {
75
- padding: 4px;
76
- border: 0.5px solid #d3d3d3;
77
- border-width: 1px;
78
- width: 40px;
79
- display: inline-block;
80
- border-radius: 10px;
81
- font-size: 20px;
82
- text-align: center;
83
- margin: 10px;
84
- margin-top: 50px;
85
- }
@@ -1 +0,0 @@
1
- // Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
@@ -1,50 +0,0 @@
1
- <!doctype html>
2
- <html lang="tr" data-bs-theme="dark">
3
-
4
- <head>
5
- <!-- ? Meta -->
6
- <meta charset="UTF-8">
7
- <meta http-equiv="Content-Language" content="tr">
8
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
-
10
- <title>{{ baslik }}</title>
11
- <meta name="description" content="{{ aciklama }}">
12
- <meta name="keywords" content="keyiflerolsun, Ömer Faruk Sancak, KekikAkademi, Kekik Akademi">
13
- <meta name="author" content="keyiflerolsun">
14
-
15
- <!-- ? Bootstrap CSS - Font Awesome -->
16
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css">
17
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
18
-
19
- <!-- ? Statik CSS -->
20
- <link rel="stylesheet" href="{{ url_for('static_home', path='CSS/stil.css') }}">
21
-
22
- <!-- ? Favicon -->
23
- <link rel="shortcut icon" href="{{ url_for('static_home', path='favicon.ico') }}" type="image/x-icon"/>
24
- </head>
25
-
26
- <body class="d-flex align-items-center min-vh-100">
27
-
28
- {% block icerik %}
29
- {% endblock %}
30
-
31
-
32
- <!-- ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
33
- * ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⡀⠀⠀⠀
34
- * ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣷⣤⣾⡇⠀⠀⠀
35
- * ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣈⡛⣿⡟⠁⢀⣀⠀
36
- * ⠀⠀⠀⢰⡄⠀⠀⠀⠀⠀⢸⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⠿⠾⣷⣾⠿⠃⠀
37
- * ⠀⠀⠀⠈⣿⣦⡀⠀⠀⠀⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀
38
- * ⠀⠀⠀⠀⣿⣿⣿⣦⡀⠀⣿⣿⣿⣧⡀⠀⠀⠀⠀⢀⣤⣤⣤⣀⡀⠛⠀⠀⠀⠀
39
- * ⠀⠀⠀⠀⠘⣿⣿⣿⣿⣶⣄⠙⠻⠿⣷⡀⠀⠀⢀⣿⣿⣿⣿⣿⡿⠶⠀⠀⠀⠀
40
- * ⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣶⣦⣤⣤⣤⣤⣾⣿⣿⡏⠉⠀⣤⠄⠀⠀⠀⠀
41
- * ⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠉⠀⠀⠀⠀⠀
42
- * ⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀
43
- * ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
44
- * ⠀⣼⣷⣶⣶⣶⣶⣶⣾⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
45
- * ⠀⢻⣿⣿⣿⣿⣿⠿⠟⠛⠛⠛⠋⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
46
- * ⠀⠘⢿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
47
- * ⠀⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
48
- ! -->
49
- </body>
50
- </html>
@@ -1,33 +0,0 @@
1
- {% extends "_html_taban.html" %}
2
- {% block icerik %}
3
-
4
- <h2>keyiflerolsun | Ömer Faruk Sancak</h2>
5
- <h3><a href="https://t.me/KekikAkademi" target="_blank">KekikAkademi</a></h3>
6
-
7
- <div style="text-align: center;">
8
- <a href="https://github.com/keyiflerolsun" target="_blank" class="hover , links-footer">
9
- <i class="fab fa-github"></i>
10
- </a>
11
- <a href="https://linkedin.com/in/keyiflerolsun" target="_blank" class="hover , links-footer">
12
- <i class="fab fa-linkedin"></i>
13
- </a>
14
- <a href="https://t.me/keyiflerolsunDev" target="_blank" class="hover , links-footer">
15
- <i class="fab fa-telegram"></i>
16
- </a>
17
- <a href="https://wa.me/908503093493" target="_blank" class="hover , links-footer">
18
- <i class="fab fa-whatsapp"></i>
19
- </a>
20
- <a href="https://buymeacoffee.com/keyiflerolsun" target="_blank" class="hover , links-footer">
21
- <i class="fas fa-coffee"></i>
22
- </a>
23
- </div>
24
-
25
-
26
- <!-- ? jQuery ve Bootstrap Bundle (Popper içerir) -->
27
- <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.min.js"></script>
28
- <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
29
-
30
- <!-- ? Statik JS -->
31
- <script src="{{ url_for('static_home', path='JS/bakalim.js') }}"></script>
32
-
33
- {% endblock %}
KekikStreamAPI/README.md DELETED
@@ -1,9 +0,0 @@
1
- # KekikStreamAPI
2
-
3
- SubTree » https://github.com/keyiflerolsun/KekikStreamAPI
4
-
5
- Güncellemek için;
6
-
7
- ```bash
8
- git subtree pull --prefix=KekikStreamAPI https://github.com/keyiflerolsun/KekikStreamAPI.git master --squash
9
- ```
@@ -1,11 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from yaml import load, FullLoader
4
-
5
- with open("AYAR.yml", "r", encoding="utf-8") as yaml_dosyasi:
6
- AYAR = load(yaml_dosyasi, Loader=FullLoader)
7
-
8
- HOST = AYAR["APP"]["HOST"]
9
- PORT = AYAR["APP"]["PORT"]
10
- WORKERS = AYAR["APP"]["WORKERS"]
11
- CACHE_TIME = AYAR["APP"]["CACHE"] * 60
@@ -1,18 +0,0 @@
1
- # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from pathlib import Path
4
- import os, sys
5
-
6
- proje_dizin = Path(__file__).resolve().parent
7
- os.chdir(proje_dizin)
8
- sys.path.append(str(proje_dizin))
9
-
10
- from CLI import cikis_yap, hata_yakala
11
- from Core import Motor
12
-
13
- def basla():
14
- try:
15
- Motor.basla()
16
- cikis_yap(False)
17
- except Exception as hata:
18
- hata_yakala(hata)
@@ -1,2 +0,0 @@
1
- KekikStream
2
- KekikStreamAPI