Add random background getter
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Tyler Perkins 2023-10-28 23:31:00 -04:00
parent a213ca0c50
commit 670ddda93a
4 changed files with 74 additions and 2 deletions

View File

@ -3,6 +3,7 @@ anyio==3.7.1
beautifulsoup4==4.12.2
certifi==2023.7.22
charset-normalizer==3.2.0
chevron==0.14.0
click==8.1.6
envyaml==1.10.211231
exceptiongroup==1.1.2
@ -16,6 +17,7 @@ isodate==0.6.1
jstyleson==0.0.2
lxml==4.9.3
mf2py==1.1.3
minio==7.1.17
pydantic==2.1.1
pydantic_core==2.4.0
pyparsing==3.1.1

View File

@ -1 +1,8 @@
images:
# This component will serve files from a static bucket, randomly
# You should set the bucket to public, we will return the url
access_key: ${ACCESS_KEY}
secret_key: ${SECRET_KEY}
endpoint: s3.clortox.com
bucket: static-assets
secure: True

View File

@ -1,8 +1,9 @@
from datetime import datetime, date
from fastapi import FastAPI, HTTPException
from routers import recipe
from routers import recipe, images
app = FastAPI()
app.include_router(recipe.router)
app.include_router(images.router)

62
src/routers/images.py Normal file
View File

@ -0,0 +1,62 @@
from fastapi import APIRouter, Depends, HTTPException, Header
from typing import List, Optional
from pydantic import BaseModel
import logging
from config import getConfig
from minio import Minio
import random
import tempfile
import traceback
router = APIRouter(
prefix="/images",
tags=["Images"],
responses={404: {"description": "Not found"}}
)
@router.get("/background/random")
async def background(accept: str = Header(None)):
"""
Will obtain a random image from the configured S3 bucket.
"""
endpoint = getConfig()["images.endpoint"]
access_key = getConfig()["images.access_key"]
secret_key = getConfig()["images.secret_key"]
bucket = getConfig()["images.bucket"]
secure = getConfig()["images.secure"]
try:
client = Minio(
endpoint,
access_key=access_key,
secret_key=secret_key,
secure=secure
)
objects = client.list_objects(bucket)
object_names = [obj.object_name for obj in objects]
if not object_names:
raise HTTPException(status_code=500, detail="No data in bucket!")
random_object_name = random.choice(object_names)
print(random_object_name)
scheme = "https" if secure else "http"
object_url = f"{scheme}://{endpoint}/{bucket}/{random_object_name}"
if accept and "image/" in accept:
with tempfile.NamedTemporaryFile(detel=True) as temp_file:
client.fget_object(bucket, random_object_name, temp_file)
return FileResponse(temp_file.name, headers={"Content-Disposition": f"attachment; filename={random_object_name}"})
return object_url
except Exception as err:
traceback.print_exc()
raise HTTPException(status_code=500, detail=f"Unknown error. Check logs {err}")
print(f"Error occurued processing background {err}")
# TODO get a sync up background