Spaces:
Sleeping
Sleeping
""" | |
Routes de l'API. | |
""" | |
import os | |
from typing import Dict, List, Any | |
from fastapi import APIRouter, HTTPException, BackgroundTasks | |
from fastapi.responses import JSONResponse, FileResponse | |
from app.main import WebToMarkdown | |
from app.api.models import ( | |
ScrapeRequest, ScrapeResponse, | |
MultipleScrapeRequest, MultipleScrapeResponse | |
) | |
router = APIRouter() | |
processor = WebToMarkdown() | |
async def scrape_url(request: ScrapeRequest) -> Dict[str, Any]: | |
""" | |
Scrape une URL et convertit le contenu en Markdown. | |
- **url**: L'URL à scraper | |
- **save**: Si True, sauvegarde le résultat en fichier Markdown | |
- **filename**: Nom du fichier pour la sauvegarde (optionnel) | |
- **clean**: Si True, nettoie le HTML avant conversion | |
Retourne le contenu en Markdown et d'autres informations. | |
""" | |
result = processor.process_url( | |
url=request.url, | |
save=request.save, | |
filename=request.filename | |
) | |
if not result["success"]: | |
raise HTTPException( | |
status_code=500, | |
detail=f"Erreur lors du scraping: {result.get('error', 'Erreur inconnue')}" | |
) | |
return result | |
async def scrape_and_save(request: ScrapeRequest) -> Dict[str, Any]: | |
""" | |
Scrape une URL, convertit en Markdown et sauvegarde dans un fichier. | |
- **url**: L'URL à scraper | |
- **filename**: Nom du fichier pour la sauvegarde (optionnel) | |
- **clean**: Si True, nettoie le HTML avant conversion | |
Retourne le chemin du fichier sauvegardé et d'autres informations. | |
""" | |
# Force la sauvegarde | |
request.save = True | |
result = processor.process_url( | |
url=request.url, | |
save=True, | |
filename=request.filename | |
) | |
if not result["success"]: | |
raise HTTPException( | |
status_code=500, | |
detail=f"Erreur lors du scraping: {result.get('error', 'Erreur inconnue')}" | |
) | |
if not result["saved"] or not result["saved_path"]: | |
raise HTTPException( | |
status_code=500, | |
detail="Échec de l'enregistrement du fichier" | |
) | |
return { | |
"success": True, | |
"file_path": result["saved_path"], | |
"title": result["title"], | |
"url": result["url"] | |
} | |
async def scrape_and_download(request: ScrapeRequest) -> FileResponse: | |
""" | |
Scrape une URL, convertit en Markdown et renvoie directement le fichier. | |
- **url**: L'URL à scraper | |
- **filename**: Nom du fichier pour la sauvegarde (optionnel) | |
- **clean**: Si True, nettoie le HTML avant conversion | |
Retourne directement le fichier Markdown pour téléchargement. | |
""" | |
# Force la sauvegarde | |
request.save = True | |
result = processor.process_url( | |
url=request.url, | |
save=True, | |
filename=request.filename | |
) | |
if not result["success"]: | |
raise HTTPException( | |
status_code=500, | |
detail=f"Erreur lors du scraping: {result.get('error', 'Erreur inconnue')}" | |
) | |
if not result["saved"] or not result["saved_path"]: | |
raise HTTPException( | |
status_code=500, | |
detail="Échec de l'enregistrement du fichier" | |
) | |
return FileResponse( | |
path=result["saved_path"], | |
media_type="text/markdown", | |
filename=os.path.basename(result["saved_path"]) | |
) | |
async def scrape_multiple_urls( | |
request: MultipleScrapeRequest, | |
background_tasks: BackgroundTasks | |
) -> Dict[str, Any]: | |
""" | |
Scrape plusieurs URLs en parallèle. | |
- **urls**: Liste d'URLs à scraper | |
- **save**: Si True, sauvegarde les résultats en fichiers Markdown | |
Retourne les résultats pour toutes les URLs. | |
""" | |
if len(request.urls) > 10: | |
# Pour de nombreuses URLs, traiter en arrière-plan | |
background_tasks.add_task( | |
processor.process_multiple_urls, | |
urls=request.urls, | |
save=request.save | |
) | |
return { | |
"total": len(request.urls), | |
"success": None, # Inconnu car traitement en arrière-plan | |
"results": [], | |
"message": f"Traitement de {len(request.urls)} URLs en arrière-plan" | |
} | |
# Pour peu d'URLs, traiter immédiatement | |
result = processor.process_multiple_urls( | |
urls=request.urls, | |
save=request.save | |
) | |
return result |