From 641c6b28c3a768d740ede15b1062830519a2bebe Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 7 Jan 2025 13:49:30 -0500 Subject: [PATCH] Working on new and improved video clipping utility. --- .../ae_comp__hosted_files_clip_video.svelte | 488 ++++++++++++++++++ ...ae_comp__hosted_files_clip_video_v1.svelte | 396 ++++++++++++++ src/lib/element_input_file.svelte | 3 +- src/routes/hosted_files/+page.svelte | 348 ++++++++----- 4 files changed, 1091 insertions(+), 144 deletions(-) create mode 100644 src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte create mode 100644 src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte diff --git a/src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte b/src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte new file mode 100644 index 00000000..6fa15692 --- /dev/null +++ b/src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte @@ -0,0 +1,488 @@ + + + +
+ +

{hosted_file_obj_li.length}× files uploaded

+{#each hosted_file_obj_li as hosted_file_obj, i} +
+ {hosted_file_obj.hosted_file_id_random} + {hosted_file_obj.filename} + {hosted_file_obj.extension} +
+
+ + + + + + + + + + + + + +
+ +{/each} + + +
+ + + + + + + {#await ae_promises.upload__hosted_file_obj} +
+ + + Uploading + {#if $ae_sess.api_upload_kv[task_id]} + {$ae_sess.api_upload_kv[task_id].percent_completed}% + {/if} + +
+ {/await} + + + + + + + + + + + +
+ +{#await ae_promises.upload__hosted_file_obj} + +

Converting... This may take a few minutes.

+{:then} + {#if ae_promises.upload__hosted_file_obj} + Ready to Download + {:else} +

Fill out the form and select the video file to clip.

+ {/if} +{/await} + +
\ No newline at end of file diff --git a/src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte b/src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte new file mode 100644 index 00000000..956dccde --- /dev/null +++ b/src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte @@ -0,0 +1,396 @@ + + + +
+ +
+ + + + + + + {#await ae_promises.upload__hosted_file_obj} +
+ + + Uploading + {#if $ae_sess.api_upload_kv[task_id]} + {$ae_sess.api_upload_kv[task_id].percent_completed}% + {/if} + +
+ {/await} + + + + + + + + + + + +
+ +{#await ae_promises.upload__hosted_file_obj} + +

Converting... This may take a few minutes.

+{:then} + {#if ae_promises.upload__hosted_file_obj} + Ready to Download + {:else} +

Fill out the form and select the video file to clip.

+ {/if} +{/await} + +
\ No newline at end of file diff --git a/src/lib/element_input_file.svelte b/src/lib/element_input_file.svelte index 90b7a640..b63d24d1 100644 --- a/src/lib/element_input_file.svelte +++ b/src/lib/element_input_file.svelte @@ -353,7 +353,8 @@ function remove_file_from_filelist(index) { on:click|preventDefault={() => { (remove_file_from_filelist(file_index)); }} class="btn btn-md variant-soft-warning hover:variant-filled-secondary m-1" title="Remove file from upload list"> - + + {file_list_item.filename} diff --git a/src/routes/hosted_files/+page.svelte b/src/routes/hosted_files/+page.svelte index 4d449081..0eba1171 100644 --- a/src/routes/hosted_files/+page.svelte +++ b/src/routes/hosted_files/+page.svelte @@ -10,7 +10,12 @@ import { ae_loc, ae_sess, ae_api, slct, slct_trigger } from '$lib/ae_stores'; import { ae_util } from '$lib/ae_utils/ae_utils'; import type { key_val } from '$lib/ae_stores'; -export let container_class_li = []; +import Comp_hosted_files_upload from '$lib/ae_core/ae_comp__hosted_files_upload.svelte'; +import Comp_hosted_files_clip_video from '$lib/ae_core/ae_comp__hosted_files_clip_video.svelte'; + +let log_lvl = 1; + +// export let container_class_li = []; let file_uploads_post_promise; let download_src; @@ -21,168 +26,261 @@ let file_uploads_clip_post_promise; let download_clip_src; let download_clip_filename; +let hosted_file_upload: key_val = { + // link_to_type: 'account', + // link_to_id: ae_loc.account_id, + hosted_file_id_li: [], + hosted_file_obj_li: [], + upload_complete: false, +}; + onMount(() => { console.log('Hosted Files: AV Utilities +page.svelte'); }); function handle_submit_form(event) { - console.log('*** handle_submit_form() ***'); +// console.log('*** handle_submit_form() ***'); - console.log(event.target.file_list); +// console.log(event.target.file_list); - const form_data = new FormData(); +// const form_data = new FormData(); - form_data.append('title_part_1', event.target.title_part_1.value); - form_data.append('title_part_2', event.target.title_part_2.value); +// form_data.append('title_part_1', event.target.title_part_1.value); +// form_data.append('title_part_2', event.target.title_part_2.value); - form_data.append('subtitle_part_1', event.target.subtitle_part_1.value); - form_data.append('subtitle_part_2', event.target.subtitle_part_2.value); +// form_data.append('subtitle_part_1', event.target.subtitle_part_1.value); +// form_data.append('subtitle_part_2', event.target.subtitle_part_2.value); - form_data.append('font_color', event.target.font_color.value); +// form_data.append('font_color', event.target.font_color.value); - form_data.append(`file`, event.target.audio_file.files[0]); - if (event.target.title_image.files.length > 0) { - form_data.append(`title_image`, event.target.title_image.files[0]); - } +// form_data.append(`file`, event.target.audio_file.files[0]); +// if (event.target.title_image.files.length > 0) { +// form_data.append(`title_image`, event.target.title_image.files[0]); +// } - download_filename = `${event.target.title_part_1.value}_${event.target.title_part_2.value}_${event.target.subtitle_part_1.value}_${event.target.subtitle_part_2.value}.mp4` +// download_filename = `${event.target.title_part_1.value}_${event.target.title_part_2.value}_${event.target.subtitle_part_1.value}_${event.target.subtitle_part_2.value}.mp4` - // for (let i = 0; i < event.target.file_list.files.length; i++) { - // form_data.append(`file_list`, event.target.event_file_upload_file_list.files[i]); - // } +// // for (let i = 0; i < event.target.file_list.files.length; i++) { +// // form_data.append(`file_list`, event.target.event_file_upload_file_list.files[i]); +// // } - let params = null; +// let params = null; - let endpoint = '/hosted_file/create_video'; +// let endpoint = '/hosted_file/create_video'; - console.log(form_data); +// console.log(form_data); - params = null; +// params = null; - // Uncomment and the file_uploads_post_promise is not seen by the "await" below - // file_uploads_post_promise = await api.post_object({api_cfg: $ae_api, endpoint: endpoint, params: params, data:form_data}); - // Uncomment so that the file_uploads_post_promise is not seen by the "await" below - file_uploads_post_promise = api.post_object({api_cfg: $ae_api, endpoint: endpoint, params: params, form_data:form_data, return_blob: true, filename: 'test.mp4', auto_download: false}) - .then(function (result) { - console.log(result); +// // Uncomment and the file_uploads_post_promise is not seen by the "await" below +// // file_uploads_post_promise = await api.post_object({api_cfg: $ae_api, endpoint: endpoint, params: params, data:form_data}); +// // Uncomment so that the file_uploads_post_promise is not seen by the "await" below +// file_uploads_post_promise = api.post_object({api_cfg: $ae_api, endpoint: endpoint, params: params, form_data:form_data, return_blob: true, filename: 'test.mp4', auto_download: false}) +// .then(function (result) { +// console.log(result); - let file_blob = new Blob([result.data]); - // console.log(file_blob); - let file_obj_url = window.URL.createObjectURL(file_blob); // The img src - // const url = window.URL.createObjectURL(new Blob([result.data])); - download_src = file_obj_url; - // download_filename = file_obj_url; +// let file_blob = new Blob([result.data]); +// // console.log(file_blob); +// let file_obj_url = window.URL.createObjectURL(file_blob); // The img src +// // const url = window.URL.createObjectURL(new Blob([result.data])); +// download_src = file_obj_url; +// // download_filename = file_obj_url; - }); +// }); - console.log(file_uploads_post_promise); +// console.log(file_uploads_post_promise); - // let file_blob = new Blob([file_uploads_post_promise.data]); - // // console.log(file_blob); - // let file_obj_url = URL.createObjectURL(file_blob); // The img src - // download_src = file_obj_url; +// // let file_blob = new Blob([file_uploads_post_promise.data]); +// // // console.log(file_blob); +// // let file_obj_url = URL.createObjectURL(file_blob); // The img src +// // download_src = file_obj_url; - // dispatch( - // 'event_file_obj_li_updated', - // { - // link_to_type: link_to_type, - // link_to_id: link_to_id, - // } - // ); +// // dispatch( +// // 'event_file_obj_li_updated', +// // { +// // link_to_type: link_to_type, +// // link_to_id: link_to_id, +// // } +// // ); - return true; +// return true; } +// function handle_submit_form_clip(event) { +// console.log('*** handle_submit_form() ***'); +// console.log(event.target.file_list); +// const form_data = new FormData(); -function handle_submit_form_clip(event) { - console.log('*** handle_submit_form() ***'); +// form_data.append('start_time', event.target.start_time.value); +// form_data.append('end_time', event.target.end_time.value); - console.log(event.target.file_list); +// if (event.target.reencode.value == '1' || event.target.reencode.value == 'true') { +// form_data.append('reencode', 'true'); +// } else { +// form_data.append('reencode', 'false'); +// } +// // form_data.append('reencode', event.target.reencode.value); - const form_data = new FormData(); +// form_data.append(`video_file`, event.target.video_file.files[0]); - form_data.append('start_time', event.target.start_time.value); - form_data.append('end_time', event.target.end_time.value); +// download_filename = `clipped_file_test.mp4` - if (event.target.reencode.value == '1' || event.target.reencode.value == 'true') { - form_data.append('reencode', 'true'); - } else { - form_data.append('reencode', 'false'); - } - // form_data.append('reencode', event.target.reencode.value); +// // for (let i = 0; i < event.target.file_list.files.length; i++) { +// // form_data.append(`file_list`, event.target.event_file_upload_file_list.files[i]); +// // } - form_data.append(`video_file`, event.target.video_file.files[0]); +// let params = null; - download_filename = `clipped_file_test.mp4` +// let endpoint = '/hosted_file/clip_video'; - // for (let i = 0; i < event.target.file_list.files.length; i++) { - // form_data.append(`file_list`, event.target.event_file_upload_file_list.files[i]); - // } +// console.log(form_data); - let params = null; +// params = null; - let endpoint = '/hosted_file/clip_video'; +// file_uploads_clip_post_promise = api.post_object({ +// api_cfg: $ae_api, endpoint: endpoint, +// params: params, +// form_data:form_data, +// return_blob: true, +// filename: 'test.mp4', +// auto_download: false +// }) +// .then(function (result) { +// console.log(result); - console.log(form_data); +// let file_blob = new Blob([result.data]); +// // console.log(file_blob); +// let file_obj_url = window.URL.createObjectURL(file_blob); // The img src +// // const url = window.URL.createObjectURL(new Blob([result.data])); +// download_src = file_obj_url; +// // download_filename = file_obj_url; - params = null; +// }); - file_uploads_clip_post_promise = api.post_object({api_cfg: $ae_api, endpoint: endpoint, params: params, form_data:form_data, return_blob: true, filename: 'test.mp4', auto_download: false}) - .then(function (result) { - console.log(result); +// console.log(file_uploads_clip_post_promise); - let file_blob = new Blob([result.data]); - // console.log(file_blob); - let file_obj_url = window.URL.createObjectURL(file_blob); // The img src - // const url = window.URL.createObjectURL(new Blob([result.data])); - download_src = file_obj_url; - // download_filename = file_obj_url; - - }); - - console.log(file_uploads_clip_post_promise); - - return true; -} +// return true; +// }
+ class="ae__hosted_files__av_util container space-y-4" + > -

Convert mp3 to mp4

+
+

Clip a Video

+

This AV utility will take an mp4 video file and create a clipped mp4 video file. This process may take a few seconds to a handful of minutes. Re-encoding will take longer. Please be patient while it is processing.

+ +

Step 1: Upload Video File

+ + +
+ + Upload video files +
+ + Aether hosted files only
+ Recommended: video (mp4, mkv)
+
+
+
+ +

Step 2: Clip Video

+ {#if hosted_file_upload.upload_complete} + + + {:else} +

Upload a video file to clip.

+ {/if} + + + + + + + + + + + + + + + + + +
+ + + + -
- - -

Clip mp4

-

This AV utility will take an mp4 video file create a clipped mp4 video file. This process may take a few seconds to a handful of minutes. Re-encoding will take longer. Please be patient while it is processing.

-
e.key === 'Escape' && handle_cancel_form_clip} class="av_util_mp4_clip space-y-4"> - - - - - - - - - - - -
- -
- - {#await file_uploads_clip_post_promise} -

Converting... This may take a few minutes.

- {:then} - {#if file_uploads_clip_post_promise} - Ready to Download - {:else} -

Fill out the form and select the video file to clip.

- {/if} - {/await} -