feat: Many more improvements to video player now with a subscription

This commit is contained in:
uttarayan21
2025-12-26 19:06:40 +05:30
parent 99853167df
commit 584495453f
13 changed files with 800 additions and 801 deletions

View File

@@ -19,7 +19,7 @@ iced = { workspace = true, default-features = true, features = [
] }
iced_video_player = { workspace = true }
iced-video = { workspace = true }
iced_wgpu = "0.14.0"
iced_winit = "0.14.0"
reqwest = "0.12.24"

View File

@@ -2,7 +2,7 @@ mod settings;
mod video;
mod shared_string;
use iced_video_player::{Video, VideoPlayer};
use iced_video::{Video, VideoHandle};
use shared_string::SharedString;
use std::sync::Arc;
@@ -140,7 +140,7 @@ struct State {
screen: Screen,
settings: settings::SettingsState,
is_authenticated: bool,
video: Option<Arc<Video>>,
video: Option<Arc<VideoHandle>>,
}
impl State {

View File

@@ -3,6 +3,7 @@ use super::*;
pub enum VideoMessage {
EndOfStream,
Open(url::Url),
Loaded(VideoHandle),
Pause,
Play,
Seek(f64),
@@ -17,34 +18,24 @@ pub fn update(state: &mut State, message: VideoMessage) -> Task<Message> {
Task::none()
}
VideoMessage::Open(url) => {
match Video::new(&url)
.inspect_err(|err| {
tracing::error!("Failed to play video at {}: {:?}", url, err);
})
.inspect(|video| {
tracing::error!("Framerate is {}", video.framerate());
})
.map(Arc::new)
{
Ok(video) => {
state.video = Some(video);
Task::none()
}
Err(err) => Task::done(Message::Error(format!(
"Error opening video at {}: {:?}",
url, err
))),
}
Task::perform(VideoHandle::load(url.clone()), move |result| match result {
Ok(video) => Message::Video(VideoMessage::Loaded(video)),
Err(err) => Message::Error(format!("Error opening video at {}: {:?}", url, err)),
})
}
VideoMessage::Loaded(video) => {
state.video = Some(Arc::new(video));
Task::done(VideoMessage::Play).map(Message::Video)
}
VideoMessage::Pause => {
if let Some(video) = state.video.as_mut().and_then(Arc::get_mut) {
video.set_paused(true);
if let Some(ref video) = state.video {
video.pause();
}
Task::none()
}
VideoMessage::Play => {
if let Some(video) = state.video.as_mut().and_then(Arc::get_mut) {
video.set_paused(false);
if let Some(ref video) = state.video {
video.play();
}
Task::none()
}
@@ -55,24 +46,25 @@ pub fn update(state: &mut State, message: VideoMessage) -> Task<Message> {
Task::none()
}
VideoMessage::Stop => {
state.video.as_ref().map(|video| {
video.stop();
});
state.video = None;
Task::none()
}
VideoMessage::Test => {
let url = url::Url::parse(
// "file:///home/servius/Projects/jello/crates/iced_video_player/.media/test.mp4",
"https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm",
// "https://www.youtube.com/watch?v=QbUUaXGA3C4",
)
.expect("Impossible: Failed to parse hardcoded URL");
Task::done(Message::Video(VideoMessage::Open(url)))
Task::done(VideoMessage::Open(url)).map(Message::Video)
}
}
}
pub fn player(video: &Video) -> Element<'_, Message> {
pub fn player(video: &VideoHandle) -> Element<'_, Message> {
container(
VideoPlayer::new(video)
Video::new(video)
.width(Length::Fill)
.height(Length::Fill)
.content_fit(iced::ContentFit::Contain)