diff --git a/LICENSE b/LICENSE index d1f0a51..d83976c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010 Zencoder +Copyright (c) 2011 Zencoder Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/README.markdown b/README.markdown index bfefa1f..e8a3be8 100644 --- a/README.markdown +++ b/README.markdown @@ -1,11 +1,11 @@ Zencoder API PHP Library ========================== -Author: [Steve Heffernan](http://www.steveheffernan.com) (steve (a) zencoder (.) com) +Author: [Steve Heffernan](http://www.steveheffernan.com) (steve (a) zencoder (.) com) Company: [Zencoder - Online Video Encoder](http://zencoder.com) -Version: 1.1 -Date: 2010-06-04 -Repository: +Version: 1.2 +Date: 2011-08-06 +Repository: For more details on the Zencoder API requirements visit @@ -195,5 +195,6 @@ Your [notifications page](https://app.zencoder.com/notifications) will come in h VERSIONS --------- + Version 1.2 - 2011-08-06 Added fixes for PHP Notices and SSL handling Version 1.1 - 2010-06-04 Added General API Requests Version 1.0 - 2010-04-02 Jobs and Notifications. \ No newline at end of file diff --git a/Zencoder.php b/Zencoder.php index f5d7aa3..d83c1c8 100644 --- a/Zencoder.php +++ b/Zencoder.php @@ -2,24 +2,29 @@ /* Zencoder API PHP Library - Version: 1.0 + Version: 1.2 See the README file for info on how to use this library. */ define('ZENCODER_LIBRARY_NAME', "ZencoderPHP"); -define('ZENCODER_LIBRARY_VERSION', "1.0"); +define('ZENCODER_LIBRARY_VERSION', "1.2"); // Add JSON functions for PHP < 5.2.0 if(!function_exists('json_encode')) { - require_once('lib/JSON.php'); + require_once(dirname(__FILE__) . '/lib/JSON.php'); $GLOBALS['JSON_OBJECT'] = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); function json_encode($value) { return $GLOBALS['JSON_OBJECT']->encode($value); } function json_decode($value) { return $GLOBALS['JSON_OBJECT']->decode($value); } } +// Check that cURL extension is enabled +if(!function_exists('curl_init')) { + throw new Exception('You must have the cURL extension enabled to use this library.'); +} + class ZencoderJob { - var $new_job_url = "https://app.zencoder.com/api/jobs"; + var $new_job_url = "https://app.zencoder.com/api/v1/jobs"; var $new_job_params = array(); var $created = false; var $errors = array(); @@ -35,12 +40,12 @@ class ZencoderJob { function ZencoderJob($params, $options = array()) { // Build using params if not sending request - if($options["build"]) { + if(!empty($options["build"])) { $this->update_attributes($params); return true; } - if($options["url"]) $this->new_job_url = $options["url"]; + if(!empty($options["url"])) $this->new_job_url = $options["url"]; $this->new_job_params = $params; $this->created = $this->create(); } @@ -75,7 +80,7 @@ function update_attributes($attributes = array()) { // Use the Label for the key if avaiable. function create_outputs($outputs = array()) { foreach($outputs as $output_attrs) { - if($output_attrs["label"]) { + if(!empty($output_attrs["label"])) { $this->outputs[$output_attrs["label"]] = new ZencoderOutputFile($output_attrs); } else { $this->outputs[] = new ZencoderOutputFile($output_attrs); @@ -172,10 +177,9 @@ class ZencoderCURL { CURLOPT_HEADER => 0, // Don't return the header in result CURLOPT_HTTPHEADER => array("Content-Type: application/json", "Accept: application/json"), CURLOPT_CONNECTTIMEOUT => 0, // Time in seconds to timeout send request. 0 is no timeout. - // CURLOPT_FOLLOWLOCATION => 0, // Follow redirects. (stopped because it was causing an error in safe mode) - // Dealing with the certificate. Still a sketchy area. - CURLOPT_SSL_VERIFYPEER => 0, // Turn off verification, curl -k or --insecure - CURLOPT_SSL_VERIFYHOST => 0 + CURLOPT_FOLLOWLOCATION => 1, // Follow redirects. + CURLOPT_SSL_VERIFYPEER => 1, + CURLOPT_SSL_VERIFYHOST => 1 ); var $connected; @@ -186,6 +190,11 @@ class ZencoderCURL { // Initialize function ZencoderCURL($url, $json, $options = array()) { + // If PHP in safe mode, disable following location + if( ini_get('safe_mode') ) { + $this->options[CURLOPT_FOLLOWLOCATION] = 0; + } + // Add library details to request $this->options[CURLOPT_HTTPHEADER][] = "Zencoder-Library-Name: ".ZENCODER_LIBRARY_NAME; $this->options[CURLOPT_HTTPHEADER][] = "Zencoder-Library-Version: ".ZENCODER_LIBRARY_VERSION; @@ -209,6 +218,13 @@ function ZencoderCURL($url, $json, $options = array()) { // Execute session and store returned results $this->results = curl_exec($ch); + + // Code based on Facebook PHP SDK + // Retries request if unable to validate cert chain + if (curl_errno($ch) == 60) { // CURLE_SSL_CACERT + curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/lib/zen_ca_chain.crt'); + $this->results = curl_exec($ch); + } // Store the HTTP status code given (201, 404, etc.) $this->status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); @@ -233,8 +249,8 @@ class ZencoderOutputNotification { var $job; function ZencoderOutputNotification($params) { - if($params["output"]) $this->output = new ZencoderOutputFile($params["output"]); - if($params["job"]) $this->job = new ZencoderJob($params["job"], array("build" => true)); + if(!empty($params["output"])) $this->output = new ZencoderOutputFile($params["output"]); + if(!empty($params["job"])) $this->job = new ZencoderJob($params["job"], array("build" => true)); } function catch_and_parse() { diff --git a/lib/zen_ca_chain.crt b/lib/zen_ca_chain.crt new file mode 100644 index 0000000..d754145 --- /dev/null +++ b/lib/zen_ca_chain.crt @@ -0,0 +1,51 @@ +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEbDCCA1SgAwIBAgIQTV8sNAiyTCDNbVB+JE3J7DANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTAwMjA4MDAwMDAwWhcNMjAw +MjA3MjM1OTU5WjA8MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMVGhhd3RlLCBJbmMu +MRYwFAYDVQQDEw1UaGF3dGUgU1NMIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAmeSFW3ZJfS8F2MWsyMip09yY5tc0pi8M8iIm2KPJFEyPBaRF6BQM +WJAFGrfFwQalgK+7HUlrUjSIw1nn72vEJ0GMK2Yd0OCjl5gZNEtB1ZjVxwWtouTX +7QytT8G1sCH9PlBTssSQ0NQwZ2ya8Q50xMLciuiX/8mSrgGKVgqYMrAAI+yQGmDD +7bs6yw9jnw1EyVLhJZa/7VCViX9WFLG3YR0cB4w6LPf/gN45RdWvGtF42MdxaqMZ +pzJQIenyDqHGEwNESNFmqFJX1xG0k4vlmZ9d53hR5U32t1m0drUJN00GOBN6HAiY +XMRISstSoKn4sZ2Oe3mwIC88lqgRYke7EQIDAQABo4H7MIH4MDIGCCsGAQUFBwEB +BCYwJDAiBggrBgEFBQcwAYYWaHR0cDovL29jc3AudGhhd3RlLmNvbTASBgNVHRMB +Af8ECDAGAQH/AgEAMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwudGhhd3Rl +LmNvbS9UaGF3dGVQQ0EuY3JsMA4GA1UdDwEB/wQEAwIBBjAoBgNVHREEITAfpB0w +GzEZMBcGA1UEAxMQVmVyaVNpZ25NUEtJLTItOTAdBgNVHQ4EFgQUp6KDuzRFQD38 +1TBPErk+oQGf9tswHwYDVR0jBBgwFoAUe1tFz6/Oy3r9MZIaarbzRutXSFAwDQYJ +KoZIhvcNAQEFBQADggEBAIAigOBsyJUW11cmh/NyNNvGclYnPtOW9i4lkaU+M5en +S+Uv+yV9Lwdh+m+DdExMU3IgpHrPUVFWgYiwbR82LMgrsYiZwf5Eq0hRfNjyRGQq +2HGn+xov+RmNNLIjv8RMVR2OROiqXZrdn/0Dx7okQ40tR0Tb9tiYyLL52u/tKVxp +EvrRI5YPv5wN8nlFUzeaVi/oVxBw9u6JDEmJmsEj9cIqzEHPIqtlbreUgm0vQF9Y +3uuVK6ZyaFIZkSqudZ1OkubK3lTqGKslPOZkpnkfJn1h7X3S5XFV2JMXfBQ4MDzf +huNMrUnjl1nOG5srztxl1Asoa06ERlFE9zMILViXIa4= +-----END CERTIFICATE-----