light-infer-chat commited on
Commit
65e87f1
·
1 Parent(s): 68002b0
Files changed (2) hide show
  1. app/api/v1/batch.py +23 -7
  2. app/api/v1/convert.py +7 -1
app/api/v1/batch.py CHANGED
@@ -8,9 +8,9 @@ import time
8
  from typing import Annotated, List, Optional
9
 
10
  import httpx
11
- from fastapi import APIRouter, Depends, File, Form, HTTPException, UploadFile
12
 
13
- from app.api.deps import get_converter_service, get_extraction_service, require_auth
14
  from app.config import get_settings
15
  from app.core.logger import get_logger
16
  from app.models.domain import ConversionError
@@ -22,6 +22,7 @@ from app.models.schemas import (
22
  )
23
  from app.services.converter_service import ConverterService
24
  from app.services.extraction_service import ExtractionService
 
25
 
26
  router = APIRouter()
27
  _logger = get_logger(__name__)
@@ -72,10 +73,12 @@ def _batch_result_from_ok(result) -> BatchFileResult:
72
  async def batch_files(
73
  files: Annotated[List[UploadFile], File(description="Files to convert")],
74
  return_json: bool = Form(False),
 
75
  mappings: Optional[str] = Form(None, description="JSON string with field mappings"),
76
  token: str = Depends(require_auth),
77
  converter_service: ConverterService = Depends(get_converter_service),
78
  extraction_service: ExtractionService = Depends(get_extraction_service),
 
79
  ):
80
  if not files:
81
  raise HTTPException(status_code=400, detail={"success": False, "message": "No files provided."})
@@ -108,7 +111,14 @@ async def batch_files(
108
  if isinstance(outcome, ConversionError):
109
  return _batch_result_from_error(f.filename or "unknown", outcome)
110
 
 
 
 
 
 
111
  result = _batch_result_from_ok(outcome)
 
 
112
  if return_json and f.filename:
113
  loop = asyncio.get_running_loop()
114
  json_result = await loop.run_in_executor(
@@ -145,9 +155,11 @@ async def batch_files(
145
  )
146
  async def batch_urls(
147
  body: BatchUrlRequest,
 
148
  token: str = Depends(require_auth),
149
  converter_service: ConverterService = Depends(get_converter_service),
150
  extraction_service: ExtractionService = Depends(get_extraction_service),
 
151
  ):
152
  batch_start = time.perf_counter()
153
 
@@ -173,6 +185,9 @@ async def batch_urls(
173
  if isinstance(outcome, ConversionError):
174
  return _batch_result_from_error(url, outcome)
175
  result = _batch_result_from_ok(outcome)
 
 
 
176
  loop = asyncio.get_running_loop()
177
  json_result = await loop.run_in_executor(
178
  _thread_pool,
@@ -193,11 +208,12 @@ async def batch_urls(
193
 
194
  loop = asyncio.get_running_loop()
195
  outcome = await loop.run_in_executor(_thread_pool, converter_service.convert_url, url)
196
- return (
197
- _batch_result_from_error(url, outcome)
198
- if isinstance(outcome, ConversionError)
199
- else _batch_result_from_ok(outcome)
200
- )
 
201
 
202
  tasks = [process_single_url(url) for url in body.urls]
203
  results = await asyncio.gather(*tasks)
 
8
  from typing import Annotated, List, Optional
9
 
10
  import httpx
11
+ from fastapi import APIRouter, Depends, File, Form, HTTPException, Query, UploadFile
12
 
13
+ from app.api.deps import get_converter_service, get_extraction_service, get_text_cleaner_service, require_auth
14
  from app.config import get_settings
15
  from app.core.logger import get_logger
16
  from app.models.domain import ConversionError
 
22
  )
23
  from app.services.converter_service import ConverterService
24
  from app.services.extraction_service import ExtractionService
25
+ from app.services.text_cleaner_service import TextCleanerService
26
 
27
  router = APIRouter()
28
  _logger = get_logger(__name__)
 
73
  async def batch_files(
74
  files: Annotated[List[UploadFile], File(description="Files to convert")],
75
  return_json: bool = Form(False),
76
+ clean_content: bool = Form(False),
77
  mappings: Optional[str] = Form(None, description="JSON string with field mappings"),
78
  token: str = Depends(require_auth),
79
  converter_service: ConverterService = Depends(get_converter_service),
80
  extraction_service: ExtractionService = Depends(get_extraction_service),
81
+ text_cleaner_service: TextCleanerService = Depends(get_text_cleaner_service),
82
  ):
83
  if not files:
84
  raise HTTPException(status_code=400, detail={"success": False, "message": "No files provided."})
 
111
  if isinstance(outcome, ConversionError):
112
  return _batch_result_from_error(f.filename or "unknown", outcome)
113
 
114
+ content = outcome.markdown
115
+ if clean_content:
116
+ loop2 = asyncio.get_running_loop()
117
+ content = await loop2.run_in_executor(_thread_pool, text_cleaner_service.clean, content)
118
+
119
  result = _batch_result_from_ok(outcome)
120
+ if clean_content:
121
+ result.content = content
122
  if return_json and f.filename:
123
  loop = asyncio.get_running_loop()
124
  json_result = await loop.run_in_executor(
 
155
  )
156
  async def batch_urls(
157
  body: BatchUrlRequest,
158
+ clean_content: bool = Query(False),
159
  token: str = Depends(require_auth),
160
  converter_service: ConverterService = Depends(get_converter_service),
161
  extraction_service: ExtractionService = Depends(get_extraction_service),
162
+ text_cleaner_service: TextCleanerService = Depends(get_text_cleaner_service),
163
  ):
164
  batch_start = time.perf_counter()
165
 
 
185
  if isinstance(outcome, ConversionError):
186
  return _batch_result_from_error(url, outcome)
187
  result = _batch_result_from_ok(outcome)
188
+ if clean_content:
189
+ loop2 = asyncio.get_running_loop()
190
+ result.content = await loop2.run_in_executor(_thread_pool, text_cleaner_service.clean, outcome.markdown)
191
  loop = asyncio.get_running_loop()
192
  json_result = await loop.run_in_executor(
193
  _thread_pool,
 
208
 
209
  loop = asyncio.get_running_loop()
210
  outcome = await loop.run_in_executor(_thread_pool, converter_service.convert_url, url)
211
+ if isinstance(outcome, ConversionError):
212
+ return _batch_result_from_error(url, outcome)
213
+ result = _batch_result_from_ok(outcome)
214
+ if clean_content:
215
+ result.content = await loop.run_in_executor(_thread_pool, text_cleaner_service.clean, outcome.markdown)
216
+ return result
217
 
218
  tasks = [process_single_url(url) for url in body.urls]
219
  results = await asyncio.gather(*tasks)
app/api/v1/convert.py CHANGED
@@ -8,7 +8,7 @@ from typing import Annotated, Any, Dict, Optional
8
  from urllib.parse import urlparse
9
 
10
  import httpx
11
- from fastapi import APIRouter, Depends, File, Form, HTTPException, UploadFile, status
12
  from pydantic import BaseModel
13
 
14
  from app.config import get_settings
@@ -195,9 +195,11 @@ async def convert_file(
195
  )
196
  async def convert_url(
197
  body: UrlRequest,
 
198
  token: str = Depends(require_auth),
199
  converter_service: ConverterService = Depends(get_converter_service),
200
  extraction_service: ExtractionService = Depends(get_extraction_service),
 
201
  ):
202
  _logger.info("Received request to convert URL: %s", body.url)
203
  parsed = urlparse(body.url)
@@ -227,6 +229,8 @@ async def convert_url(
227
  raw_data=raw_data,
228
  mappings=body.mappings,
229
  extraction_service=extraction_service,
 
 
230
  )
231
  _logger.info("Request completed for URL %s", body.url)
232
  return response
@@ -247,6 +251,8 @@ async def convert_url(
247
  filename=filename,
248
  mappings=body.mappings,
249
  extraction_service=extraction_service,
 
 
250
  )
251
  _logger.info("Request completed for URL %s", body.url)
252
  return response
 
8
  from urllib.parse import urlparse
9
 
10
  import httpx
11
+ from fastapi import APIRouter, Depends, File, Form, HTTPException, Query, UploadFile, status
12
  from pydantic import BaseModel
13
 
14
  from app.config import get_settings
 
195
  )
196
  async def convert_url(
197
  body: UrlRequest,
198
+ clean_content: bool = Query(False),
199
  token: str = Depends(require_auth),
200
  converter_service: ConverterService = Depends(get_converter_service),
201
  extraction_service: ExtractionService = Depends(get_extraction_service),
202
+ text_cleaner_service: TextCleanerService = Depends(get_text_cleaner_service),
203
  ):
204
  _logger.info("Received request to convert URL: %s", body.url)
205
  parsed = urlparse(body.url)
 
229
  raw_data=raw_data,
230
  mappings=body.mappings,
231
  extraction_service=extraction_service,
232
+ clean_content=clean_content,
233
+ text_cleaner_service=text_cleaner_service,
234
  )
235
  _logger.info("Request completed for URL %s", body.url)
236
  return response
 
251
  filename=filename,
252
  mappings=body.mappings,
253
  extraction_service=extraction_service,
254
+ clean_content=clean_content,
255
+ text_cleaner_service=text_cleaner_service,
256
  )
257
  _logger.info("Request completed for URL %s", body.url)
258
  return response