File size: 3,615 Bytes
c3812ef
c001f24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c3812ef
c001f24
 
 
 
 
 
 
c3812ef
c001f24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c3812ef
c001f24
c3812ef
c001f24
c3812ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from flask import Blueprint, render_template, request, jsonify, current_app
from flask_login import login_required, current_user
from werkzeug.utils import secure_filename
from database import get_db_connection
import os
import uuid

camera_bp = Blueprint('camera', __name__)

@camera_bp.route('/camera_web')
@login_required
def camera_web():
    return render_template('camera_web.html')

@camera_bp.route('/camera_mobile')
@login_required
def camera_mobile():
    # camera_id can be used to select specific camera if needed, defaulting to back camera
    return render_template('camera_mobile.html')


@camera_bp.route('/camera/upload_captured_image', methods=['POST'])
@login_required
def upload_captured_image():
    if 'image' not in request.files:
        return jsonify({'error': 'No image file provided'}), 400

    file = request.files['image']
    if file.filename == '':
        return jsonify({'error': 'No selected file'}), 400

    if file:
        session_id = str(uuid.uuid4())
        original_filename = secure_filename(file.filename) or f"captured_image_{session_id}.png"

        # Save to UPLOAD_FOLDER or TEMP_FOLDER
        # For captured images, TEMP_FOLDER is suitable, then processed further
        save_path = os.path.join(os.getcwd(), 'tmp', original_filename) # Using tmp folder relative to CWD
        file.save(save_path)

        conn = get_db_connection()
        try:
            conn.execute(
                'INSERT INTO sessions (id, original_filename, name, user_id, session_type) VALUES (?, ?, ?, ?, ?)',
                (session_id, original_filename, original_filename, current_user.id, 'image_capture')
            )
            # Insert the image into the images table
            conn.execute(
                'INSERT INTO images (session_id, image_index, filename, original_name, image_type) VALUES (?, ?, ?, ?, ?)',
                (session_id, 0, original_filename, original_filename, 'original')
            )
            conn.commit()
        except Exception as e:
            conn.rollback()
            return jsonify({'error': f'Database error: {str(e)}'}), 500
        finally:
            conn.close()

        return jsonify({'success': True, 'session_id': session_id, 'filename': original_filename})

    return jsonify({'error': 'Image capture failed'}), 500


def init_socketio_handlers(socketio):
    """Initialize socketio event handlers. Called after app is created to avoid circular imports."""
    from flask_socketio import emit, join_room

    @socketio.on('join')
    def handle_join(data):
        room = data.get('room', 'stream_room')
        join_room(room)
        print(f"Client joined room: {room}")
        emit('user_joined', {'message': 'A user has joined'}, room=room)

    @socketio.on('offer')
    def handle_offer(data):
        room = data.get('room', 'stream_room')
        print("Received offer")
        emit('offer', data['offer'], room=room, include_self=False)

    @socketio.on('answer')
    def handle_answer(data):
        room = data.get('room', 'stream_room')
        print("Received answer")
        emit('answer', data['answer'], room=room, include_self=False)

    @socketio.on('candidate')
    def handle_candidate(data):
        room = data.get('room', 'stream_room')
        print("Received candidate")
        emit('candidate', data['candidate'], room=room, include_self=False)

    @socketio.on('remote_capture')
    def handle_remote_capture(data):
        room = data.get('room', 'stream_room')
        print("Received remote capture request")
        emit('trigger_capture', {}, room=room, include_self=False)