kemono2/client/fluid-player/e2e/functions/video.ts
2025-04-11 00:58:59 +02:00

86 lines
2.4 KiB
TypeScript

import { Locator, Page } from 'playwright';
/**
* Seek to a given time in the video
*
* @param video - Playwright video locator
* @param time - The time you want to seek to
*/
export async function setVideoCurrentTime(video: Locator, time: number): Promise<void> {
await video.page().waitForFunction(
(vid) => {
const videoElement = vid as HTMLVideoElement | null;
return videoElement && videoElement.readyState >= 2;
},
await video.elementHandle(),
{ timeout: 10000 }
);
// Seek to the specified time
await video.evaluate((vid, t) => {
const videoElement = vid as HTMLVideoElement;
videoElement.currentTime = t;
}, time);
}
/**
* Wait until the video duration has changed
* This way you can detect if the ad or content is loaded in
*
* @param page - The Playwright page instance
* @param initialDuration - The initial duration of the video element
* @param timeout
*/
export async function waitForVideoDurationChange(
page: Page,
initialDuration: number,
timeout: number = 10000
): Promise<void> {
await page.waitForFunction(
(initialDur) => {
const videoElement = document.querySelector('video') as HTMLVideoElement;
return videoElement.duration !== initialDur;
},
initialDuration,
{ timeout }
);
}
/**
* Get the current duration of the video
*
* @param video - Playwright video locator
* @returns video duration time
*/
export async function getVideoDuration(video: Locator): Promise<number> {
return await video.evaluate((vid) => {
const videoElement = vid as HTMLVideoElement;
return videoElement.duration;
});
}
/**
* Get the current time of the video
*
* @param video - Playwright video locator
* @returns video current time
*/
export async function getVideoCurrentTime(video: Locator): Promise<number> {
return await video.evaluate((vid) => {
const videoElement = vid as HTMLVideoElement;
return videoElement.currentTime;
});
}
/**
* Waits until the given video element starts playing.
*
* @param video - The Playwright Locator for the video element.
*/
export async function waitForVideoToPlay(video: Locator): Promise<void> {
await video.evaluate((vid) => {
return new Promise<void>((resolve) => {
vid.addEventListener('playing', () => resolve(), { once: true });
});
});
}