nannou_video 0.20.0

Video decoding and playback, built on Bevy for nannou - the creative-coding framework.
Documentation
use bevy::app::{App, Plugin};
use bevy::prelude::{AssetApp, IntoScheduleConfigs, Update};

mod asset;
mod components;
mod events;

#[cfg(not(target_arch = "wasm32"))]
mod player;
#[cfg(not(target_arch = "wasm32"))]
mod worker;

#[cfg(target_arch = "wasm32")]
mod wasm;

pub use asset::{NetworkPreset, Video, VideoAssetLoaderError, VideoLoaderSettings, VideoSource};
pub use components::{HwAccelPolicy, PlaybackMode, SeekTo, VideoOutput, VideoPlayer, VideoResize};
pub use events::{VideoEnded, VideoFailed, VideoLoaded, VideoLooped, VideoSeeked};

#[cfg(not(target_arch = "wasm32"))]
pub use video_rs::location::Url;

pub mod prelude {
    pub use crate::asset::{NetworkPreset, Video, VideoLoaderSettings, VideoSource};
    pub use crate::components::{
        HwAccelPolicy, PlaybackMode, SeekTo, VideoOutput, VideoPlayer, VideoResize,
    };
    pub use crate::events::{VideoEnded, VideoFailed, VideoLoaded, VideoLooped, VideoSeeked};
    #[cfg(not(target_arch = "wasm32"))]
    pub use video_rs::location::Url;
}

pub struct NannouVideoPlugin;

impl Plugin for NannouVideoPlugin {
    fn build(&self, app: &mut App) {
        app.init_asset::<Video>()
            .register_type::<VideoPlayer>()
            .register_type::<VideoOutput>()
            .register_type::<PlaybackMode>()
            .register_type::<SeekTo>()
            .register_type::<HwAccelPolicy>()
            .register_type::<VideoResize>();

        #[cfg(not(target_arch = "wasm32"))]
        {
            app.init_asset_loader::<asset::VideoLoader>()
                .add_systems(
                    Update,
                    (
                        player::attach_workers,
                        player::process_seeks,
                        player::sync_commands,
                        player::drain_frames,
                    )
                        .chain(),
                )
                .add_observer(player::on_player_removed);
        }

        #[cfg(target_arch = "wasm32")]
        {
            use bevy::render::RenderApp;
            wasm::install_registry(app);
            app.init_asset_loader::<wasm::VideoLoader>()
                .add_systems(
                    Update,
                    (
                        wasm::attach_players,
                        wasm::process_seeks,
                        wasm::sync_commands,
                        wasm::drain_events,
                        wasm::sync_positions,
                    )
                        .chain(),
                )
                .add_observer(wasm::on_player_removed);
            if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
                wasm::install_render_app(render_app);
            }
        }
    }
}