diff --git a/src/website/packages/components/src/api/index.tsx b/src/website/packages/components/src/api/index.tsx index bf162cb57c..a854f77bc2 100644 --- a/src/website/packages/components/src/api/index.tsx +++ b/src/website/packages/components/src/api/index.tsx @@ -1,11 +1,11 @@ import { FetchStatus } from "./_common/SharedFetchTypes"; -import { MediaFileType, GetMediaByUser } from "./media_files"; +import { MediaFile, GetMediaByUser } from "./media_files"; import { Weight, ListWeights, ListFeaturedWeights } from "./weights"; import { GetBookmarksByUser } from "./bookmarks/GetBookmarksByUser"; import { MediaFileClass } from "./enums/MediaFileClass"; import { BucketConfig } from "./BucketConfig"; -export type { MediaFileType, Weight }; +export type { MediaFile, Weight }; export { BucketConfig, FetchStatus, diff --git a/src/website/packages/components/src/api/media_files/GetMedia.ts b/src/website/packages/components/src/api/media_files/GetMedia.ts index 45a41317f4..83eaadf1d1 100644 --- a/src/website/packages/components/src/api/media_files/GetMedia.ts +++ b/src/website/packages/components/src/api/media_files/GetMedia.ts @@ -10,10 +10,28 @@ import { WeightCategory, } from "@storyteller/components/src/api/_common/enums"; +export interface MediaVideoPreviews { + animated: string; + animated_thumbnail_template: string; + still: string; + still_thumbnail_template: string; +} + +// export type MediaThumbFn = (width: number) => string; + +export interface ResponseMediaLinks { + cdn_url: string; + // path for image media thumbnails + maybe_thumbnail_template: string | null; + // previews for video media + maybe_video_previews: MediaVideoPreviews | null; +} + export interface MediaFile { token: string; media_type: MediaFileType; media_class: MediaFileClass | null; + media_links: ResponseMediaLinks; maybe_engine_category: EngineCategory | null; maybe_animation_type: AnimationType | null; maybe_media_subtype: MediaFileSubtype | null; @@ -49,6 +67,15 @@ export interface MediaFile { maybe_text_transcript?: string | undefined; } +// export interface MediaFile extends ResponseMediaFile { +// frontendURLs: { +// imageThumb: MediaThumbFn; +// main: string; +// videoStill: MediaThumbFn; +// videoAnimated: MediaThumbFn; +// }; +// } + export interface MediaFileModeratorFields { maybe_style_transfer_source_media_file_token?: string; } diff --git a/src/website/packages/components/src/api/media_files/MediaLinks.ts b/src/website/packages/components/src/api/media_files/MediaLinks.ts new file mode 100644 index 0000000000..aa3b40711a --- /dev/null +++ b/src/website/packages/components/src/api/media_files/MediaLinks.ts @@ -0,0 +1,32 @@ +import { ResponseMediaLinks } from "./GetMedia"; + +const MediaLinker = (baseUrl: string) => (width: number) => + baseUrl.replace("{WIDTH}", width.toString()); + +export type MediaLinkFn = (width: number) => string; + +export interface MediaLinkUtility { + mainURL: string; + fixedVideoStill: string; + fixedVideoAnimated: string; + imageThumb: MediaLinkFn | null; + videoStill: MediaLinkFn | null; + videoAnimated: MediaLinkFn | null; +} + +export function MediaLinks(mediaLinks?: ResponseMediaLinks): MediaLinkUtility { + return { + mainURL: mediaLinks?.cdn_url || "", + fixedVideoStill: mediaLinks?.maybe_video_previews?.still || "", + fixedVideoAnimated: mediaLinks?.maybe_video_previews?.animated || "", + imageThumb: mediaLinks?.maybe_thumbnail_template + ? MediaLinker(mediaLinks.maybe_thumbnail_template) + : null, + videoStill: mediaLinks?.maybe_video_previews + ? MediaLinker(mediaLinks.maybe_video_previews.still_thumbnail_template) + : null, + videoAnimated: mediaLinks?.maybe_video_previews + ? MediaLinker(mediaLinks.maybe_video_previews.animated_thumbnail_template) + : null, + }; +} diff --git a/src/website/packages/components/src/api/media_files/index.tsx b/src/website/packages/components/src/api/media_files/index.tsx index 812530f3da..306792a860 100644 --- a/src/website/packages/components/src/api/media_files/index.tsx +++ b/src/website/packages/components/src/api/media_files/index.tsx @@ -1,10 +1,11 @@ -import { MediaFile } from "./GetMediaFile"; -import { GetMediaByUser } from "./GetMediaByUser"; +import { + GetMedia, + GetMediaRequest, + GetMediaResponse, + MediaFile, +} from "./GetMedia"; +import { GetMediaByUser } from "./GetMediaByUser"; +import { MediaLinks, MediaLinkUtility } from "./MediaLinks"; - -export type{ - MediaFile as MediaFileType -} -export { - GetMediaByUser -} \ No newline at end of file +export { GetMedia, GetMediaByUser, MediaLinks }; +export type { GetMediaRequest, GetMediaResponse, MediaFile, MediaLinkUtility }; diff --git a/src/website/packages/fakeyou.com/src/common/GetMediaFileTitle.ts b/src/website/packages/fakeyou.com/src/common/GetMediaFileTitle.ts index 7035f71eda..bab030e42a 100644 --- a/src/website/packages/fakeyou.com/src/common/GetMediaFileTitle.ts +++ b/src/website/packages/fakeyou.com/src/common/GetMediaFileTitle.ts @@ -1,32 +1,28 @@ import { MediaFileType } from "@storyteller/components/src/api/_common/enums/MediaFileType"; -import { MediaFile as MediaFileOne } from "@storyteller/components/src/api/media_files/GetMedia"; -import { MediaFile as MediaFileTwo } from "@storyteller/components/src/api/media_files/GetMediaFile"; +import { MediaFile } from "@storyteller/components/src/api/media_files/GetMedia"; -// Support multiple "Media File" API response payloads. -type MediaFile = MediaFileOne | MediaFileTwo ; - -export function GetMediaFileTitle(mediaFile?: MediaFile) : string { +export function GetMediaFileTitle(mediaFile?: MediaFile): string { if (mediaFile === undefined) { return "Untitled file"; } let mediaType = undefined; - + switch (mediaFile?.media_type) { case MediaFileType.Audio: case MediaFileType.Video: case MediaFileType.Image: - mediaType = mediaFile?.media_type.toLocaleLowerCase(); - break; + mediaType = mediaFile?.media_type.toLocaleLowerCase(); + break; case MediaFileType.BVH: case MediaFileType.GLTF: case MediaFileType.GLB: case MediaFileType.FBX: - mediaType = mediaFile?.media_type.toUpperCase(); - break; + mediaType = mediaFile?.media_type.toUpperCase(); + break; case MediaFileType.SceneRon: - mediaType = "RON"; - break; + mediaType = "RON"; + break; } let title = ""; @@ -44,7 +40,7 @@ export function GetMediaFileTitle(mediaFile?: MediaFile) : string { } if (title.length < 4) { - const maybeSuffix = (!!mediaType) ? ` (${mediaType} file)` : ""; + const maybeSuffix = !!mediaType ? ` (${mediaType} file)` : ""; return `${title}${maybeSuffix}`; } else { return title; diff --git a/src/website/packages/fakeyou.com/src/components/common/AudioPlayer/AudioPlayer.tsx b/src/website/packages/fakeyou.com/src/components/common/AudioPlayer/AudioPlayer.tsx index b5c19dd9ea..4e21619d55 100644 --- a/src/website/packages/fakeyou.com/src/components/common/AudioPlayer/AudioPlayer.tsx +++ b/src/website/packages/fakeyou.com/src/components/common/AudioPlayer/AudioPlayer.tsx @@ -1,6 +1,5 @@ import React, { useEffect, useState, useRef } from "react"; import WaveSurfer from "wavesurfer.js"; -import { BucketConfig } from "@storyteller/components/src/api/BucketConfig"; import { faPlay, faPause } from "@fortawesome/pro-solid-svg-icons"; import Button from "components/common/Button"; import "./AudioPlayer.scss"; @@ -20,8 +19,6 @@ export default function AudioPlayer({ src, id }: AudioPlayerProps) { const isPlayerOnScreen = useOnScreen(waveformRef); //This stops the audio from playing when the player is not on screen useEffect(() => { - const audioLink = new BucketConfig().getGcsUrl(src); - if (!waveSurferRef.current && waveformRef.current) { const wavesurferInstance = WaveSurfer.create({ container: waveformRef.current, @@ -36,7 +33,7 @@ export default function AudioPlayer({ src, id }: AudioPlayerProps) { waveSurferRef.current = wavesurferInstance; - waveSurferRef.current.load(audioLink); + waveSurferRef.current.load(src); waveSurferRef.current.on("pause", () => { setIsPlaying(false); diff --git a/src/website/packages/fakeyou.com/src/components/common/CameraInput/CameraInput.tsx b/src/website/packages/fakeyou.com/src/components/common/CameraInput/CameraInput.tsx index 7c6b97f51f..5a2db7410e 100644 --- a/src/website/packages/fakeyou.com/src/components/common/CameraInput/CameraInput.tsx +++ b/src/website/packages/fakeyou.com/src/components/common/CameraInput/CameraInput.tsx @@ -27,7 +27,7 @@ export default function CameraInput({ const { open } = useModal(); const camera = useCameraState(true); const [token, tokenSet] = useState(""); - const { bucketUrl } = useMedia({ mediaToken: token }); + const { links } = useMedia({ mediaToken: token }); const cameraSupported = MediaRecorder.isTypeSupported("video/mp4"); const cameraClick = () => @@ -83,7 +83,7 @@ export default function CameraInput({