Example #1
0
        private string GetSasUrl(IAsset asset)
        {
            // Create an 1-day readonly access policy.
            IAccessPolicy streamingPolicy = mediaContext.AccessPolicies.Create("Full Access Policy",
                                                                               TimeSpan.FromMinutes(20),
                                                                               AccessPermissions.List | AccessPermissions.Write | AccessPermissions.Read);

            // Create the origin locator. Set the start time as 5 minutes
            // before the present so that the locator can be accessed immediately
            // if there is clock skew between the client and server.
            ILocator sasLocator =
                (from l in mediaContext.Locators
                 where l.Type == LocatorType.Sas && l.AssetId == asset.Id
                 select l).FirstOrDefault();

            if (sasLocator != null && sasLocator.ExpirationDateTime < DateTime.UtcNow)
            {
                sasLocator.Delete();
                sasLocator = null;
            }

            if (sasLocator == null)
            {
                sasLocator = mediaContext
                             .Locators.CreateSasLocator(asset,
                                                        streamingPolicy,
                                                        DateTime.UtcNow.AddMinutes(-5));
            }
            // Create a full URL to the manifest file. Use this for playback
            // in streaming media clients.
            string sasUrl = sasLocator.Path;

            return(sasUrl);
        }
        public void ShouldCreateAssetFile()
        {
            IAsset             asset              = _mediaContext.Assets.Create("Empty", AssetCreationOptions.StorageEncrypted);
            IAssetFile         file               = asset.AssetFiles.CreateAsync(Path.GetFileName(_smallWmv), CancellationToken.None).Result;
            IAccessPolicy      policy             = _mediaContext.AccessPolicies.Create("temp", TimeSpan.FromMinutes(10), AccessPermissions.Write);
            ILocator           locator            = _mediaContext.Locators.CreateSasLocator(asset, policy);
            BlobTransferClient blobTransferClient = _mediaContext.MediaServicesClassFactory.GetBlobTransferClient();
            bool transferCompletedFired           = false;

            blobTransferClient.TransferCompleted += (sender, args) =>
            {
                transferCompletedFired = true;
                Assert.AreEqual(BlobTransferType.Upload, args.TransferType, "file.UploadAsync Transfer completed expected BlobTransferType is Upload");
            };
            file.UploadAsync(_smallWmv, blobTransferClient, locator, CancellationToken.None).Wait();
            Assert.IsNotNull(asset, "Asset should be non null");
            Assert.IsTrue(transferCompletedFired, "TransferCompleted event has not been fired");
            Assert.AreNotEqual(Guid.Empty, asset.Id, "Asset ID shuold not be null");
            Assert.AreEqual(AssetState.Initialized, asset.State, "Asset state wrong");

            foreach (IAssetFile ifile in asset.AssetFiles)
            {
                if (ifile.IsPrimary)
                {
                    Assert.IsTrue(string.Compare(Path.GetFileName(_smallWmv), ifile.Name, StringComparison.InvariantCultureIgnoreCase) == 0, "Main file is wrong");
                    break;
                }
            }
        }
        public void ShouldCreateAssetAsyncWithMultipleFiles()
        {
            string[] files = Directory.GetFiles("TestFiles");

            IAsset        asset      = _mediaContext.Assets.Create(Guid.NewGuid().ToString(), AssetCreationOptions.None);
            IAccessPolicy policy     = _mediaContext.AccessPolicies.Create("Write", TimeSpan.FromMinutes(5), AccessPermissions.Write);
            ILocator      locator    = _mediaContext.Locators.CreateSasLocator(asset, policy);
            var           blobclient = _mediaContext.MediaServicesClassFactory.GetBlobTransferClient();

            var tasks = new List <Task>();

            foreach (string filePath in files)
            {
                var        info = new FileInfo(filePath);
                IAssetFile file = asset.AssetFiles.Create(info.Name);
                tasks.Add(file.UploadAsync(filePath, blobclient, locator, CancellationToken.None));
            }

            Task.WaitAll(tasks.ToArray());
            Assert.AreEqual(AssetState.Initialized, asset.State);
            Assert.AreEqual(files.Length, asset.AssetFiles.Count());
            Assert.AreEqual(1, asset.Locators.Count);


            foreach (IAssetFile assetFile in asset.AssetFiles)
            {
                Assert.IsTrue(files.Any(f => Path.GetFileName(f).Equals(assetFile.Name, StringComparison.OrdinalIgnoreCase)));
            }
        }
Example #4
0
        private ILocator AssignSasLocator(IAsset asset)
        {
            IAccessPolicy myPolicy    = azureInstance.context.AccessPolicies.Create("READPOLICYSAS", TimeSpan.FromDays(365 * 20), AccessPermissions.Read);
            ILocator      destination = azureInstance.context.Locators.CreateSasLocator(asset, myPolicy);

            return(destination);
        }
Example #5
0
        private IAccessPolicy GetAccessPolicy(bool readWrite)
        {
            string        policyName   = readWrite ? Constant.Media.AccessPolicy.ReadWritePolicyName : Constant.Media.AccessPolicy.ReadOnlyPolicyName;
            IAccessPolicy accessPolicy = GetEntityByName(MediaEntity.AccessPolicy, policyName) as IAccessPolicy;

            if (accessPolicy == null)
            {
                TimeSpan          policyDuration;
                AccessPermissions policyPermissions = AccessPermissions.Read;
                if (readWrite)
                {
                    string settingKey      = Constant.AppSettingKey.MediaLocatorWriteDurationMinutes;
                    string durationMinutes = AppSetting.GetValue(settingKey);
                    policyDuration    = new TimeSpan(0, int.Parse(durationMinutes), 0);
                    policyPermissions = policyPermissions | AccessPermissions.Write;
                }
                else
                {
                    string settingKey   = Constant.AppSettingKey.MediaLocatorReadDurationDays;
                    string durationDays = AppSetting.GetValue(settingKey);
                    policyDuration = new TimeSpan(int.Parse(durationDays), 0, 0, 0);
                }
                accessPolicy = _media.AccessPolicies.Create(policyName, policyDuration, policyPermissions);
            }
            return(accessPolicy);
        }
        public void ShouldCreateEmptyAssetUploadTwoFilesSetPrimaryAndDownloadFile()
        {
            IAsset asset = _mediaContext.Assets.Create("Test", AssetCreationOptions.None);

            VerifyAsset(asset);

            IAccessPolicy policy  = _mediaContext.AccessPolicies.Create("temp", TimeSpan.FromMinutes(10), AccessPermissions.Write);
            ILocator      locator = _mediaContext.Locators.CreateSasLocator(asset, policy);

            UploadFile(locator, asset, _smallWmv, _mediaContext);
            //asset = _dataContext.Assets.Where(c => c.Id == asset.Id).FirstOrDefault();
            UploadFile(locator, asset, WindowsAzureMediaServicesTestConfiguration.SmallWmv2, _mediaContext);

            Assert.AreEqual(2, asset.AssetFiles.Count());
            IAssetFile assetFile = asset.AssetFiles.ToList()[1];

            assetFile.IsPrimary = true;
            assetFile.Update();
            locator.Delete();
            policy.Delete();
            IAsset refreshedAsset = RefreshedAsset(asset);

            Assert.AreEqual(2, refreshedAsset.AssetFiles.Count(), "file count wrong");
            VerifyAndDownloadAsset(refreshedAsset, 2);
        }
Example #7
0
        /// <summary>
        /// Downloads the represented file to the specified destination path.
        /// </summary>
        /// <param name="destinationPath">The path to download the file to.</param>
        public void Download(string destinationPath)
        {
            IAccessPolicy accessPolicy = null;
            ILocator      locator      = null;

            try
            {
                accessPolicy = this.GetMediaContext().AccessPolicies.Create("SdkDownload", TimeSpan.FromHours(12), AccessPermissions.Read);
                locator      = this.GetMediaContext().Locators.CreateSasLocator(this.Asset, accessPolicy);


                BlobTransferClient blobTransfer = this.GetMediaContext().MediaServicesClassFactory.GetBlobTransferClient();
                blobTransfer.NumberOfConcurrentTransfers = this.GetMediaContext().NumberOfConcurrentTransfers;
                blobTransfer.ParallelTransferThreadCount = this.GetMediaContext().ParallelTransferThreadCount;

                this.DownloadAsync(destinationPath, blobTransfer, locator, CancellationToken.None).Wait();
            }
            catch (AggregateException exception)
            {
                throw exception.Flatten();
            }
            finally
            {
                if (locator != null)
                {
                    locator.Delete();
                }
                if (accessPolicy != null)
                {
                    accessPolicy.Delete();
                }
            }
        }
Example #8
0
        /// <summary>
        /// Too complicated. The other method is pretty much simple.
        /// </summary>
        /// <param name="jobID"></param>
        /// <param name="outputFolder"></param>
        /// <returns></returns>
        static IAsset DownloadAsset(string jobID, string outputFolder)
        {
            IJob          job          = GetJob(jobID);
            IAsset        outputAsset  = job.OutputMediaAssets[0];
            IAccessPolicy accessPolicy = context.AccessPolicies.Create("File Download Policy", TimeSpan.FromDays(30), AccessPermissions.Read);
            ILocator      locator      = context.Locators.CreateLocator(LocatorType.Sas, outputAsset, accessPolicy);

            BlobTransferClient client = new BlobTransferClient()
            {
                NumberOfConcurrentTransfers = 10,
                ParallelTransferThreadCount = 10
            };

            var downloadTasks = new List <Task>();

            foreach (IAssetFile outputFile in outputAsset.AssetFiles)
            {
                string localDownloadPath = Path.Combine(outputFolder, outputFile.Name);
                Console.Write("File download path: " + localDownloadPath);
                downloadTasks.Add(
                    outputFile.DownloadAsync(
                        Path.GetFullPath(localDownloadPath),
                        client,
                        locator,
                        CancellationToken.None)
                    );
            }
            Task.WaitAll(downloadTasks.ToArray());
            return(outputAsset);
        }
Example #9
0
        public void ShouldReportProgressForFile()
        {
            string        fileName         = _smallWmv;
            bool          reportedProgress = false;
            IAsset        asset            = _dataContext.Assets.Create(Guid.NewGuid().ToString(), AssetCreationOptions.StorageEncrypted);
            IAccessPolicy policy           = _dataContext.AccessPolicies.Create("Write", TimeSpan.FromMinutes(5), AccessPermissions.Write);
            ILocator      locator          = _dataContext.Locators.CreateSasLocator(asset, policy);
            var           info             = new FileInfo(fileName);
            IAssetFile    file             = asset.AssetFiles.Create(info.Name);
            var           blobclient       = new BlobTransferClient
            {
                NumberOfConcurrentTransfers = 5,
                ParallelTransferThreadCount = 5
            };

            blobclient.TransferProgressChanged += (s, e) =>
            {
                Assert.AreEqual(fileName, e.LocalFile);
                Assert.IsTrue(e.BytesTransferred <= e.TotalBytesToTransfer);
                reportedProgress = true;
            };

            file.UploadAsync(fileName, blobclient, locator, CancellationToken.None).Wait();
            Assert.IsTrue(reportedProgress);
        }
        static void Main(string[] args)
        {
            string tenantDomain = args[0];
            string RESTendpoint = args[1];
            string assetId      = args[2];
            // Specify your AAD tenant domain, for example "microsoft.onmicrosoft.com"
            AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(tenantDomain, AzureEnvironments.AzureCloudEnvironment);
            AzureAdTokenProvider    tokenProvider    = new AzureAdTokenProvider(tokenCredentials);

            // Specify your REST API endpoint, for example "https://accountname.restv2.westcentralus.media.azure.net/API"
            _context = new CloudMediaContext(new Uri(RESTendpoint), tokenProvider);
            IAsset asset = GetAsset(assetId);
            // Always try to reuse access policies.  You only need to configure one per type of access (30 day, read for example).
            var tempPolicyId = from a in _context.AccessPolicies
                               where a.Name == "30DayRead"
                               select a;
            IAccessPolicy policy = null;

            if (tempPolicyId.Count() < 1)
            {
                // This will likely only run once ever to create the policy with this specific name.
                policy = _context.AccessPolicies.Create("30DayRead",
                                                        TimeSpan.FromDays(30),
                                                        AccessPermissions.Read);
            }
            else
            {
                // The policy exists already and has been found.
                policy = tempPolicyId.FirstOrDefault();
            }
            // Create a locator to the streaming content on an origin.
            ILocator originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset,
                                                                     policy,
                                                                     DateTime.UtcNow.AddMinutes(-5));
        }
        private IAsset CreateSmoothAsset(string[] filePaths)
        {
            IAsset        asset      = _mediaContext.Assets.Create(Guid.NewGuid().ToString(), AssetCreationOptions.StorageEncrypted);
            IAccessPolicy policy     = _mediaContext.AccessPolicies.Create("Write", TimeSpan.FromMinutes(5), AccessPermissions.Write);
            ILocator      locator    = _mediaContext.Locators.CreateSasLocator(asset, policy);
            var           blobclient = new BlobTransferClient
            {
                NumberOfConcurrentTransfers = 5,
                ParallelTransferThreadCount = 5
            };


            foreach (string filePath in filePaths)
            {
                var        info = new FileInfo(filePath);
                IAssetFile file = asset.AssetFiles.Create(info.Name);
                file.UploadAsync(filePath, blobclient, locator, CancellationToken.None).Wait();
                if (WindowsAzureMediaServicesTestConfiguration.SmallIsm == filePath)
                {
                    file.IsPrimary = true;
                    file.Update();
                }
            }
            return(asset);
        }
Example #12
0
    // Download the output asset of the specified job to a local folder.
    static IAsset DownloadAssetToLocal(IAsset outputAsset, string outputFolder)
    {
        // Create a SAS locator to download the asset
        IAccessPolicy accessPolicy = _context.AccessPolicies.Create("File Download Policy", TimeSpan.FromDays(30), AccessPermissions.Read);
        ILocator      locator      = _context.Locators.CreateLocator(LocatorType.Sas, outputAsset, accessPolicy);

        BlobTransferClient blobTransfer = new BlobTransferClient
        {
            NumberOfConcurrentTransfers = 20,
            ParallelTransferThreadCount = 20
        };

        var downloadTasks = new List <Task>();

        foreach (IAssetFile outputFile in outputAsset.AssetFiles)
        {
            // Use the following event handler to check download progress.
            outputFile.DownloadProgressChanged += DownloadProgress;

            string localDownloadPath = Path.Combine(outputFolder, outputFile.Name);

            Console.WriteLine("File download path:  " + localDownloadPath);

            downloadTasks.Add(outputFile.DownloadAsync(Path.GetFullPath(localDownloadPath), blobTransfer, locator, CancellationToken.None));

            outputFile.DownloadProgressChanged -= DownloadProgress;
        }

        Task.WaitAll(downloadTasks.ToArray());

        return(outputAsset);
    }
        private void BuildProgressiveDownloadURLs(IAsset asset)
        {
            // Create a 30-day readonly access policy.
            IAccessPolicy policy = _context.AccessPolicies.Create("Streaming policy",
                                                                  TimeSpan.FromDays(30),
                                                                  AccessPermissions.Read);

            _log.Info("Policy created successfully");
            // Create an OnDemandOrigin locator to the asset.
            ILocator originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset,
                                                                     policy,
                                                                     DateTime.UtcNow.AddMinutes(-5));


            // Display some useful values based on the locator.
            _log.Info("Streaming asset base path on origin: ");
            _log.Info(originLocator.Path);


            // Get MP4 files.
            IEnumerable <IAssetFile> mp4AssetFiles = asset
                                                     .AssetFiles
                                                     .ToList()
                                                     .Where(af => af.Name.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase));

            // Create a full URL to the MP4 files. Use this to progressively download files.
            foreach (var pd in mp4AssetFiles)
            {
                _log.Info(originLocator.Path + pd.Name);
            }
        }
Example #14
0
        /// <summary>
        /// PublishAsset - Publishes the asset with global descriptor to enable the asset for streaming.
        /// </summary>
        /// <param name="asset">asset</param>
        /// <returns>Returns list of streaming uri's for all available streaming formats</returns>
        public PublishedUrlDetails PublishAsset(IAsset asset)
        {
            PublishedUrlDetails publishedUrls = new PublishedUrlDetails();
            var assetFile = asset.AssetFiles.Where(f => f.Name.ToLower().EndsWith(".ism")).FirstOrDefault();

            IAccessPolicy policy        = _mediaContext.AccessPolicies.Create("Streaming policy", TimeSpan.FromDays(365), AccessPermissions.Read);
            ILocator      originLocator = _mediaContext.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset, policy, DateTime.UtcNow.AddMinutes(-5));

            Uri smoothStreamingUri = asset.GetSmoothStreamingUri();
            Uri hlsUri             = asset.GetHlsUri();
            Uri mpegDashUri        = asset.GetMpegDashUri();
            Uri hlsv3Uri           = asset.GetHlsv3Uri();

            publishedUrls.SmoothUrl = smoothStreamingUri != null?smoothStreamingUri.ToString().Replace("http://", "https://") : " ";

            publishedUrls.Hlsv4Uri = hlsUri != null?hlsUri.ToString().Replace("http://", "https://") : " ";

            publishedUrls.Hlsv3Uri = hlsv3Uri != null?hlsv3Uri.ToString().Replace("http://", "https://") : " ";

            publishedUrls.MpegDashUri = mpegDashUri != null?mpegDashUri.ToString().Replace("http://", "https://") : " ";

            if (assetFile != null)
            {
                publishedUrls.UrlWithOriginLocator = originLocator.Path.Replace("http://", "https://") + assetFile.Name +
                                                     "/manifest";
            }
            return(publishedUrls);
        }
Example #15
0
        public async Task <ICipherText> Encrypt(byte[] data, IPublicKey publicKey, IAccessPolicy accessPolicy)
        {
            try
            {
                var publicKeyFile = await LocalHost.WriteFileAsync(publicKey.Value);

                var messageFile = await LocalHost.WriteFileAsync(data);

                var encodedDataFile = LocalHost.GetRandomFilename();

                await LocalHost.RunProcessAsync("cpabe-enc", $"-o {encodedDataFile} {publicKeyFile} {messageFile} \"{accessPolicy.AndGate()}\"");

                var encodedDataBytes = await LocalHost.ReadFileAsync(encodedDataFile);

                var encodedData = new MockCipherText()
                {
                    Value = encodedDataBytes
                };

                File.Delete(publicKeyFile);
                File.Delete(messageFile);
                File.Delete(encodedDataFile);

                return(encodedData);
            }
            catch (Exception exception)
            {
                throw new ABESchemeException($"Error has occured during encryption: {accessPolicy.AndGate()}", exception);
            }
        }
        public void ShouldCreateAssetFileArrayWithEncryption()
        {
            var           filePaths  = new[] { WindowsAzureMediaServicesTestConfiguration.SmallWmv, WindowsAzureMediaServicesTestConfiguration.SmallWmv2 };
            IAsset        asset      = _mediaContext.Assets.Create(Guid.NewGuid().ToString(), AssetCreationOptions.StorageEncrypted);
            IAccessPolicy policy     = _mediaContext.AccessPolicies.Create("Write", TimeSpan.FromMinutes(5), AccessPermissions.Write);
            ILocator      locator    = _mediaContext.Locators.CreateSasLocator(asset, policy);
            var           blobclient = new BlobTransferClient
            {
                NumberOfConcurrentTransfers = 5,
                ParallelTransferThreadCount = 5
            };


            foreach (string filePath in filePaths)
            {
                var        info = new FileInfo(filePath);
                IAssetFile file = asset.AssetFiles.Create(info.Name);
                file.UploadAsync(filePath, blobclient, locator, CancellationToken.None).Wait();
            }

            // Associate an access policy with the asset so we can download the files associated with it
            policy = _mediaContext.AccessPolicies.Create("Test", TimeSpan.FromMinutes(10), AccessPermissions.Read);
            _mediaContext.Locators.CreateSasLocator(asset, policy);

            Assert.IsNotNull(asset, "Asset should be non null");
            Assert.AreNotEqual(Guid.Empty, asset.Id, "Asset ID should not be null");
            Assert.IsTrue(asset.Options == AssetCreationOptions.StorageEncrypted, "AssetCreationOptions did not have the expected value");

            VerifyFileAndContentKeyMetadataForStorageEncryption(asset, _mediaContext);
            VerifyStorageEncryptionOnFiles(asset, filePaths);
        }
Example #17
0
        private IAsset CreateAssetAndUploadNFilesUsingAsyncCall(int expected)
        {
            IAsset asset = _dataContext.Assets.Create("TestWithMultipleFiles", AssetCreationOptions.None);

            VerifyAsset(asset);
            DirectoryInfo info = Directory.CreateDirectory(Guid.NewGuid().ToString());

            var           files   = new List <Task>();
            var           client  = new BlobTransferClient();
            IAccessPolicy policy  = _dataContext.AccessPolicies.Create("Write", TimeSpan.FromMinutes(20), AccessPermissions.Write);
            ILocator      locator = _dataContext.Locators.CreateSasLocator(asset, policy);


            for (int i = 0; i < expected; i++)
            {
                string     fileName;
                string     fullFilePath = CreateNewFileFromOriginal(info, out fileName);
                IAssetFile file         = asset.AssetFiles.Create(fileName);
                files.Add(file.UploadAsync(fullFilePath, client, locator, CancellationToken.None));
            }
            Task.WaitAll(files.ToArray());
            foreach (Task task in files)
            {
                Assert.IsTrue(task.IsCompleted);
                Assert.IsFalse(task.IsFaulted);
                Assert.IsNull(task.Exception);
            }
            return(asset);
        }
        public void TestAccessPolicyCreateRetry()
        {
            var dataContextMock = new Mock <IMediaDataServiceContext>();

            int exceptionCount = 2;

            var expected = new AccessPolicyData {
                Name = "testData"
            };
            var fakeResponse = new TestMediaDataServiceResponse {
                AsyncState = expected
            };
            var fakeException = new WebException("testException", WebExceptionStatus.ConnectionClosed);

            dataContextMock.Setup((ctxt) => ctxt.AddObject("AccessPolicies", It.IsAny <object>()));
            dataContextMock.Setup((ctxt) => ctxt
                                  .SaveChangesAsync(It.IsAny <object>()))
            .Returns(() => Task.Factory.StartNew <IMediaDataServiceResponse>(() =>
            {
                if (--exceptionCount > 0)
                {
                    throw fakeException;
                }
                return(fakeResponse);
            }));

            _mediaContext.MediaServicesClassFactory = new TestMediaServicesClassFactory(dataContextMock.Object);

            IAccessPolicy policy = _mediaContext.AccessPolicies.Create("Empty", TimeSpan.FromSeconds(1), AccessPermissions.None);

            Assert.AreEqual(expected.Name, policy.Name);
            Assert.AreEqual(0, exceptionCount);
        }
Example #19
0
        public void ShouldThrowArgumentExceptionWhenUploadAsyncFileNameNotEqualToAssetFileName()
        {
            IAsset        asset        = _mediaContext.Assets.Create("test", AssetCreationOptions.None);
            string        fileUploaded = _smallWmv;
            IAssetFile    fileInfo     = asset.AssetFiles.Create("test.txt");
            IAccessPolicy policy       = _mediaContext.AccessPolicies.Create("Write", TimeSpan.FromMinutes(1),
                                                                             AccessPermissions.Write);
            ILocator locator = _mediaContext.Locators.CreateLocator(LocatorType.Sas, asset, policy);

            try
            {
                fileInfo.UploadAsync(fileUploaded,
                                     new BlobTransferClient
                {
                    NumberOfConcurrentTransfers = 5,
                    ParallelTransferThreadCount = 5
                },
                                     locator,
                                     CancellationToken.None);
            }
            catch (ArgumentException ex)
            {
                AssertFileMismatchException(fileUploaded, ex);
                throw;
            }
        }
Example #20
0
        private IAsset CreateMediaAsset(CloudFile model)
        {
            CloudMediaContext context = new CloudMediaContext(mediaAccountName, mediaAccountKey);

            CloudStorageAccount storageAccount     = CloudStorageAccount.Parse(storageConnectionString);
            CloudBlobClient     cloudBlobClient    = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer  mediaBlobContainer = cloudBlobClient.GetContainerReference(storageContainerReference);

            mediaBlobContainer.CreateIfNotExists();

            // Create a new asset.
            IAsset        asset              = context.Assets.Create("UploadedVideo-" + Guid.NewGuid(), AssetCreationOptions.None);
            IAccessPolicy writePolicy        = context.AccessPolicies.Create("writePolicy", TimeSpan.FromMinutes(120), AccessPermissions.Write);
            ILocator      destinationLocator = context.Locators.CreateLocator(LocatorType.Sas, asset, writePolicy);

            // Get the asset container URI and copy blobs from mediaContainer to assetContainer.
            Uri                uploadUri          = new Uri(destinationLocator.Path);
            string             assetContainerName = uploadUri.Segments[1];
            CloudBlobContainer assetContainer     = cloudBlobClient.GetContainerReference(assetContainerName);
            string             fileName           = HttpUtility.UrlDecode(Path.GetFileName(model.BlockBlob.Uri.AbsoluteUri));

            var sourceCloudBlob = mediaBlobContainer.GetBlockBlobReference(fileName);

            sourceCloudBlob.FetchAttributes();

            if (sourceCloudBlob.Properties.Length > 0)
            {
                IAssetFile assetFile       = asset.AssetFiles.Create(fileName);
                var        destinationBlob = assetContainer.GetBlockBlobReference(fileName);

                destinationBlob.DeleteIfExists();
                destinationBlob.StartCopyFromBlob(sourceCloudBlob);
                destinationBlob.FetchAttributes();
                if (sourceCloudBlob.Properties.Length != destinationBlob.Properties.Length)
                {
                    model.UploadStatusMessage += "Failed to copy as Media Asset!";
                }
            }
            destinationLocator.Delete();
            writePolicy.Delete();
            sourceCloudBlob.Delete();  //delete temp blob

            // Refresh the asset.
            asset = context.Assets.Where(a => a.Id == asset.Id).FirstOrDefault();

            var ismAssetFiles = asset.AssetFiles.ToList().Where(f => f.Name.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase)).ToArray();

            if (ismAssetFiles.Count() != 1)
            {
                throw new ArgumentException("The asset should have only one, .ism file");
            }

            ismAssetFiles.First().IsPrimary = true;
            ismAssetFiles.First().Update();

            model.UploadStatusMessage += " Media file uploaded successfully by id: " + asset.Id;
            model.AssetId              = asset.Id;

            return(asset);
        }
Example #21
0
        public override void Fill(NumericTextBoxPropertyBag propertyBag, FillerParams fillerParams)
        {
            if (fillerParams.SkipSecurityFill == false)
            {
                IModelPropertyConfiguration propertyConfig = ReadPropertyConfiguration(fillerParams.ModelName, fillerParams.PropertyName, fillerParams.ConfigKey);

                if (propertyConfig != null && propertyConfig.PropertyConfiguration != null)
                {
                    IAccessPolicy accessSecurity = GetAccess(propertyConfig.PropertyConfiguration.Security);
                    if (accessSecurity != null)
                    {
                        propertyBag.Enabled    = accessSecurity.Enabled;
                        propertyBag.ReadOnly   = accessSecurity.ReadOnly;
                        propertyBag.Masking    = accessSecurity.Masking;
                        propertyBag.Visibility = accessSecurity.Visibility;
                    }
                }
                else
                {
                    setDefalutSecurity(propertyBag);
                }
            }
            else
            {
                setDefalutSecurity(propertyBag);
            }
        }
Example #22
0
        private IAsset CreateAndConfigureAsset(ZetronMstIncidents zetronMstIncidents, out ILocator originLocator)
        {
            //Create asset
            IAsset asset = null;

            try
            {
                asset = _mediaContext.Assets.Create("Asset_" + zetronMstIncidents.IncidentId.ToString(), AssetCreationOptions.None);

                // Create a 30 - day readonly access policy.
                IAccessPolicy accessPolicy = _mediaContext.AccessPolicies.Create("Streaming policy",
                                                                                 TimeSpan.FromDays(30),
                                                                                 AccessPermissions.Read);

                // Create a locator to the streaming content on an origin.
                originLocator = _mediaContext.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset,
                                                                     accessPolicy,
                                                                     DateTime.UtcNow.AddMinutes(-5));
            }
            catch (Exception ex)
            {
                Log(ex.Message);
                throw;
            }

            return(asset);
        }
        public void ShouldVerifyParametersInLocatorCreate()
        {
            IAsset        asset             = _mediaContext.Assets.Create("Test", AssetCreationOptions.None);
            IAccessPolicy policy            = _mediaContext.AccessPolicies.Create("Test", TimeSpan.FromDays(1), AccessPermissions.Read);
            bool          assetNullverified = false;

            try
            {
                _mediaContext.Locators.CreateLocator(LocatorType.OnDemandOrigin, null, policy);
            }
            catch (ArgumentNullException)
            {
                assetNullverified = true;
            }

            bool policyNullverified = false;

            try
            {
                _mediaContext.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset, null);
            }
            catch (ArgumentNullException)
            {
                policyNullverified = true;
            }

            Assert.IsTrue(assetNullverified, "Expecting ArgumentNullException passing asset as null");
            Assert.IsTrue(policyNullverified, "Expecting ArgumentNullException passing policy as null");
        }
Example #24
0
        public String GetSasUrl(IAsset asset, TimeSpan accessPolicyTimeout)
        {
            // Create a policy for the asset.
            IAccessPolicy readPolicy = mediaContext.AccessPolicies.Create("My Test Policy", accessPolicyTimeout, AccessPermissions.Read);
            ILocator      locator    = mediaContext.Locators.CreateSasLocator(asset,
                                                                              readPolicy,
                                                                              DateTime.UtcNow.AddMinutes(-5));

            // Print the path for the locator you created.
            Console.WriteLine("Locator path: ");
            Console.WriteLine(locator.Path);
            Console.WriteLine();

            var theOutputFile =
                from f in asset.Files
                where f.Name.EndsWith(".mp4")
                select f;
            // Cast the IQueryable variable back to an IFileInfo.
            IFileInfo theFile  = theOutputFile.FirstOrDefault();
            string    fileName = theFile.Name;

            // Now take the locator path, add the file name, and build a complete SAS URL to browse to the asset.
            var uriBuilder = new UriBuilder(locator.Path);

            uriBuilder.Path += "/" + fileName;

            // Print the full SAS URL
            Console.WriteLine("Full URL to file: ");
            Console.WriteLine(uriBuilder.Uri.AbsoluteUri);
            Console.WriteLine();
            //writeToFile(uriBuilder.Uri.AbsoluteUri, output);
            // Return the SAS URL.
            return(uriBuilder.Uri.AbsoluteUri);
        }
        public void LocatorCRUD()
        {
            ILocator stubed = _mediaContext.Locators.FirstOrDefault();

            Assert.IsNotNull(stubed);
            Assert.IsNotNull(stubed.Asset);
            Assert.IsNotNull(stubed.AccessPolicy);

            IAsset        asset   = _mediaContext.Assets.Create("Test", AssetCreationOptions.None);
            IAccessPolicy policy  = _mediaContext.AccessPolicies.Create("Test", TimeSpan.FromDays(1), AccessPermissions.Read);
            ILocator      locator = _mediaContext.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset, policy);

            Assert.IsNotNull(locator.AccessPolicy);
            Assert.IsNotNull(locator.Asset);
            locator.Update(DateTime.UtcNow.AddDays(5));
            locator.Update(DateTime.UtcNow.AddDays(1), DateTime.UtcNow.AddDays(5));
            locator.UpdateAsync(DateTime.UtcNow.AddDays(5));
            locator.Delete();
            Assert.IsNull(_mediaContext.Locators.Where(c => c.Id == locator.Id).FirstOrDefault());

            ILocator sas = _mediaContext.Locators.CreateSasLocator(asset, policy);

            sas.Delete();

            sas = _mediaContext.Locators.CreateSasLocatorAsync(asset, policy).Result;
            sas.Delete();
            ILocator sasAsync = _mediaContext.Locators.CreateSasLocatorAsync(asset, policy, DateTime.UtcNow, "Name").Result;

            sasAsync.DeleteAsync().Wait();
        }
        public void ShouldCreateEncryptedInitilizedAsset()
        {
            IAsset asset = _mediaContext.Assets.Create("Test", AssetCreationOptions.StorageEncrypted);

            Assert.IsNotNull(asset, "Asset should be non null");
            Assert.AreNotEqual(Guid.Empty, asset.Id, "Asset ID shuold not be null");
            Assert.AreEqual(0, asset.AssetFiles.Count(), "Asset has files");
            Assert.AreEqual(AssetState.Initialized, asset.State, "Expecting initilized state");

            IAccessPolicy policy  = _mediaContext.AccessPolicies.Create("temp", TimeSpan.FromMinutes(10), AccessPermissions.Write);
            ILocator      locator = _mediaContext.Locators.CreateSasLocator(asset, policy);

            IAssetFile file = asset.AssetFiles.Create(Path.GetFileName(_smallWmv));

            Task task = file.UploadAsync(_smallWmv,
                                         _mediaContext.MediaServicesClassFactory.GetBlobTransferClient(),
                                         locator,
                                         CancellationToken.None);

            task.Wait();
            Assert.IsTrue(task.IsCompleted);
            Assert.IsTrue(!task.IsFaulted);
            locator.Delete();
            policy.Delete();
            IAsset refreshedAsset = _mediaContext.Assets.Where(c => c.Id == asset.Id).FirstOrDefault();

            Assert.AreEqual(asset.Name, refreshedAsset.Name);
            Assert.AreEqual(AssetState.Initialized, refreshedAsset.State);
            Assert.AreEqual(1, refreshedAsset.AssetFiles.Count(), "file count wrong");
            VerifyAndDownloadAsset(refreshedAsset, 1, false);
            ContentKeyTests.VerifyFileAndContentKeyMetadataForStorageEncryption(refreshedAsset, _mediaContext);
        }
Example #27
0
        public static string PublishAndBuildStreamingURLs(String jobID, CloudMediaContext _context)
        {
            string urlForClientStreaming;

            try
            {
                IJob   job   = _context.Jobs.Where(j => j.Id == jobID).FirstOrDefault();
                IAsset asset = job.OutputMediaAssets.FirstOrDefault();

                // Create a 30-day readonly access policy.
                // You cannot create a streaming locator using an AccessPolicy that includes write or delete permissions.
                IAccessPolicy policy = _context.AccessPolicies.Create($"{asset.Name}_Streaming_Policy", TimeSpan.FromDays(30), AccessPermissions.Read);

                // Create a locator to the streaming content on an origin.
                ILocator originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset, policy, DateTime.UtcNow.AddMinutes(-5));

                // Get a reference to the streaming manifest file from the
                // collection of files in the asset.
                var manifestFile = asset.AssetFiles.ToList().Where(f => f.Name.ToLower().EndsWith(".ism")).FirstOrDefault();

                // Create a full URL to the manifest file. Use this for playback
                // in streaming media clients.
                //urlForClientStreaming = originLocator.Path + manifestFile.Name + "/manifest";
                urlForClientStreaming = originLocator.Path + manifestFile.Name + "/manifest" + "(format=m3u8-aapl)?video.m3u8";
            }
            catch (Exception)
            {
                return(null);
            }

            return(urlForClientStreaming);
        }
        public void ShouldDownloadSameAssetFile2TimesIdenticallyAsStorageSDK()
        {
            IAsset asset = _mediaContext.Assets.Create("Test", AssetCreationOptions.None);

            VerifyAsset(asset);
            IAccessPolicy policy  = _mediaContext.AccessPolicies.Create("temp", TimeSpan.FromMinutes(10), AccessPermissions.Write);
            ILocator      locator = _mediaContext.Locators.CreateSasLocator(asset, policy);

            UploadFile(locator, asset, _smallWmv, _mediaContext);
            UploadFile(locator, asset, WindowsAzureMediaServicesTestConfiguration.SmallWmv2, _mediaContext);


            IAssetFile assetFile = asset.AssetFiles.FirstOrDefault();

            Assert.IsNotNull(assetFile);
            assetFile.IsPrimary = true;
            assetFile.Update();
            locator.Delete();
            policy.Delete();
            IAsset refreshedAsset = RefreshedAsset(asset);

            Assert.AreEqual(2, refreshedAsset.AssetFiles.Count(), "file count wrong");


            for (int i = 0; i < 2; i++)
            {
                VerifyAndDownloadAsset(refreshedAsset, 2);
            }
        }
        public void ShouldCreateAssetFileArrayWithPlayReadyEncryption()
        {
            // Note that these files are not really PlayReady encrypted.  For the purposes of this test that is okay.
            IAsset        asset      = _mediaContext.Assets.Create(Guid.NewGuid().ToString(), AssetCreationOptions.CommonEncryptionProtected);
            IAccessPolicy policy     = _mediaContext.AccessPolicies.Create("Write", TimeSpan.FromMinutes(5), AccessPermissions.Write);
            ILocator      locator    = _mediaContext.Locators.CreateSasLocator(asset, policy);
            var           blobclient = new BlobTransferClient
            {
                NumberOfConcurrentTransfers = 5,
                ParallelTransferThreadCount = 5
            };


            foreach (string filePath in new[] { WindowsAzureMediaServicesTestConfiguration.SmallWmv, WindowsAzureMediaServicesTestConfiguration.SmallWmv2 })
            {
                var        info = new FileInfo(filePath);
                IAssetFile file = asset.AssetFiles.Create(info.Name);
                file.UploadAsync(filePath, blobclient, locator, CancellationToken.None).Wait();
            }

            Guid keyId = Guid.NewGuid();

            byte[] contentKey = GetRandomBuffer(16);

            IContentKey key = _mediaContext.ContentKeys.Create(keyId, contentKey);

            asset.ContentKeys.Add(key);

            Assert.IsNotNull(asset, "Asset should be non null");
            Assert.AreNotEqual(Guid.Empty, asset.Id, "Asset ID should not be null");
            Assert.IsTrue(asset.Options == AssetCreationOptions.CommonEncryptionProtected, "AssetCreationOptions did not have the expected value");

            VerifyFileAndContentKeyMetadataForCommonEncryption(asset);
            VerifyContentKeyVersusExpectedValue2(asset, contentKey, keyId);
        }
        private async Task <WamsLocatorInfo> CreateLocatorAsync(IAsset asset, string accessPolicyName, LocatorType type, TimeSpan duration)
        {
            IAccessPolicy accessPolicy = null;
            ILocator      locator      = null;

            try {
                accessPolicy = await Context.AccessPolicies.CreateAsync(accessPolicyName, duration, AccessPermissions.Read | AccessPermissions.List).ConfigureAwait(continueOnCapturedContext: false);

                locator = await Context.Locators.CreateLocatorAsync(type, asset, accessPolicy).ConfigureAwait(continueOnCapturedContext: false);

                Logger.Information("New {0} locator with duration {1} was created for asset '{2}'", type, duration, asset.Name);

                return(new WamsLocatorInfo(locator.Id, locator.Path));
            }
            catch (Exception ex) {
                Logger.Error(ex, "Error while creating locator for asset '{0}'. Cleaning up any created locator and access policy.", asset.Name);

                try {
                    if (locator != null)
                    {
                        locator.Delete();
                    }
                    if (accessPolicy != null)
                    {
                        accessPolicy.Delete();
                    }
                }
                catch (Exception iex) {
                    Logger.Warning(iex, "Error while cleaning up created locator and access policy.");
                }

                throw;
            }
        }
        private void Cleanup(BlobTransferClient blobTransfer, FileEncryption fileEncryption, ILocator locator, IAccessPolicy accessPolicy)
        {
            lock (this._lock)
            {
                if (blobTransfer != null)
                {
                    try
                    {
                        blobTransfer.TransferProgressChanged -= this.OnDownloadBlobTransferProgressChanged;
                    }
                    catch
                    {
                    }
                    finally
                    {
                        blobTransfer = null;
                    }
                }

                if (fileEncryption != null)
                {
                    try
                    {
                        fileEncryption.Dispose();
                    }
                    catch
                    {
                    }
                    finally
                    {
                        fileEncryption = null;
                    }
                }

                if (locator != null)
                {
                    try
                    {
                        locator.Delete();
                    }
                    catch
                    {
                    }
                    finally
                    {
                        locator = null;
                    }
                }

                if (accessPolicy != null)
                {
                    try
                    {
                        accessPolicy.Delete();
                    }
                    catch
                    {
                    }
                    finally
                    {
                        accessPolicy = null;
                    }
                }
            }
        }