use gtk::glib;
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Box as GtkBox, Button, Entry, Orientation};
use mutsumi::video::MutsumiVideoPlayer;
use mutsumi::{PlayParams, PlaySource};
fn main() {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::INFO)
.init();
mutsumi::force_gl_renderer();
gtk::init().expect("Failed to initialize GTK");
let player = MutsumiVideoPlayer::new();
player.backend_ref().mpv().mpv.set_property("config", true);
player
.backend_ref()
.mpv()
.mpv
.command("script-binding", &["stats/display-stats-toggle"]);
player.backend_ref().mpv().mpv.set_property(
"ytdl-raw-options",
"cookies-from-browser=firefox".to_string(),
);
let player_clone = player.clone();
glib::spawn_future_local(async move {
glib::timeout_future(std::time::Duration::from_secs(2)).await;
player_clone.play(&PlayParams::new(PlaySource::new_for_url(
"https://www.bilibili.com/video/BV1t5jw6bEhY",
)));
});
let app = Application::builder()
.application_id("org.mutsumi.example.mpvglarea")
.build();
let player_for_activate = player.clone();
app.connect_activate(move |app| {
let window = ApplicationWindow::builder()
.application(app)
.title("wl-proxy embed mpv demo")
.default_width(960)
.default_height(540)
.build();
let vbox = GtkBox::new(Orientation::Vertical, 6);
let video = player_for_activate.clone();
video.set_hexpand(true);
video.set_vexpand(true);
vbox.append(&video);
let controls = GtkBox::new(Orientation::Horizontal, 6);
let entry = Entry::new();
entry.set_placeholder_text(Some("file:///path/to/video.mp4 or https://..."));
controls.append(&entry);
let play_btn = Button::with_label("Play");
let pause_btn = Button::with_label("Toggle Pause");
let stop_btn = Button::with_label("Stop");
controls.append(&play_btn);
controls.append(&pause_btn);
controls.append(&stop_btn);
vbox.append(&controls);
let video_play = video.clone();
let entry_play = entry.clone();
play_btn.connect_clicked(move |_| {
let url = entry_play.text().to_string();
if url.trim().is_empty() {
eprintln!("Please enter a URL or file path to play.");
return;
}
video_play.play(&PlayParams::new(PlaySource::new_for_url(url.clone())));
eprintln!("Play requested: {}", url);
});
let video_pause = video.clone();
pause_btn.connect_clicked(move |_| {
video_pause.command_pause();
video_pause.push_an_empty_texture();
eprintln!("Toggle pause");
});
let video_stop = video.clone();
stop_btn.connect_clicked(move |_| {
video_stop.stop();
eprintln!("Stop requested");
});
window.set_child(Some(&vbox));
window.present();
});
app.run();
}