bethaus-app/search.py

111 lines
4.2 KiB
Python

import sqlite3
from flask import Flask, render_template, request, request, jsonify, session
import random
import json
app = Flask(__name__)
SEARCH_DB_NAME = 'search.db'
search_db = sqlite3.connect(SEARCH_DB_NAME, check_same_thread=False)
search_db.row_factory = sqlite3.Row
with open("app_config.json", 'r') as file:
app_config = json.load(file)
def searchcommand():
query = request.form.get("query", "").strip()
category = request.form.get("category", "").strip()
include_transcript = request.form.get("includeTranscript") in ["true", "on"]
words = [w for w in query.split() if w]
cursor = search_db.cursor()
allowed_basefolders = list(session['folders'].keys())
print("Allowed base folders:", allowed_basefolders)
if not include_transcript:
conditions = []
params = []
# Apply query words to relative_path and filename
for word in words:
conditions.append("(relative_path LIKE ? OR filename LIKE ?)")
params.extend([f"%{word}%", f"%{word}%"])
# Search category in filename
if category:
conditions.append("(filename LIKE ?)")
params.extend([f"%{category}%"])
# Only include rows where basefolder is in allowed_basefolders
if allowed_basefolders:
placeholders = ",".join("?" for _ in allowed_basefolders)
conditions.append(f"basefolder IN ({placeholders})")
params.extend(allowed_basefolders)
sql = "SELECT * FROM files"
if conditions:
sql += " WHERE " + " AND ".join(conditions)
cursor.execute(sql, params)
raw_results = cursor.fetchall()
results = [dict(row) for row in raw_results]
# Randomize the list before sorting to break ties randomly.
random.shuffle(results)
results.sort(key=lambda x: x["hitcount"], reverse=True)
else:
# Advanced search: include transcript. Count transcript hits.
conditions = []
params = []
# Apply query words for filename and transcript
for word in words:
conditions.append("(filename LIKE ? OR transcript LIKE ?)")
params.extend([f"%{word}%", f"%{word}%"])
# Search category in filename
if category:
conditions.append("(filename LIKE ?)")
params.extend([f"%{category}%"])
# Only include rows where basefolder is in allowed_basefolders
if allowed_basefolders:
placeholders = ",".join("?" for _ in allowed_basefolders)
conditions.append(f"basefolder IN ({placeholders})")
params.extend(allowed_basefolders)
sql = "SELECT * FROM files"
if conditions:
sql += " WHERE " + " AND ".join(conditions)
cursor.execute(sql, params)
raw_results = cursor.fetchall()
results = []
for row in raw_results:
result = dict(row)
transcript = result.get("transcript") or ""
total_hits = sum(transcript.lower().count(word.lower()) for word in words)
result["transcript_hits"] = total_hits
result.pop("transcript", None)
results.append(result)
# Randomize the list before sorting to break ties randomly.
random.shuffle(results)
results.sort(key=lambda x: x["transcript_hits"], reverse=True)
results = results[:100]
return jsonify(results=results)
def search():
title_short = app_config.get('TITLE_SHORT', 'Default Title')
title_long = app_config.get('TITLE_LONG' , 'Default Title')
header_color = app_config.get('header_color' , '#000')
header_text_color = app_config.get('header_text_color', '#fff')
background_color = app_config.get('background_color', '#fff')
main_text_color = app_config.get('main_text_color', '#000')
return render_template("search.html",
title_short=title_short,
title_long=title_long,
header_color=header_color,
header_text_color=header_text_color,
main_text_color=main_text_color,
background_color=background_color,
)