Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }