72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import { extractVideoChapters } from './extract-video-chapters';
|
|
|
|
/**
|
|
* Converts milliseconds duration to a string in the hh:mm:ss format
|
|
*
|
|
* @param {number} milliseconds - The duration in milliseconds
|
|
* @returns {string} - The formatted time
|
|
*/
|
|
function millisecondsToClockTime( milliseconds: number ) {
|
|
const hours = Math.floor( milliseconds / 3600000 );
|
|
let remaining = milliseconds - hours * 3600000;
|
|
|
|
const minutes = Math.floor( remaining / 60000 );
|
|
remaining = remaining - minutes * 60000;
|
|
|
|
const seconds = Math.floor( remaining / 1000 );
|
|
|
|
return [ hours, minutes, seconds ]
|
|
.map( value => ( value < 10 ? `0${ value }` : value ) )
|
|
.join( ':' );
|
|
}
|
|
|
|
/**
|
|
* Generates the contents of a WebVTT file from video data
|
|
*
|
|
* @param {string} description - The video description
|
|
* @param {number} videoDuration - The video duration, in milliseconds
|
|
* @returns {string} - WebVTT text content
|
|
*/
|
|
function generateChaptersFileContent(
|
|
description: string,
|
|
videoDuration = 359999000 // 99:59:59
|
|
): string | null {
|
|
const chapters = extractVideoChapters( description );
|
|
if ( chapters.length === 0 ) {
|
|
return null;
|
|
}
|
|
|
|
let content = 'WEBVTT\n';
|
|
let chapterCount = 1;
|
|
|
|
for ( const [ index, chapter ] of chapters.entries() ) {
|
|
const startMilliseconds = index === 0 ? '000' : '001';
|
|
|
|
const endAt =
|
|
index < chapters.length - 1
|
|
? chapters[ index + 1 ].startAt
|
|
: millisecondsToClockTime( videoDuration );
|
|
|
|
content += `\n${ chapterCount++ }\n${
|
|
chapter.startAt
|
|
}.${ startMilliseconds } --> ${ endAt }.000\n${ chapter.title }\n`;
|
|
}
|
|
|
|
return content;
|
|
}
|
|
|
|
export default function generateChaptersFile(
|
|
description: string,
|
|
videoDuration: number
|
|
): File | null {
|
|
const content = generateChaptersFileContent( description, videoDuration );
|
|
|
|
if ( ! content ) {
|
|
return null;
|
|
}
|
|
|
|
return new File( [ content ], 'chapters.vtt', { type: 'text/vtt' } );
|
|
}
|
|
|
|
export { millisecondsToClockTime, generateChaptersFileContent, generateChaptersFile };
|