nexstream-api / backend /tests /services /stream_resolver.test.ts
circleci
deploy 10310ef
b051e6f
Raw
History Blame Contribute Delete
3.6 kB
import { describe, it, expect } from 'vitest';
import { resolveFormatDetails } from '../../src/services/video/stream-resolver.js';
import type { Format, VideoInfo } from '../../src/types/index.js';
const makeFormat = (over: Partial<Format>): Format => ({
formatId: 'base',
url: 'https://cdn.example/base.mp4',
extension: 'mp4',
vcodec: 'none',
acodec: 'none',
isMuxed: false,
isVideo: false,
isAudio: false,
...over,
});
const makeInfo = (formats: Format[]): VideoInfo =>
({ formats }) as unknown as VideoInfo;
describe('resolveFormatDetails — audioUrl pairing for dash sources', () => {
it('synthesizes a separate audio format from a video format audioUrl', () => {
const info = makeInfo([
makeFormat({
formatId: '1080p',
url: 'https://scontent.cdninstagram.com/v/1080.mp4',
vcodec: 'h264',
acodec: 'aac',
audioUrl: 'https://scontent.cdninstagram.com/a/audio.mp4',
isVideo: true,
height: 1920,
}),
]);
const res = resolveFormatDetails(info, '1080p', false);
expect(res.isAudioOnly).toBe(false);
expect(res.finalVideoFormat?.formatId).toBe('1080p');
expect(res.finalAudioFormat?.url).toBe(
'https://scontent.cdninstagram.com/a/audio.mp4'
);
expect(res.finalAudioFormat?.vcodec).toBe('none');
});
it('does not synthesize audio for a muxed progressive format', () => {
const info = makeInfo([
makeFormat({
formatId: 'sd',
url: 'https://scontent.cdninstagram.com/v/sd.mp4',
vcodec: 'h264',
acodec: 'aac',
isMuxed: true,
isVideo: true,
isAudio: true,
height: 640,
}),
]);
const res = resolveFormatDetails(info, 'sd', false);
expect(res.finalAudioFormat).toBeNull();
});
it('still selects a separate audio format for video-only sources', () => {
const info = makeInfo([
makeFormat({
formatId: 'v1080',
url: 'https://cdn.example/v/1080.mp4',
vcodec: 'avc1.640028',
acodec: 'none',
isVideo: true,
height: 1080,
}),
makeFormat({
formatId: 'a140',
url: 'https://cdn.example/a/audio.m4a',
extension: 'm4a',
vcodec: 'none',
acodec: 'mp4a.40.2',
isAudio: true,
abr: 128,
}),
]);
const res = resolveFormatDetails(info, 'v1080', false);
expect(res.finalAudioFormat?.formatId).toBe('a140');
});
it('picks audio-only from audioFormats for dash video-only', () => {
const info = {
formats: [
makeFormat({
formatId: '315',
url: 'https://cdn.example/v/2160.webm',
vcodec: 'vp9',
acodec: 'none',
isVideo: true,
height: 2160,
}),
makeFormat({
formatId: '18',
url: 'https://cdn.example/v/muxed360.mp4',
vcodec: 'avc1.42001E',
acodec: 'mp4a.40.2',
isMuxed: true,
isVideo: true,
isAudio: true,
height: 360,
}),
],
audioFormats: [
makeFormat({
formatId: '251',
url: 'https://cdn.example/a/opus.webm',
extension: 'webm',
vcodec: 'none',
acodec: 'opus',
isAudio: true,
abr: 160,
}),
],
} as unknown as VideoInfo;
const res = resolveFormatDetails(info, '315', false);
expect(res.finalVideoFormat?.formatId).toBe('315');
expect(res.finalAudioFormat?.formatId).toBe('251');
expect(res.finalAudioFormat?.vcodec).toBe('none');
});
});