Compare commits

...

5 Commits

Author SHA1 Message Date
40bead1e6a latest ui version
All checks were successful
Build and Publish Docker Image / build-and-push (push) Successful in 4m3s
2025-07-14 12:53:36 +01:00
4b50711cd3 working match logic for account add 2025-07-14 12:52:42 +01:00
3f1ebfbac0 working stream name match 2025-07-14 12:47:35 +01:00
ce6572b81b string entry 2025-07-14 11:45:08 +01:00
bcab963b99 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.
2025-07-14 11:22:24 +01:00
4 changed files with 69 additions and 29 deletions

View File

@ -1 +1 @@
1.0.6
1.0.8

11
app.py
View File

@ -26,7 +26,8 @@ else:
app.config.from_object(DevelopmentConfig)
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_HTTPONLY'] = True # Prevent JavaScript access
@ -85,6 +86,7 @@ def home():
accounts=count,
current_month_accounts=current_month_accounts,
expired_accounts=expired_accounts,
ocr_enabled=app.config.get("OCR_ENABLED"),
)
return render_template("index.html")
@ -163,7 +165,7 @@ def add_account():
return redirect(url_for("user_accounts"))
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"), text_input_enabled=app.config.get("TEXT_INPUT_ENABLED"))
@app.route("/accounts/delete", methods=["POST"])
@ -187,8 +189,9 @@ def stream_names():
return jsonify(stream_names)
@app.route('/OCRupload', methods=['POST'])
def OCRupload():
if app.config.get("OCR_ENABLED"):
@app.route('/OCRupload', methods=['POST'])
def OCRupload():
if 'image' not in request.files:
return jsonify({"error": "No image file found"}), 400
# Get the uploaded file

View File

@ -1,8 +0,0 @@
[tool.bump-my-version]
current_version = "1.0.6"
commit = true
tag = true
message = "bump version to {new_version}"
[[tool.bump-my-version.files]]
filename = "VERSION"

View File

@ -74,6 +74,7 @@
<span id="buttonText">Add Account</span>
</button>
</form>
{% if ocr_enabled %}
<hr>
<h2>Load Details Via OCR</h2>
<form action="/OCRupload" method="POST" enctype="multipart/form-data" onsubmit="showLoadingOCR()">
@ -86,6 +87,15 @@
<span id="ocrButtonText">Load Details</span>
</button>
</form>
{% endif %}
{% if text_input_enabled %}
<hr>
<h2>Load Details Via Text</h2>
<div class="form-group">
<label for="accountDetails">Paste Account Details</label>
<textarea class="form-control" id="accountDetails" rows="4"></textarea>
</div>
{% endif %}
</main>
<footer class="bg-dark text-white text-center py-3 mt-5">
@ -106,12 +116,47 @@
document.addEventListener("DOMContentLoaded", function() {
var streamInput = document.getElementById("stream");
var awesomplete;
fetch('/get_stream_names')
.then(response => response.json())
.then(data => {
new Awesomplete(streamInput, {
awesomplete = new Awesomplete(streamInput, {
list: data
});
streamInput.addEventListener('awesomplete-selectcomplete', function(event) {
this.value = event.text.value;
});
{% if text_input_enabled %}
const accountDetailsTextarea = document.getElementById('accountDetails');
if (accountDetailsTextarea) {
accountDetailsTextarea.addEventListener('input', function() {
const text = this.value;
const lines = text.split('\n');
const streamName = lines[0] ? lines[0].trim() : '';
const usernameLine = lines.find(line => line.toUpperCase().startsWith('USER:'));
const passwordLine = lines.find(line => line.toUpperCase().startsWith('PASS:'));
if (usernameLine) {
document.getElementById('username').value = usernameLine.substring(5).trim();
}
if (passwordLine) {
document.getElementById('password').value = passwordLine.substring(5).trim();
}
if (streamName) {
streamInput.value = streamName;
awesomplete.evaluate();
if (awesomplete.ul.children.length > 0) {
awesomplete.goto(0);
awesomplete.select();
}
}
});
}
{% endif %}
});
});
</script>