import threading import socket import re import time import datetime import os import numpy as np import pandas as pd import faiss import cv2 from flask import Flask from flask import request from flask import render_template # live stream for channel 0, change to right url first live_stream_0 = "http://192.168.77.60/flv?app=live&stream=math_review_0" math_expr_checking_df = pd.DataFrame(columns=["time", "total", "num_of_yes", "num_of_no", "num_of_invalid", "all_expressions", "screenshot"]) math_expr_checking_df['time'] = pd.to_datetime(math_expr_checking_df['time']) ''' receive math expression checking result from socket (sent from VideoPipe) ''' def expr_checking_result_receiver(): udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) bind_ip = '192.168.77.68' bind_port = 3333 udp_socket.bind((bind_ip, bind_port)) while True: data, addr = udp_socket.recvfrom(1024 * 64) s = data.decode() print('############################################') print(f'Received data: \n{s}') print(f'From address: {addr}') li = re.findall("\<\-\-.*?\-\-\>", s, re.DOTALL) print(f"total {len(li)} records parsed! going to append to data frame...") for l in li: items = str(l).split('\n') ''' items[0] <-- items[1] time items[2] channel index, frame index items[3] total num, num of yes, num of no, number of invalid items[4] 1st expression string, 2nd expression string, 3rd expression string, ... items[5] screenshot path items[6] --> ''' assert(len(items) == 7) # append items to dataframe math_expr_checking_df.loc[len(math_expr_checking_df)] = [items[1].split('.')[0], items[3].split(',')[0], items[3].split(',')[1], items[3].split(',')[2], items[3].split(',')[3], items[4], items[5]] print(f"now total {len(math_expr_checking_df)} records in math_expr_checking_df!") print('############################################') ''' create flask app ''' app = Flask(__name__) # home page @app.route("/", methods=["GET", "POST"]) def home(): ''' filter properties ''' select_channel = "all" if 'select_channel' in request.form: select_channel = request.form['select_channel'] # 1 hour by default now = time.time() past_1_hour = now - 3600 select_start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(past_1_hour)) select_end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now)) if 'select_start_time' in request.form and request.form['select_start_time'] != '': select_start_time = datetime.datetime.strptime(request.form['select_start_time'], '%Y-%m-%dT%H:%M:%S') if 'select_end_time' in request.form and request.form['select_end_time'] != '': select_end_time = datetime.datetime.strptime(request.form['select_end_time'], '%Y-%m-%dT%H:%M:%S') sql = "total != ''" if select_channel != 'all': sql += f" & channel == '{select_channel}'" sql += f" & time >= '{select_start_time}'" sql += f" & time < '{select_end_time}'" print(sql) filter_df = math_expr_checking_df.query(sql) print(filter_df) expr_checking_results = [] for index, row in filter_df.iterrows(): expr_checking_results.append({'uid':index, \ 'time':row['time'], \ 'total':row['total'], \ 'num_of_yes':row['num_of_yes'], \ 'num_of_no':row['num_of_no'], \ 'num_of_invalid':row['num_of_invalid'], \ 'all_expressions':row['all_expressions'], \ 'screenshot': row['screenshot']}) return render_template("home.html", \ expr_checking_results=expr_checking_results, \ total_records=len(filter_df), \ select_start_time = select_start_time, \ select_end_time = select_end_time, \ live_stream_0=live_stream_0) if __name__ == "__main__": # start expr checking results receiving thread receiver = threading.Thread(target = expr_checking_result_receiver) receiver.start() # run server app.run(host="192.168.77.68", port=3636)