Commits vergleichen

...

5 Commits

Autor SHA1 Nachricht Datum
40bead1e6a latest ui version
Alle Prüfungen waren erfolgreich
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 geänderte Dateien mit 69 neuen und 29 gelöschten Zeilen

Datei anzeigen

@ -1 +1 @@
1.0.6 1.0.8

5
app.py
Datei anzeigen

@ -26,6 +26,7 @@ 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"})
if app.config.get("OCR_ENABLED"):
ocr = PaddleOCR(use_angle_cls=True, lang='en') # Adjust language if needed 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"]
@ -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"), text_input_enabled=app.config.get("TEXT_INPUT_ENABLED"))
@app.route("/accounts/delete", methods=["POST"]) @app.route("/accounts/delete", methods=["POST"])
@ -187,6 +189,7 @@ def stream_names():
return jsonify(stream_names) return jsonify(stream_names)
if app.config.get("OCR_ENABLED"):
@app.route('/OCRupload', methods=['POST']) @app.route('/OCRupload', methods=['POST'])
def OCRupload(): def OCRupload():
if 'image' not in request.files: if 'image' not in request.files:

Datei anzeigen

@ -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"

Datei anzeigen

@ -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,15 @@
<span id="ocrButtonText">Load Details</span> <span id="ocrButtonText">Load Details</span>
</button> </button>
</form> </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> </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">
@ -106,12 +116,47 @@
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
var streamInput = document.getElementById("stream"); var streamInput = document.getElementById("stream");
var awesomplete;
fetch('/get_stream_names') fetch('/get_stream_names')
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
new Awesomplete(streamInput, { awesomplete = new Awesomplete(streamInput, {
list: data 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> </script>