Files
monde-usage-unity/Assets/Scripts/VideoAsset.cs
2024-09-29 22:52:50 +02:00

183 lines
4.4 KiBLFS
C#

#nullable enable
using System;
using System.IO;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Video;
[CreateAssetMenu(fileName = "VideoAsset", menuName = "VideoAsset", order = 1)]
public class VideoAsset : ScriptableObject
{
public static bool? halfResOverride = null;
private static readonly string rootPath = "gs://monde-en-carton.appspot.com/Videos/";
private static readonly string halfResSuffix = "_halfres.mp4";
public string? storageUrl;
public bool isHalfRes = false;
[SerializeField] private bool forceDownload = false;
[SerializeField] private bool useDownloadUrl = false;
public VideoClip? videoClip;
[SerializeField] private string? localVideoPath;
[SerializeField] private string? downloadUrl;
[SerializeField] private bool loaded = false;
public bool Loaded => loaded;
[SerializeField] private bool loading = false;
public bool Loading => loading;
public string errorMessage = "";
public bool NeedDownloading => forceDownload || useDownloadUrl || (videoClip == null && storageUrl != null && !File.Exists(GetLocalVideoPath()));
public int PlayCount => VideoPlayManager.GetPlayCount(this);
public void Init()
{
loaded = false;
loading = false;
localVideoPath = null;
#if UNITY_WEBGL
videoClip = null; // Reset videoClip for WebGL builds to exclude from build
useDownloadUrl = true; // Use download URL for WebGL builds
#endif
GetLocalVideoPath();
}
public void FinishLoading()
{
loading = false;
loaded = true;
}
public string StorageUrl => storageUrl != null ?
(isHalfRes ? storageUrl.Replace(".mp4", halfResSuffix) : storageUrl) :
throw new Exception("No storage URL provided");
public void SetLocalVideoPath(string path)
{
localVideoPath = path;
}
public void SetDownloadUrl(string url)
{
downloadUrl = url;
FinishLoading();
}
public string GetLocalVideoPath()
{
if (storageUrl == null) throw new Exception("No storage URL provided");
string targetStorageUrl = storageUrl;
if (halfResOverride ?? isHalfRes) targetStorageUrl = storageUrl.Replace(".mp4", halfResSuffix);
localVideoPath = Path.Join(Application.persistentDataPath, "Videos", targetStorageUrl.Replace(rootPath, ""));
return localVideoPath;
}
public void Prepare(Action<float>? progressCallBack = null)
{
if (!NeedDownloading)
{
Debug.Log($"Video {name} does not need downloading.");
FinishLoading();
return;
}
if (!forceDownload && videoClip != null)
{
Debug.Log("Video clip in memory.");
FinishLoading();
return;
}
DownloadVideo(progressCallBack);
}
public void Play(VideoPlayer videoPlayer)
{
if (videoClip != null)
{
videoPlayer.source = VideoSource.Url;
videoPlayer.clip = videoClip;
}
else if (useDownloadUrl && downloadUrl != null)
{
videoPlayer.source = VideoSource.Url;
videoPlayer.url = downloadUrl;
}
#if !UNITY_WEBGL
else if (storageUrl != null && localVideoPath != null)
{
videoPlayer.source = VideoSource.Url;
videoPlayer.url = localVideoPath;
}
#endif
else
{
Debug.LogError("No video clip or storage URL provided");
return;
}
}
private void SetError(string error)
{
errorMessage = error;
loading = false;
}
public void DownloadVideo(Action<float>? progressCallBack = null)
{
if (storageUrl == null) throw new Exception("No video clip or storage URL provided");
localVideoPath = GetLocalVideoPath();
loading = true;
string targetStorageUrl = storageUrl;
if (halfResOverride ?? isHalfRes) targetStorageUrl = storageUrl.Replace(".mp4", halfResSuffix);
if (!useDownloadUrl)
{
if (File.Exists(localVideoPath))
{
Debug.Log("File already exists.");
FinishLoading();
return;
}
else
{
string directoryPath = Path.GetDirectoryName(localVideoPath);
Directory.CreateDirectory(directoryPath);
}
}
#if UNITY_WEBGL && !UNITY_EDITOR
FirebaseFileDownloader.DownloadFileFirebaseWeb(targetStorageUrl);
#else
if (useDownloadUrl)
FirebaseFileDownloader.DownloadFileDownloadUrl(targetStorageUrl, SetDownloadUrl, SetError);
else
FirebaseFileDownloader.DownloadFileFirebaseVanilla(targetStorageUrl, localVideoPath, progressCallBack, FinishLoading, SetError);
#endif
}
#if UNITY_EDITOR
public void DownloadVideoInEditor()
{
DownloadVideo();
}
#endif
}