File size: 5,431 Bytes
b7d08bd
 
 
 
 
 
efbda21
 
 
 
 
 
b7d08bd
 
 
 
 
 
 
 
3e770b9
 
b7d08bd
 
9d283dd
 
67111f2
b7d08bd
3e770b9
efbda21
e406848
 
efbda21
 
 
e406848
efbda21
 
 
 
e406848
 
efbda21
e406848
b7d08bd
9d283dd
 
 
 
67111f2
9d283dd
 
 
 
 
 
 
 
 
 
 
 
 
67111f2
 
 
9d283dd
 
67111f2
9d283dd
67111f2
 
9d283dd
 
67111f2
b7d08bd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efbda21
 
 
9d283dd
 
67111f2
 
 
 
 
9d283dd
67111f2
 
 
 
9d283dd
67111f2
 
efbda21
 
 
 
 
 
 
 
b7d08bd
 
 
cb6a777
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from flask import Flask, render_template, request, jsonify
import os
import base64
import requests
from PIL import Image
from io import BytesIO
import logging
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# Configure logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

app = Flask(__name__)

# Configuration
UPLOAD_FOLDER = 'static/captures'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# Hugging Face API settings
HF_API_TOKEN = os.getenv('HF_API_TOKEN')  # Load token from environment variable
HF_API_URL = "https://api-inference.huggingface.co/models/facebook/detr-resnet-50"  # Example model for object detection

# Zapier webhook settings
ZAPIER_WEBHOOK_URL = os.getenv('ZAPIER_WEBHOOK_URL')  # Load webhook URL from environment variable

def query_hugging_face(image_data):
    if not HF_API_TOKEN:
        logging.error("Hugging Face API token not set.")
        return {"error": "Hugging Face API token not set. Please set the HF_API_TOKEN environment variable."}
    try:
        session = requests.Session()
        retries = Retry(total=3, backoff_factor=1, status_forcelist=[502, 503, 504])
        session.mount('https://', HTTPAdapter(max_retries=retries))
        headers = {"Authorization": f"Bearer {HF_API_TOKEN}"}
        logging.debug(f"Sending request to {HF_API_URL}")
        response = session.post(HF_API_URL, headers=headers, data=image_data, timeout=10)
        response.raise_for_status()
        logging.debug("Hugging Face API request successful.")
        return response.json()
    except requests.exceptions.RequestException as e:
        logging.error(f"Failed to connect to Hugging Face API: {str(e)}")
        return {"error": f"Failed to connect to Hugging Face API: {str(e)}"}

def send_to_zapier(image_path):
    if not ZAPIER_WEBHOOK_URL:
        logging.error("Zapier webhook URL not set.")
        return {"error": "Zapier webhook URL not set. Please set the ZAPIER_WEBHOOK_URL environment variable."}
    try:
        # Read the image file
        with open(image_path, "rb") as f:
            image_data = f.read()
            encoded_image = base64.b64encode(image_data).decode('utf-8')

        # Prepare data for Zapier
        payload = {
            'image': encoded_image,
            'filename': os.path.basename(image_path),
            'content_type': 'image/jpeg'
        }

        # Send to Zapier webhook
        session = requests.Session()
        retries = Retry(total=3, backoff_factor=1, status_forcelist=[502, 503, 504])
        session.mount('https://', HTTPAdapter(max_retries=retries))
        logging.debug(f"Sending image to Zapier webhook: {ZAPIER_WEBHOOK_URL}")
        response = session.post(ZAPIER_WEBHOOK_URL, json=payload, timeout=10)
        response.raise_for_status()
        logging.debug("Image sent to Zapier successfully.")
        return {"status": "success"}
    except requests.exceptions.RequestException as e:
        logging.error(f"Failed to send to Zapier: {str(e)}")
        return {"error": f"Failed to send to Zapier: {str(e)}"}

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/capture', methods=['POST'])
def capture():
    try:
        # Get the base64 image data from the request
        data = request.form['image']
        header, encoded = data.split(",", 1)
        binary_data = base64.b64decode(encoded)
        
        # Save the image
        filename = f"capture_{len(os.listdir(app.config['UPLOAD_FOLDER'])) + 1}.jpg"
        filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        with open(filepath, "wb") as f:
            f.write(binary_data)
        
        # Process with Hugging Face API
        with open(filepath, "rb") as f:
            hf_result = query_hugging_face(f.read())
        
        # Return the image URL and Hugging Face result
        image_url = f"/{filepath}"
        return jsonify({
            'status': 'success',
            'image_url': image_url,
            'hf_result': hf_result
        })
    except Exception as e:
        logging.error(f"Error in capture: {str(e)}")
        return jsonify({'status': 'error', 'message': str(e)})

@app.route('/upload_zapier', methods=['POST'])
def upload_zapier():
    try:
        image_url = request.form['image_url']
        if not image_url.startswith('/static/captures/'):
            return jsonify({'status': 'error', 'message': 'Invalid image path.'})
        
        result = send_to_zapier(image_url.lstrip('/'))
        if 'error' in result:
            return jsonify({'status': 'error', 'message': result['error']})
        return jsonify({'status': 'success'})
    except Exception as e:
        logging.error(f"Error in upload_zapier: {str(e)}")
        return jsonify({'status': 'error', 'message': str(e)})

@app.route('/test_connectivity')
def test_connectivity():
    try:
        response = requests.get('https://www.google.com', timeout=5)
        logging.debug(f"Connectivity test to Google: {response.status_code}")
        return jsonify({'status': 'success', 'code': response.status_code})
    except requests.exceptions.RequestException as e:
        logging.error(f"Connectivity test failed: {str(e)}")
        return jsonify({'status': 'error', 'message': str(e)})

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=7860)