feat(ocr): make OCR functionality optional via configuration

The OCR feature can now be enabled or disabled using a new `OCR_ENABLED` configuration flag.

This allows for more flexible deployments where the OCR feature is not required, reducing the application's resource footprint and dependency overhead.

The backend now conditionally initializes the OCR engine and its associated route. The frontend UI for OCR uploads is also rendered conditionally based on this setting.
This commit is contained in:
Karl 2025-07-14 11:22:24 +01:00
parent 5a5692d8cc
commit bcab963b99
2 changed files with 24 additions and 19 deletions

41
app.py
View File

@ -26,7 +26,8 @@ else:
app.config.from_object(DevelopmentConfig) app.config.from_object(DevelopmentConfig)
cache = Cache(app, config={"CACHE_TYPE": "SimpleCache"}) cache = Cache(app, config={"CACHE_TYPE": "SimpleCache"})
ocr = PaddleOCR(use_angle_cls=True, lang='en') # Adjust language if needed if app.config.get("OCR_ENABLED"):
ocr = PaddleOCR(use_angle_cls=True, lang='en') # Adjust language if needed
app.config["SESSION_COOKIE_SECURE"] = not app.config["DEBUG"] app.config["SESSION_COOKIE_SECURE"] = not app.config["DEBUG"]
app.config['SESSION_COOKIE_HTTPONLY'] = True # Prevent JavaScript access app.config['SESSION_COOKIE_HTTPONLY'] = True # Prevent JavaScript access
@ -85,6 +86,7 @@ def home():
accounts=count, accounts=count,
current_month_accounts=current_month_accounts, current_month_accounts=current_month_accounts,
expired_accounts=expired_accounts, expired_accounts=expired_accounts,
ocr_enabled=app.config.get("OCR_ENABLED"),
) )
return render_template("index.html") return render_template("index.html")
@ -163,7 +165,7 @@ def add_account():
return redirect(url_for("user_accounts")) return redirect(url_for("user_accounts"))
return render_template("add_account.html") return render_template("add_account.html")
return render_template("add_account.html") return render_template("add_account.html", ocr_enabled=app.config.get("OCR_ENABLED"))
@app.route("/accounts/delete", methods=["POST"]) @app.route("/accounts/delete", methods=["POST"])
@ -187,23 +189,24 @@ def stream_names():
return jsonify(stream_names) return jsonify(stream_names)
@app.route('/OCRupload', methods=['POST']) if app.config.get("OCR_ENABLED"):
def OCRupload(): @app.route('/OCRupload', methods=['POST'])
if 'image' not in request.files: def OCRupload():
return jsonify({"error": "No image file found"}), 400 if 'image' not in request.files:
# Get the uploaded file return jsonify({"error": "No image file found"}), 400
file = request.files['image'] # Get the uploaded file
try: file = request.files['image']
image = Image.open(file.stream) try:
image_np = np.array(image) image = Image.open(file.stream)
result = ocr.ocr(image_np) image_np = np.array(image)
# Extract text result = ocr.ocr(image_np)
extracted_text = [] # Extract text
for line in result[0]: extracted_text = []
extracted_text.append(line[1][0]) for line in result[0]:
return render_template("add_account.html", username=extracted_text[2], password=extracted_text[3]) extracted_text.append(line[1][0])
except Exception as e: return render_template("add_account.html", username=extracted_text[2], password=extracted_text[3])
return jsonify({"error": str(e)}), 500 except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == "__main__": if __name__ == "__main__":
app.run(debug=app.config["DEBUG"], host=app.config["HOST"], port=app.config["PORT"]) app.run(debug=app.config["DEBUG"], host=app.config["HOST"], port=app.config["PORT"])

View File

@ -74,6 +74,7 @@
<span id="buttonText">Add Account</span> <span id="buttonText">Add Account</span>
</button> </button>
</form> </form>
{% if ocr_enabled %}
<hr> <hr>
<h2>Load Details Via OCR</h2> <h2>Load Details Via OCR</h2>
<form action="/OCRupload" method="POST" enctype="multipart/form-data" onsubmit="showLoadingOCR()"> <form action="/OCRupload" method="POST" enctype="multipart/form-data" onsubmit="showLoadingOCR()">
@ -86,6 +87,7 @@
<span id="ocrButtonText">Load Details</span> <span id="ocrButtonText">Load Details</span>
</button> </button>
</form> </form>
{% endif %}
</main> </main>
<footer class="bg-dark text-white text-center py-3 mt-5"> <footer class="bg-dark text-white text-center py-3 mt-5">