diff --git a/app/components/UploadComponent/UploadComponent.tsx b/app/components/UploadComponent/UploadComponent.tsx
index d84782de4c..b54c866070 100644
--- a/app/components/UploadComponent/UploadComponent.tsx
+++ b/app/components/UploadComponent/UploadComponent.tsx
@@ -112,7 +112,7 @@ function UploadComponent({
<>
-
+
{
+function toTimeString(timecode: number):number {
+ return Math.round(timecode * 100) / 100;
+}
+
+export const WaveformPlayer = ({
+ hasPlayButton,
+ onLoad,
+ audio
+}: {
+ hasPlayButton?: boolean;
+ onLoad?:({duration}:{duration:number})=>void;
+ audio: string;
+}) => {
useSignals();
const waveSurferRef = useRef(undefined);
- const [isPlaying, toggleIsPlaying] = useState(false);
+ const [isPlaying, toggleIsPlaying] = useState(false);
+ const [currenttime, setCurrenttime] = useState(0);
const containerRef = useCallback((node: HTMLDivElement) => {
if (node) {
@@ -28,6 +41,7 @@ export const WaveformPlayer = ({ audio }: { audio: string }) => {
waveSurfer.load(newUrl);
waveSurfer.on("ready", () => {
waveSurferRef.current = waveSurfer;
+ if(onLoad) onLoad({duration: waveSurfer.getDuration()});
});
waveSurfer.on("play", () => {
toggleIsPlaying(true);
@@ -35,9 +49,6 @@ export const WaveformPlayer = ({ audio }: { audio: string }) => {
waveSurfer.on("pause", () => {
toggleIsPlaying(false);
});
- waveSurfer.on("finish", () => {
- waveSurfer.seekTo(0);
- });
}
}, []);
@@ -48,16 +59,20 @@ export const WaveformPlayer = ({ audio }: { audio: string }) => {
};
}, []);
+ const duration = toTimeString(waveSurferRef.current ? waveSurferRef.current.getDuration() : 0);
+
return (
-
{
- waveSurferRef.current?.playPause();
- }}
- />
-
+ {hasPlayButton &&
+ {
+ waveSurferRef.current?.playPause();
+ }}
+ />
+ }
+
);
};
diff --git a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/AudioTab.tsx b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/AudioTab.tsx
index 4055a56804..8f86fa93ea 100644
--- a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/AudioTab.tsx
+++ b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/AudioTab.tsx
@@ -21,10 +21,10 @@ import {
import { PageLibrary } from "./pageLibrary";
import { PageAudioGeneration } from "./pageAudioGeneration";
-import { AudioTabPages, AudioPanelState, TtsState, V2VState } from "./types";
+import { AudioTabPages, AudioPanelState } from "./types";
import { initialTtsState, initialV2VState } from "./values";
import { TtsModelListItem } from "~/pages/PageEnigma/models/tts";
-import { VoiceConversionModelListItem } from "./typesImported";
+import { VoiceConversionModelListItem, MediaFile } from "./typesImported";
import { PageSelectTtsModel } from "./pageSelectTtsModel";
import { PageSelectV2VModel } from "./pageSelectV2VModel";
@@ -69,7 +69,12 @@ export const AudioTab = () => {
}))
return findNewItem !== undefined;
}
- ListAudioByUser(username, sessionToken).then((res:any[])=>{
+ function getLength(item:any){
+ return item.maybe_duration_millis
+ ? item.maybe_duration_millis / 1000 * 60
+ : undefined;
+ }
+ ListAudioByUser(username, sessionToken).then((res:MediaFile[])=>{
audioItemsFromServer.value = res.map(item=>{
const morphedItem:AudioMediaItem = {
version: 1,
@@ -78,9 +83,9 @@ export const AudioTab = () => {
media_id: item.token,
object_uuid: item.token,
name: getTitle(item),
- description: item.maybe_text_transcript,
+ description: item.maybe_text_transcript || "",
publicBucketPath: item.public_bucket_path,
- length: 25,
+ length: getLength(item),
thumbnail: "/resources/placeholders/audio_placeholder.png",
isMine: true,
isNew: checkIsNew(item.token),
diff --git a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/audioItemElement.tsx b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/audioItemElement.tsx
index 1c86d4f498..2c98881a41 100644
--- a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/audioItemElement.tsx
+++ b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/audioItemElement.tsx
@@ -13,7 +13,11 @@ import {
import { H5, H6 } from "~/components";
import { AudioTypePill } from "./audioTypePills"
-import { cancelNewFromAudioItem } from "~/pages/PageEnigma/store/mediaFromServer";
+import {
+ cancelNewFromAudioItem,
+ updateAudioItemLength,
+ updateDemoAudioItemLength,
+} from "~/pages/PageEnigma/store";
function getGcsUrl(bucketRelativePath: string | undefined | null): string {
let bucket = "vocodes-public";
@@ -63,7 +67,6 @@ export const AudioItemElement = ({ item }: Props) => {
const onPointerDown = useCallback(
(event: React.PointerEvent) => {
if(item.isNew) {
- console.log('pointerdown triggered');
cancelNewFromAudioItem(item.media_id);
}
if (event.button === 0) {
@@ -89,11 +92,27 @@ export const AudioItemElement = ({ item }: Props) => {
+ {/*
{item.length}
*/}
{item.isNew &&
New*
}
{item.publicBucketPath && (
-
+
{
+ // only do this for items that doesn't have a length
+ if(item.category === "demo"){
+ updateDemoAudioItemLength(item.media_id, duration * 60);
+ }
+ else{
+ updateAudioItemLength(item.media_id, duration * 60);
+ }
+ }
+ }
+ />
)}
{item.name}
diff --git a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/typesImported.ts b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/typesImported.ts
index d853e75275..15a60fb50f 100644
--- a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/typesImported.ts
+++ b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTab/typesImported.ts
@@ -130,6 +130,8 @@ export interface MediaFile {
maybe_original_filename: string | null;
maybe_creator_user: UserDetailsLight | null;
maybe_prompt_token: string | null;
+ maybe_text_transcript: string | null;
+ maybe_duration_millis: number | null;
cover_image: {
maybe_cover_image_public_bucket_path: string | null;
default_cover: {
diff --git a/app/pages/PageEnigma/models/assets.ts b/app/pages/PageEnigma/models/assets.ts
index 376549aa1b..bb81da02a1 100644
--- a/app/pages/PageEnigma/models/assets.ts
+++ b/app/pages/PageEnigma/models/assets.ts
@@ -7,7 +7,7 @@ export interface MediaItem {
name: string;
description?: string;
publicBucketPath?: string;
- length?: number;
+ length?: number; // unit of length is frames, as in FPS
thumbnail?: string;
imageIndex?: number;
isMine?: boolean;
diff --git a/app/pages/PageEnigma/store/index.ts b/app/pages/PageEnigma/store/index.ts
index 07628a1914..fb152d4bfe 100644
--- a/app/pages/PageEnigma/store/index.ts
+++ b/app/pages/PageEnigma/store/index.ts
@@ -4,6 +4,7 @@ export * from "./characterGroups";
export * from "./dragAndDrop";
export * from "./hotkeys";
export * from "./media";
+export * from "./mediaFromServer";
export * from "./myMovies";
export * from "./objectGroup";
export * from "./selectedItem";
diff --git a/app/pages/PageEnigma/store/media.ts b/app/pages/PageEnigma/store/media.ts
index 8ed2608793..ea557810fb 100644
--- a/app/pages/PageEnigma/store/media.ts
+++ b/app/pages/PageEnigma/store/media.ts
@@ -2,6 +2,13 @@ import { signal } from "@preact/signals-core";
import { AssetType, MediaItem, AudioMediaItem } from "~/pages/PageEnigma/models";
import * as uuid from "uuid";
+export const updateDemoAudioItemLength = (mediaId:string, duration: number)=>{
+ const newList = audioItems.value.map((item)=>{
+ if( item.media_id === mediaId ) item.length = duration;
+ return item;
+ })
+ audioItems.value = [...newList];
+}
export const animationItems = signal([
{
version: 1,
@@ -452,7 +459,6 @@ export const audioItems = signal([
version: 1,
media_id: "m_403phjvjkbbaxxbz8y7r6qjay07mfd",
type: AssetType.AUDIO,
- length: 25,
name: "Talk (Demo Sounds)",
thumbnail: "/resources/placeholders/audio_placeholder.png",
category: "demo",
@@ -463,7 +469,6 @@ export const audioItems = signal([
version: 1,
media_id: "m_w5nn3kjh1fbkmjrdac5b2qaba0pmyt",
type: AssetType.AUDIO,
- length: 25,
name: "NCS Song",
category: "demo",
thumbnail: "/resources/placeholders/audio_placeholder.png",
diff --git a/app/pages/PageEnigma/store/mediaFromServer.ts b/app/pages/PageEnigma/store/mediaFromServer.ts
index 8974da4e57..661ec27f14 100644
--- a/app/pages/PageEnigma/store/mediaFromServer.ts
+++ b/app/pages/PageEnigma/store/mediaFromServer.ts
@@ -3,11 +3,17 @@ import { AudioMediaItem } from "~/pages/PageEnigma/models";
export const audioItemsFromServer = signal([]);
export const cancelNewFromAudioItem = (mediaId:string)=>{
- console.log('function called');
const newList = audioItemsFromServer.value.map((item)=>{
if( item.media_id === mediaId ) item.isNew = false;
return item;
})
- console.log(newList);
+ audioItemsFromServer.value = [...newList];
+}
+
+export const updateAudioItemLength = (mediaId:string, duration: number)=>{
+ const newList = audioItemsFromServer.value.map((item)=>{
+ if( item.media_id === mediaId ) item.length = duration;
+ return item;
+ })
audioItemsFromServer.value = [...newList];
}
\ No newline at end of file