Spaces:
Sleeping
Sleeping
| import logging | |
| import os | |
| import sqlite3 | |
| import re | |
| from datetime import datetime | |
| import hashlib | |
| import json | |
| import math | |
| from flask import Blueprint, jsonify, request | |
| from flask_cors import CORS | |
| # Import modules | |
| from utils import date_to_words, custom_normalize, translate_date_to_words | |
| from gematria import calculate_gematria, strip_diacritics | |
| from deep_translator import GoogleTranslator | |
| # --- Setup Logging --- | |
| logger = logging.getLogger(__name__) | |
| # --- Blueprint Setup --- | |
| psalms_bp = Blueprint('psalms_bp', __name__) | |
| # --- Constants and Global Variables --- | |
| DATABASE_FILE = 'gematria.db' | |
| ELS_CACHE_DB = 'els_cache.db' | |
| DATABASE_TIMEOUT = 60 | |
| ADJUSTMENT_CONSTANT = 137.035999177 # Use the more precise constant | |
| # --- Available languages --- | |
| LANGUAGES = { | |
| 'English': 'en', | |
| 'Arabic': 'ar', | |
| 'German': 'de', | |
| 'Spanish': 'es', | |
| 'French': 'fr', | |
| 'Hebrew': 'iw', # Note: Google Translator uses 'iw' for Hebrew | |
| 'Hindi': 'hi', | |
| 'Italian': 'it', | |
| 'Japanese': 'ja', | |
| 'Korean': 'ko', | |
| 'Dutch': 'nl', | |
| 'Portuguese': 'pt', | |
| 'Russian': 'ru', | |
| 'Chinese (Simplified)': 'zh-CN', | |
| 'Chinese (Traditional)': 'zh-TW', | |
| } | |
| # --- Helper Functions (Copied from original app.py) --- | |
| def get_query_hash(func, args, kwargs): | |
| """Generate a hash for caching query results""" | |
| key = (func.__name__, args, kwargs) | |
| logger.debug(f"Generating query hash for key: {key}") | |
| hash_value = hashlib.sha256(json.dumps(key).encode()).hexdigest() | |
| logger.debug(f"Generated hash: {hash_value}") | |
| return hash_value | |
| def create_els_cache_table(): | |
| """Create the ELS cache table if it doesn't exist""" | |
| if not os.path.exists(ELS_CACHE_DB): | |
| logger.debug(f"Creating ELS cache table in {ELS_CACHE_DB}") | |
| with sqlite3.connect(ELS_CACHE_DB) as conn: | |
| conn.execute(''' | |
| CREATE TABLE IF NOT EXISTS els_cache ( | |
| query_hash TEXT PRIMARY KEY, | |
| function_name TEXT, | |
| args TEXT, | |
| kwargs TEXT, | |
| results TEXT | |
| ) | |
| ''') | |
| logger.debug("ELS cache table created.") | |
| else: | |
| logger.debug(f"ELS cache table already exists in {ELS_CACHE_DB}") | |
| def cached_process_json_files(func, *args, **kwargs): | |
| """Cache results of JSON file processing functions""" | |
| logger.debug(f"Entering cached_process_json_files with func: {func}, args: {args}, kwargs: {kwargs}") | |
| params = { | |
| "function": f"{func.__module__}.{func.__name__}" | |
| } | |
| arg_names = func.__code__.co_varnames[:func.__code__.co_argcount] | |
| for name, value in zip(arg_names, args): | |
| params[name] = value | |
| for name, value in kwargs.items(): | |
| params[name] = value | |
| params_json = json.dumps(params) | |
| logger.debug(f"Parameters as JSON: {params_json}") | |
| query_hash = get_query_hash(func, params_json, "") | |
| create_els_cache_table() | |
| try: | |
| with sqlite3.connect(ELS_CACHE_DB, timeout=DATABASE_TIMEOUT) as conn: | |
| cursor = conn.cursor() | |
| cursor.execute( | |
| "SELECT results FROM els_cache WHERE query_hash = ?", (query_hash,) | |
| ) | |
| result = cursor.fetchone() | |
| if result: | |
| logger.info(f"Cache hit for query: {query_hash}") | |
| logger.debug(f"Cached result: {result[0]}") | |
| return json.loads(result[0]) | |
| except sqlite3.Error as e: | |
| logger.error(f"Database error checking cache: {e}") | |
| logger.info(f"Cache miss for query: {query_hash}") | |
| results = func(*args, **kwargs) | |
| logger.debug(f"Results from function call: {results}") | |
| try: | |
| with sqlite3.connect(ELS_CACHE_DB, timeout=DATABASE_TIMEOUT) as conn: | |
| cursor = conn.cursor() | |
| cursor.execute( | |
| "INSERT INTO els_cache (query_hash, function_name, args, kwargs, results) VALUES (?, ?, ?, ?, ?)", | |
| (query_hash, params["function"], params_json, json.dumps({}), json.dumps(results)), | |
| ) | |
| conn.commit() | |
| logger.debug("Cached results in database.") | |
| except sqlite3.Error as e: | |
| logger.error(f"Database error caching results: {e}") | |
| logger.debug(f"Exiting cached_process_json_files, returning: {results}") | |
| return results | |
| def calculate_gematria_sum(text, date_words): | |
| """Calculate the gematria sum for input text and date words""" | |
| logger.debug(f"Entering calculate_gematria_sum with text: '{text}', date_words: '{date_words}'") | |
| if text or date_words: | |
| combined_input = f"{text} {date_words}" | |
| logger.info(f"Calculating Gematria sum for input: {combined_input}") | |
| numbers = re.findall(r'\d+', combined_input) | |
| logger.debug(f"Extracted numbers: {numbers}") | |
| text_without_numbers = re.sub(r'\d+', '', combined_input) | |
| logger.debug(f"Text without numbers: {text_without_numbers}") | |
| number_sum = sum(int(number) for number in numbers) | |
| logger.debug(f"Sum of numbers: {number_sum}") | |
| text_gematria = calculate_gematria(strip_diacritics(text_without_numbers)) | |
| logger.debug(f"Gematria of text: {text_gematria}") | |
| total_sum = text_gematria + number_sum | |
| logger.debug(f"Calculated Gematria sum: {total_sum}") | |
| logger.debug(f"Exiting calculate_gematria_sum, returning: {total_sum}") | |
| return total_sum | |
| else: | |
| logger.debug("No input text or date words provided. Returning None.") | |
| return None | |
| def get_first_els_result_genesis(gematria_sum, tlang="en"): | |
| """Gets the first ELS result from Genesis (book 1) using cached processing.""" | |
| logger.debug(f"Entering get_first_els_result_genesis with gematria_sum: {gematria_sum}, tlang: {tlang}") | |
| import torah | |
| results = cached_process_json_files( | |
| torah.process_json_files, | |
| 1, # Only Genesis (book 1 to 1) | |
| 1, # Only Genesis (book 1 to 1) | |
| gematria_sum, # Use gematria sum as step | |
| "1,-1", # Default rounds_combination | |
| 0, # length | |
| tlang, | |
| True, # strip_spaces | |
| True, # strip_in_braces | |
| True, # strip_diacritics_chk | |
| ) | |
| if results: | |
| result = results[0] | |
| # Calculate gematria sum if not already present | |
| if "result_sum" not in result: | |
| result["result_sum"] = calculate_gematria(result["result_text"]) | |
| # Add standard fields expected from daily_psalm | |
| if "book" not in result: | |
| result["book"] = "Torah 1." | |
| if "title" not in result: | |
| result["title"] = "Genesis" | |
| if "source_language" not in result: | |
| result["source_language"] = "iw" | |
| if "translated_text" not in result: | |
| result["translated_text"] = "" | |
| # Add step field to match expected structure in /api/all endpoint | |
| if "step" not in result: | |
| result["step"] = gematria_sum # Use the provided gematria_sum as the step value | |
| logger.debug(f"First ELS result from Genesis: {result}") | |
| logger.debug(f"Exiting get_first_els_result_genesis, returning: {result}") | |
| return result | |
| else: | |
| logger.debug("No ELS results found in Genesis.") | |
| logger.debug("Exiting get_first_els_result_genesis, returning: None") | |
| return None | |
| def get_first_els_result_matthew(gematria_sum, tlang="en"): | |
| """Gets the first ELS result from Matthew (book 40) using cached processing.""" | |
| logger.debug(f"Entering get_first_els_result_matthew with gematria_sum: {gematria_sum}, tlang: {tlang}") | |
| import bible | |
| results = cached_process_json_files( | |
| bible.process_json_files, | |
| 40, 40, # Only Matthew (book 40 to 40) | |
| gematria_sum, # Use gematria sum as step | |
| "1,-1", # Default rounds_combination | |
| 0, # length | |
| tlang, | |
| True, # strip_spaces | |
| True, # strip_in_braces | |
| True # strip_diacritics_value | |
| ) | |
| if results: | |
| logger.debug(f"Got {len(results)} ELS results from Matthew") | |
| # Match daily_psalm by selecting the round 1 result first | |
| round_1_results = [r for r in results if r.get('round') == 1] | |
| if round_1_results: | |
| result = round_1_results[0] | |
| logger.debug(f"Selected round 1 result: {result}") | |
| else: | |
| result = results[0] | |
| logger.debug(f"No round 1 results found, selected first result: {result}") | |
| # Calculate gematria sum if not already present | |
| if 'result_sum' not in result: | |
| result['result_sum'] = calculate_gematria(result['result_text']) | |
| # Add standard fields expected from daily_psalm | |
| if 'book' not in result and 'book_title' in result: | |
| result['book'] = result['book_title'] | |
| elif 'book' not in result and 'book_id' in result: | |
| result['book'] = f"Bible {result['book_id']}" | |
| if 'title' not in result and 'book_title' in result: | |
| result['title'] = result['book_title'] | |
| elif 'title' not in result: | |
| result['title'] = "Matthew" | |
| if 'source_language' not in result: | |
| result['source_language'] = 'el' # Greek for New Testament | |
| if 'translated_text' not in result: | |
| result['translated_text'] = '' | |
| logger.debug(f"First ELS result from Matthew: {result}") | |
| logger.debug(f"Exiting get_first_els_result_matthew, returning: {result}") | |
| return result | |
| else: | |
| logger.debug("No ELS results found in Matthew.") | |
| logger.debug("Exiting get_first_els_result_matthew, returning: None") | |
| return None | |
| def find_shortest_psalm_match(gematria_sum): | |
| """Finds the shortest Psalm entry in gematria.db.""" | |
| logger.debug(f"Entering find_shortest_psalm_match with gematria_sum: {gematria_sum}") | |
| with sqlite3.connect(DATABASE_FILE) as conn: | |
| cursor = conn.cursor() | |
| cursor.execute(''' | |
| SELECT words, chapter, verse | |
| FROM results | |
| WHERE gematria_sum = ? AND book = 'Psalms' | |
| ORDER BY LENGTH(words) ASC | |
| LIMIT 1 | |
| ''', (gematria_sum,)) | |
| result = cursor.fetchone() | |
| if result: | |
| # Create a proper dictionary to return | |
| psalm_match = {"words": result[0], "chapter": result[1], "verse": result[2], "phrase_length": None} | |
| logger.debug(f"Shortest Psalm match found: {result}") | |
| logger.debug(f"Exiting find_shortest_psalm_match, returning: {psalm_match}") | |
| return psalm_match | |
| logger.debug("No matching Psalm found.") | |
| logger.debug(f"Exiting find_shortest_psalm_match, returning: None") | |
| return None | |
| def find_shortest_sura_match(gematria_sum): | |
| """Finds the shortest Sura entry in abjad.db.""" | |
| logger.debug(f"Entering find_shortest_sura_match with gematria_sum: {gematria_sum}") | |
| import quran | |
| return quran.find_shortest_sura_match(gematria_sum, db_file='abjad.db') | |
| def find_shortest_bible_match(gematria_sum): | |
| """Finds the shortest Bible verse in Revelation that matches the given gematria sum.""" | |
| logger.debug(f"Finding shortest Bible match for gematria sum: {gematria_sum} in bible.db") | |
| try: | |
| with sqlite3.connect("bible.db") as conn: | |
| cursor = conn.cursor() | |
| cursor.execute(''' | |
| SELECT words, book, chapter, verse, phrase_length, word_position | |
| FROM results | |
| WHERE gematria_sum = ? AND book = 'Revelation' | |
| ORDER BY LENGTH(words) ASC | |
| LIMIT 1 | |
| ''', (gematria_sum,)) | |
| result = cursor.fetchone() | |
| if result: | |
| logger.debug(f"Found Bible match: {result}") | |
| return { | |
| "words": result[0], | |
| "book": result[1], | |
| "chapter": result[2], | |
| "verse": result[3], | |
| "phrase_length": result[4], | |
| "word_position": result[5] if len(result) > 5 else None | |
| } | |
| else: | |
| logger.debug(f"No matching verse found in Revelation for gematria sum: {gematria_sum}") | |
| return None | |
| except sqlite3.Error as e: | |
| logger.error(f"Database error when finding Bible match: {e}") | |
| return None | |
| except Exception as e: | |
| logger.error(f"Unexpected error when finding Bible match: {e}") | |
| return None | |
| # --- API Routes --- | |
| def get_languages(): | |
| """Return the list of available languages""" | |
| return jsonify(LANGUAGES) | |
| def get_psalm(): | |
| """Find a daily psalm based on name and date""" | |
| name = request.args.get('name', '') | |
| date_str = request.args.get('date', datetime.today().strftime('%Y-%m-%d')) | |
| adjusted_sum = request.args.get('adjusted_sum', 'true').lower() == 'true' | |
| language_display = request.args.get('language', 'English') | |
| try: | |
| # Convert date string to datetime | |
| date = datetime.strptime(date_str, "%Y-%m-%d") | |
| # Get language code | |
| language_code = LANGUAGES.get(language_display, 'en') | |
| # Get date in words and translate if needed | |
| if language_display == "English": | |
| date_words = date_to_words(date_str) | |
| else: | |
| try: | |
| date_words = translate_date_to_words(date, lang=language_code) | |
| except Exception as e: | |
| logger.warning(f"Failed to translate date to {language_display}, falling back to English: {e}") | |
| date_words = date_to_words(date_str) | |
| # If name is provided, translate it too | |
| if name and language_display != "English": | |
| try: | |
| translator = GoogleTranslator(source='auto', target=language_code) | |
| name = translator.translate(name) | |
| except Exception as e: | |
| logger.warning(f"Failed to translate name: {e}") | |
| # Calculate initial gematria sum | |
| initial_gematria_sum = calculate_gematria_sum(name, date_words) | |
| if initial_gematria_sum is None: | |
| return jsonify({"error": "Could not calculate initial Gematria sum"}), 400 | |
| # Adjust gematria sum if requested | |
| if adjusted_sum: | |
| adjusted_sum_value = initial_gematria_sum + (initial_gematria_sum / ADJUSTMENT_CONSTANT) | |
| initial_gematria_sum = math.ceil(adjusted_sum_value) | |
| logger.debug(f"Adjusted Gematria Sum (using formula): {initial_gematria_sum}") | |
| # Get ELS result from Genesis (exactly like in daily_psalm) | |
| logger.debug(f"Entering get_first_els_result_genesis with gematria_sum: {initial_gematria_sum}, tlang: en") | |
| els_result = get_first_els_result_genesis(initial_gematria_sum, tlang='en') | |
| if not els_result: | |
| logger.debug("No ELS result found in Genesis.") | |
| return jsonify({"error": "No ELS result found in Genesis"}), 404 | |
| # Calculate gematria sum for ELS result | |
| els_gematria_sum = calculate_gematria(els_result['result_text']) | |
| logger.debug(f"ELS Gematria sum: {els_gematria_sum}") | |
| # Find matching psalm | |
| logger.debug(f"Entering find_shortest_psalm_match with gematria_sum: {els_gematria_sum}") | |
| psalm_match = find_shortest_psalm_match(els_gematria_sum) | |
| if not psalm_match: | |
| logger.debug("No matching Psalm found.") | |
| return jsonify({"error": "No matching Psalm found for the ELS result"}), 404 | |
| logger.debug(f"Psalm Match result: {psalm_match}") | |
| # Create the response | |
| response = { | |
| "input": { | |
| "name": name, | |
| "date": date_str, | |
| "date_words": date_words, | |
| "language": language_display, | |
| "language_code": language_code, | |
| "initial_gematria_sum": initial_gematria_sum | |
| }, | |
| "els_result": { | |
| "text": els_result['result_text'], | |
| "step": els_result.get('step', 0), # Default to 0 if step is not present | |
| "book": els_result.get('title', "Genesis"), | |
| "gematria_sum": els_result.get('result_sum', els_gematria_sum) | |
| }, | |
| "psalm": { | |
| "words": psalm_match["words"], | |
| "chapter": psalm_match["chapter"], | |
| "verse": psalm_match["verse"], | |
| "reference": f"Psalms {psalm_match['chapter']}:{psalm_match['verse']}", | |
| "url": f"https://www.biblegateway.com/passage/?search=Psalms+{psalm_match['chapter']}&version=CJB" | |
| } | |
| } | |
| return jsonify(response) | |
| except Exception as e: | |
| logger.error(f"Error finding psalm: {str(e)}", exc_info=True) | |
| return jsonify({"error": f"Error finding psalm: {str(e)}"}), 500 | |
| def get_sura(): | |
| """Find a daily Quran sura based on name and date""" | |
| name = request.args.get('name', '') | |
| date_str = request.args.get('date', datetime.today().strftime('%Y-%m-%d')) | |
| adjusted_sum = request.args.get('adjusted_sum', 'true').lower() == 'true' | |
| language_display = request.args.get('language', 'English') | |
| try: | |
| # Import quran module | |
| import quran | |
| # Check if database is initialized | |
| with sqlite3.connect('abjad.db') as conn: | |
| cursor = conn.cursor() | |
| try: | |
| cursor.execute("SELECT COUNT(*) FROM results") | |
| count = cursor.fetchone()[0] | |
| if count == 0: | |
| logger.warning("Quran database not initialized. Initializing database...") | |
| # Initialize with a small number of entries | |
| quran.initialize_quran_database('abjad.db', max_phrase_length=1) | |
| except sqlite3.OperationalError: | |
| logger.warning("Quran database not initialized. Initializing database...") | |
| # Initialize with a small number of entries | |
| quran.initialize_quran_database('abjad.db', max_phrase_length=1) | |
| # Convert date string to datetime | |
| date = datetime.strptime(date_str, "%Y-%m-%d") | |
| # Get language code | |
| language_code = LANGUAGES.get(language_display, 'en') | |
| # Get date in words and translate if needed | |
| if language_display == "English": | |
| date_words = date_to_words(date_str) | |
| else: | |
| try: | |
| date_words = translate_date_to_words(date, lang=language_code) | |
| except Exception as e: | |
| logger.warning(f"Failed to translate date to {language_display}, falling back to English: {e}") | |
| date_words = date_to_words(date_str) | |
| # If name is provided, translate it too | |
| if name and language_display != "English": | |
| try: | |
| translator = GoogleTranslator(source='auto', target=language_code) | |
| name = translator.translate(name) | |
| except Exception as e: | |
| logger.warning(f"Failed to translate name: {e}") | |
| # Calculate initial gematria sum | |
| initial_gematria_sum = calculate_gematria_sum(name, date_words) | |
| if initial_gematria_sum is None: | |
| return jsonify({"error": "Could not calculate initial Gematria sum"}), 400 | |
| # Adjust gematria sum if requested | |
| if adjusted_sum: | |
| adjusted_sum_value = initial_gematria_sum + (initial_gematria_sum / ADJUSTMENT_CONSTANT) | |
| initial_gematria_sum = math.ceil(adjusted_sum_value) | |
| logger.debug(f"Adjusted Gematria Sum (using formula): {initial_gematria_sum}") | |
| # Get ELS result from Quran | |
| logger.debug(f"Finding ELS result in Quran with gematria_sum: {initial_gematria_sum}, tlang: en") | |
| els_result = quran.get_first_els_result_quran(initial_gematria_sum, tlang='en', cached_process_func=cached_process_json_files) | |
| if not els_result: | |
| logger.debug("No ELS result found in the Quran.") | |
| return jsonify({"error": "No ELS result found in the Quran"}), 404 | |
| # Calculate gematria sum for ELS result | |
| els_gematria_sum = calculate_gematria(els_result['result_text']) | |
| logger.debug(f"ELS Gematria sum from Quran: {els_gematria_sum}") | |
| # Find matching sura | |
| logger.debug(f"Finding shortest Sura match with gematria_sum: {els_gematria_sum}") | |
| sura_match = find_shortest_sura_match(els_gematria_sum) | |
| if not sura_match: | |
| logger.debug("No matching Sura found.") | |
| return jsonify({"error": "No matching Sura found for the ELS result"}), 404 | |
| logger.debug(f"Sura Match result: {sura_match}") | |
| # Create the response | |
| response = { | |
| "input": { | |
| "name": name, | |
| "date": date_str, | |
| "date_words": date_words, | |
| "language": language_display, | |
| "language_code": language_code, | |
| "initial_gematria_sum": initial_gematria_sum | |
| }, | |
| "els_result": { | |
| "text": els_result['result_text'], | |
| "step": els_result['step'], | |
| "start_sura": els_result.get('start_sura'), | |
| "start_sura_name": els_result.get('start_sura_name'), | |
| "start_verse": els_result.get('start_verse'), | |
| "end_sura": els_result.get('end_sura'), | |
| "end_sura_name": els_result.get('end_sura_name'), | |
| "end_verse": els_result.get('end_verse'), | |
| "gematria_sum": els_gematria_sum | |
| }, | |
| "sura": { | |
| "book": sura_match["book"], | |
| "chapter": sura_match["chapter"], | |
| "verse": sura_match["verse"], | |
| "words": sura_match["words"], | |
| "reference": f"Quran {sura_match['chapter']}:{sura_match['verse']}", | |
| "url": f"https://quran.com/{sura_match['chapter']}/{sura_match['verse']}" | |
| } | |
| } | |
| return jsonify(response) | |
| except Exception as e: | |
| logger.error(f"Error finding sura: {str(e)}", exc_info=True) | |
| return jsonify({"error": f"Error finding sura: {str(e)}"}), 500 | |
| def get_bible(): | |
| """Find a daily Bible verse based on name and date""" | |
| name = request.args.get('name', '') | |
| date_str = request.args.get('date', datetime.today().strftime('%Y-%m-%d')) | |
| adjusted_sum = request.args.get('adjusted_sum', 'true').lower() == 'true' | |
| language_display = request.args.get('language', 'English') | |
| try: | |
| # Import bible module | |
| import bible | |
| # Convert date string to datetime | |
| date = datetime.strptime(date_str, "%Y-%m-%d") | |
| # Get language code | |
| language_code = LANGUAGES.get(language_display, 'en') | |
| # Get date in words and translate if needed | |
| if language_display == "English": | |
| date_words = date_to_words(date_str) | |
| else: | |
| try: | |
| date_words = translate_date_to_words(date, lang=language_code) | |
| except Exception as e: | |
| logger.warning(f"Failed to translate date to {language_display}, falling back to English: {e}") | |
| date_words = date_to_words(date_str) | |
| # If name is provided, translate it too | |
| if name and language_display != "English": | |
| try: | |
| translator = GoogleTranslator(source='auto', target=language_code) | |
| name = translator.translate(name) | |
| except Exception as e: | |
| logger.warning(f"Failed to translate name: {e}") | |
| # Calculate initial gematria sum | |
| initial_gematria_sum = calculate_gematria_sum(name, date_words) | |
| if initial_gematria_sum is None: | |
| return jsonify({"error": "Could not calculate initial Gematria sum"}), 400 | |
| # Adjust gematria sum if requested | |
| if adjusted_sum: | |
| adjusted_sum_value = initial_gematria_sum + (initial_gematria_sum / ADJUSTMENT_CONSTANT) | |
| initial_gematria_sum = math.ceil(adjusted_sum_value) | |
| logger.debug(f"Adjusted Gematria Sum (using formula): {initial_gematria_sum}") | |
| # Get ELS result from Matthew | |
| logger.debug(f"Entering get_first_els_result_matthew with gematria_sum: {initial_gematria_sum}, tlang: en") | |
| els_result = get_first_els_result_matthew(initial_gematria_sum, tlang='en') | |
| if not els_result: | |
| logger.debug("No ELS result found in Matthew.") | |
| return jsonify({"error": "No ELS result found in Matthew"}), 404 | |
| # Calculate gematria sum for ELS result | |
| els_gematria_sum = calculate_gematria(els_result['result_text']) | |
| logger.debug(f"ELS Gematria sum from Matthew: {els_gematria_sum}") | |
| # Use the ELS result to find a matching verse in Revelation | |
| bible_match = find_shortest_bible_match(els_gematria_sum) | |
| if not bible_match: | |
| logger.debug("No matching verse found in Revelation.") | |
| return jsonify({"error": "No matching verse found in Revelation for the ELS result"}), 404 | |
| logger.debug(f"Bible Match result: {bible_match}") | |
| # Find the book of Revelation for the response | |
| logger.debug(f"Finding book of Revelation (book ID 66)") | |
| book_id = 66 # Revelation is typically book ID 66 | |
| book_data = bible.process_bible_files(book_id, book_id) | |
| if not book_data or book_id not in book_data: | |
| return jsonify({"error": "Could not find the book of Revelation"}), 404 | |
| # Use the chapter from the match | |
| chapter_index = bible_match["chapter"] | |
| # Get chapter data | |
| chapter = book_data[book_id]['text'][chapter_index - 1] | |
| # Create the response | |
| response = { | |
| "input": { | |
| "name": name, | |
| "date": date_str, | |
| "date_words": date_words, | |
| "language": language_display, | |
| "language_code": language_code, | |
| "initial_gematria_sum": initial_gematria_sum | |
| }, | |
| "els_result": { | |
| "text": els_result['result_text'], | |
| "step": els_result['step'], | |
| "book": "Matthew", | |
| "gematria_sum": els_gematria_sum | |
| }, | |
| "bible": { | |
| "book_id": book_id, | |
| "book_name": book_data[book_id]['title'], | |
| "chapter": chapter_index, | |
| "verse": bible_match["verse"], | |
| "words": bible_match["words"], | |
| "phrase_length": bible_match["phrase_length"], | |
| "word_position": bible_match["word_position"], | |
| "num_verses": len(chapter), | |
| "reference": f"{book_data[book_id]['title']} {chapter_index}:{bible_match['verse']}", | |
| "url": f"https://www.biblegateway.com/passage/?search={book_data[book_id]['title']}+{chapter_index}&version=CJB" | |
| } | |
| } | |
| return jsonify(response) | |
| except Exception as e: | |
| logger.error(f"Error finding bible verse: {str(e)}", exc_info=True) | |
| return jsonify({"error": f"Error finding bible verse: {str(e)}"}), 500 | |
| def get_all(): | |
| """Return results from psalm, sura and bible in a single request""" | |
| name = request.args.get('name', '') | |
| date_str = request.args.get('date', datetime.today().strftime('%Y-%m-%d')) | |
| adjusted_sum = request.args.get('adjusted_sum', 'true').lower() == 'true' | |
| language_display = request.args.get('language', 'English') | |
| try: | |
| # Convert date string to datetime | |
| date = datetime.strptime(date_str, "%Y-%m-%d") | |
| # Get language code | |
| language_code = LANGUAGES.get(language_display, 'en') | |
| # Get date in words and translate if needed | |
| if language_display == "English": | |
| date_words = date_to_words(date_str) | |
| else: | |
| try: | |
| date_words = translate_date_to_words(date, lang=language_code) | |
| except Exception as e: | |
| logger.warning(f"Failed to translate date to {language_display}, falling back to English: {e}") | |
| date_words = date_to_words(date_str) | |
| # If name is provided, translate it too | |
| translated_name = name | |
| if name and language_display != "English": | |
| try: | |
| translator = GoogleTranslator(source='auto', target=language_code) | |
| translated_name = translator.translate(name) | |
| logger.debug(f"Translated name in {language_display}: {translated_name}") | |
| except Exception as e: | |
| logger.warning(f"Failed to translate name: {e}") | |
| # Calculate initial gematria sum | |
| initial_gematria_sum = calculate_gematria_sum(translated_name, date_words) | |
| if initial_gematria_sum is None: | |
| return jsonify({"error": "Could not calculate initial Gematria sum"}), 400 | |
| # Adjust gematria sum if requested | |
| if adjusted_sum: | |
| adjusted_sum_value = initial_gematria_sum + (initial_gematria_sum / ADJUSTMENT_CONSTANT) | |
| initial_gematria_sum = math.ceil(adjusted_sum_value) | |
| logger.debug(f"Adjusted Gematria Sum (using formula): {initial_gematria_sum}") | |
| # Prepare response dictionary with input data | |
| response = { | |
| "input": { | |
| "name": name, | |
| "date": date_str, | |
| "date_words": date_words, | |
| "language": language_display, | |
| "language_code": language_code, | |
| "initial_gematria_sum": initial_gematria_sum | |
| } | |
| } | |
| # Get Psalm result | |
| try: | |
| logger.debug(f"Getting psalm result with gematria_sum: {initial_gematria_sum}") | |
| # Get ELS result from Genesis | |
| logger.debug(f"Entering get_first_els_result_genesis with gematria_sum: {initial_gematria_sum}, tlang: en") | |
| genesis_result = get_first_els_result_genesis(initial_gematria_sum, tlang='en') | |
| if genesis_result and 'result_text' in genesis_result: | |
| logger.debug(f"First ELS result from Genesis: {genesis_result}") | |
| # Calculate gematria sum for ELS result | |
| genesis_gematria_sum = calculate_gematria(genesis_result['result_text']) | |
| logger.debug(f"ELS Gematria sum: {genesis_gematria_sum}") | |
| # Find matching psalm | |
| logger.debug(f"Entering find_shortest_psalm_match with gematria_sum: {genesis_gematria_sum}") | |
| psalm_match = find_shortest_psalm_match(genesis_gematria_sum) | |
| logger.debug(f"Psalm match result: {psalm_match}") | |
| if psalm_match and isinstance(psalm_match, dict): | |
| response["psalm"] = { | |
| "words": psalm_match.get("words", ""), | |
| "chapter": psalm_match.get("chapter", 0), | |
| "verse": psalm_match.get("verse", 0), | |
| "reference": f"Psalms {psalm_match.get('chapter', 0)}:{psalm_match.get('verse', 0)}", | |
| "url": f"https://www.biblegateway.com/passage/?search=Psalms+{psalm_match.get('chapter', 0)}&version=CJB", | |
| "els_result": { | |
| "text": genesis_result.get('result_text', ''), | |
| "step": genesis_result.get('step', initial_gematria_sum), # Use initial_gematria_sum as default | |
| "book": genesis_result.get('title', "Genesis"), | |
| "gematria_sum": genesis_result.get('result_sum', genesis_gematria_sum) | |
| } | |
| } | |
| else: | |
| response["psalm"] = { | |
| "error": "No matching Psalm found for the ELS result" | |
| } | |
| else: | |
| response["psalm"] = { | |
| "error": "No ELS result found in Genesis" | |
| } | |
| except Exception as e: | |
| logger.error(f"Error finding psalm: {str(e)}", exc_info=True) | |
| response["psalm"] = { | |
| "error": f"Error finding psalm: {str(e)}" | |
| } | |
| # Get Sura result | |
| try: | |
| logger.debug(f"Getting sura result with gematria_sum: {initial_gematria_sum}") | |
| import quran | |
| # Get ELS result from Quran | |
| logger.debug(f"Finding ELS result in Quran with gematria_sum: {initial_gematria_sum}, tlang: en") | |
| quran_result = quran.get_first_els_result_quran(initial_gematria_sum, tlang='en', cached_process_func=cached_process_json_files) | |
| if quran_result and 'result_text' in quran_result: | |
| logger.debug(f"First ELS result from Quran: {quran_result}") | |
| # Calculate gematria sum for ELS result | |
| quran_gematria_sum = calculate_gematria(quran_result['result_text']) | |
| logger.debug(f"ELS Gematria sum from Quran: {quran_gematria_sum}") | |
| # Find matching sura | |
| logger.debug(f"Finding shortest Sura match with gematria_sum: {quran_gematria_sum}") | |
| sura_match = find_shortest_sura_match(quran_gematria_sum) | |
| if sura_match: | |
| response["sura"] = { | |
| "book": sura_match["book"], | |
| "chapter": sura_match["chapter"], | |
| "verse": sura_match["verse"], | |
| "words": sura_match["words"], | |
| "reference": f"Quran {sura_match['chapter']}:{sura_match['verse']}", | |
| "url": f"https://quran.com/{sura_match['chapter']}/{sura_match['verse']}", | |
| "els_result": { | |
| "text": quran_result['result_text'], | |
| "step": quran_result['step'], | |
| "start_sura": quran_result.get('start_sura'), | |
| "start_sura_name": quran_result.get('start_sura_name'), | |
| "start_verse": quran_result.get('start_verse'), | |
| "end_sura": quran_result.get('end_sura'), | |
| "end_sura_name": quran_result.get('end_sura_name'), | |
| "end_verse": quran_result.get('end_verse'), | |
| "gematria_sum": quran_gematria_sum | |
| } | |
| } | |
| else: | |
| response["sura"] = { | |
| "error": "No matching Sura found for the ELS result" | |
| } | |
| else: | |
| response["sura"] = { | |
| "error": "No ELS result found in the Quran" | |
| } | |
| except Exception as e: | |
| logger.error(f"Error finding sura: {str(e)}", exc_info=True) | |
| response["sura"] = { | |
| "error": f"Error finding sura: {str(e)}" | |
| } | |
| # Get Bible result | |
| try: | |
| logger.debug(f"Getting bible result with gematria_sum: {initial_gematria_sum}") | |
| import bible | |
| # Get ELS result from Matthew | |
| logger.debug(f"Entering get_first_els_result_matthew with gematria_sum: {initial_gematria_sum}, tlang: en") | |
| matthew_result = get_first_els_result_matthew(initial_gematria_sum, tlang='en') | |
| if matthew_result and 'result_text' in matthew_result: | |
| logger.debug(f"First ELS result from Matthew: {matthew_result}") | |
| # Calculate gematria sum for ELS result | |
| matthew_gematria_sum = calculate_gematria(matthew_result['result_text']) | |
| logger.debug(f"ELS Gematria sum from Matthew: {matthew_gematria_sum}") | |
| # Use the ELS result to find a matching verse in Revelation | |
| bible_match = find_shortest_bible_match(matthew_gematria_sum) | |
| if not bible_match: | |
| logger.debug("No matching verse found in Revelation.") | |
| response["bible"] = { | |
| "error": "No matching verse found in Revelation for the ELS result" | |
| } | |
| # Skip the rest of the bible processing | |
| return jsonify(response) | |
| logger.debug(f"Bible Match result: {bible_match}") | |
| # Find the book of Revelation for response | |
| logger.debug(f"Finding book of Revelation (book ID 66)") | |
| book_id = 66 # Revelation is typically book ID 66 | |
| book_data = bible.process_bible_files(book_id, book_id) | |
| if book_data and book_id in book_data: | |
| # Use the chapter from the match | |
| chapter_index = bible_match["chapter"] | |
| # Get chapter data | |
| chapter = book_data[book_id]['text'][chapter_index - 1] | |
| response["bible"] = { | |
| "book_id": book_id, | |
| "book_name": book_data[book_id]['title'], | |
| "chapter": chapter_index, | |
| "verse": bible_match["verse"], | |
| "words": bible_match["words"], | |
| "phrase_length": bible_match["phrase_length"], | |
| "word_position": bible_match["word_position"], | |
| "num_verses": len(chapter), | |
| "reference": f"{book_data[book_id]['title']} {chapter_index}:{bible_match['verse']}", | |
| "url": f"https://www.biblegateway.com/passage/?search={book_data[book_id]['title']}+{chapter_index}&version=CJB", | |
| "els_result": { | |
| "text": matthew_result['result_text'], | |
| "step": matthew_result['step'], | |
| "book": "Matthew", | |
| "gematria_sum": matthew_gematria_sum | |
| } | |
| } | |
| else: | |
| response["bible"] = { | |
| "error": "Could not find the book of Revelation" | |
| } | |
| else: | |
| response["bible"] = { | |
| "error": "No ELS result found in Matthew" | |
| } | |
| except Exception as e: | |
| logger.error(f"Error finding bible verse: {str(e)}", exc_info=True) | |
| response["bible"] = { | |
| "error": f"Error finding bible verse: {str(e)}" | |
| } | |
| return jsonify(response) | |
| except Exception as e: | |
| logger.error(f"Error in get_all: {str(e)}", exc_info=True) | |
| return jsonify({"error": f"Error getting combined results: {str(e)}"}), 500 | |