diff --git a/.env b/.env new file mode 100644 index 0000000..c5f2edf --- /dev/null +++ b/.env @@ -0,0 +1 @@ +KJV_SERMON_DB="/home/tyler/kjv-api/sermon-analyzer/data/sermons.db" diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..c5f2edf --- /dev/null +++ b/.env.sample @@ -0,0 +1 @@ +KJV_SERMON_DB="/home/tyler/kjv-api/sermon-analyzer/data/sermons.db" diff --git a/app.py b/app.py index b6479ba..8c0ac54 100644 --- a/app.py +++ b/app.py @@ -14,9 +14,13 @@ import sqlite3 import string # for literals shortcut import json # for dictionary import hunspell # for spell checking (not really used) -import sys +import os import logging from tools import sanity_check +from dotenv import load_dotenv +load_dotenv() + +SERMON_DB = os.getenv("KJV_SERMON_DB") sequential_purge_delta: timedelta = timedelta(days=90) timestamp_runtime: datetime = datetime.now().strftime("%d%b%y-%H:%M") @@ -56,14 +60,33 @@ https://docs.python.org/3/library/sqlite3.html#sqlite3-placeholders URL Shortener for sharing groups of scripture. """ +def dict_factory(cursor, row): + fields = [column[0] for column in cursor.description] + return {key: value for key, value in zip(fields, row)} + +kjv_cur = None +sermon_cur = None if __name__ == "__main__": # single user mode, running without uwsgi usermode: str = "Single" kjv_cur = sqlite3.connect("data/kjv.db", check_same_thread=False).cursor() + if SERMON_DB: + sermon_con = sqlite3.connect(SERMON_DB, check_same_thread=False) + sermon_con.row_factory = dict_factory + sermon_cur = sermon_con.cursor() else: # you're running with uwsgi usermode: str = "Multi" kjv_cur = sqlite3.connect("data/kjv.db").cursor() + if SERMON_DB: + sermon_con = sqlite3.connect(SERMON_DB) + sermon_con.row_factory = dict_factory + sermon_cur = sermon_con.cursor() + +if not kjv_cur: + exit("CRITICAL: Error connecting to KJV Database") +if not sermon_cur: + print("WARN: Error connecting to Sermon Database") cached: dict = { "verse_ids": [i[0] for i in kjv_cur.execute("SELECT id FROM fts_kjv;").fetchall()], @@ -139,6 +162,10 @@ def lookup_by_verse_id(start_verse, end_verse=None) -> list: ).fetchall() return results +def get_sermons_by_verse_id(verse_id) -> list: + if not sermon_cur: + return + return sermon_cur.execute(f"select * from verse_refs where verse_id={verse_id}").fetchall() def get_verse_id(book_id, chapter: str, verse: str) -> str: # verse_id is 00000000 (00 000 000) (book + chapter + verse) @@ -244,6 +271,49 @@ def ref_parse_book(ref): return book return False +@app.get("/ref/") +def get_single_reference_verse_id(ref:str): + ref = ref.split(",")[0] + ref = ref.split("-")[0] + # only want the first single ref, not a range, and not a group. + ref = ref_input_cleaning(ref) + maybe_chapter: str = ref.split(":")[0][3:] + ref_chapter: str = "" + for maybedigit in maybe_chapter: + if maybedigit.isdigit(): + ref_chapter += maybedigit + ref_verse = ref.split(":")[1] + book_str: str = ref_input_cleaning(ref, string.ascii_letters) + ref_bookname: str = ref_parse_book(book_str) + ref_book_id: int = lookup_book_id(ref_bookname) + if not ref_book_id: + return + return get_verse_id(ref_book_id, ref_chapter, ref_verse) + +@app.get("/sermon/") +def find_sermon(ref:str=None): + verse_id = get_single_reference_verse_id(ref=ref) + if not sermon_cur: + return jsonify({'error':"Sermon database not found"}) + sermons = get_sermons_by_verse_id(verse_id=verse_id) + for sermon in sermons: + sermon.update({'kjv':find_by_verseid(sermon.get("verse_id"))[4]}) + return jsonify(sermons) + +def clean_verseid(verse_id): + verse_id = str(verse_id) + clean_verseid = '' + for char in verse_id: + if char in string.digits: + clean_verseid += char + return clean_verseid + + +@app.get("/verse_id/") +def find_by_verseid(verse_id): + clean_verse_id = clean_verseid(verse_id=verse_id) + return lookup_by_verse_id(clean_verse_id)[0] + @app.get("/find") def parse_query(query_override: str = None): diff --git a/kjv-api-test.sh b/kjv-api-test.sh index 89e2588..4e0c2dd 100755 --- a/kjv-api-test.sh +++ b/kjv-api-test.sh @@ -2,7 +2,7 @@ # run from current directory only FILE=app.py if test -f "$FILE"; then - uwsgi_python3 --http-socket 0.0.0.0:1612 --wsgi-file app.py --callable app --pyargv "-vvv" + uwsgi_python3 --http-socket 0.0.0.0:1612 --wsgi-file app.py --callable app --pyargv "-vvv" --stats 0.0.0.0:9192 else cd /opt/kjv-api echo "WARNING: RUNNING FROM /opt/kjv-api"