unbundle 5.2.0

Unbundle media files - extract still frames, audio tracks, and subtitles from video files
Documentation
//! Video filter-graph integration tests.
//!
//! These tests require fixture files generated by
//! `tests/fixtures/generate_fixtures.sh` (or `.bat` on Windows).

use std::path::Path;

use unbundle::{MediaFile, UnbundleError};

fn sample_video_path() -> &'static str {
    "tests/fixtures/sample_video.mp4"
}

#[test]
fn frame_with_filter_scale_changes_dimensions() {
    let path = sample_video_path();
    if !Path::new(path).exists() {
        return;
    }

    let mut unbundler = MediaFile::open(path).expect("Failed to open test video");
    let frame = unbundler
        .video()
        .frame_with_filter(0, "scale=320:240")
        .expect("Failed to extract filtered frame");

    assert_eq!(frame.width(), 320);
    assert_eq!(frame.height(), 240);
}

#[test]
fn frame_with_complex_filter_chain_changes_dimensions() {
    let path = sample_video_path();
    if !Path::new(path).exists() {
        return;
    }

    let mut unbundler = MediaFile::open(path).expect("Failed to open test video");
    let frame = unbundler
        .video()
        .frame_with_filter(5, "scale=640:480,crop=320:240:10:20,hflip,transpose=1")
        .expect("Failed to extract frame with complex filter chain");

    assert_eq!(frame.width(), 240);
    assert_eq!(frame.height(), 320);
}

#[test]
fn chainable_filter_api_changes_dimensions() {
    let path = sample_video_path();
    if !Path::new(path).exists() {
        return;
    }

    let mut unbundler = MediaFile::open(path).expect("Failed to open test video");
    let frame = unbundler
        .video()
        .filter("scale=320:240")
        .filter("transpose=1")
        .frame(0)
        .expect("Failed to extract frame with chainable filter API");

    assert_eq!(frame.width(), 240);
    assert_eq!(frame.height(), 320);
}

#[test]
fn frame_with_filter_invalid_spec_returns_error() {
    let path = sample_video_path();
    if !Path::new(path).exists() {
        return;
    }

    let mut unbundler = MediaFile::open(path).expect("Failed to open test video");
    let result = unbundler
        .video()
        .frame_with_filter(0, "this_filter_does_not_exist");

    assert!(result.is_err(), "Expected filter graph error");
    assert!(
        matches!(result.unwrap_err(), UnbundleError::FilterGraphError(_)),
        "Expected FilterGraphError variant"
    );
}