| """ |
| 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. |
| """ |
| |
| 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. |
| """ |
| |
| 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: |
| |
| background_tasks.add_task( |
| processor.process_multiple_urls, |
| urls=request.urls, |
| save=request.save |
| ) |
| return { |
| "total": len(request.urls), |
| "success": None, |
| "results": [], |
| "message": f"Traitement de {len(request.urls)} URLs en arrière-plan" |
| } |
| |
| |
| result = processor.process_multiple_urls( |
| urls=request.urls, |
| save=request.save |
| ) |
| |
| return result |