Spaces:
Sleeping
Sleeping
File size: 4,713 Bytes
698ce3e |
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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
"""
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()
@router.post("/scrape", response_model=ScrapeResponse, tags=["Scraping"])
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
@router.post("/scrape/save", tags=["Scraping"])
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"]
}
@router.post("/scrape/download", tags=["Scraping"])
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"])
)
@router.post("/scrape/multiple", response_model=MultipleScrapeResponse, tags=["Scraping multiple"])
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 |