README.md

# FirstLastFrame

A simple Elixir library for extracting the first and last frames from video files. Provides a convenient way to programmatically access key visual elements within your video processing workflows.

## Installation

Add `first_last_frame` to your list of dependencies in `mix.exs`:
elixir
def deps do
  [
    {:first_last_frame, "~> 0.1.0"} # Replace with the actual version
  ]
end

Then, run `mix deps.get` to fetch the dependency.

## Usage

This library leverages `ffmpeg` under the hood. Ensure that `ffmpeg` is installed and accessible in your system's PATH.

Here are some example usages:

**1. Extracting frames and saving them to default locations:**
elixir
FirstLastFrame.extract("path/to/your/video.mp4")
#=> {:ok, %{first_frame: "path/to/your/video_first.jpg", last_frame: "path/to/your/video_last.jpg"}}

This will extract the first and last frames as JPEG images, saving them in the same directory as the video file, with `_first.jpg` and `_last.jpg` suffixes.

**2. Extracting frames and specifying output directories:**
elixir
FirstLastFrame.extract("path/to/your/video.mp4", output_dir: "/tmp/frames")
#=> {:ok, %{first_frame: "/tmp/frames/video_first.jpg", last_frame: "/tmp/frames/video_last.jpg"}}

This saves the extracted frames to the `/tmp/frames` directory.

**3. Handling errors:**
elixir
case FirstLastFrame.extract("invalid/path/video.mp4") do
  {:ok, frame_paths} ->
    IO.puts "Frames extracted: #{inspect(frame_paths)}"
  {:error, reason} ->
    IO.puts "Error extracting frames: #{reason}"
end

This example demonstrates how to handle potential errors during the extraction process.

**4. Piping for streamlined processing:**
elixir
"path/to/your/video.mp4"
|> FirstLastFrame.extract(output_dir: "/tmp/frames")
|> case do
  {:ok, frame_paths} ->
    IO.puts "Frames extracted: #{inspect(frame_paths)}"
  {:error, reason} ->
    IO.puts "Error extracting frames: #{reason}"
end

This demonstrates using the pipe operator for a more readable and concise workflow.

**5. Custom filename suffixes:**
elixir
FirstLastFrame.extract("path/to/your/video.mp4", first_frame_suffix: "_start", last_frame_suffix: "_end")
#=> {:ok, %{first_frame: "path/to/your/video_start.jpg", last_frame: "path/to/your/video_end.jpg"}}

Customize the suffixes appended to the base filename for better organization.

## Feature Summary

*   **Easy Extraction:** Simplifies the process of extracting the first and last frames from video files.
*   **Customizable Output:** Allows specifying the output directory and filename suffixes for better organization.
*   **Error Handling:** Provides clear error messages for debugging.
*   **Clean API:** Offers a straightforward and easy-to-use API.
*   **Dependency-Light:** Relies on `ffmpeg`, a widely available and powerful video processing tool.

## License

MIT

This package is part of the first-last-frame ecosystem. For advanced features and enterprise-grade tools, visit: https://supermaker.ai/video/first-last-frame/