|
from flask import Blueprint, jsonify, request, current_app |
|
import os |
|
from werkzeug.utils import secure_filename |
|
from app.utils import OCRModel |
|
import torch |
|
import io |
|
|
|
main = Blueprint('main', __name__) |
|
ocr_model = OCRModel() |
|
|
|
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'} |
|
|
|
def allowed_file(filename): |
|
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS |
|
|
|
@main.route('/') |
|
def index(): |
|
return jsonify({"message": "Welcome to OCR API!"}) |
|
|
|
@main.route('/api/ocr', methods=['POST']) |
|
def process_image(): |
|
if 'file' not in request.files: |
|
return jsonify({"error": "No file part"}), 400 |
|
|
|
if 'allergens' not in request.form: |
|
return jsonify({"error": "No allergens specified"}), 400 |
|
|
|
file = request.files['file'] |
|
if file.filename == '': |
|
return jsonify({"error": "No selected file"}), 400 |
|
|
|
|
|
user_allergens = request.form['allergens'].lower().split(',') |
|
user_allergens = {allergen.strip() for allergen in user_allergens} |
|
|
|
if file and allowed_file(file.filename): |
|
|
|
file_bytes = file.read() |
|
file_stream = io.BytesIO(file_bytes) |
|
|
|
try: |
|
|
|
result = ocr_model.process_image(file_stream) |
|
|
|
|
|
found_allergens = set() |
|
text_lower = result.lower() |
|
|
|
for allergen in user_allergens: |
|
if allergen in text_lower: |
|
found_allergens.add(allergen) |
|
|
|
response = { |
|
"text": result, |
|
"found_allergens": list(found_allergens), |
|
"has_allergens": len(found_allergens) > 0, |
|
"warning": "تحذير: هذا المنتج يحتوي على مواد قد تسبب لك حساسية!" if found_allergens else "لم يتم العثور على مواد مسببة للحساسية" |
|
} |
|
|
|
return jsonify(response) |
|
|
|
except Exception as e: |
|
return jsonify({"error": str(e)}), 500 |
|
|
|
return jsonify({"error": "Invalid file type"}), 400 |