Welcome to FMEO TV

Stream your favorite content — and get paid to watch it.

Connect your XUMM Wallet to start earning FMEO Coin powered by the XRP Ledger.

Connect XUMM Wallet
"
from flask import Flask, request, jsonify, render_template from datetime import datetime import os import random from dotenv import load_dotenv load_dotenv() app = Flask(__name__, template_folder="templates", static_folder="static") # Safe SDK import with micropip-free fallback sdk = None try: from xumm import XummSdk sdk = XummSdk( api_key=os.getenv('XUMM_API_KEY', ''), api_secret=os.getenv('XUMM_API_SECRET', '') ) except Exception as e: print("Xumm SDK not available, using mock.", str(e)) class XummSdkMock: def payload_create(self, payload): return { 'uuid': 'mock-uuid', 'next': {'always': 'mock-url'}, 'refs': {'qr_png': 'mock-qr', 'websocket_status': 'mock-ws'} } def get_account_trustlines(self, address): return {'lines': [ {'currency': 'FMEO', 'issuer': 'rQBsybc537dSFcKVckEb8UrGrtH1ecxgaS'}, {'currency': 'RLUSD', 'issuer': 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De'} ]} def ping(self): class App: name = 'MockApp'; uuidv4 = '0000'; webhookurl = ''; disabled = 0 class Call: uuidv4 = 'mock-call-uuid' return type('MockPing', (), {'application': App(), 'call': Call(), 'quota': {}})() def verify_user_token(self, token): return type('MockToken', (), {'active': True})() sdk = XummSdkMock() # ML payout weighting simulation def calculate_payout_weight(view_time_minutes): if view_time_minutes < 10: return 0.5 # light viewer elif 10 <= view_time_minutes <= 30: return 1.0 # normal elif view_time_minutes > 30: return 1.5 # power viewer return 1.0 # Real wallet logic def get_wallet_address_from_user(user_id): if isinstance(user_id, str) and user_id.startswith('r') and len(user_id) >= 25: return user_id return None @app.route('/') def index(): return render_template( 'index.html', rlusd_trustline_url='https://xpmarket.com/trustline/RLUSD-rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De/set', fmeo_trustline_url='https://xpmarket.com/trustline/FMEO-rQBsybc537dSFcKVckEb8UrGrtH1ecxgaS/set' ) @app.route('/calculate-reward', methods=['POST']) def calculate_reward(): try: data = request.get_json() view_time = int(data.get("minutes_watched", 0)) base_reward = 100 multiplier = calculate_payout_weight(view_time) reward = int(base_reward * multiplier) # Log streaming session for admin tracking (simulate) user_id = data.get("user_id", "unknown") with open("streaming_sessions.log", "a") as log: log.write(f"User: {user_id}, Minutes Watched: {view_time}, Multiplier: {multiplier}, Reward: {reward} ") return jsonify({"reward": reward, "multiplier": multiplier}) except Exception as e: return jsonify({"error": str(e)}), 500 except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/create-payload', methods=['POST']) def create_payload(): try: data = request.get_json() destination = data.get("destination", "rwiETSee2wMz3SBnAG8hkMsCgvGy9LWbZ1") amount = data.get("amount", "1337") new_payload = { 'txjson': { 'TransactionType': 'Payment', 'Destination': destination, 'Amount': str(amount) } } created = sdk.payload_create(new_payload) return jsonify({ "uuid": created.get('uuid'), "sign_url": created['next']['always'], "qr": created['refs']['qr_png'], "websocket": created['refs']['websocket_status'] }) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/check-trustline/', methods=['GET']) def check_trustline(user_id): try: wallet_address = get_wallet_address_from_user(user_id) if not wallet_address: return jsonify({"error": "Invalid wallet address"}), 400 result = sdk.get_account_trustlines(wallet_address) has_fmeo = any(line['currency'] == 'FMEO' and line['issuer'] == 'rQBsybc537dSFcKVckEb8UrGrtH1ecxgaS' for line in result['lines']) has_rlusd = any(line['currency'] == 'RLUSD' and line['issuer'] == 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De' for line in result['lines']) if not has_rlusd: return jsonify({ "error": "Missing RLUSD trustline. Please add it via https://xpmarket.com/trustline/RLUSD-rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De/set", "trustline_FMEO": has_fmeo, "trustline_RLUSD": has_rlusd }), 400 return jsonify({"trustline_FMEO": has_fmeo, "trustline_RLUSD": has_rlusd}) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/ping', methods=['GET']) def ping(): try: pong = sdk.ping() return jsonify({ "app_name": pong.application.name, "uuid": pong.application.uuidv4, "webhook": pong.application.webhookurl, "call_uuid": pong.call.uuidv4 }) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/verify-token', methods=['POST']) def verify_token(): try: data = request.get_json() token = data.get("token") active = sdk.verify_user_token(token).active return jsonify({"active": active}) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/connect-wallet', methods=['POST']) def connect_wallet(): try: sign_in_payload = { "txjson": { "TransactionType": "SignIn" } } result = sdk.payload_create(sign_in_payload) return jsonify({ "uuid": result.get('uuid'), "sign_url": result['next']['always'], "qr": result['refs']['qr_png'], "websocket": result['refs']['websocket_status'] }) except Exception as e: return jsonify({"error": str(e)}), 500