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