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-----