diff --git a/Cargo.toml b/Cargo.toml index c335021..90dac0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,19 @@ [package] name = "iced_video_player" +description = "A convenient video player widget for Iced" +homepage = "https://github.com/jazzfool/iced_video_player" +repository = "https://github.com/jazzfool/iced_video_player" +readme = "README.md" +keywords = ["gui", "iced", "video"] +categories = ["gui", "multimedia"] version = "0.1.0" authors = ["jazzfool"] -edition = "2018" +edition = "2021" resolver = "2" +license = "MIT OR Apache-2.0" +exclude = [ + ".media/test.mp4" +] [dependencies] iced = { version = "0.12", features = ["image", "advanced", "wgpu"] } diff --git a/src/lib.rs b/src/lib.rs index 709421f..305e212 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,46 @@ +//! # Iced Video Player +//! +//! A convenient video player widget for Iced. +//! +//! To get started, load a video from a URI (e.g., a file path prefixed with `file:///`) using [`Video::new`](crate::Video::new), +//! then use it like any other Iced widget in your `view` function by creating a [`VideoPlayer`]. +//! +//! Example: +//! ```rust +//! use iced_video_player::{Video, VideoPlayer}; +//! use iced::{Sandbox, Element}; +//! +//! fn main() { +//! App::run(Default::default()); +//! } +//! +//! struct App { +//! video: Video, +//! } +//! +//! impl Sandbox for App { +//! type Message = (); +//! +//! fn new() -> Self { +//! App { +//! video: Video::new(&url::Url::parse("file:///C:/my_video.mp4").unwrap()).unwrap(), +//! } +//! } +//! +//! fn title(&self) -> String { +//! String::from("Video Player") +//! } +//! +//! fn update(&mut self, _message: ()) {} +//! +//! fn view(&mut self) -> Element<()> { +//! VideoPlayer::new(&self.video).into() +//! } +//! } +//! ``` +//! +//! You can programmatically control the video (e.g., seek, pause, loop, grab thumbnails) by accessing various methods on [`Video`]. + mod pipeline; mod video; mod video_player; diff --git a/src/video_player.rs b/src/video_player.rs index 7f68413..1ee65a8 100644 --- a/src/video_player.rs +++ b/src/video_player.rs @@ -8,7 +8,7 @@ use iced_wgpu::primitive::pipeline::Renderer as PrimitiveRenderer; use std::{marker::PhantomData, sync::atomic::Ordering}; use std::{sync::Arc, time::Duration}; -/// Video player which displays the current frame of a [`Video`](crate::Video). +/// Video player widget which displays the current frame of a [`Video`](crate::Video). pub struct VideoPlayer<'a, Message, Theme = iced::Theme, Renderer = iced::Renderer> where Renderer: PrimitiveRenderer, @@ -23,6 +23,7 @@ impl<'a, Message, Theme, Renderer> VideoPlayer<'a, Message, Theme, Renderer> where Renderer: PrimitiveRenderer, { + /// Creates a new video player widget for a given video. pub fn new(video: &'a Video) -> Self { VideoPlayer { video, @@ -32,6 +33,7 @@ where } } + /// Message to send when the video reaches the end of stream (i.e., the video ends). pub fn on_end_of_stream(self, on_end_of_stream: Message) -> Self { VideoPlayer { on_end_of_stream: Some(on_end_of_stream), @@ -39,6 +41,7 @@ where } } + /// Message to send when the video receives a new frame. pub fn on_new_frame(self, on_new_frame: Message) -> Self { VideoPlayer { on_new_frame: Some(on_new_frame),