<script setup lang="ts"> import { onMounted, reactive, ref } from 'vue' import { Sunny, UploadFilled } from '@element-plus/icons-vue' import { ElMessage, genFileId, type UploadInstance, type UploadProps, type UploadRawFile } from 'element-plus' import { useLanguage } from './compositions/index' import videoService from '@/api/service/videoService' import exportFile from '@/utils/exportFile' import { whenMouse } from 'element-plus/es/utils/index.mjs' const { languages } = useLanguage() const step = ref(1) const form = reactive({ language: 'en', video: '', timeline: <Wm.TimelineItem[]>[], withSub: true }) const upload = ref<UploadInstance>() const actionUrl = ref( import.meta.env.MODE === 'production' ? '/upload_file' : import.meta.env.VITE_APP_BASE_API + '/upload_file' ) onMounted(() => {}) const onSubmit = () => { if (!form.video) { ElMessage({ message: '请先上传视频', type: 'error' }) return } let postData: Wm.VideoCutOptions = { instances: [ { video: form.video, lang: form.language, steps: ['step'+step.value] } ] } if (step.value === 2) { let srt_json_in = form.timeline postData.instances[0] = { ...postData.instances[0], with_sub: form.withSub, srt_json_in: srt_json_in } } videoService .wmVideoCut(postData) .then((res: any) => { console.log(res) ElMessage({ message: '操作成功', type: 'success' }) const ishttps = document.location.protocol === 'https:' // console.log(document.location) if (res) { if (step.value === 1) { form.timeline = res.result step.value = 2 } else { let url = '' const final_video_url = res.result if (ishttps) { url = final_video_url.replace('http://', 'https://') } else { url = final_video_url.replace('https://', 'http://') } url = '/download' + url.substring(1, url.length) console.log(url) const arr_name = final_video_url.split('/') const file_name = arr_name[arr_name.length - 1] // 获取文件名 fetch(url) .then((url) => url.blob()) .then((blob: any) => { exportFile.getVideoFile(blob, file_name) }) step.value = 1 } } }) .catch((err: any) => { console.log(err) ElMessage({ message: '操作失败' + err, type: 'error' }) }) } const handleExceed: UploadProps['onExceed'] = (files) => { upload.value!.clearFiles() const file = files[0] as UploadRawFile file.uid = genFileId() upload.value!.handleStart(file) upload.value!.submit() } const handleUploadSuccess = (val: Wm.UploadResult) => { form.video = val.result.file_url ElMessage({ message: '上传成功', type: 'success' }) } const handleBeforeUpload = (file: any) => { const isLt100M = file.size / 1024 / 1024 < 100 const fileName = file.name const fileType = fileName.substring(fileName.lastIndexOf('.')) console.log(fileType) const isMp4 = (file.type.indexOf('video') > -1 && file.type === 'video/mp4') || fileType === '.mp4' if (!isLt100M) { ElMessage.error('上传文件大小不能超过 100MB!') return false } if (!isMp4) { ElMessage.error('视频仅支持MP4格式!') return false } return isMp4 && isLt100M } const handleRemove = () => { form.video = '' } </script> <template> <main class="home-container"> <el-divider content-position="left" >视频转换(先根据视频生成翻译,再转换视频)</el-divider > <el-form :model="form" label-width="114px"> <el-form-item label="选择语言"> <el-select v-model="form.language" placeholder="请选择要转换的语言"> <el-option v-for="item in languages" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> <el-form-item label="上传视频"> <el-upload class="upload-demo" drag ref="upload" accept=".mp4" :limit="1" :action="actionUrl" :on-success="handleUploadSuccess" :on-exceed="handleExceed" :on-remove="handleRemove" :before-upload="handleBeforeUpload" > <el-icon class="el-icon--upload"><upload-filled /></el-icon> <div class="el-upload__text"> 将需要转换的视频文件拖到此处或 <em>点击上传</em> </div> <template #tip> <div class="el-upload__tip"> <span>1、视频请上传mp4格式;</span> <span>2、视频大小控制在100M以内</span> </div> </template> </el-upload> </el-form-item> <el-form-item label="校对翻译" v-if="step === 2"> <!-- <el-timeline> <el-timeline-item placement="top" v-for="(srt, index) in form.timeline" :key="index" :timestamp="srt.start + ' --- ' + srt.end"> <el-input v-model="srt.content" style="width: 500px" :autosize="{ minRows: 1, maxRows: 3 }" type="textarea" /> </el-timeline-item> </el-timeline> --> <div v-for="(srt, index) in form.timeline"> <el-icon v-if="srt.content != '< No Speech >'" color="#409EFC" size="10px"> <BellFilled /> </el-icon> <span v-if="srt.content != '< No Speech >'"> {{ srt.start + " --- " + srt.end }} </span> <el-input v-if="srt.content != '< No Speech >'" v-model="srt.content" style="width: 600px; margin: 5px 0" :autosize="{ minRows: 1, maxRows: 3 }" type="textarea" /> </div> </el-form-item> <el-form-item label="是否需要字幕" v-if="step === 2"> <el-select v-model="form.withSub" placeholder="是否需要字幕"> <el-option label="是" :value="true" /> <el-option label="否" :value="false" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit" >{{ step === 1 ? "翻译" : "转换" }} </el-button> </el-form-item> </el-form> </main> </template> <style lang="scss" scoped> .home-container { .upload-demo { width: 600px; } .el-upload__tip { > span { display: flex; line-height: 20px; } } } </style> @/api/service/myService