public async Task <WMAssetOutputMessage> CreateEmptyWatermarkedAsset(string ProcessId, string SourceAssetId, string WMEmbedCode) { WMAssetOutputMessage result = new WMAssetOutputMessage(); if ((SourceAssetId is null) || (WMEmbedCode is null)) { result.Status = "ERROR"; result.StatusMessage = "Either Source Asset or WM Embed Code missing."; return(result); } try { // Get a reference to the Source Asset IAsset SourceMediaAsset = GetMediaAssetFromAssetId(SourceAssetId); string NewAssetName = $"{SourceMediaAsset.Name}-{ProcessId}-{DateTime.Now.Ticks.ToString()}"; CancellationToken myToken = new CancellationToken(); IAsset newWatermarkedAsset = await _mediaContext.Assets.CreateAsync(NewAssetName, AssetCreationOptions.None, myToken); newWatermarkedAsset.AlternateId = $"{SourceAssetId}-{WMEmbedCode}"; await newWatermarkedAsset.UpdateAsync(); result.Status = result.Status = "Finished";; result.EmbedCode = WMEmbedCode; result.WMAssetId = newWatermarkedAsset.Id; } catch (Exception X) { result.Status = "ERROR"; result.StatusMessage = X.Message; } return(result); }
private async Task <WMAssetOutputMessage> AddRenderToAsset(CloudBlockBlob sourceBlob, CloudBlockBlob destBlob, IAssetFile renderFile, string WMEmbedCode, string WatermarkedAssetId) { WMAssetOutputMessage result = new WMAssetOutputMessage() { MMRKURLAdded = sourceBlob.Uri.AbsoluteUri, EmbedCode = WMEmbedCode, WMAssetId = WatermarkedAssetId }; try { string name = HttpUtility.UrlDecode(HttpUtility.UrlDecode(Path.GetFileName(sourceBlob.Uri.AbsolutePath))); string copyId = await destBlob.StartCopyAsync(sourceBlob); await sourceBlob.FetchAttributesAsync(); renderFile.ContentFileSize = sourceBlob.Properties.Length; await renderFile.UpdateAsync(); result.Status = "MMRK File Added"; result.StatusMessage = destBlob.Name + " added to watermarked asset"; } catch (Exception X) { result.Status = $"Copy error"; //Add Blob Info to the error result.StatusMessage = $"{sourceBlob.Uri.AbsoluteUri} Error {X.Message}"; Trace.TraceError(result.StatusMessage); } return(result); }
public async Task <WMAssetOutputMessage> GenerateManifest(string SourceAssetId, bool setAsPrimary) { WMAssetOutputMessage result = new WMAssetOutputMessage(); if ((SourceAssetId is null)) { result.Status = "ERROR"; result.StatusMessage = "Either Source Asset "; return(result); } IAsset myAsset = GetMediaAssetFromAssetId(SourceAssetId); string manifestName = "manifest.ism"; string videoBase = " <video src=\"{0}\" />\r\n"; string AudioBase = " <audio src = \"{0}\" title = \"{1}\" /> \r\n"; string switchTxt = "<switch>\r\n"; string path; if (Environment.GetEnvironmentVariable("HOME") != null) { path = Environment.GetEnvironmentVariable("HOME") + @"\site\wwwroot" + @"\Files\ManifestBase.xml"; } else { path = @".\Files\ManifestBase.xml"; } string xml = File.ReadAllText(path); foreach (IAssetFile file in myAsset.AssetFiles.OrderBy(f => f.ContentFileSize)) { switchTxt += string.Format(videoBase, file.Name); } switchTxt += string.Format(AudioBase, myAsset.AssetFiles.OrderBy(f => f.ContentFileSize).FirstOrDefault().Name, "English"); switchTxt += " </switch>"; string Manifest = xml.Replace("<switch></switch>", switchTxt); //TODO: update Asset container Name var assetContainer = _AMSStorageBlobClient.GetContainerReference(myAsset.Id.Replace("nb:cid:UUID:", "asset-")); var manifestBlob = assetContainer.GetBlockBlobReference(manifestName); await manifestBlob.UploadTextAsync(Manifest); var currentFile = await myAsset.AssetFiles.CreateAsync(manifestName, new CancellationToken()); manifestBlob.FetchAttributes(); currentFile.ContentFileSize = manifestBlob.Properties.Length; currentFile.IsPrimary = setAsPrimary; await currentFile.UpdateAsync(); await myAsset.UpdateAsync(); result.Status = "OK"; result.StatusMessage = "Created Manifest"; return(result); }
public async Task <List <WMAssetOutputMessage> > AddWatermarkedRendersFiletoAsset(string assetId, List <UnifiedResponse.WaterMarkedRender> Renders, string WMEmbedCode) { List <WMAssetOutputMessage> resultAll = new List <WMAssetOutputMessage>(); try { IAsset WatermarkedAsset = _mediaContext.Assets.Where(a => a.Id == assetId).FirstOrDefault(); string containerName = ConvertMediaAssetIdToStorageContainerName(WatermarkedAsset.Id); CloudBlobContainer DestinationBlobContainer = GetAssetCopyBlobClient(WatermarkedAsset).GetContainerReference(containerName); List <Task <WMAssetOutputMessage> > renderTask = new List <Task <WMAssetOutputMessage> >(); //Each foreach (var myRender in Renders) { CloudBlockBlob sourceBlob = new CloudBlockBlob(new Uri(myRender.MP4URL)); string name = HttpUtility.UrlDecode(HttpUtility.UrlDecode(Path.GetFileName(sourceBlob.Uri.AbsolutePath))); CloudBlockBlob destBlob = DestinationBlobContainer.GetBlockBlobReference(name); IAssetFile currentFile = WatermarkedAsset.AssetFiles.Create(name); renderTask.Add(AddRenderToAsset(sourceBlob, destBlob, currentFile, WMEmbedCode, WatermarkedAsset.Id)); //renderTask.LastOrDefault().Start(); await Task.Delay(500); } Task.WaitAll(renderTask.ToArray()); foreach (var t in renderTask) { resultAll.Add(t.Result); } } catch (Exception X) { var error = new WMAssetOutputMessage() { EmbedCode = WMEmbedCode, MMRKURLAdded = "", Status = $"Error Multi render level", StatusMessage = $"Error Multi render level {X.Message}", WMAssetId = assetId }; resultAll.Add(error); } return(resultAll); }
public async Task <WMAssetOutputMessage> AddWatermarkedMediaFiletoAsset(string WatermarkedAssetId, string WMEmbedCode, string MMRKURL) { WMAssetOutputMessage result = new WMAssetOutputMessage(); if ((WatermarkedAssetId is null) || (WMEmbedCode is null) || (MMRKURL is null)) { result.Status = "ERROR"; result.StatusMessage = "Either Source Asset or WM Embed Code missing."; return(result); } IAsset Asset = _mediaContext.Assets.Where(a => a.Id == WatermarkedAssetId).FirstOrDefault(); string containerName = ConvertMediaAssetIdToStorageContainerName(Asset.Id); CloudBlobContainer DestinationBlobContainer = _AMSStorageBlobClient.ListContainers().Where(n => n.Name == containerName).FirstOrDefault(); CloudBlockBlob sourceBlob = new CloudBlockBlob(new Uri(MMRKURL)); // Get a reference to the destination blob (in this case, a new blob). string name = HttpUtility.UrlDecode(HttpUtility.UrlDecode(Path.GetFileName(sourceBlob.Uri.AbsolutePath))); CloudBlockBlob destBlob = DestinationBlobContainer.GetBlockBlobReference(name); string copyId = null; try { copyId = await destBlob.StartCopyAsync(sourceBlob); result.MMRKURLAdded = MMRKURL; result.Status = "MMRK File Added"; result.StatusMessage = destBlob.Name + " added to watermarked asset"; result.EmbedCode = WMEmbedCode; result.WMAssetId = WatermarkedAssetId; var currentFile = Asset.AssetFiles.Create(name); sourceBlob.FetchAttributes(); currentFile.ContentFileSize = sourceBlob.Properties.Length; currentFile.Update(); Asset.Update(); #region Add Locator to new Media Asset if (_PUBLISHWATERKEDCOPY.ToLower() == "true") { if (Asset.Locators.Where(l => l.Type == LocatorType.OnDemandOrigin).Count() == 0) { // This could be done at the "end", once for each newly created asset, instead of doing it after each file is added to the newly created asset LocatorType locatorType = LocatorType.OnDemandOrigin; AccessPermissions accessPolicyPermissions = AccessPermissions.Read | AccessPermissions.List; TimeSpan accessPolicyDuration = new TimeSpan(100 * 365, 1, 1, 1, 1); // 100 years DateTime locaatorStartDate = DateTime.Now; string forceLocatorGuid = null; ProcessCreateLocator(locatorType, Asset, accessPolicyPermissions, accessPolicyDuration, locaatorStartDate, forceLocatorGuid); } else { Trace.TraceInformation($"Assset {Asset.Id} already has OndemandOrigin"); } } #endregion } catch (StorageException e) { Trace.TraceError(e.Message); //throw; result.MMRKURLAdded = MMRKURL; result.Status = $"Copy error {e.Message}"; result.StatusMessage = destBlob.Name + "error"; result.EmbedCode = WMEmbedCode; result.WMAssetId = WatermarkedAssetId; } finally { } return(result); }
public async Task <WMAssetOutputMessage> AddWatermarkedMediaFiletoAsset(string WatermarkedAssetId, string WMEmbedCode, string MMRKURL, TraceWriter log) { WMAssetOutputMessage result = new WMAssetOutputMessage(); if ((WatermarkedAssetId is null) || (WMEmbedCode is null) || (MMRKURL is null)) { result.Status = "ERROR"; result.StatusMessage = "Either Source Asset or WM Embed Code missing."; return(result); } IAsset Asset = _mediaContext.Assets.Where(a => a.Id == WatermarkedAssetId).FirstOrDefault(); string containerName = ConvertMediaAssetIdToStorageContainerName(Asset.Id); CloudBlobContainer DestinationBlobContainer = _AMSStorageBlobClient.ListContainers().Where(n => n.Name == containerName).FirstOrDefault(); CloudBlockBlob sourceBlob = new CloudBlockBlob(new Uri(MMRKURL)); // Get a reference to the destination blob (in this case, a new blob). //https://XXXXXXXXXXXXXXXX.blob.core.windows.net/asset-f073197d-e853-4683-b987-3c7c687daeec/nb:cid:UUID:6b59a856-e513-4232-bb40-1e90cd47bf9b/1000/Chile%20Travel%20Promotional%20Video72_1280x720_2000.mp4 string name = HttpUtility.UrlDecode(HttpUtility.UrlDecode(Path.GetFileName(sourceBlob.Uri.AbsolutePath))); CloudBlockBlob destBlob = DestinationBlobContainer.GetBlockBlobReference(name); string copyId = null; try { copyId = await destBlob.StartCopyAsync(sourceBlob); result.MMRKURLAdded = MMRKURL; result.Status = "MMRK File Added"; result.StatusMessage = destBlob.Name + " added to watermarked asset"; result.EmbedCode = WMEmbedCode; result.WMAssetId = WatermarkedAssetId; var currentFile = Asset.AssetFiles.Create(name); sourceBlob.FetchAttributes(); currentFile.ContentFileSize = sourceBlob.Properties.Length; currentFile.Update(); Asset.Update(); #region Add Locator to new Media Asset if (Asset.Locators.Where(l => l.Type == LocatorType.OnDemandOrigin).Count() == 0) { // This could be done at the "end", once for each newly created asset, instead of doing it after each file is added to the newly created asset LocatorType locatorType = LocatorType.OnDemandOrigin; AccessPermissions accessPolicyPermissions = AccessPermissions.Read | AccessPermissions.List; TimeSpan accessPolicyDuration = new TimeSpan(100 * 365, 1, 1, 1, 1); // 100 years DateTime locaatorStartDate = DateTime.Now; string forceLocatorGuid = null; ProcessCreateLocator(locatorType, Asset, accessPolicyPermissions, accessPolicyDuration, locaatorStartDate, forceLocatorGuid); } else { log.Info($"Assset {Asset.Id} already has OndemandOrigin"); } #endregion } catch (StorageException e) { log.Verbose(e.Message); //throw; result.MMRKURLAdded = MMRKURL; result.Status = $"Copy error {e.Message}"; result.StatusMessage = destBlob.Name + "error"; result.EmbedCode = WMEmbedCode; result.WMAssetId = WatermarkedAssetId; } finally { } return(result); }