private IEnumerator VideoPathPreparing(string path, bool playImmediately, IPathPreparedListener listener) { if (_cachedVideoPaths.ContainsKey(path)) { listener.OnPathPrepared(_cachedVideoPaths[path], playImmediately); yield break; } #if UNITY_EDITOR _lastEventMsg = "Path Preparing"; #endif if (UMPSettings.RuntimePlatform == UMPSettings.Platforms.Android) { /// Check if we try to play exported videos and wait when export process will be completed var exptPaths = UMPSettings.Instance.AndroidExportedPaths; var filePath = path.Replace("file:///", ""); foreach (var exptPath in exptPaths) { if (exptPath.Contains(filePath)) { while (!_isExportCompleted) { yield return(null); } if (_cachedVideoPaths.ContainsKey(filePath)) { listener.OnPathPrepared(_cachedVideoPaths[filePath], playImmediately); yield break; } break; } } if ((_mediaPlayer.Options as PlayerOptionsAndroid).PlayerType == PlayerOptionsAndroid.PlayerTypes.LibVLC && MediaPlayerHelper.IsAssetsFile(path)) { var tempFilePath = System.IO.Path.Combine(Application.temporaryCachePath, filePath); if (File.Exists(tempFilePath)) { _cachedVideoPaths.Add(path, tempFilePath); listener.OnPathPrepared(tempFilePath, playImmediately); yield break; } var data = new byte[0]; #if UNITY_2017_2_OR_NEWER var www = UnityWebRequest.Get(System.IO.Path.Combine(Application.streamingAssetsPath, filePath)); yield return(www.SendWebRequest()); data = www.downloadHandler.data; #else var www = new WWW(System.IO.Path.Combine(Application.streamingAssetsPath, filePath)); yield return(www); data = www.bytes; #endif if (string.IsNullOrEmpty(www.error)) { var tempFile = new FileInfo(tempFilePath); tempFile.Directory.Create(); File.WriteAllBytes(tempFile.FullName, data); _cachedVideoPaths.Add(path, tempFilePath); path = tempFilePath; } else { Debug.LogError("Can't create temp file from asset folder: " + www.error); } www.Dispose(); } } if (_videoServices.ValidUrl(path)) { Video serviceVideo = null; _isParsing = true; yield return(_videoServices.GetVideos(path, (videos) => { _isParsing = false; serviceVideo = VideoServices.FindVideo(videos, int.MaxValue, int.MaxValue); }, (error) => { _isParsing = false; Debug.LogError(string.Format("[UniversalMediaPlayer.GetVideos] {0}", error)); OnPlayerEncounteredError(); })); if (serviceVideo == null) { Debug.LogError("[UniversalMediaPlayer.VideoPathPreparing] Can't get service video information"); OnPlayerEncounteredError(); } else { if (serviceVideo is YoutubeVideo) { yield return((serviceVideo as YoutubeVideo).Decrypt(UMPSettings.Instance.YoutubeDecryptFunction, (error) => { Debug.LogError(string.Format("[UniversalMediaPlayer.Decrypt] {0}", error)); OnPlayerEncounteredError(); })); } path = serviceVideo.Url; } } listener.OnPathPrepared(path, playImmediately); yield return(null); }
private IEnumerator VideoPathPreparing(string path, bool playImmediately, IPathPreparedListener listener) { if (_cachedVideoPaths.ContainsKey(path)) { listener.OnPathPrepared(_cachedVideoPaths[path], playImmediately); yield break; } #if UNITY_EDITOR _lastEventMsg = "Path Preparing"; #endif if (UMPSettings.SupportedPlatform == UMPSettings.Platforms.Android) { /// Check if we try to play exported videos and wait when export process will be completed var exptPaths = UMPSettings.GetSettings().AndroidExportedPaths; var filePath = path.Replace("file:///", ""); foreach (var exptPath in exptPaths) { if (exptPath.Contains(filePath)) { while (!_isExportCompleted) { yield return(null); } if (_cachedVideoPaths.ContainsKey(filePath)) { listener.OnPathPrepared(_cachedVideoPaths[filePath], playImmediately); yield break; } break; } } if ((_mediaPlayer.Options as PlayerOptionsAndroid).PlayerType == PlayerOptionsAndroid.PlayerTypes.LibVLC && MediaPlayerHelper.IsAssetsFile(path)) { var tempFilePath = System.IO.Path.Combine(Application.temporaryCachePath, filePath); if (File.Exists(tempFilePath)) { _cachedVideoPaths.Add(path, tempFilePath); listener.OnPathPrepared(tempFilePath, playImmediately); yield break; } var www = new WWW(System.IO.Path.Combine(Application.streamingAssetsPath, filePath)); yield return(www); if (string.IsNullOrEmpty(www.error)) { var tempFile = new FileInfo(tempFilePath); tempFile.Directory.Create(); File.WriteAllBytes(tempFile.FullName, www.bytes); _cachedVideoPaths.Add(path, tempFilePath); path = tempFilePath; } else { Debug.LogError("Can't create temp file from asset folder: " + www.error); } www.Dispose(); } } if (_videoHostingParser.IsVideoHostingUrl(path)) { var videoInfos = _videoHostingParser.GetCachedVideoInfos(path); if (videoInfos == null) { var isError = false; _isParsing = true; _videoHostingParser.ParseVideoInfos(path, (res) => { _isParsing = false; }, (error) => { isError = true; Debug.LogError(error); }); while (_isParsing) { if (isError) { _isParsing = false; yield break; } yield return(null); } videoInfos = _videoHostingParser.GetCachedVideoInfos(path); } var videoInfo = _videoHostingParser.GetBestCompatibleVideo(videoInfos); var directLink = videoInfo.DownloadUrl; if (videoInfo.RequiresDecryption && !videoInfo.IsDecrypted) { var isDecrypted = false; _videoHostingParser.DecryptVideoUrl(videoInfo, (res) => { directLink = videoInfo.DownloadUrl; isDecrypted = true; }); while (!isDecrypted) { yield return(null); } } _cachedVideoPaths.Add(path, directLink); path = directLink; } listener.OnPathPrepared(path, playImmediately); yield return(null); }
private IEnumerator VideoPathPreparing(string path, bool playImmediately, IPathPreparedListener listener) { if (_cachedVideoPaths.ContainsKey(path)) { listener.OnPathPrepared(_cachedVideoPaths[path], playImmediately); yield break; } #if UNITY_EDITOR _lastEventMsg = "Path Preparing"; #endif if (UMPSettings.SupportedPlatform == UMPSettings.Platforms.Android && !UMPSettings.Instance.UseAndroidNative && MediaPlayerHelper.IsAssetsFile(path)) { var filePath = path.Replace("file:///", ""); var tempFilePath = System.IO.Path.Combine(Application.temporaryCachePath, filePath); if (File.Exists(tempFilePath)) { _cachedVideoPaths.Add(path, tempFilePath); listener.OnPathPrepared(tempFilePath, playImmediately); yield break; } var www = new WWW(System.IO.Path.Combine(Application.streamingAssetsPath, filePath)); yield return(www); if (string.IsNullOrEmpty(www.error)) { File.WriteAllBytes(tempFilePath, www.bytes); _cachedVideoPaths.Add(path, tempFilePath); path = tempFilePath; } else { Debug.LogError("Can't create temp file from asset folder: " + www.error); } www.Dispose(); } if (_videoHostingParser.IsVideoHostingUrl(path)) { var videoInfos = _videoHostingParser.GetCachedVideoInfos(path); if (videoInfos == null) { var isError = false; _isParsing = true; _videoHostingParser.ParseVideoInfos(path, (res) => { _isParsing = false; }, (error) => { isError = true; Debug.LogError(error); }); while (_isParsing) { if (isError) { _isParsing = false; yield break; } yield return(null); } videoInfos = _videoHostingParser.GetCachedVideoInfos(path); } var videoInfo = _videoHostingParser.GetBestCompatibleVideo(videoInfos); var directLink = videoInfo.DownloadUrl; if (videoInfo.RequiresDecryption && !videoInfo.IsDecrypted) { var isDecrypted = false; _videoHostingParser.DecryptVideoUrl(videoInfo, (res) => { directLink = videoInfo.DownloadUrl; isDecrypted = true; }); while (!isDecrypted) { yield return(null); } } _cachedVideoPaths.Add(path, directLink); path = directLink; } listener.OnPathPrepared(path, playImmediately); yield return(null); }