Signage — Open Source Digital

# requirements.txt Flask==2.3.0 flask-cors==4.0.0 flask-sqlalchemy==3.0.5 qrcode==7.4.2 Pillow==10.0.0 For Xibo: Use the HTML package with iframe embedding

last_hour = datetime.utcnow() - timedelta(hours=1) scans_last_hour = QRScan.query.filter(QRScan.scanned_at >= last_hour).count() open source digital signage

scan = QRScan( qr_content_id=qr_id, ip_address=request.remote_addr, user_agent=request.headers.get('User-Agent') ) db.session.add(scan) db.session.commit() # requirements

return jsonify( 'id': current_qr.id, 'name': current_qr.name, 'url': current_qr.url, 'qr_image': qr_base64, 'description': current_qr.description, 'duration': current_qr.display_duration ) @app.route('/api/track-scan', methods=['POST']) def track_scan(): data = request.json qr_id = data.get('qr_id') = last_hour).count() scan = QRScan( qr_content_id=qr_id

with app.app_context(): db.create_all() def generate_qr_base64(url): qr = qrcode.QRCode(version=1, box_size=10, border=4) qr.add_data(url) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") buffered = BytesIO() img.save(buffered, format="PNG") return base64.b64encode(buffered.getvalue()).decode() Get current active QR for display @app.route('/api/current-qr', methods=['GET']) def get_current_qr(): active_qrs = QRContent.query.filter_by(is_active=True).all()