Add comprehensive API documentation with media type enums

- Added MediaType enum with book, vinyl, cd, cassette options
- Created Pydantic models (SearchRequest, MediaItem) for API documentation
- Added /api/search endpoint with proper type annotations and response models
- Enhanced FastAPI docs with detailed descriptions and parameter explanations
- Media types now clearly visible in /docs and /redoc interfaces
- Improved API usability with structured request/response models
This commit is contained in:
2025-08-11 16:46:41 +07:00
parent 877ef951b2
commit 93284a9088

64
main.py
View File

@@ -4,16 +4,47 @@ from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
import httpx import httpx
import asyncio import asyncio
from typing import Optional from typing import Optional, List
import json import json
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
import discogs_client as discogs import discogs_client as discogs
from enum import Enum
from pydantic import BaseModel
# Load environment variables # Load environment variables
load_dotenv() load_dotenv()
app = FastAPI(title="Media Inventory App", description="Search for books, vinyl, CDs, and cassettes") # Define media types enum for API documentation
class MediaType(str, Enum):
book = "book"
vinyl = "vinyl"
cd = "cd"
cassette = "cassette"
# Pydantic models for API documentation
class SearchRequest(BaseModel):
media_type: MediaType
query: str
artist: Optional[str] = None
class MediaItem(BaseModel):
title: str
artist: Optional[str] = None
author: Optional[str] = None
year: str
isbn: Optional[str] = None
label: Optional[str] = None
format: Optional[str] = None
cover_url: Optional[str] = None
openlibrary_url: Optional[str] = None
discogs_url: Optional[str] = None
app = FastAPI(
title="Media Inventory App",
description="Search for books, vinyl records, CDs, and cassettes using OpenLibrary and Discogs APIs",
version="1.0.0"
)
# Mount static files and templates # Mount static files and templates
app.mount("/static", StaticFiles(directory="static"), name="static") app.mount("/static", StaticFiles(directory="static"), name="static")
@@ -28,6 +59,35 @@ async def home(request: Request):
"""Serve the main search form""" """Serve the main search form"""
return templates.TemplateResponse("index.html", {"request": request}) return templates.TemplateResponse("index.html", {"request": request})
@app.post("/api/search", response_model=List[MediaItem])
async def api_search_media(search_request: SearchRequest):
"""
Search for media items via API
**Media Types:**
- `book`: Search books using OpenLibrary API
- `vinyl`: Search vinyl records using Discogs API
- `cd`: Search CDs using Discogs API
- `cassette`: Search cassettes using Discogs API
**Parameters:**
- `media_type`: Type of media to search for (required)
- `query`: Search query - title, album name, or keywords (required)
- `artist`: Artist name for music searches (optional, helps narrow results)
**Returns:**
List of media items with details like title, artist/author, year, and links to source
"""
if not search_request.query.strip():
return []
if search_request.media_type == MediaType.book:
results = await search_openlibrary(search_request.query)
else: # vinyl, cd, cassette
results = await search_discogs(search_request.query, search_request.media_type.value, search_request.artist)
return results
@app.post("/search") @app.post("/search")
async def search_media( async def search_media(
request: Request, request: Request,