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() searchfolder = request.form.get("folder", "").strip() datefrom = request.form.get("datefrom", "").strip() dateto = request.form.get("dateto", "").strip() include_transcript = request.form.get("includeTranscript") in ["true", "on"] words = [w for w in query.split() if w] cursor = search_db.cursor() # Determine allowed basefolders allowed_basefolders = list(session['folders'].keys()) if searchfolder and searchfolder in allowed_basefolders: allowed_basefolders = [searchfolder] # Build conditions and parameters conditions = [] params = [] # Choose fields for word search if include_transcript: fields = ['filename', 'transcript'] else: fields = ['relative_path', 'filename'] for word in words: field_clauses = [f"{f} LIKE ?" for f in fields] conditions.append(f"({ ' OR '.join(field_clauses) })") for _ in fields: params.append(f"%{word}%") # Category filter if category: conditions.append("filename LIKE ?") params.append(f"%{category}%") # Basefolder filter if allowed_basefolders: placeholders = ",".join("?" for _ in allowed_basefolders) conditions.append(f"basefolder IN ({placeholders})") params.extend(allowed_basefolders) # Date range filters if datefrom: try: conditions.append("performance_date >= ?") params.append(datefrom) except ValueError: pass if dateto: try: conditions.append("performance_date <= ?") params.append(dateto) except ValueError: pass # Ensure we only include entries with dates when filtering by date if datefrom or dateto: conditions.append("performance_date IS NOT NULL") # Build and execute SQL sql = "SELECT * FROM files" if conditions: sql += " WHERE " + " AND ".join(conditions) cursor.execute(sql, params) raw_results = cursor.fetchall() # Process results results = [] for row in raw_results: record = dict(row) if include_transcript: transcript = record.get('transcript', '') or '' record['transcript_hits'] = sum( transcript.lower().count(w.lower()) for w in words ) record.pop('transcript', None) results.append(record) # Randomize and sort random.shuffle(results) key = 'transcript_hits' if include_transcript else 'hitcount' results.sort(key=lambda x: x.get(key, 0), reverse=True) # Limit results results = results[:100] return jsonify(results=results) def search(): allowed_basefolders = list(session['folders'].keys()) title_short = app_config.get('TITLE_SHORT', 'Default Title') title_long = app_config.get('TITLE_LONG' , 'Default Title') return render_template("search.html", title_short=title_short, title_long=title_long, search_folders=allowed_basefolders )