내보내기(0) 인쇄
모두 확장

.NET용 Media Services SDK를 사용하여 자산 관리

업데이트 날짜: 2014년 7월

이 항목에서는 다음과 같은 미디어 서비스 관리 태스크를 수행하는 방법을 보여 줍니다.

note참고
기존 미디어 서비스 자산을 관리하기 위한 코드를 작성하려면 먼저, Media Services SDK를 통해 Media Services에 연결 항목에서 설명된 바와 같이 미디어 서비스 서버 컨텍스트에 대한 참조가 있어야 합니다. 컨텍스트 개체는 다음에 나오는 코드 예제에서 _context라는 변수로 표현됩니다.

미디어 서비스의 기존 자산에 대한 참조를 가져오는 태스크는 빈번하게 수행됩니다. 다음 코드 예제에서는 자산 ID를 사용하여 서버 컨텍스트 개체의 Assets 컬렉션에서 자산 참조를 가져오는 방법을 보여 줍니다.

다음 코드 예제는 Linq 쿼리를 사용하여 기존 IAsset 개체에 대한 참조를 가져옵니다.

static IAsset GetAsset(string assetId)
{
    // Use a LINQ Select query to get an asset.
    var assetInstance =
        from a in _context.Assets
        where a.Id == assetId
        select a;
    // Reference the asset as an IAsset.
    IAsset asset = assetInstance.FirstOrDefault();

    return asset;
}

미디어 서비스 코드에서 처리 태스크를 사용할 때는 대개 ID를 기반으로 기존 작업에 대한 참조를 가져와야 합니다. 다음 코드 예제에서는 Jobs 컬렉션에서 IJob 개체에 대한 참조를 가져오는 방법을 보여 줍니다.

Warning경고
실행 시간이 긴 인코딩 작업을 시작하며 스레드에 대한 작업 상태를 확인해야 하는 경우 작업 참조를 가져와야 할 수 있습니다. 이러한 경우, 메서드의 결과가 스레드로부터 반환될 때 새로 고쳐진 작업 참조를 검색해야 합니다.

static IJob GetJob(string jobId)
{
    // Use a Linq select query to get an updated 
    // reference by Id. 
    var jobInstance =
        from j in _context.Jobs
        where j.Id == jobId
        select j;
    // Return the job reference as an Ijob. 
    IJob job = jobInstance.FirstOrDefault();

    return job;
}

저장소의 자산 수가 점점 늘어남에 따라, 자산을 나열하면 자산을 파악하는 데 도움이 됩니다. 다음 코드 예제에서는 서버 컨텍스트 개체의 Assets 컬렉션에 포함되어 있는 자산에 대해 반복 수행하여 모든 자산을 나열하는 방법을 보여 줍니다. 코드 예제에서는 각 자산에 대해 해당 속성 값 일부를 콘솔에 쓸 수 있습니다. 예를 들어 각 자산에는 여러 미디어 파일이 포함되어 있을 수 있습니다. 다음 코드 예제는 각 자산과 연관된 모든 파일을 씁니다.

note참고
콘솔에 표시된 모든 자산 정보를 확인하려면 Visual Studio의 중단점을 예제 메서드의 닫는 중괄호에 설정합니다. 중단점을 설정하지 않으면 콘솔이 닫혀 데이터를 볼 수 없습니다. 자산을 확인하는 다른 방법은 나열된 모든 자산 정보를 파일에 쓰는 것입니다. 이 시리즈와 함께 제공되는 프로젝트에서는 이 코드 예제와 비슷한 자산이 나열되는 메서드를 사용하여 자산 목록을 파일에 쓰는 방법을 보여 줍니다.


static void ListAssets()
{
    string waitMessage = "Building the list. This may take a few "
        + "seconds to a few minutes depending on how many assets "
        + "you have."
        + Environment.NewLine + Environment.NewLine
        + "Please wait..."
        + Environment.NewLine;
    Console.Write(waitMessage);

    // Create a Stringbuilder to store the list that we build. 
    StringBuilder builder = new StringBuilder();

    foreach (IAsset asset in _context.Assets)
    {
        // Display the collection of assets.
        builder.AppendLine("");
        builder.AppendLine("******ASSET******");
        builder.AppendLine("Asset ID: " + asset.Id);
        builder.AppendLine("Name: " + asset.Name);
        builder.AppendLine("==============");
        builder.AppendLine("******ASSET FILES******");

        // Display the files associated with each asset. 
        foreach (IAssetFile fileItem in asset.AssetFiles)
        {
            builder.AppendLine("Name: " + fileItem.Name);
            builder.AppendLine("Size: " + fileItem.ContentFileSize);
            builder.AppendLine("==============");
        }
    }

    // Display output in console.
    Console.Write(builder.ToString());
}

미디어 서비스의 자산과 해당 연관 작업을 나열하는 태스크도 중요합니다. 다음 코드 예제에서는 각 IJob 개체를 나열한 다음 각 작업에 대해 해당 속성, 모든 연관 태스크, 모든 입력 자산 및 모든 출력 자산을 표시하는 방법을 보여 줍니다. 이 예제의 코드는 기타 여러 가지 태스크에도 유용합니다. 예를 들어 이전에 실행된 여러 인코딩 작업의 출력 자산을 나열하려는 경우 이 코드를 사용하여 출력 자산에 액세스할 수 있습니다. 출력 자산에 대한 참조가 있으면 해당 콘텐츠를 다운로드하거나 URL을 제공하여 다른 사용자나 응용 프로그램에 배달할 수 있습니다. 자산 배달 방법에 대한 자세한 내용은 .NET용 Media Services SDK를 사용하여 자산 배달을 참조하십시오.

// List all jobs on the server, and for each job, also list 
// all tasks, all input assets, all output assets.
static void ListJobsAndAssets()
{
    string waitMessage = "Building the list. This may take a few "
        + "seconds to a few minutes depending on how many assets "
        + "you have."
        + Environment.NewLine + Environment.NewLine
        + "Please wait..."
        + Environment.NewLine;
    Console.Write(waitMessage);

    // Create a Stringbuilder to store the list that we build. 
    StringBuilder builder = new StringBuilder();

    foreach (IJob job in _context.Jobs)
    {
        // Display the collection of jobs on the server.
        builder.AppendLine("");
        builder.AppendLine("******JOB*******");
        builder.AppendLine("Job ID: " + job.Id);
        builder.AppendLine("Name: " + job.Name);
        builder.AppendLine("State: " + job.State);
        builder.AppendLine("Order: " + job.Priority);
        builder.AppendLine("==============");


        // For each job, display the associated tasks (a job  
        // has one or more tasks). 
        builder.AppendLine("******TASKS*******");
        foreach (ITask task in job.Tasks)
        {
            builder.AppendLine("Task Id: " + task.Id);
            builder.AppendLine("Name: " + task.Name);
            builder.AppendLine("Progress: " + task.Progress);
            builder.AppendLine("Configuration: " + task.Configuration);
            if (task.ErrorDetails != null)
            {
                builder.AppendLine("Error: " + task.ErrorDetails);
            }
            builder.AppendLine("==============");
        }

        // For each job, display the list of input media assets.
        builder.AppendLine("******JOB INPUT MEDIA ASSETS*******");
        foreach (IAsset inputAsset in job.InputMediaAssets)
        {

            if (inputAsset != null)
            {
                builder.AppendLine("Input Asset Id: " + inputAsset.Id);
                builder.AppendLine("Name: " + inputAsset.Name);
                builder.AppendLine("==============");
            }
        }

        // For each job, display the list of output media assets.
        builder.AppendLine("******JOB OUTPUT MEDIA ASSETS*******");
        foreach (IAsset theAsset in job.OutputMediaAssets)
        {
            if (theAsset != null)
            {
                builder.AppendLine("Output Asset Id: " + theAsset.Id);
                builder.AppendLine("Name: " + theAsset.Name);
                builder.AppendLine("==============");
            }
        }

    }

    // Display output in console.
    Console.Write(builder.ToString());
}

미디어 서비스에서는 자산이나 해당 파일에 대한 액세스 정책을 정의할 수 있습니다. 액세스 정책은 파일이나 자산에 대한 권한(액세스 유형 및 기간)을 정의합니다. 미디어 서비스 코드에서는 대개 IAccessPolicy 개체를 만든 다음 이를 기존 자산에 연결하여 액세스 정책을 정의합니다. 그런 다음 ILocator 개체를 만듭니다. 이 개체를 통해 미디어 서비스의 자산에 대한 직접적인 액세스를 제공할 수 있습니다. 이 설명서 시리즈와 함께 제공되는 Visual Studio 프로젝트에는 자산에 대한 액세스 정책과 로케이터를 만들어 할당하는 방법을 보여 주는 예제 코드가 몇 가지 포함되어 있습니다.

다음 예제 코드에서는 서버의 모든 액세스 정책과 각 액세스 정책과 연관된 권한을 나열하는 방법을 보여 줍니다. 또는 서버의 모든 ILocator 개체를 나열한 다음 각 로케이터에 대해 AccessPolicy 속성을 사용하여 해당 로케이터와 연관된 액세스 정책을 나열할 수도 있습니다.

static void ListAllPolicies()
{
    foreach (IAccessPolicy policy in _context.AccessPolicies)
    {
        Console.WriteLine("");
        Console.WriteLine("Name:  " + policy.Name);
        Console.WriteLine("ID:  " + policy.Id);
        Console.WriteLine("Permissions: " + policy.Permissions);
        Console.WriteLine("==============");

    }
}

로케이터는 자산을 액세스할 수 있는 직접적인 경로를 제공하는 URL로서, 로케이터와 연관된 액세스 정책에 정의된 자산에 대한 권한도 함께 제공됩니다. 각 자산에는 해당 Locators 속성에서 각 자산과 연관되는 ILocator 개체 컬렉션이 있습니다. 서버 컨텍스트에도 모든 로케이터가 포함된 Locators 컬렉션이 있습니다.

다음 코드 예제에서는 서버의 모든 로케이터를 나열합니다. 로케이터별로 연관된 자산 및 액세스 정책의 ID를 표시합니다. 또한 자산에 대한 권한 유형, 만료 날짜 및 전체 경로도 표시합니다.

note참고
자산에 대한 로케이터 경로는 자산의 기본 URL에 불과합니다. 사용자나 응용 프로그램에서 검색할 수 있는 개별 파일에 대한 직접 경로를 만들려면 코드에서 구체적인 파일 경로를 로케이터 경로에 추가해야 합니다. 자세한 방법은 .NET용 Media Services SDK를 사용하여 자산 배달 항목을 참조하십시오.

static void ListAllLocators()
{
    foreach (ILocator locator in _context.Locators)
    {
        Console.WriteLine("***********");
        Console.WriteLine("Locator Id: " + locator.Id);
        Console.WriteLine("Locator asset Id: " + locator.AssetId);
        Console.WriteLine("Locator access policy Id: " + locator.AccessPolicyId);
        Console.WriteLine("Access policy permissions: " + locator.AccessPolicy.Permissions);
        Console.WriteLine("Locator expiration: " + locator.ExpirationDateTime);
        // The locator path is the base or parent path (with included permissions) to access  
        // the media content of an asset. To create a full URL to a specific media file, take 
        // the locator path and then append a file name and info as needed.  
        Console.WriteLine("Locator base path: " + locator.Path);
        Console.WriteLine("");
    }
}


다음 예제에서는 자산이 삭제됩니다.

static void DeleteAsset( IAsset asset)
{
    // delete the asset
    asset.Delete();

    // Verify asset deletion
    if (GetAsset(asset.Id) == null)
        Console.WriteLine("Deleted the Asset");

}

작업을 삭제하려면 State 속성에 표시된 작업의 상태를 확인해야 합니다. 완료됨 또는 취소됨 상태의 작업은 삭제할 수 있지만 대기 중, 예약 중 또는 처리 중 등의 상태에 있는 작업은 먼저 취소한 다음에 삭제할 수 있습니다.

다음 코드 예제에서는 작업 상태를 확인한 다음 완료됨 또는 취소됨 상태일 때 작업을 삭제하는 메서드를 보여 줍니다. 이 코드는 이 항목의 이전 섹션인 작업의 참조를 가져오는 방법에 따라 달라집니다. 작업 참조 가져오기.

static void DeleteJob(string jobId)
{
    bool jobDeleted = false;

    while (!jobDeleted)
    {
        // Get an updated job reference.  
        IJob job = GetJob(jobId);

        // Check and handle various possible job states. You can 
        // only delete a job whose state is Finished, Error, or Canceled.   
        // You can cancel jobs that are Queued, Scheduled, or Processing,  
        // and then delete after they are canceled.
        switch (job.State)
        {
            case JobState.Finished:
            case JobState.Canceled:
            case JobState.Error:
                // Job errors should already be logged by polling or event 
                // handling methods such as CheckJobProgress or StateChanged.
                // You can also call job.DeleteAsync to do async deletes.
                job.Delete();
                Console.WriteLine("Job has been deleted.");
                jobDeleted = true;
                break;
            case JobState.Canceling:
                Console.WriteLine("Job is cancelling and will be deleted "
                    + "when finished.");
                Console.WriteLine("Wait while job finishes canceling...");
                Thread.Sleep(5000);
                break;
            case JobState.Queued:
            case JobState.Scheduled:
            case JobState.Processing:
                job.Cancel();
                Console.WriteLine("Job is scheduled or processing and will "
                    + "be deleted.");
                break;
            default:
                break;
        }

    }
}


다음 코드 예제에서는 정책 ID를 기반으로 액세스 정책에 대한 참조를 가져온 다음 해당 정책을 삭제하는 방법을 보여 줍니다.

static void DeleteAccessPolicy(string existingPolicyId)
{
    // To delete a specific access policy, get a reference to the policy.  
    // based on the policy Id passed to the method.
    var policyInstance =
            from p in _context.AccessPolicies
            where p.Id == existingPolicyId
            select p;
    IAccessPolicy policy = policyInstance.FirstOrDefault();

    policy.Delete();

}


참고 항목

표시:
© 2014 Microsoft