Upload app.py
Browse files
app.py
CHANGED
|
@@ -30,6 +30,7 @@ folder_tree_data: dict[str, list[dict]] = {}
|
|
| 30 |
folder_browser_data: dict[str, dict[str, dict]] = {}
|
| 31 |
source_records_map: dict[str, list[int]] = {}
|
| 32 |
extension_counts: dict[str, int] = {}
|
|
|
|
| 33 |
word_index: dict[str, set[int]] = {}
|
| 34 |
|
| 35 |
def query_tokens(text: str) -> list[str]:
|
|
@@ -156,13 +157,18 @@ def load_json_gz(path: Path):
|
|
| 156 |
return json.loads(gzip.decompress(path.read_bytes()).decode("utf-8"))
|
| 157 |
|
| 158 |
def build_indexes() -> None:
|
| 159 |
-
global word_index, source_records_map, extension_counts
|
| 160 |
word_index = {}
|
| 161 |
source_records_map = {}
|
| 162 |
extension_counts = {}
|
|
|
|
| 163 |
for idx, rec in enumerate(records):
|
| 164 |
-
|
| 165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
file_text = " ".join([rec["display_name"], rec["source_name"]])
|
| 167 |
path_text = rec["display_rel_path"]
|
| 168 |
tokens = tokenize(f"{file_text} {path_text}")
|
|
@@ -270,7 +276,7 @@ def search(q="", sources_filter=None, folders=None, min_size=None, max_size=None
|
|
| 270 |
if not q and sort == "relevance" and not has_filters(sources_filter, folders, min_size, max_size):
|
| 271 |
result_items = [trim_record(rec) for rec in records[start:start + page_size]]
|
| 272 |
result_items = add_summaries(result_items)
|
| 273 |
-
return {"results": result_items, "total": len(records), "page": page, "page_size": page_size
|
| 274 |
if not q:
|
| 275 |
indices = list(range(len(records)))
|
| 276 |
filtered = apply_filters(indices, sources_filter, folders, min_size, max_size)
|
|
@@ -300,7 +306,7 @@ def search(q="", sources_filter=None, folders=None, min_size=None, max_size=None
|
|
| 300 |
total = len(filtered)
|
| 301 |
result_items = [trim_record(records[idx]) for idx in filtered[start:start + page_size]]
|
| 302 |
result_items = add_summaries(result_items)
|
| 303 |
-
return {"results": result_items, "total": total, "page": page, "page_size": page_size
|
| 304 |
|
| 305 |
def fulltext_search(q="", sources_filter=None, folders=None, min_size=None, max_size=None, page=1, page_size=100, sort="relevance", exact=False, search_paths=True):
|
| 306 |
q = q.strip()
|
|
@@ -327,7 +333,7 @@ def fulltext_search(q="", sources_filter=None, folders=None, min_size=None, max_
|
|
| 327 |
q,
|
| 328 |
matched_snippets=True,
|
| 329 |
)
|
| 330 |
-
return {"results": result_items, "total": total, "page": page, "page_size": page_size
|
| 331 |
|
| 332 |
def get_doc_storage_path(doc: dict) -> Path:
|
| 333 |
return BASE_DIR / doc["storage_root"] / doc["storage_rel_path"]
|
|
@@ -391,10 +397,7 @@ def api_sources():
|
|
| 391 |
@app.get("/api/extensions")
|
| 392 |
|
| 393 |
def api_extensions(source: Optional[str] = Query(default=None)):
|
| 394 |
-
|
| 395 |
-
counts = {}
|
| 396 |
-
for rec in pool:
|
| 397 |
-
counts[rec["extension"]] = counts.get(rec["extension"], 0) + 1
|
| 398 |
return JSONResponse([{"name": ext, "count": count} for ext, count in sorted(counts.items())])
|
| 399 |
@app.get("/api/folders/{source_slug}")
|
| 400 |
|
|
@@ -407,10 +410,14 @@ def api_folder_contents(source_slug: str, path: str = Query(default="")):
|
|
| 407 |
@app.get("/api/random")
|
| 408 |
|
| 409 |
def api_random(source: Optional[str] = Query(default=None)):
|
| 410 |
-
|
| 411 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 412 |
return JSONResponse({"error": "no record"}, status_code=404)
|
| 413 |
-
return JSONResponse(trim_record(random.choice(
|
| 414 |
@app.get("/api/preview/{doc_id}")
|
| 415 |
|
| 416 |
def api_preview(doc_id: str):
|
|
|
|
| 30 |
folder_browser_data: dict[str, dict[str, dict]] = {}
|
| 31 |
source_records_map: dict[str, list[int]] = {}
|
| 32 |
extension_counts: dict[str, int] = {}
|
| 33 |
+
source_extension_counts: dict[str, dict[str, int]] = {}
|
| 34 |
word_index: dict[str, set[int]] = {}
|
| 35 |
|
| 36 |
def query_tokens(text: str) -> list[str]:
|
|
|
|
| 157 |
return json.loads(gzip.decompress(path.read_bytes()).decode("utf-8"))
|
| 158 |
|
| 159 |
def build_indexes() -> None:
|
| 160 |
+
global word_index, source_records_map, extension_counts, source_extension_counts
|
| 161 |
word_index = {}
|
| 162 |
source_records_map = {}
|
| 163 |
extension_counts = {}
|
| 164 |
+
source_extension_counts = {}
|
| 165 |
for idx, rec in enumerate(records):
|
| 166 |
+
source = rec["source"]
|
| 167 |
+
extension = rec["extension"]
|
| 168 |
+
source_records_map.setdefault(source, []).append(idx)
|
| 169 |
+
extension_counts[extension] = extension_counts.get(extension, 0) + 1
|
| 170 |
+
source_counts_for_ext = source_extension_counts.setdefault(source, {})
|
| 171 |
+
source_counts_for_ext[extension] = source_counts_for_ext.get(extension, 0) + 1
|
| 172 |
file_text = " ".join([rec["display_name"], rec["source_name"]])
|
| 173 |
path_text = rec["display_rel_path"]
|
| 174 |
tokens = tokenize(f"{file_text} {path_text}")
|
|
|
|
| 276 |
if not q and sort == "relevance" and not has_filters(sources_filter, folders, min_size, max_size):
|
| 277 |
result_items = [trim_record(rec) for rec in records[start:start + page_size]]
|
| 278 |
result_items = add_summaries(result_items)
|
| 279 |
+
return {"results": result_items, "total": len(records), "page": page, "page_size": page_size}
|
| 280 |
if not q:
|
| 281 |
indices = list(range(len(records)))
|
| 282 |
filtered = apply_filters(indices, sources_filter, folders, min_size, max_size)
|
|
|
|
| 306 |
total = len(filtered)
|
| 307 |
result_items = [trim_record(records[idx]) for idx in filtered[start:start + page_size]]
|
| 308 |
result_items = add_summaries(result_items)
|
| 309 |
+
return {"results": result_items, "total": total, "page": page, "page_size": page_size}
|
| 310 |
|
| 311 |
def fulltext_search(q="", sources_filter=None, folders=None, min_size=None, max_size=None, page=1, page_size=100, sort="relevance", exact=False, search_paths=True):
|
| 312 |
q = q.strip()
|
|
|
|
| 333 |
q,
|
| 334 |
matched_snippets=True,
|
| 335 |
)
|
| 336 |
+
return {"results": result_items, "total": total, "page": page, "page_size": page_size}
|
| 337 |
|
| 338 |
def get_doc_storage_path(doc: dict) -> Path:
|
| 339 |
return BASE_DIR / doc["storage_root"] / doc["storage_rel_path"]
|
|
|
|
| 397 |
@app.get("/api/extensions")
|
| 398 |
|
| 399 |
def api_extensions(source: Optional[str] = Query(default=None)):
|
| 400 |
+
counts = source_extension_counts.get(source, {}) if source else extension_counts
|
|
|
|
|
|
|
|
|
|
| 401 |
return JSONResponse([{"name": ext, "count": count} for ext, count in sorted(counts.items())])
|
| 402 |
@app.get("/api/folders/{source_slug}")
|
| 403 |
|
|
|
|
| 410 |
@app.get("/api/random")
|
| 411 |
|
| 412 |
def api_random(source: Optional[str] = Query(default=None)):
|
| 413 |
+
if source:
|
| 414 |
+
indices = source_records_map.get(source, [])
|
| 415 |
+
if not indices:
|
| 416 |
+
return JSONResponse({"error": "no record"}, status_code=404)
|
| 417 |
+
return JSONResponse(trim_record(records[random.choice(indices)]))
|
| 418 |
+
if not records:
|
| 419 |
return JSONResponse({"error": "no record"}, status_code=404)
|
| 420 |
+
return JSONResponse(trim_record(random.choice(records)))
|
| 421 |
@app.get("/api/preview/{doc_id}")
|
| 422 |
|
| 423 |
def api_preview(doc_id: str):
|