| import gradio as gr |
| from flask import Flask, Response, request |
| import requests |
|
|
| app_flask = Flask(__name__) |
|
|
| |
| channels = [ |
| { |
| "name": "Indosiar", |
| "url": "https://atemecdnbalancer-voe.sysln.id/live/eds/IndosiarHD/mpd/IndosiarHD.mpd", |
| "kid": "Xq3czYk6R6yLZfmzGWOjrA", |
| "key": "iBr6Z+pXtBwYItdF1nVZ5g" |
| }, |
| { |
| "name": "SCTV", |
| "url": "https://atemecdnbalancer-voe.sysln.id/live/eds/SCTVHD/mpd/SCTVHD.mpd", |
| "kid": "p5oYgmNyS/ yq/ Ep8OzzYzg", |
| "key": "TUcy2T5nIN4O+ITXEG4U9w" |
| }, |
| { |
| "name": "MOJI TV", |
| "url": "https://atemeshield1-voe.sysln.id/live/eds/MOJIOChannel/mpd/MOJIOChannel.mpd", |
| "kid": "BShh6+2rRzCJ0OdIDQxbYw", |
| "key": "TVGqAwSvmMRJ/exVSooZ+Q" |
| } |
| ] |
|
|
| |
| @app_flask.route("/proxy") |
| def proxy(): |
| target_url = request.args.get("url") |
| headers = {"User-Agent": "ExoPlayerDemo/2.15.1 (Linux; Android 13)"} |
| r = requests.get(target_url, headers=headers, stream=True) |
| return Response(r.iter_content(chunk_size=1024), content_type=r.headers.get("content-type")) |
|
|
| def player(channel_index): |
| ch = channels[channel_index] |
| html = f""" |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/shaka-player/4.3.6/shaka-player.compiled.min.js"></script> |
| <video id="video" width="640" controls autoplay></video> |
| <script> |
| async function initPlayer() {{ |
| shaka.polyfill.installAll(); |
| if (!shaka.Player.isBrowserSupported()) {{ |
| alert("Browser tidak mendukung Shaka Player"); |
| return; |
| }} |
| const video = document.getElementById('video'); |
| const player = new shaka.Player(video); |
| |
| const clearKeyConfig = {{ |
| 'org.w3.clearkey': {{ |
| keyids: {{ |
| '{ch['kid']}': '{ch['key']}' |
| }} |
| }} |
| }}; |
| |
| player.configure({{ drm: {{ servers: clearKeyConfig }} }}); |
| try {{ |
| await player.load("/proxy?url={ch['url']}"); |
| }} catch (e) {{ |
| console.error("Error load stream", e); |
| }} |
| }} |
| document.addEventListener('DOMContentLoaded', initPlayer); |
| </script> |
| """ |
| return html |
|
|
| with gr.Blocks() as demo: |
| dropdown = gr.Dropdown(choices=[c["name"] for c in channels], value=channels[0]["name"], label="Pilih Channel") |
| iframe = gr.HTML(player(0)) |
|
|
| def update_player(name): |
| idx = [c["name"] for c in channels].index(name) |
| return player(idx) |
|
|
| dropdown.change(update_player, dropdown, iframe) |
|
|
| demo.launch(server_name="0.0.0.0", server_port=7860) |