Working With Videos

Working with videos

Use Unbody’s Video API powered by Mux to work with video content, including streaming, thumbnails, transcriptions, and analysis.

Fetch Video Assets

Retrieve video thumbnails and animated preview images with size filtering to optimize loading times.

const {
  data: { payload: videoFiles },
} = await unbody.get.videoFile
    .where(({ LessThan }) => ({
        size: LessThan(10000000), // 10 MB in bytes
    }))
    .select(
        "thumbnailUrl.png",
        "animatedImageUrl.gif",
        "autoSummary",
        "animatedImageUrl.webp",
        "size"
    )
    .exec();

Access Video Subtitles

Fetch and work with video subtitles, including timing and text content. This example filters videos by type and size.

const {
  data: { payload: subtitleFiles },
} = await unbody.get.subtitleFile
    .where(({ LessThan }) => ({
        media: {
            VideoFile: {
                mimeType: "video/mp4",
                size: LessThan(10000000), // 10 MB in Bytes
            },
        },
    }))
    .select(
        "entries.SubtitleEntry.start",
        "entries.SubtitleEntry.end",
        "entries.SubtitleEntry.text"
    )
    .exec();
 
const { entries } = subtitleFiles[0];

Analyze Video Content

Analyze Video Content

Analyze subtitle content from videos by extracting story elements and generating structured insights. Perfect for understanding narrative flow and key moments in video transcripts.

The example demonstrates advanced video analysis combining subtitle queries with structured content generation:

  • Fetches video subtitles with size constraints and timing information
  • Uses role-based messages to request story analysis
  • Enforces structured output with Zod schema, capturing:
  • Story context (location, characters, timeframe)
  • Key moments and their significance
  • Humor elements (setup/punchline)
  • Overall narrative tone

Results are validated against the schema by Zod, ensuring consistent analysis format.

    const {
      data: { payload: subtitleFiles },
    } = await unbody.get.subtitleFile
        .where(({ LessThan }) => ({
            media: {
                VideoFile: {
                    mimeType: "video/mp4",
                    size: LessThan(10000000),
                },
            },
        }))
        .select(
            "entries.SubtitleEntry.start",
            "entries.SubtitleEntry.end",
            "entries.SubtitleEntry.text"
        )
        .exec();
 
    const { entries } = subtitleFiles[0];
 
    // Now analyze the content using generate.json
    const analysis = await unbody.generate.json(
        [
            {
                role: "user",
                content: `Analyze this story from a video transcript: ${JSON.stringify(entries)}`,
            },
            {
                role: "system",
                content: "Extract key story elements and create a structured analysis.",
            },
        ],
        {
            schema: z.object({
                storyContext: z.object({
                    location: z.string(),
                    mainCharacters: z.array(z.string()),
                    timeframe: z.string(),
                }),
                keyMoments: z.array(
                    z.object({
                        moment: z.string(),
                        significance: z.string(),
                    })
                ),
                humorElement: z.object({
                    setup: z.string(),
                    punchline: z.string(),
                }),
                overallTone: z.string(),
            }),
        }
    );

Learn more about advanced video features in our Advanced Video Api Guide.

©2024 Unbody