Search code examples
amazon-web-servicesamazon-s3rokubrightscript

Generate Expiring AWS S3 URL links in Brightscript


Can someone point me to some documentation of utilizing brightscript to generate expiring AWS S3 urls with AWSaccesskey to append to video links from an XML feed.

example: http://s3.amazonaws.com/bucket/path?AWSAccessKeyId=44CF9590006BF252F707&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D


Solution

  • Ok, no answers so I gave up with the brightscript bit, couldn't figure out how to do the base64_encode part in brightscript.

    So I hosted my XML feeds on a linux host and created a PHP page that produces the category feed and runs a function that creates the signed AWS S3 expiring links based upon work by Tournas Dimitrios https://tournasdimitrios1.wordpress.com/2012/12/04/how-to-create-expiring-links-for-amazons-s3-with-php/.

    Only a few tweaks to the function to switch the organization of the URL and use & instead of &'s for the XML.

    The result turned out nicely, just fill in the variables with your specific info and Video files and point the categories feed to the php page

    category1.php

    <?php 
    
    // Set header content type for XML for proper browser render
    header('Content-Type: text/xml');
    
    // ** EDIT VARIABLE BELOW **
    
    // Set Variables
    $genre = "Documentary";
    $type = "Video";
    $bucketName = "Your S3 Bucket"   ; 
    $awsAccessKey = "Your AWS Access Key"  ; 
    $awsSecretKey = "Your AWS Secret Key"  ; 
    
    //Build Array of Video Items
    $xmlContent = array (
        array ( "title" => "Title 1", 
                "desc" => "Description 1", 
                "sdImg" => "http://Image1.url", 
                "vidFile" => "/path/videofile1.mp4"),
        array ( "title" => "Title 2", 
                "desc" => "Description 2", 
                "sdImg" => "http://Image2.url", 
                "vidFile" => "/path/videofile3.mp4"),
        array ( "title" => "Title 3", 
                "desc" => "Description 3", 
                "sdImg" => "http://Image3.url", 
                "vidFile" => "/path/videofile3.mp4")
        );
    
    // ** FINISHED EDITING VARIABLES**
    
    
    // Echo initial part or XML document
            echo '<?xml version="1.0" encoding="UTF-8"?>';
            echo '<feed>';
    
    // Loop through the rest of the XML document filling in variables
    $count = 1;
    foreach ($xmlContent as $video) {
    
        // Call function to produce expiring signed AWS S3 URL
        $objectPath = $video[vidFile] ; 
        $s3URL =  s3TempLink("$awsAccessKey" , "$awsSecretKey", "$bucketName",  "$objectPath") ; 
    
            echo ' <item sdImg="'. $video[sdImg] .'" hdImg="'. $video[sdImg] .'">';
            echo '  <title>'. $video[title] .'</title>';
            echo '  <contentType>'. $type .'</contentType>';
            echo '  <contentId>'. $count .'</contentId>';
            echo '  <media>';
            echo '   <streamFormat>mp4</streamFormat>';
            echo '   <streamQuality>SD</streamQuality>';
            echo '   <streamUrl>'. $s3URL .'</streamUrl>';
            echo '  </media>';
            echo '  <media>';
            echo '   <streamFormat>mp4</streamFormat>';
            echo '   <streamQuality>HD</streamQuality>';
            echo '   <streamUrl>'. $s3URL .'</streamUrl>';
            echo '  </media>';
            echo '  <synopsis>'.  $video[desc] .'</synopsis>';
            echo '  <genres>'.  $genre .'</genres>';
            echo ' </item>';
    $count++;
    }
    
    // Echo last part of XML document
            echo '</feed>';
    
    // Function to create signed expiring AWS S3 link Original by Tournas Dimitrios
        //Reference Link: https://tournasdimitrios1.wordpress.com/2012/12/04/how-to-create-expiring-links-for-amazons-s3-with-php/
    
    function s3TempLink($awsAccessKey, $awsSecretKey, $bucketName , $objectPath , $expires = 5) {
      // Calculating expiry time
      $expires = time() + ($expires * 60) ; 
      $objectPath =  ltrim($objectPath, '/') ;
      $signature = "GET\n\n\n$expires\n".'/'.$bucketName.'/'.$objectPath ; 
      // Calculating  HMAC-sha1
      $hashedSignature = base64_encode(hash_hmac('sha1' ,$signature , $awsSecretKey , true )) ;
      // Constructing the URL
      $url = sprintf('http://s3.amazonaws.com/%s/%s', $bucketName , $objectPath);
      // Constructing the query String
      $queryString = http_build_query( array(
        'AWSAccessKeyId' => $awsAccessKey ,
        'Expires' => $expires ,
        'Signature' => $hashedSignature
                ), '', '&amp;');
        // Apending query string to URL
      return $url.'?'.$queryString ;
    }
    
    ?>
    

    Cheers!

    Mark-