feat: Many more improvements to video player now with a subscription
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user