icmr-data / app.py
kzropx's picture
Update app.py
802e9a1 verified
Raw
History Blame Contribute Delete
3.22 kB
from fastapi import FastAPI, HTTPException, Query
import duckdb
from contextlib import asynccontextmanager
from datetime import datetime, timedelta
# === VALIDITY CHECK ===
DEPLOYMENT_DATE = datetime(2026, 6, 27) # Tune aaj deploy kiya hai
EXPIRY_DAYS = 21 # 3 weeks
def is_api_valid():
return datetime.now() < DEPLOYMENT_DATE + timedelta(days=EXPIRY_DAYS)
# Global Connection
con = None
@asynccontextmanager
async def lifespan(app: FastAPI):
global con
print("🟢 DuckDB initialize ho raha hai...")
con = duckdb.connect()
con.execute("PRAGMA memory_limit='800MB'")
con.execute("PRAGMA threads=2")
con.execute("SET enable_object_cache=true")
con.execute("SET preserve_insertion_order=false")
con.execute("INSTALL httpfs; LOAD httpfs;")
URL_ICMR = "https://huggingface.co/datasets/kzropx/icmr-parquet/resolve/main/icmr.parquet"
con.execute(f"SELECT 1 FROM read_parquet('{URL_ICMR}') LIMIT 1")
print("🟢 DuckDB ready!")
yield
con.close()
app = FastAPI(lifespan=lifespan)
VALID_KEY = "@kzr0x"
@app.get("/")
def home(key: str = Query(..., description="API Key required")):
if not is_api_valid():
return {"status": "error", "message": "API Expired! Valid only for 3 weeks from 27-June-2026."}
if key != VALID_KEY:
return {"status": "error", "message": "Invalid API key"}
return {"status": "success", "message": "API Live! Use /search"}
@app.get("/search")
async def search_data(
key: str = Query(..., description="API Key required"),
number: str = Query(None, description="Search by Phone Number"),
aadhar: str = Query(None, description="Search by Aadhar Number"),
q: str = Query(None, description="Generic search")
):
# === EXPIRY CHECK (SAB SE PEHLE) ===
if not is_api_valid():
return {"status": "error", "message": "This API has expired. Valid only for 3 weeks (till 18-July-2026)."}
if key != VALID_KEY:
return {"status": "error", "message": "Invalid or missing API key"}
if not number and not aadhar and not q:
raise HTTPException(status_code=400, detail="Provide number, aadhar, or q")
search_term = q or number or aadhar
URL_ICMR = "https://huggingface.co/datasets/kzropx/icmr-parquet/resolve/main/icmr.parquet"
try:
query = f"""
SELECT name, fathersName, phoneNumber, aadharNumber, address, district, pincode, state, town
FROM read_parquet('{URL_ICMR}')
WHERE phoneNumber = ? OR aadharNumber = ?
LIMIT 1
"""
result = con.execute(query, [search_term, search_term]).fetchall()
if not result:
return {
"status": "error",
"message": f"'{search_term}' not found.",
"developer": {"name": "@kzr0x", "team": "TEAM DARK KNIGHT APIs"}
}
columns = [desc[0] for desc in con.description]
return {
"status": "success",
"data": dict(zip(columns, result[0])),
"developer": {"name": "@kzr0x", "team": "TEAM DARK KNIGHT APIs"}
}
except Exception as e:
return {"status": "error", "message": str(e)}