Spaces:
Running
Running
| import { OriginalManuscript } from 'common-utils' | |
| import Transitions from '../public/assets/transitions.json' | |
| import { RenderUtils } from './RenderUtils' | |
| import { YoutubeCategoriesConfig } from './models/Categories' | |
| export function GenerateScript(Script: OriginalManuscript) { | |
| let fps = Script?.meta?.fps | |
| if (!fps) { | |
| Script.meta.fps = 24 | |
| fps = 24 | |
| } | |
| var durationInSec = 0 | |
| var lastDirection = false; | |
| let preloadImages = [] | |
| let preloadVideos = [] | |
| let contents = | |
| Script.transcript | |
| .sort((t, u) => t.index - u.index) | |
| // .filter(item => (item.audioCaptionFile != undefined)) | |
| // .slice(0, 2) | |
| .map((section, idx, array) => { | |
| section.index = section.index || idx; | |
| var { text, duration: durationMilis, offset, mediaAbsPaths, mediaAbsPaths, audioFullPath, title, pointers } = section | |
| mediaAbsPaths = mediaAbsPaths || mediaAbsPaths || [] | |
| if (!durationMilis) { | |
| durationMilis = section.durationInSeconds * 1000 | |
| } | |
| if (!durationMilis) | |
| durationMilis = 10e3 | |
| // maybe required for youtube composition !!! | |
| let curDurSecs = (durationMilis / 1e3) | |
| if (curDurSecs < 3) { | |
| curDurSecs = 3 | |
| } | |
| //@ts-ignore | |
| const transitionFile = (section?.transition_file || Transitions[0].file) | |
| const transition_type = (section?.transition_type) | |
| if (transition_type && transition_type != 'none') { | |
| section.transition_duration_sec = section?.transition_duration_sec || 0.5 | |
| } | |
| //@ts-ignore | |
| const transitionDurationSec = (section?.transition_duration_sec || (transition_type && transition_type != 'none') ? 0.5 : 0) | |
| const transitionDurationFrames = transitionDurationSec * fps | |
| let commDuration = durationInSec //+ transitionDurationSec | |
| durationInSec = durationInSec + curDurSecs;///+ transitionDurationSec | |
| lastDirection = !lastDirection | |
| mediaAbsPaths.forEach(p => { | |
| let im = p.path | |
| if (im.startsWith("http")) { | |
| if (im.indexOf("-video-") > -1 || im.indexOf(".mp4") > -1 || im.indexOf(".webm") > -1) { | |
| preloadVideos.push(im) | |
| // preloadVideo(im) | |
| } | |
| else { | |
| preloadImages.push(im) | |
| // preloadImage(im) | |
| } | |
| } | |
| }) | |
| let bgImagePaths = mediaAbsPaths.map(p => { | |
| p.path = RenderUtils.getFileName(p?.path)!! | |
| return p | |
| }) | |
| if (!offset) { | |
| offset = commDuration | |
| } | |
| let frame = Object.assign(section, { | |
| "commulativeDurationStartSec": commDuration, | |
| "text": text, | |
| "transition_file": RenderUtils.getFileName(transitionFile), | |
| "durationInSecs": curDurSecs, | |
| "duration": Math.ceil(curDurSecs * fps), | |
| "offset": offset * fps, | |
| "direction": lastDirection ? 'left' : 'right', | |
| "bgImagePaths": bgImagePaths, | |
| "audioPath": RenderUtils.getFileName(audioFullPath), | |
| "textColor": '#F44336', | |
| "emphasisOnImage": title?.length > 0 && pointers?.length > 0 || Script.meta.emphasisOnImage | |
| }) | |
| return frame | |
| }) | |
| console.log('contents', contents) | |
| const intro = { | |
| durationInFrames: 0, | |
| durationInSec: 5.433, | |
| file: Script.meta.tenantVideoConfig ? RenderUtils.getFileName(Script.meta.tenantVideoConfig.introFile, "assets") : 'assets/music_intro.mp4' | |
| } | |
| let ADJUST_END_DUR_SEC = 3 | |
| const outro = { | |
| durationInFrames: 0, | |
| durationInSec: 8.034 - ADJUST_END_DUR_SEC, | |
| file: Script.meta.tenantVideoConfig ? RenderUtils.getFileName(Script.meta.tenantVideoConfig.outroFile, "assets") : 'assets/music_outro.mp4' | |
| } | |
| if (intro && Script?.meta?.tenantVideoConfig?.introFile) { | |
| durationInSec += intro.durationInSec | |
| intro.durationInFrames = Math.ceil(fps * intro.durationInSec) | |
| } | |
| if (outro && Script?.meta?.tenantVideoConfig?.outroFile) { | |
| durationInSec += outro.durationInSec | |
| //hack for blank end | |
| outro.durationInSec += 30 | |
| outro.durationInFrames = Math.ceil(fps * outro.durationInSec) | |
| } | |
| // durationInSec = 10 | |
| const duration = Math.ceil(durationInSec * fps) | |
| console.log("Total Video Duration", durationInSec) | |
| //@ts-ignore | |
| const playListsIDs = YoutubeCategoriesConfig.GET_PLAY_LIST_IDS(Script.meta?.userId || "104349087108535511186") | |
| return { | |
| Script, | |
| contents, | |
| playListsIDs, | |
| duration, | |
| outro, | |
| intro | |
| } | |
| } |