File size: 4,105 Bytes
314856e 66a788b 314856e 66a788b 314856e e21c8ff 314856e 66a788b e21c8ff 314856e e21c8ff 314856e 66a788b 314856e 66a788b 314856e e21c8ff 314856e 66a788b 314856e 66a788b 314856e e21c8ff 314856e 66a788b 314856e 66a788b 314856e e21c8ff 314856e 8c2f928 314856e 8c2f928 314856e c2592a7 314856e 66a788b 314856e e21c8ff 314856e 66a788b 314856e e21c8ff 314856e 66a788b 314856e 66a788b 314856e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import HTMLResponse
from dateutil import parser
import requests
import json
import secrets
app = FastAPI()
# Global variables for custom fields
CREATOR = "Eyepatch"
API_VERSION = "1.0"
# Utility function to format API responses
def format_response(**kwargs):
return {
"creator": CREATOR,
"api_version": API_VERSION,
**kwargs,
}
@app.get("/")
def root(request: Request):
return format_response(message="Welcome to the API", hostname=request.url.hostname)
@app.get("/search")
async def search(query: str, page: int = 0):
payload = {
"search_text": query,
"tags": [],
"brands": [],
"blacklist": [],
"order_by": [],
"ordering": [],
"page": page,
}
headers = {"Content-Type": "application/json; charset=utf-8"}
response = requests.post("https://search.htv-services.com", headers=headers, json=payload)
response_data = response.json()
return format_response(
results=json.loads(response_data["hits"]),
page=response_data["page"],
)
@app.get("/recent")
async def recent(page: int = 0):
payload = {
"search_text": "",
"tags": [],
"brands": [],
"blacklist": [],
"order_by": "created_at_unix",
"ordering": "desc",
"page": page,
}
headers = {"Content-Type": "application/json; charset=utf-8"}
response = requests.post("https://search.htv-services.com", headers=headers, json=payload)
response_data = response.json()
return format_response(
results=json.loads(response_data["hits"]),
page=response_data["page"],
)
@app.get("/trending")
async def trending(time: str = "month", page: int = 0):
headers = {
"X-Signature-Version": "web2",
"X-Signature": secrets.token_hex(32),
}
response = requests.get(
f"https://hanime.tv/api/v8/browse-trending?time={time}&page={page}",
headers=headers,
)
response_data = response.json()
return format_response(
results=response_data["hentai_videos"],
time=response_data["time"],
page=response_data["page"],
)
@app.get("/details")
async def details(id: str):
response = requests.get(f"https://hanime.tv/api/v8/video?id={id}")
response_data = response.json()
video_data = response_data["hentai_video"]
formatted_data = {
"query": video_data["slug"],
"name": video_data["name"],
"slug": video_data["slug"],
"cover": video_data["cover_url"],
"id": video_data["id"],
"monthly_rank": video_data["monthly_rank"],
"description": video_data["description"],
"views": "{:,}".format(video_data["views"]),
"likes": video_data["likes"],
"dislikes": video_data["dislikes"],
"brand": video_data["brand"],
"created_at": parser.parse(video_data["created_at"]).strftime("%Y %m %d"),
"released_date": parser.parse(video_data["released_at"]).strftime("%Y %m %d"),
"is_censored": video_data["is_censored"],
"tags": [tag["text"] for tag in video_data["hentai_tags"]],
}
return format_response(**formatted_data)
@app.get("/link")
async def hentai_video(id: str):
headers = {
"X-Session-Token": "PhzIzReFsg7g2GZi-tz9KVpR2LskgMP8-l_xJ0kmbwhSuBOcD3yZJeOoQKS-ND1w3qFCGj0Y2HzfJ4renU82W25BNSVI6KnmwfiN5e9lueyQOYbZ0RVKmS2Ek1fLKvMnS_3ktEUiFOTjSCezPusemw==(-(0)-)hDLS0eC_45mNW15pn3ZJYQ==",
}
response = requests.get(f"https://hanime.tv/api/v8/video?id={id}", headers=headers)
response_data = response.json()
return format_response(
streams=response_data["videos_manifest"]["servers"][0]["streams"]
)
@app.get("/play")
async def play(link: str):
html_content = f"""
<!DOCTYPE html>
<html>
<body>
<video id="live" autoplay controls>
<source src="{link}" type="video/mp4">
</video>
</body>
</html>
"""
return HTMLResponse(content=html_content, status_code=200)
|