mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	Upload video bg via converter extension
This commit is contained in:
		
							
								
								
									
										11
									
								
								public/global.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								public/global.d.ts
									
									
									
									
										vendored
									
									
								
							| @@ -55,4 +55,15 @@ declare global { | |||||||
|      * @param provider Translation provider |      * @param provider Translation provider | ||||||
|      */ |      */ | ||||||
|     async function translate(text: string, lang: string, provider: string = null): Promise<string>; |     async function translate(text: string, lang: string, provider: string = null): Promise<string>; | ||||||
|  |  | ||||||
|  |     interface ConvertVideoArgs { | ||||||
|  |         buffer: Uint8Array; | ||||||
|  |         name: string; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Converts a video file to an animated WebP format using FFmpeg. | ||||||
|  |      * @param args - The arguments for the conversion function. | ||||||
|  |      */ | ||||||
|  |     function convertVideoToAnimatedWebp(args: ConvertVideoArgs): Promise<Uint8Array>; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4920,7 +4920,7 @@ | |||||||
|                     <div id="bg_menu_content" class="bg_list"> |                     <div id="bg_menu_content" class="bg_list"> | ||||||
|                         <form id="form_bg_download" class="bg_example no-border no-shadow" action="javascript:void(null);" method="post" enctype="multipart/form-data"> |                         <form id="form_bg_download" class="bg_example no-border no-shadow" action="javascript:void(null);" method="post" enctype="multipart/form-data"> | ||||||
|                             <label class="input-file"> |                             <label class="input-file"> | ||||||
|                                 <input type="file" id="add_bg_button" name="avatar" accept="image/png, image/jpeg, image/jpg, image/gif, image/bmp"> |                                 <input type="file" id="add_bg_button" name="avatar" accept="image/*, video/*"> | ||||||
|                                 <div class="bg_example no-border no-shadow add_bg_but" style="background-image: url('/img/addbg3.png');"></div> |                                 <div class="bg_example no-border no-shadow add_bg_but" style="background-image: url('/img/addbg3.png');"></div> | ||||||
|                             </label> |                             </label> | ||||||
|                         </form> |                         </form> | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| import { Fuse } from '../lib.js'; | import { Fuse } from '../lib.js'; | ||||||
|  |  | ||||||
| import { callPopup, chat_metadata, eventSource, event_types, generateQuietPrompt, getCurrentChatId, getRequestHeaders, getThumbnailUrl, saveSettingsDebounced } from '../script.js'; | import { callPopup, chat_metadata, eventSource, event_types, generateQuietPrompt, getCurrentChatId, getRequestHeaders, getThumbnailUrl, saveSettingsDebounced } from '../script.js'; | ||||||
| import { saveMetadataDebounced } from './extensions.js'; | import { openThirdPartyExtensionMenu, saveMetadataDebounced } from './extensions.js'; | ||||||
| import { SlashCommand } from './slash-commands/SlashCommand.js'; | import { SlashCommand } from './slash-commands/SlashCommand.js'; | ||||||
| import { SlashCommandParser } from './slash-commands/SlashCommandParser.js'; | import { SlashCommandParser } from './slash-commands/SlashCommandParser.js'; | ||||||
| import { flashHighlight, stringFormat } from './utils.js'; | import { flashHighlight, stringFormat } from './utils.js'; | ||||||
| @@ -77,7 +77,7 @@ function getChatBackgroundsList() { | |||||||
| } | } | ||||||
|  |  | ||||||
| function getBackgroundPath(fileUrl) { | function getBackgroundPath(fileUrl) { | ||||||
|     return `backgrounds/${fileUrl}`; |     return `backgrounds/${encodeURIComponent(fileUrl)}`; | ||||||
| } | } | ||||||
|  |  | ||||||
| function highlightLockedBackground() { | function highlightLockedBackground() { | ||||||
| @@ -438,7 +438,7 @@ async function delBackground(bg) { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
| function onBackgroundUploadSelected() { | async function onBackgroundUploadSelected() { | ||||||
|     const form = $('#form_bg_download').get(0); |     const form = $('#form_bg_download').get(0); | ||||||
|  |  | ||||||
|     if (!(form instanceof HTMLFormElement)) { |     if (!(form instanceof HTMLFormElement)) { | ||||||
| @@ -447,10 +447,49 @@ function onBackgroundUploadSelected() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     const formData = new FormData(form); |     const formData = new FormData(form); | ||||||
|  |     await convertFileIfVideo(formData); | ||||||
|     uploadBackground(formData); |     uploadBackground(formData); | ||||||
|     form.reset(); |     form.reset(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Converts a video file to an animated webp format if the file is a video. | ||||||
|  |  * @param {FormData} formData | ||||||
|  |  * @returns {Promise<void>} | ||||||
|  |  */ | ||||||
|  | async function convertFileIfVideo(formData) { | ||||||
|  |     const file = formData.get('avatar'); | ||||||
|  |     if (!(file instanceof File)) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     if (!file.type.startsWith('video/')) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     if (typeof globalThis.convertVideoToAnimatedWebp !== 'function') { | ||||||
|  |         toastr.warning('Click here to install the Video Background Loader extension', 'Video background uploads require a downloadable add-on', { | ||||||
|  |             timeOut: 0, | ||||||
|  |             extendedTimeOut: 0, | ||||||
|  |             onclick: () => openThirdPartyExtensionMenu('https://github.com/SillyTavern/Extension-VideoBackgroundLoader'), | ||||||
|  |         }); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let toastMessage = jQuery(); | ||||||
|  |     try { | ||||||
|  |         toastMessage = toastr.info('Preparing video for upload...', 'Please wait', { timeOut: 0, extendedTimeOut: 0 }); | ||||||
|  |         const sourceBuffer = await file.arrayBuffer(); | ||||||
|  |         const convertedBuffer = await globalThis.convertVideoToAnimatedWebp({ buffer: new Uint8Array(sourceBuffer), name: file.name }); | ||||||
|  |         const convertedFileName = file.name.replace(/\.[^/.]+$/, '.webp'); | ||||||
|  |         const convertedFile = new File([convertedBuffer], convertedFileName, { type: 'image/webp' }); | ||||||
|  |         formData.set('avatar', convertedFile); | ||||||
|  |         toastMessage.remove(); | ||||||
|  |     } catch (error) { | ||||||
|  |         toastMessage.remove(); | ||||||
|  |         console.error('Error converting video to animated webp:', error); | ||||||
|  |         toastr.error('Error converting video to animated webp'); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Uploads a background to the server |  * Uploads a background to the server | ||||||
|  * @param {FormData} formData |  * @param {FormData} formData | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user