diff --git a/changlog.md b/changlog.md index d0457f48f..954f998e7 100644 --- a/changlog.md +++ b/changlog.md @@ -1,8 +1,13 @@ # 功能升级日志 -# 计划 +# 计划 # 2.18.10 - 🐞 修复:视频按钮提示词,有个小错别字。 #424 +- 🐞 修复:claude-3-5-sonnet-20240620无法上传图片 #425 #427 #430 +- 🐞 修复:LUMA不支持竖屏9:16 这个对于短视频 不友好 官方是支持的 #431 +- 🐞 修复:其实cluade其他模型也是支持识图 #433 +- 😄 新增:LUMA视频 支持 `延展` 每 `延展` `+5s` +- 😄 修复:LUMA不支持竖屏9:16 这个对于短视频 不友好 官方是支持的 #431 # 2.18.9 - 🐞 修复:luma download_url bug diff --git a/package.json b/package.json index 61515f89c..5e20808c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chatgpt-web-midjourney-proxy", - "version": "2.18.9", + "version": "2.18.10", "private": false, "description": "ChatGPT Web Midjourney Proxy", "author": "Dooy ", @@ -29,6 +29,8 @@ "common:prepare": "husky install" }, "dependencies": { + "@ffmpeg/ffmpeg": "^0.12.10", + "@ffmpeg/util": "^0.12.1", "@traptitech/markdown-it-katex": "^3.6.0", "@vueuse/core": "^9.13.0", "eventsource-parser": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7a2cfde2..953f4ea1b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,6 +1,12 @@ lockfileVersion: '6.0' dependencies: + '@ffmpeg/ffmpeg': + specifier: ^0.12.10 + version: 0.12.10 + '@ffmpeg/util': + specifier: ^0.12.1 + version: 0.12.1 '@traptitech/markdown-it-katex': specifier: ^3.6.0 version: 3.6.0 @@ -1863,6 +1869,23 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@ffmpeg/ffmpeg@0.12.10: + resolution: {integrity: sha512-lVtk8PW8e+NUzGZhPTWj2P1J4/NyuCrbDD3O9IGpSeLYtUZKBqZO8CNj1WYGghep/MXoM8e1qVY1GztTkf8YYQ==} + engines: {node: '>=18.x'} + dependencies: + '@ffmpeg/types': 0.12.2 + dev: false + + /@ffmpeg/types@0.12.2: + resolution: {integrity: sha512-NJtxwPoLb60/z1Klv0ueshguWQ/7mNm106qdHkB4HL49LXszjhjCCiL+ldHJGQ9ai2Igx0s4F24ghigy//ERdA==} + engines: {node: '>=16.x'} + dev: false + + /@ffmpeg/util@0.12.1: + resolution: {integrity: sha512-10jjfAKWaDyb8+nAkijcsi9wgz/y26LOc1NKJradNMyCIl6usQcBbhkjX5qhALrSBcOy6TOeksunTYa+a03qNQ==} + engines: {node: '>=18.x'} + dev: false + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 6c3db6cc4..8476069d3 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "ChatGPT-MJ", - "version": "2.18.9" + "version": "2.18.10" }, "tauri": { "allowlist": { diff --git a/src/api/mjapi.ts b/src/api/mjapi.ts index 0a60e26c5..59ac22e37 100644 --- a/src/api/mjapi.ts +++ b/src/api/mjapi.ts @@ -368,14 +368,14 @@ export const canVisionModel= (model:string)=>{ mlog('canVisionModel ',model ); //['gpt-4-all','gpt-4-v'].indexOf(model)==-1 && model.indexOf('gpt-4-gizmo')==-1 if( ['gpt-4-all','gpt-4-v','gpt-4v','gpt-3.5-net','gpt-4o-all'].indexOf(model)>-1 ) return true; - if(model.indexOf('gpt-4-gizmo')>-1 || model.indexOf('claude-3-opus')>-1 )return true; + if(model.indexOf('gpt-4-gizmo')>-1 )return true; // || model.indexOf('claude-3-opus')>-1cha return false; } export const isCanBase64Model=(model:string)=>{ //gpt-4o //customVisionModel - let visionArr=['gemini-pro-vision','gpt-4o','gpt-4o-2024-05-13','gemini-pro-1.5','gpt-4-turbo','gpt-4-turbo-2024-04-09','gpt-4-vision-preview','luma-video','claude-3-5-sonnet-20240620', defaultVisionModel() ] + let visionArr=['gemini-pro-vision','gpt-4o','gpt-4o-2024-05-13','gemini-pro-1.5','gpt-4-turbo','gpt-4-turbo-2024-04-09','gpt-4-vision-preview','luma-video','claude-3-5-sonnet-20240620' ,'claude-3-sonnet-20240229','claude-3-opus-20240229', defaultVisionModel() ] if( homeStore.myData.session.customVisionModel ){ homeStore.myData.session.customVisionModel.split(/[ ,]+/ig).map( (v:string)=>{ visionArr.push( v.toLocaleLowerCase() ) diff --git a/src/api/mp4img.ts b/src/api/mp4img.ts new file mode 100644 index 000000000..c7ed6a5a8 --- /dev/null +++ b/src/api/mp4img.ts @@ -0,0 +1,52 @@ +import { FFmpeg } from '@ffmpeg/ffmpeg' +import type { LogEvent } from '@ffmpeg/ffmpeg/dist/esm/types' +import { fetchFile, toBlobURL } from '@ffmpeg/util' +import { mlog } from './mjapi' +const baseURL = 'https://unpkg.com/@ffmpeg/core-mt@0.12.6/dist/esm' + + export async function myTestTranscode( vidoUrl:string) { + mlog('vidoUrl>> ', vidoUrl ) + const ffmpeg = new FFmpeg() + //await ffmpeg.load(); + + //message.value = 'Loading ffmpeg-core.js' + ffmpeg.on('log', ({ message: msg }: LogEvent) => { + //message.value = msg + mlog('FFmpeg', msg) + }) + mlog('FFmpegs url23 ' ) + try{ + await ffmpeg.load({ + coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'), + wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'), + workerURL: await toBlobURL(`${baseURL}/ffmpeg-core.worker.js`, 'text/javascript') + }) + }catch(e){ + mlog('FFmpegs url3 er ', e ) + } + + //await ffmpeg.load(); + mlog('FFmpegs url3 ' ) + //message.value = 'Start transcoding' + await ffmpeg.writeFile('input.mp4', await fetchFile(vidoUrl)) + //await ffmpeg.exec(['-i', 'test.avi', 'test.mp4']) + await ffmpeg.exec(['-sseof', '-3', '-i', 'input.mp4', '-update', '1', '-q:v', '1', 'last_frame.jpg']) + //message.value = 'Complete transcoding' + const data = await ffmpeg.readFile( 'last_frame.jpg') + //const url = URL.createObjectURL(new Blob([data.buffer], { type: 'image/jpeg' })); + const url = URL.createObjectURL(new Blob([(data as Uint8Array).buffer], { type: 'image/jpeg' } )) + mlog('FFmpeg url ', url ) + // 创建一个临时的元素 + const a = document.createElement('a'); + a.href = url; + a.download ='last_frame.jpg'; // 设置下载文件的名称 + + // 将 元素添加到 DOM,然后触发点击事件以启动下载 + document.body.appendChild(a); + a.click(); + + // 触发下载后,从 DOM 中移除 元素,并释放 URL 对象 + document.body.removeChild(a); + URL.revokeObjectURL(url); + + } \ No newline at end of file diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index ee3f7431d..92c7e2ab8 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -429,7 +429,12 @@ export default { plsInput: "Please input content!", submitSuccess: "Submitted successfully!", process: "Video generating...", - repeat: "Get again" + repeat: "Get again", + pending: 'Status: Queued', + processing: 'Status: Processing', + download: 'Download', + extend: 'Extend' + } diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 0358c922f..da8734094 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -437,6 +437,12 @@ export default { submitSuccess:'已提交成功!', process:'视频生成中...', repeat:'重新获取', + + pending:'状态:队列中', + processing:'状态:队列中', + download:'下载', + extend:'延展', + } diff --git a/src/views/luma/voInput.vue b/src/views/luma/voInput.vue index 433fb5dc5..f7f222579 100644 --- a/src/views/luma/voInput.vue +++ b/src/views/luma/voInput.vue @@ -1,19 +1,31 @@