Cloudinary_Cloudinary - Version 1.1.0

Version Notes

v1.1.0

* Fix bug when image sizes contain a decimal point
* Update to latest Cloudinary PHP Library

Download this release

Release Info

Developer Cloudinary
Extension Cloudinary_Cloudinary
Version 1.1.0
Comparing to
See all releases


Code changes from version 1.0.0 to 1.1.0

app/code/community/Cloudinary/Cloudinary/Helper/Autoloader.php CHANGED
@@ -22,10 +22,10 @@ class Cloudinary_Cloudinary_Helper_Autoloader
22
  spl_autoload_register(
23
  function ($className) {
24
  if(
25
- strpos($className, self::CLOUDINARY_EXTENSION_LIB_PATH . '\\') === 0 ||
26
- strpos($className, self::CLOUDINARY_LIB_PATH . '\\') === 0
27
  ) {
28
- include_once preg_replace(self::CONVERT_CLASS_TO_PATH_REGEX, '/', $className) . '.php';
29
  }
30
  }
31
  );
@@ -39,8 +39,8 @@ class Cloudinary_Cloudinary_Helper_Autoloader
39
 
40
  spl_autoload_register(
41
  function ($className) use ($libFolder) {
42
- if($className === self::CLOUDINARY_LIB_PATH) {
43
- foreach(new GlobIterator($libFolder . DS . self::CLOUDINARY_LIB_PATH . DS . '*.php') as $phpFile) {
44
  include_once $phpFile;
45
  }
46
  }
22
  spl_autoload_register(
23
  function ($className) {
24
  if(
25
+ strpos($className, Cloudinary_Cloudinary_Helper_Autoloader::CLOUDINARY_EXTENSION_LIB_PATH . '\\') === 0 ||
26
+ strpos($className, Cloudinary_Cloudinary_Helper_Autoloader::CLOUDINARY_LIB_PATH . '\\') === 0
27
  ) {
28
+ include_once preg_replace(Cloudinary_Cloudinary_Helper_Autoloader::CONVERT_CLASS_TO_PATH_REGEX, '/', $className) . '.php';
29
  }
30
  }
31
  );
39
 
40
  spl_autoload_register(
41
  function ($className) use ($libFolder) {
42
+ if($className === Cloudinary_Cloudinary_Helper_Autoloader::CLOUDINARY_LIB_PATH) {
43
+ foreach(new GlobIterator($libFolder . DS . Cloudinary_Cloudinary_Helper_Autoloader::CLOUDINARY_LIB_PATH . DS . '*.php') as $phpFile) {
44
  include_once $phpFile;
45
  }
46
  }
app/code/community/Cloudinary/Cloudinary/Helper/Configuration.php CHANGED
@@ -28,6 +28,8 @@ class Cloudinary_Cloudinary_Helper_Configuration extends Mage_Core_Helper_Abstra
28
 
29
  const STATUS_DISABLED = 0;
30
 
 
 
31
  public function buildCredentials()
32
  {
33
  $environmentVariable = CloudinaryEnvironmentVariable::fromString($this->getEnvironmentVariable());
@@ -79,12 +81,23 @@ class Cloudinary_Cloudinary_Helper_Configuration extends Mage_Core_Helper_Abstra
79
  $this->_setStoreConfig(self::CONFIG_PATH_ENABLED, self::STATUS_DISABLED);
80
  }
81
 
 
 
 
 
 
 
 
 
 
82
  public function buildConfiguration()
83
  {
84
  $config = Configuration::fromEnvironmentVariable(
85
  CloudinaryEnvironmentVariable::fromString($this->getEnvironmentVariable())
86
  );
87
 
 
 
88
  if($this->getCdnSubdomainFlag()) {
89
  $config->enableCdnSubdomain();
90
  }
@@ -105,4 +118,4 @@ class Cloudinary_Cloudinary_Helper_Configuration extends Mage_Core_Helper_Abstra
105
  $config->saveConfig($configPath, $value)->reinit();
106
  }
107
 
108
- }
28
 
29
  const STATUS_DISABLED = 0;
30
 
31
+ const USER_PLATFORM_TEMPLATE = 'CloudinaryMagento/%s (Magento %s)';
32
+
33
  public function buildCredentials()
34
  {
35
  $environmentVariable = CloudinaryEnvironmentVariable::fromString($this->getEnvironmentVariable());
81
  $this->_setStoreConfig(self::CONFIG_PATH_ENABLED, self::STATUS_DISABLED);
82
  }
83
 
84
+ public function getUserPlatform()
85
+ {
86
+ return sprintf(
87
+ self::USER_PLATFORM_TEMPLATE,
88
+ Mage::getConfig()->getModuleConfig('Cloudinary_Cloudinary')->version,
89
+ Mage::getVersion()
90
+ );
91
+ }
92
+
93
  public function buildConfiguration()
94
  {
95
  $config = Configuration::fromEnvironmentVariable(
96
  CloudinaryEnvironmentVariable::fromString($this->getEnvironmentVariable())
97
  );
98
 
99
+ $config->setUserPlatform($this->getUserPlatform());
100
+
101
  if($this->getCdnSubdomainFlag()) {
102
  $config->enableCdnSubdomain();
103
  }
118
  $config->saveConfig($configPath, $value)->reinit();
119
  }
120
 
121
+ }
app/code/community/Cloudinary/Cloudinary/Model/MediaCollectionCounter.php CHANGED
@@ -5,7 +5,7 @@ class Cloudinary_Cloudinary_Model_MediaCollectionCounter implements Countable
5
 
6
  private $_collections = array();
7
 
8
- public function addCollection(Cloudinary_Cloudinary_Model_Resource_Media_Collection_Interface $collection)
9
  {
10
  $this->_collections[] = $collection;
11
 
5
 
6
  private $_collections = array();
7
 
8
+ public function addCollection(Varien_Data_Collection $collection)
9
  {
10
  $this->_collections[] = $collection;
11
 
app/code/community/Cloudinary/Cloudinary/Model/Resource/Cms/Synchronisation/Collection.php CHANGED
@@ -4,7 +4,7 @@ use CloudinaryExtension\Migration\SynchronizedMediaRepository;
4
 
5
  class Cloudinary_Cloudinary_Model_Resource_Cms_Synchronisation_Collection
6
  extends Mage_Cms_Model_Wysiwyg_Images_Storage_Collection
7
- implements SynchronizedMediaRepository, Cloudinary_Cloudinary_Model_Resource_Media_Collection_Interface
8
  {
9
 
10
  public function __construct()
4
 
5
  class Cloudinary_Cloudinary_Model_Resource_Cms_Synchronisation_Collection
6
  extends Mage_Cms_Model_Wysiwyg_Images_Storage_Collection
7
+ implements SynchronizedMediaRepository
8
  {
9
 
10
  public function __construct()
app/code/community/Cloudinary/Cloudinary/Model/Resource/Media/Collection.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
 
3
  class Cloudinary_Cloudinary_Model_Resource_Media_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
4
- implements Cloudinary_Cloudinary_Model_Resource_Media_Collection_Interface
5
  {
6
 
7
  protected function _construct()
1
  <?php
2
 
3
  class Cloudinary_Cloudinary_Model_Resource_Media_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
 
4
  {
5
 
6
  protected function _construct()
app/code/community/Cloudinary/Cloudinary/Model/Resource/Media/Collection/Interface.php DELETED
@@ -1,8 +0,0 @@
1
- <?php
2
-
3
- interface Cloudinary_Cloudinary_Model_Resource_Media_Collection_Interface
4
- {
5
-
6
- public function getSize();
7
-
8
- }
 
 
 
 
 
 
 
 
app/code/community/Cloudinary/Cloudinary/Model/Resource/Synchronisation/Collection.php CHANGED
@@ -4,7 +4,7 @@ use CloudinaryExtension\Migration\SynchronizedMediaRepository;
4
 
5
  class Cloudinary_Cloudinary_Model_Resource_Synchronisation_Collection
6
  extends Mage_Core_Model_Resource_Db_Collection_Abstract
7
- implements SynchronizedMediaRepository, Cloudinary_Cloudinary_Model_Resource_Media_Collection_Interface
8
  {
9
 
10
  protected function _construct()
@@ -33,8 +33,10 @@ class Cloudinary_Cloudinary_Model_Resource_Synchronisation_Collection
33
 
34
  public function findUnsynchronisedImages($limit=200)
35
  {
 
 
36
  $this->getSelect()
37
- ->joinRight('catalog_product_entity_media_gallery', 'value_id=media_gallery_id', '*')
38
  ->where('cloudinary_synchronisation_id is null')
39
  ->limit($limit)
40
  ;
4
 
5
  class Cloudinary_Cloudinary_Model_Resource_Synchronisation_Collection
6
  extends Mage_Core_Model_Resource_Db_Collection_Abstract
7
+ implements SynchronizedMediaRepository
8
  {
9
 
10
  protected function _construct()
33
 
34
  public function findUnsynchronisedImages($limit=200)
35
  {
36
+ $tableName = Mage::getSingleton('core/resource')->getTableName('cloudinary_cloudinary/catalog_media_gallery');
37
+
38
  $this->getSelect()
39
+ ->joinRight($tableName, 'value_id=media_gallery_id', '*')
40
  ->where('cloudinary_synchronisation_id is null')
41
  ->limit($limit)
42
  ;
app/code/community/Cloudinary/Cloudinary/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Cloudinary_Cloudinary>
5
- <version>0.1.1</version>
6
  </Cloudinary_Cloudinary>
7
  </modules>
8
  <global>
@@ -41,6 +41,9 @@
41
  <migration>
42
  <table>cloudinary_migration</table>
43
  </migration>
 
 
 
44
  </entities>
45
  </cloudinary_resource>
46
  </models>
@@ -166,4 +169,4 @@
166
  </updates>
167
  </layout>
168
  </adminhtml>
169
- </config>
2
  <config>
3
  <modules>
4
  <Cloudinary_Cloudinary>
5
+ <version>1.1.0</version>
6
  </Cloudinary_Cloudinary>
7
  </modules>
8
  <global>
41
  <migration>
42
  <table>cloudinary_migration</table>
43
  </migration>
44
+ <catalog_media_gallery>
45
+ <table>catalog_product_entity_media_gallery</table>
46
+ </catalog_media_gallery>
47
  </entities>
48
  </cloudinary_resource>
49
  </models>
169
  </updates>
170
  </layout>
171
  </adminhtml>
172
+ </config>
lib/Cloudinary/Api.php CHANGED
@@ -222,7 +222,7 @@ class Api {
222
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
223
  curl_setopt($ch, CURLOPT_USERPWD, "{$api_key}:{$api_secret}");
224
  curl_setopt($ch, CURLOPT_CAINFO,realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."cacert.pem");
225
- curl_setopt($ch, CURLOPT_USERAGENT, \Cloudinary::USER_AGENT);
226
  curl_setopt($ch, CURLOPT_PROXY, \Cloudinary::option_get($options, "api_proxy", \Cloudinary::config_get("api_proxy")));
227
  $response = $this->execute($ch);
228
  $curl_error = NULL;
@@ -246,6 +246,7 @@ class Api {
246
 
247
  # Based on http://snipplr.com/view/17242/
248
  protected function execute($ch) {
 
249
  $string = curl_exec($ch);
250
  $headers = array();
251
  $content = '';
222
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
223
  curl_setopt($ch, CURLOPT_USERPWD, "{$api_key}:{$api_secret}");
224
  curl_setopt($ch, CURLOPT_CAINFO,realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."cacert.pem");
225
+ curl_setopt($ch, CURLOPT_USERAGENT, \Cloudinary::userAgent());
226
  curl_setopt($ch, CURLOPT_PROXY, \Cloudinary::option_get($options, "api_proxy", \Cloudinary::config_get("api_proxy")));
227
  $response = $this->execute($ch);
228
  $curl_error = NULL;
246
 
247
  # Based on http://snipplr.com/view/17242/
248
  protected function execute($ch) {
249
+ \Mage::log(\Cloudinary::userAgent());
250
  $string = curl_exec($ch);
251
  $headers = array();
252
  $content = '';
lib/Cloudinary/Cloudinary.php CHANGED
@@ -6,14 +6,48 @@ class Cloudinary {
6
  const OLD_AKAMAI_SHARED_CDN = "cloudinary-a.akamaihd.net";
7
  const AKAMAI_SHARED_CDN = "res.cloudinary.com";
8
  const SHARED_CDN = "res.cloudinary.com";
9
- const VERSION = "1.0.17";
10
- const USER_AGENT = "cld-php-1.0.17";
11
  const BLANK = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  public static $DEFAULT_RESPONSIVE_WIDTH_TRANSFORMATION = array("width"=>"auto", "crop"=>"limit");
13
 
14
  private static $config = NULL;
15
  public static $JS_CONFIG_PARAMS = array("api_key", "cloud_name", "private_cdn", "secure_distribution", "cdn_subdomain");
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  public static function config($values = NULL) {
18
  if (self::$config == NULL) {
19
  self::reset_config();
@@ -115,9 +149,8 @@ class Cloudinary {
115
  }
116
 
117
  private static function generate_base_transformation($base_transformation) {
118
- return is_array($base_transformation) ?
119
- Cloudinary::generate_transformation_string($base_transformation) :
120
- Cloudinary::generate_transformation_string(array("transformation"=>$base_transformation));
121
  }
122
 
123
  // Warning: $options are being destructively updated!
@@ -174,10 +207,56 @@ class Cloudinary {
174
  $flags = implode(Cloudinary::build_array(Cloudinary::option_consume($options, "flags")), ".");
175
  $dpr = Cloudinary::option_consume($options, "dpr", Cloudinary::config_get("dpr"));
176
 
177
- $params = array("w"=>$width, "h"=>$height, "t"=>$named_transformation, "c"=>$crop, "b"=>$background, "co"=>$color, "e"=>$effect, "bo"=>$border, "a"=>$angle, "fl"=>$flags, "dpr"=>$dpr);
178
- $simple_params = array("x"=>"x", "y"=>"y", "r"=>"radius", "d"=>"default_image", "g"=>"gravity",
179
- "q"=>"quality", "p"=>"prefix", "l"=>"overlay", "u"=>"underlay", "f"=>"fetch_format",
180
- "dn"=>"density", "pg"=>"page", "dl"=>"delay", "cs"=>"color_space", "o"=>"opacity");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  foreach ($simple_params as $param=>$option) {
182
  $params[$param] = Cloudinary::option_consume($options, $option);
183
  }
@@ -202,6 +281,48 @@ class Cloudinary {
202
  }
203
  return implode("/", array_filter($base_transformations));
204
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
 
206
  // Warning: $options are being destructively updated!
207
  public static function cloudinary_url($source, &$options=array()) {
@@ -344,12 +465,12 @@ class Cloudinary {
344
  $shared_domain = ($secure_distribution == Cloudinary::SHARED_CDN);
345
  }
346
 
347
- if (empty($secure_cdn_subdomain) && $shared_domain) {
348
  $secure_cdn_subdomain = $cdn_subdomain ;
349
  }
350
 
351
  if ($secure_cdn_subdomain) {
352
- $secure_distribution = str_replace('res.cloudinary.com', "res-" . ((crc32($source) % 5) + 1) . "cloudinary.com", $secure_distribution);
353
  }
354
 
355
  $prefix = "https://" . $secure_distribution;
@@ -459,10 +580,30 @@ class Cloudinary {
459
  $to_sign = implode("&", array_map($join_pair, array_keys($params), array_values($params)));
460
  return sha1($to_sign . $api_secret);
461
  }
462
- public static function html_attrs($options) {
463
- ksort($options);
464
- $join_pair = function($key, $value) { return $key . "='" . $value . "'"; };
465
- return implode(" ", array_map($join_pair, array_keys($options), array_values($options)));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
466
  }
467
  }
468
 
6
  const OLD_AKAMAI_SHARED_CDN = "cloudinary-a.akamaihd.net";
7
  const AKAMAI_SHARED_CDN = "res.cloudinary.com";
8
  const SHARED_CDN = "res.cloudinary.com";
 
 
9
  const BLANK = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
10
+ const RANGE_VALUE_RE = '/^(?P<value>(\d+\.)?\d+)(?P<modifier>[%pP])?$/';
11
+ const RANGE_RE = '/^(\d+\.)?\d+[%pP]?\.\.(\d+\.)?\d+[%pP]?$/';
12
+
13
+ const VERSION = "1.1.1";
14
+ /** @internal Do not change this value */
15
+ const USER_AGENT = "CloudinaryPHP/1.1.1";
16
+
17
+ /**
18
+ * Additional information to be passed with the USER_AGENT, e.g. "CloudinaryMagento/1.0.1". This value is set in platform-specific
19
+ * implementations that use cloudinary_php.
20
+ *
21
+ * The format of the value should be <ProductName>/Version[ (comment)].
22
+ * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43
23
+ *
24
+ * <b>Do not set this value in application code!</b>
25
+ *
26
+ * @var string
27
+ */
28
+ public static $USER_PLATFORM = "";
29
+
30
  public static $DEFAULT_RESPONSIVE_WIDTH_TRANSFORMATION = array("width"=>"auto", "crop"=>"limit");
31
 
32
  private static $config = NULL;
33
  public static $JS_CONFIG_PARAMS = array("api_key", "cloud_name", "private_cdn", "secure_distribution", "cdn_subdomain");
34
 
35
+ /**
36
+ * Provides the USER_AGENT string that is passed to the Cloudinary servers.
37
+ *
38
+ * Prepends {@link $USER_PLATFORM} if it is defined.
39
+ *
40
+ * @return string
41
+ */
42
+ public static function userAgent()
43
+ {
44
+ if (self::$USER_PLATFORM == "") {
45
+ return self::USER_AGENT;
46
+ } else {
47
+ return self::$USER_PLATFORM . " " . self::USER_AGENT;
48
+ }
49
+ }
50
+
51
  public static function config($values = NULL) {
52
  if (self::$config == NULL) {
53
  self::reset_config();
149
  }
150
 
151
  private static function generate_base_transformation($base_transformation) {
152
+ $options = is_array($base_transformation) ? $base_transformation : array("transformation"=>$base_transformation);
153
+ return Cloudinary::generate_transformation_string($options);
 
154
  }
155
 
156
  // Warning: $options are being destructively updated!
207
  $flags = implode(Cloudinary::build_array(Cloudinary::option_consume($options, "flags")), ".");
208
  $dpr = Cloudinary::option_consume($options, "dpr", Cloudinary::config_get("dpr"));
209
 
210
+ $duration = Cloudinary::norm_range_value(Cloudinary::option_consume($options, "duration"));
211
+ $start_offset = Cloudinary::norm_range_value(Cloudinary::option_consume($options, "start_offset"));
212
+ $end_offset = Cloudinary::norm_range_value(Cloudinary::option_consume($options, "end_offset"));
213
+ $offset = Cloudinary::split_range(Cloudinary::option_consume($options, "offset"));
214
+ if (!empty($offset)) {
215
+ $start_offset = Cloudinary::norm_range_value($offset[0]);
216
+ $end_offset = Cloudinary::norm_range_value($offset[1]);
217
+ }
218
+
219
+ $video_codec = Cloudinary::process_video_codec_param(Cloudinary::option_consume($options, "video_codec"));
220
+
221
+ $params = array(
222
+ "a" => $angle,
223
+ "b" => $background,
224
+ "bo" => $border,
225
+ "c" => $crop,
226
+ "co" => $color,
227
+ "dpr" => $dpr,
228
+ "du" => $duration,
229
+ "e" => $effect,
230
+ "eo" => $end_offset,
231
+ "fl" => $flags,
232
+ "h" => $height,
233
+ "so" => $start_offset,
234
+ "t" => $named_transformation,
235
+ "vc" => $video_codec,
236
+ "w" => $width);
237
+
238
+ $simple_params = array(
239
+ "ac" => "audio_codec",
240
+ "af" => "audio_frequency",
241
+ "br" => "bit_rate",
242
+ "cs" => "color_space",
243
+ "d" => "default_image",
244
+ "dl" => "delay",
245
+ "dn" => "density",
246
+ "f" => "fetch_format",
247
+ "g" => "gravity",
248
+ "l" => "overlay",
249
+ "o" => "opacity",
250
+ "p" => "prefix",
251
+ "pg" => "page",
252
+ "q" => "quality",
253
+ "r" => "radius",
254
+ "u" => "underlay",
255
+ "vs" => "video_sampling",
256
+ "x" => "x",
257
+ "y" => "y",
258
+ "z" => "zoom");
259
+
260
  foreach ($simple_params as $param=>$option) {
261
  $params[$param] = Cloudinary::option_consume($options, $option);
262
  }
281
  }
282
  return implode("/", array_filter($base_transformations));
283
  }
284
+
285
+ private static function split_range($range) {
286
+ if (is_array($range) && count($range) >= 2) {
287
+ return array($range[0], end($range));
288
+ } else if (is_string($range) && preg_match(Cloudinary::RANGE_RE, $range) == 1) {
289
+ return explode("..", $range, 2);
290
+ } else {
291
+ return NULL;
292
+ }
293
+ }
294
+
295
+ private static function norm_range_value($value) {
296
+ if (empty($value)) {
297
+ return NULL;
298
+ }
299
+
300
+ preg_match(Cloudinary::RANGE_VALUE_RE, $value, $matches);
301
+
302
+ if (empty($matches)) {
303
+ return NULL;
304
+ }
305
+
306
+ $modifier = '';
307
+ if (!empty($matches['modifier'])) {
308
+ $modifier = 'p';
309
+ }
310
+ return $matches['value'] . $modifier;
311
+ }
312
+
313
+ private static function process_video_codec_param($param) {
314
+ $out_param = $param;
315
+ if (is_array($out_param)) {
316
+ $out_param = $param['codec'];
317
+ if (array_key_exists('profile', $param)) {
318
+ $out_param = $out_param . ':' . $param['profile'];
319
+ if (array_key_exists('level', $param)) {
320
+ $out_param = $out_param . ':' . $param['level'];
321
+ }
322
+ }
323
+ }
324
+ return $out_param;
325
+ }
326
 
327
  // Warning: $options are being destructively updated!
328
  public static function cloudinary_url($source, &$options=array()) {
465
  $shared_domain = ($secure_distribution == Cloudinary::SHARED_CDN);
466
  }
467
 
468
+ if (is_null($secure_cdn_subdomain) && $shared_domain) {
469
  $secure_cdn_subdomain = $cdn_subdomain ;
470
  }
471
 
472
  if ($secure_cdn_subdomain) {
473
+ $secure_distribution = str_replace('res.cloudinary.com', "res-" . ((crc32($source) % 5) + 1) . ".cloudinary.com", $secure_distribution);
474
  }
475
 
476
  $prefix = "https://" . $secure_distribution;
580
  $to_sign = implode("&", array_map($join_pair, array_keys($params), array_values($params)));
581
  return sha1($to_sign . $api_secret);
582
  }
583
+
584
+ public static function html_attrs($options, $only = NULL) {
585
+ $attrs = array();
586
+ foreach($options as $k => $v) {
587
+ $key = $k;
588
+ $value = $v;
589
+ if (is_int($k)) {
590
+ $key = $v;
591
+ $value = "";
592
+ }
593
+ if (is_array($only) && array_search($key, $only) !== FALSE || !is_array($only)) {
594
+ $attrs[$key] = $value;
595
+ }
596
+ }
597
+ ksort($attrs);
598
+
599
+ $join_pair = function($key, $value) {
600
+ $out = $key;
601
+ if (!empty($value)) {
602
+ $out .= '=\'' . $value . '\'';
603
+ }
604
+ return $out;
605
+ };
606
+ return implode(" ", array_map($join_pair, array_keys($attrs), array_values($attrs)));
607
  }
608
  }
609
 
lib/Cloudinary/Helpers.php CHANGED
@@ -4,7 +4,8 @@ namespace {
4
  function cl_upload_url($options = array())
5
  {
6
  if (!@$options["resource_type"]) $options["resource_type"] = "auto";
7
- return Cloudinary::cloudinary_api_url("upload", $options);
 
8
  }
9
 
10
  function cl_upload_tag_params($options = array())
@@ -24,6 +25,11 @@ namespace {
24
  }
25
 
26
  function cl_image_upload_tag($field, $options = array())
 
 
 
 
 
27
  {
28
  $html_options = Cloudinary::option_get($options, "html", array());
29
 
@@ -37,6 +43,7 @@ namespace {
37
  "data-cloudinary-field" => $field,
38
  "class" => implode(" ", $classes),
39
  ));
 
40
  return '<input ' . Cloudinary::html_attrs($tag_options) . '/>';
41
  }
42
 
@@ -148,4 +155,94 @@ namespace {
148
  return "<link rel='stylesheet' type='text/css' href='" . cl_sprite_url($tag, $options) . "'>";
149
  }
150
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  }
4
  function cl_upload_url($options = array())
5
  {
6
  if (!@$options["resource_type"]) $options["resource_type"] = "auto";
7
+ $endpoint = array_key_exists('chunk_size', $options) ? 'upload_chunked' : 'upload';
8
+ return Cloudinary::cloudinary_api_url($endpoint, $options);
9
  }
10
 
11
  function cl_upload_tag_params($options = array())
25
  }
26
 
27
  function cl_image_upload_tag($field, $options = array())
28
+ {
29
+ return cl_upload_tag($field, $options);
30
+ }
31
+
32
+ function cl_upload_tag($field, $options = array())
33
  {
34
  $html_options = Cloudinary::option_get($options, "html", array());
35
 
43
  "data-cloudinary-field" => $field,
44
  "class" => implode(" ", $classes),
45
  ));
46
+ if (array_key_exists('chunk_size', $options)) $tag_options['data-max-chunk-size'] = $options['chunk_size'];
47
  return '<input ' . Cloudinary::html_attrs($tag_options) . '/>';
48
  }
49
 
155
  return "<link rel='stylesheet' type='text/css' href='" . cl_sprite_url($tag, $options) . "'>";
156
  }
157
 
158
+ function default_poster_options() { return array( 'format' => 'jpg', 'resource_type' => 'video' ); }
159
+ function default_source_types() { return array('webm', 'mp4', 'ogv'); }
160
+ # Returns a url for the given source with +options+
161
+ function cl_video_path($source, $options = array()) {
162
+ $options = array_merge( array('resource_type' => 'video'), $options);
163
+ return cloudinary_url_internal($source, $options);
164
+ }
165
+
166
+ # Returns an HTML <tt>img</tt> tag with the thumbnail for the given video +source+ and +options+
167
+ function cl_video_thumbnail_tag($source, $options = array()) {
168
+ return cl_image_tag($source, array_merge(default_poster_options(),$options));
169
+ }
170
+
171
+ # Returns a url for the thumbnail for the given video +source+ and +options+
172
+ function cl_video_thumbnail_path($source, $options = array()) {
173
+ $options = array_merge(default_poster_options(), $options);
174
+ return cloudinary_url_internal($source, $options);
175
+ }
176
+
177
+ # Creates an HTML video tag for the provided +source+
178
+ #
179
+ # ==== Options
180
+ # * <tt>source_types</tt> - Specify which source type the tag should include. defaults to webm, mp4 and ogv.
181
+ # * <tt>source_transformation</tt> - specific transformations to use for a specific source type.
182
+ # * <tt>poster</tt> - override default thumbnail:
183
+ # * url: provide an ad hoc url
184
+ # * options: with specific poster transformations and/or Cloudinary +:public_id+
185
+ #
186
+ # ==== Examples
187
+ # cl_video_tag("mymovie.mp4")
188
+ # cl_video_tag("mymovie.mp4", array('source_types' => 'webm'))
189
+ # cl_video_tag("mymovie.ogv", array('poster' => "myspecialplaceholder.jpg"))
190
+ # cl_video_tag("mymovie.webm", array('source_types' => array('webm', 'mp4'), 'poster' => array('effect' => 'sepia')))
191
+ function cl_video_tag($source, $options = array()) {
192
+ $source = preg_replace('/\.(' . implode('|', default_source_types()) . ')$/', '', $source);
193
+
194
+ $source_types = Cloudinary::option_consume($options, 'source_types', array());
195
+ $source_transformation = Cloudinary::option_consume($options, 'source_transformation', array());
196
+ $fallback = Cloudinary::option_consume($options, 'fallback_content', '');
197
+
198
+ if (empty($source_types)) {
199
+ $source_types = default_source_types();
200
+ }
201
+ $video_options = $options;
202
+
203
+ if (array_key_exists('poster', $video_options)) {
204
+ if (is_array($video_options['poster'])) {
205
+ if (array_key_exists('public_id', $video_options['poster'])) {
206
+ $video_options['poster'] = cloudinary_url_internal($video_options['poster']['public_id'], $video_options['poster']);
207
+ } else {
208
+ $video_options['poster'] = cl_video_thumbnail_path($source, $video_options['poster']);
209
+ }
210
+ }
211
+ } else {
212
+ $video_options['poster'] = cl_video_thumbnail_path($source, $options);
213
+ }
214
+
215
+ if (empty($video_options['poster'])) unset($video_options['poster']);
216
+
217
+
218
+ $html = '<video ';
219
+
220
+ if (!array_key_exists('resource_type', $video_options)) $video_options['resource_type'] = 'video';
221
+ $multi_source = is_array($source_types);
222
+ if (!$multi_source){
223
+ $source .= '.' . $source_types;
224
+ }
225
+ $src = cloudinary_url_internal($source, $video_options);
226
+ if (!$multi_source) $video_options['src'] = $src;
227
+ if (isset($video_options["html_width"])) $video_options['width'] = Cloudinary::option_consume($video_options, 'html_width');
228
+ if (isset($video_options['html_height'])) $video_options['height'] = Cloudinary::option_consume($video_options, 'html_height');
229
+ $html .= Cloudinary::html_attrs($video_options ) . '>';
230
+
231
+ if ($multi_source) {
232
+
233
+ foreach($source_types as $source_type) {
234
+ $transformation = Cloudinary::option_consume($source_transformation, $source_type, array());
235
+ $transformation = array_merge($options, $transformation);
236
+ $src = cl_video_path($source . '.' . $source_type, $transformation);
237
+ $video_type = (($source_type == 'ogv') ? 'ogg' : $source_type);
238
+ $mime_type = "video/$video_type";
239
+ $html .= '<source '. Cloudinary::html_attrs(array('src' => $src, 'type' => $mime_type)) . '>';
240
+ }
241
+
242
+ }
243
+
244
+ $html .= $fallback;
245
+ $html .= '</video>';
246
+ return $html;
247
+ }
248
  }
lib/Cloudinary/Uploader.php CHANGED
@@ -65,17 +65,31 @@ namespace Cloudinary {
65
  public static function upload_large($file, $options=array())
66
  {
67
  $src = fopen($file, 'r');
68
- $temp_file_name = tempnam(sys_get_temp_dir(), 'cldupload.' + pathinfo($file, PATHINFO_EXTENSION));
69
  $upload = $upload_id = NULL;
70
- $public_id = \Cloudinary::option_get($upload, "public_id");
71
- $index = 1;
 
 
72
  while (!feof($src)) {
 
 
 
 
73
  $dest = fopen($temp_file_name, 'w');
74
- stream_copy_to_stream($src, $dest, 20000000);
75
  fclose($dest);
 
 
 
 
 
 
 
 
76
  try {
77
  $upload = Uploader::upload_large_part($temp_file_name, array_merge($options,
78
- array("public_id"=>$public_id, "upload_id"=>$upload_id, "part_number"=>$index, "final"=>feof($src))));
79
  } catch(\Exception $e) {
80
  unlink($temp_file_name);
81
  fclose($src);
@@ -94,17 +108,8 @@ namespace Cloudinary {
94
  // Upload large raw files. Note that public_id should include an extension for best results.
95
  public static function upload_large_part($file, $options=array())
96
  {
97
- $params = array(
98
- "timestamp" => time(),
99
- "type" => \Cloudinary::option_get($options, "type"),
100
- "backup" => \Cloudinary::option_get($options, "backup"),
101
- "final" => \Cloudinary::option_get($options, "final"),
102
- "part_number" => \Cloudinary::option_get($options, "part_number"),
103
- "upload_id" => \Cloudinary::option_get($options, "upload_id"),
104
- "tags" => implode(",", \Cloudinary::build_array(\Cloudinary::option_get($options, "tags"))),
105
- "public_id" => \Cloudinary::option_get($options, "public_id")
106
- );
107
- return Uploader::call_api("upload_large", $params, array_merge($options, array("resource_type" => "raw")), $file);
108
  }
109
 
110
  public static function destroy($public_id, $options = array())
@@ -138,6 +143,8 @@ namespace Cloudinary {
138
  "type" => \Cloudinary::option_get($options, "type"),
139
  "callback" => \Cloudinary::option_get($options, "callback"),
140
  "eager" => Uploader::build_eager(\Cloudinary::option_get($options, "eager")),
 
 
141
  "headers" => Uploader::build_custom_headers(\Cloudinary::option_get($options, "headers")),
142
  "tags" => \Cloudinary::encode_array(\Cloudinary::option_get($options, "tags")),
143
  "face_coordinates" => \Cloudinary::encode_double_array(\Cloudinary::option_get($options, "face_coordinates")),
@@ -245,7 +252,7 @@ namespace Cloudinary {
245
 
246
  $post_params = array();
247
  if ($file) {
248
- if (!preg_match('/^@|^https?:|^s3:|^data:[^;]*;base64,([a-zA-Z0-9\/+\n=]+)$/', $file)) {
249
  if (function_exists("curl_file_create")) {
250
  $post_params['file'] = curl_file_create($file);
251
  $post_params['file']->setPostFilename($file);
@@ -258,13 +265,19 @@ namespace Cloudinary {
258
  }
259
 
260
  curl_setopt($ch, CURLOPT_POST, true);
261
- curl_setopt($ch, CURLOPT_TIMEOUT, 60);
 
262
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
263
  curl_setopt($ch, CURLOPT_CAINFO,realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."cacert.pem");
264
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
265
- curl_setopt($ch, CURLOPT_USERAGENT, \Cloudinary::USER_AGENT);
266
  curl_setopt($ch, CURLOPT_PROXY, \Cloudinary::option_get($options, "api_proxy", \Cloudinary::config_get("api_proxy")));
267
-
 
 
 
 
 
268
  $response = curl_exec($ch);
269
  $curl_error = NULL;
270
  if(curl_errno($ch))
65
  public static function upload_large($file, $options=array())
66
  {
67
  $src = fopen($file, 'r');
68
+ $temp_file_name = tempnam(sys_get_temp_dir(), 'cldupload.' . pathinfo($file, PATHINFO_EXTENSION));
69
  $upload = $upload_id = NULL;
70
+ $chunk_size = \Cloudinary::option_get($options, "chunk_size", 20000000);
71
+ $public_id = \Cloudinary::option_get($options, "public_id");
72
+ $index = 0;
73
+ $file_size = filesize($file);
74
  while (!feof($src)) {
75
+ $current_loc = $index * $chunk_size;
76
+ if ($current_loc >= $file_size) {
77
+ break;
78
+ }
79
  $dest = fopen($temp_file_name, 'w');
80
+ stream_copy_to_stream($src, $dest, $chunk_size);
81
  fclose($dest);
82
+ if (phpversion() >= "5.3.0") {
83
+ clearstatcache(TRUE, $temp_file_name);
84
+ } else {
85
+ clearstatcache();
86
+ }
87
+
88
+ $temp_file_size = filesize($temp_file_name);
89
+ $range = "bytes ". $current_loc . "-" . ($current_loc + $temp_file_size - 1) . "/" . $file_size;
90
  try {
91
  $upload = Uploader::upload_large_part($temp_file_name, array_merge($options,
92
+ array("public_id"=>$public_id, "content_range"=>$range)));
93
  } catch(\Exception $e) {
94
  unlink($temp_file_name);
95
  fclose($src);
108
  // Upload large raw files. Note that public_id should include an extension for best results.
109
  public static function upload_large_part($file, $options=array())
110
  {
111
+ $params = Uploader::build_upload_params($options);
112
+ return Uploader::call_api("upload_chunked", $params, array_merge(array("resource_type" => "raw"), $options), $file);
 
 
 
 
 
 
 
 
 
113
  }
114
 
115
  public static function destroy($public_id, $options = array())
143
  "type" => \Cloudinary::option_get($options, "type"),
144
  "callback" => \Cloudinary::option_get($options, "callback"),
145
  "eager" => Uploader::build_eager(\Cloudinary::option_get($options, "eager")),
146
+ "eager_async" => \Cloudinary::option_get($options, "eager_async"),
147
+ "eager_notification_url" => \Cloudinary::option_get($options, "eager_notification_url"),
148
  "headers" => Uploader::build_custom_headers(\Cloudinary::option_get($options, "headers")),
149
  "tags" => \Cloudinary::encode_array(\Cloudinary::option_get($options, "tags")),
150
  "face_coordinates" => \Cloudinary::encode_double_array(\Cloudinary::option_get($options, "face_coordinates")),
252
 
253
  $post_params = array();
254
  if ($file) {
255
+ if (!preg_match('/^@|^ftp:|^https?:|^s3:|^data:[^;]*;base64,([a-zA-Z0-9\/+\n=]+)$/', $file)) {
256
  if (function_exists("curl_file_create")) {
257
  $post_params['file'] = curl_file_create($file);
258
  $post_params['file']->setPostFilename($file);
265
  }
266
 
267
  curl_setopt($ch, CURLOPT_POST, true);
268
+ $timeout = \Cloudinary::option_get($options, "timeout", \Cloudinary::config_get("timeout", 60));
269
+ curl_setopt($ch, CURLOPT_TIMEOUT_MS, $timeout * 1000);
270
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
271
  curl_setopt($ch, CURLOPT_CAINFO,realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."cacert.pem");
272
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
273
+ curl_setopt($ch, CURLOPT_USERAGENT, \Cloudinary::userAgent());
274
  curl_setopt($ch, CURLOPT_PROXY, \Cloudinary::option_get($options, "api_proxy", \Cloudinary::config_get("api_proxy")));
275
+
276
+ $range = \Cloudinary::option_get($options, "content_range");
277
+ if ($range != NULL){
278
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Range: '.$range));
279
+ }
280
+ \Mage::log(\Cloudinary::userAgent());
281
  $response = curl_exec($ch);
282
  $curl_error = NULL;
283
  if(curl_errno($ch))
lib/CloudinaryExtension/CloudinaryImageProvider.php CHANGED
@@ -50,6 +50,7 @@ class CloudinaryImageProvider implements ImageProvider
50
  private function authorise()
51
  {
52
  Cloudinary::config($this->configuration->build());
 
53
  }
54
 
55
  private function getSignedValidationUrl()
50
  private function authorise()
51
  {
52
  Cloudinary::config($this->configuration->build());
53
+ Cloudinary::$USER_PLATFORM = $this->configuration->getUserPlatform();
54
  }
55
 
56
  private function getSignedValidationUrl()
lib/CloudinaryExtension/Configuration.php CHANGED
@@ -15,6 +15,8 @@ class Configuration
15
 
16
  private $cdnSubdomain = true;
17
 
 
 
18
  private function __construct(Cloud $cloud,Credentials $credentials)
19
  {
20
  $this->cdnSubdomain = false;
@@ -76,4 +78,20 @@ class Configuration
76
  "api_secret" => (string)$this->credentials->getSecret()
77
  );
78
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  }
15
 
16
  private $cdnSubdomain = true;
17
 
18
+ private $userPlatform = '';
19
+
20
  private function __construct(Cloud $cloud,Credentials $credentials)
21
  {
22
  $this->cdnSubdomain = false;
78
  "api_secret" => (string)$this->credentials->getSecret()
79
  );
80
  }
81
+
82
+ /**
83
+ * @return string
84
+ */
85
+ public function getUserPlatform()
86
+ {
87
+ return $this->userPlatform;
88
+ }
89
+
90
+ /**
91
+ * @param string $userPlatform
92
+ */
93
+ public function setUserPlatform($userPlatform)
94
+ {
95
+ $this->userPlatform = $userPlatform;
96
+ }
97
  }
lib/CloudinaryExtension/Image/Transformation/Dimensions.php CHANGED
@@ -10,8 +10,8 @@ class Dimensions
10
 
11
  private function __construct($width, $height)
12
  {
13
- $this->width = $width;
14
- $this->height = $height;
15
  }
16
 
17
  public function getWidth()
10
 
11
  private function __construct($width, $height)
12
  {
13
+ $this->width = is_null($width) ? null : (int) round($width);
14
+ $this->height = is_null($height) ? null : (int) round($height);
15
  }
16
 
17
  public function getWidth()
package.xml CHANGED
@@ -1,27 +1,21 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Cloudinary_Cloudinary</name>
4
- <version>1.0.0</version>
5
  <stability>stable</stability>
6
  <license>MIT License (MITL)</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Cloudinary - Image Management In The Cloud</summary>
10
  <description>Cloudinary supercharges your images! Upload images to the cloud, deliver optimized via a fast CDN, perform smart resizing and apply effects.</description>
11
- <notes>v1.0.0&#xD;
12
  &#xD;
13
- Release Highlights:&#xD;
14
- &#xD;
15
- * Dynamic manipulation of Magento product images to match your graphic design and theme.&#xD;
16
- * Smart image optimization for faster page loading, better user experience and reduced bandwidth costs.&#xD;
17
- * Optimized fast CDN delivery of your media files to all worldwide visitors of your site.&#xD;
18
- * Automatic product images upload and migration to the cloud.&#xD;
19
- * Access to interactive media library web interface.&#xD;
20
- </notes>
21
  <authors><author><name>Cloudinary</name><user>cloudinary</user><email>accounts+magento@cloudinary.com</email></author></authors>
22
- <date>2015-04-13</date>
23
- <time>16:38:30</time>
24
- <contents><target name="magecommunity"><dir name="Cloudinary"><dir name="Cloudinary"><dir name="Block"><dir name="Adminhtml"><dir name="Manage"><file name="Grid.php" hash="b6a05f6ba08c5ba0d08846a7b0a06776"/></dir><file name="Manage.php" hash="0e5969a1fb7ce270776c3c80fb07a072"/><dir name="Page"><file name="Menu.php" hash="891d6a4c075ba03c9a20658076c86ad0"/></dir><dir name="System"><dir name="Config"><file name="Signup.php" hash="235c27f236e45900eb94dea0181027cc"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="CloudinaryController.php" hash="e14ba0c37dafefca8347783b3616403c"/></dir></dir><dir name="data"><dir name="cloudinary_setup"><file name="data-upgrade-0.1.0-0.1.1.php" hash="4c6ce6cd9ab0d94654afb4a398fb3d6c"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="46e365e2f4b1d543aad248dfcfb99c50"/><file name="config.xml" hash="5904e6d20e05db7a5bcc1edac670ea61"/><file name="system.xml" hash="ea40bfc4a7ef533b1800d49c70bc3706"/></dir><dir name="Helper"><file name="Autoloader.php" hash="8df3153dd01755e34d547edad1449b76"/><dir name="Configuration"><file name="Validation.php" hash="6d17d39ba39f67888701fadf0fe3de62"/></dir><file name="Configuration.php" hash="a7c8b78225677973c36175927e52f3b8"/><file name="Console.php" hash="e4ca7f9bf450b05383def130b2819ce0"/><file name="Data.php" hash="42c9d44f1bbe530e30cf5379846dea65"/><file name="Image.php" hash="018d99d47230d570c40e4c4dabcdfa2f"/></dir><dir name="Model"><dir name="Catalog"><dir name="Product"><file name="Image.php" hash="3634cce83bfa42768f7dbbc2958bbe9a"/><dir name="Media"><file name="Config.php" hash="678422f87913a2ea70ec717aaa2169b1"/></dir><file name="Media.php" hash="4804b00885bfe279ee43a1b290d801da"/></dir></dir><dir name="Cms"><dir name="Adminhtml"><dir name="Template"><file name="Filter.php" hash="4ef453061d790fff6b772286e90439f2"/></dir></dir><file name="Synchronisation.php" hash="c62e3ed78d7463267951157d6ff8bdc9"/><dir name="Template"><file name="Filter.php" hash="5ec9589ef22b1e9c88b20c3272d01f8c"/></dir><file name="Uploader.php" hash="bcaca2303cf806d41bac82a009ba9eb6"/><dir name="Wysiwyg"><dir name="Images"><file name="Storage.php" hash="b3eae9a3a4810d9de5ab6a91243d047d"/></dir></dir></dir><file name="Cron.php" hash="a02414ee2fca1b1e65cb9c5fa59ee657"/><dir name="Exception"><file name="BadFilePathException.php" hash="68135da8dfe2f0589a531b4bd36e3330"/></dir><file name="Image.php" hash="4a2ee22c0ca6510b7633ef2ef3541587"/><file name="Logger.php" hash="c497bae551881533afbb08882f73e91d"/><file name="MediaCollectionCounter.php" hash="9f20a1494c52937e85ffd0869892ff78"/><file name="Migration.php" hash="e923053b36d2ab469362b3590935ecfe"/><file name="Observer.php" hash="22a8e380ac895894f218e7239560b2e2"/><file name="PreConditionsValidator.php" hash="8f5f33e3b8c7755d80ae5036848dd5ff"/><dir name="Resource"><dir name="Cms"><dir name="Synchronisation"><file name="Collection.php" hash="cb95b51d9176b48f6515507cad3a5d74"/></dir></dir><dir name="Media"><dir name="Collection"><file name="Interface.php" hash="1ab399cf089a2d6b0dbaf3f48d35abd7"/></dir><file name="Collection.php" hash="a06f9a51cf8c1b13d2d847e2799ef0d6"/></dir><file name="Migration.php" hash="69a545d0627016afc03ea097641aa749"/><dir name="Synchronisation"><file name="Collection.php" hash="02a2eccc9994cec5658e8e2dfd309142"/></dir><file name="Synchronisation.php" hash="5b721d854d8f89bc3310e46081be7153"/></dir><file name="Synchronisation.php" hash="53de366c8e304c5c0a823df1095a276c"/><file name="SynchronisedMediaUnifier.php" hash="7cd30f02d4877caff089230809699b0f"/><dir name="System"><dir name="Config"><dir name="Source"><dir name="Dropdown"><file name="Dpr.php" hash="2b9bfd5f836dbdb5d7224d298264f540"/><file name="Gravity.php" hash="c241498e2093640892170673cd7550cd"/><file name="Quality.php" hash="e0c5902f5c36c96fb8a8ba7cc741ce1f"/></dir></dir></dir></dir></dir><dir name="sql"><dir name="cloudinary_setup"><file name="install-0.1.0.php" hash="55d93b3dab573c2a932edbb5a2fa4865"/><file name="upgrade-0.1.0-0.1.1.php" hash="6c8d430fbf7b9714586b67db3d455008"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Cloudinary_Cloudinary.xml" hash="9337962a4ccf8a43164d5d71dfd2d756"/></dir></target><target name="magelib"><dir name="CloudinaryExtension"><file name="CloudinaryImageProvider.php" hash="7fbfbe13b2359353dfdf874a98e39592"/><file name="Cloud.php" hash="59b0debf9ae297e4e824e39ba819b1d1"/><file name="Configuration.php" hash="a3b9f791bd3459b56bf0a9ed93105a7b"/><file name="Credentials.php" hash="ccd2da6450df39f3218cfd64ac47103f"/><dir name="Exception"><file name="InvalidCredentials.php" hash="abecc635a25f6c9896c605ad16e1f7d7"/></dir><dir name="Image"><file name="Synchronizable.php" hash="dffcdc40ed5a5cde556ef200d3c544ba"/><dir name="Transformation"><file name="Dimensions.php" hash="b80ce98ede5c2008da399023ac8f9cd3"/><file name="Dpr.php" hash="f78cd1bfabaf3088ca8d4af972bfd453"/><file name="FetchFormat.php" hash="b81c62dd756dee4ad085ee6f0a83356a"/><file name="Format.php" hash="ab8ea9b6a8c813a24f23b079ea6236da"/><file name="Gravity.php" hash="c1c2adf4dbbeaa6b06d67d2014300559"/><file name="Quality.php" hash="23a857f3910aecf6e45645194ff7f54e"/></dir><file name="Transformation.php" hash="fc443a6abad4a478e94df5661e4aef12"/></dir><file name="Image.php" hash="ea59732b244899cb5b69b3e3e86cffee"/><file name="ImageProvider.php" hash="f4eb49d5e1e4c1728a5dde29b6b5a3fa"/><dir name="Migration"><file name="BatchUploader.php" hash="7cd66596475070673e2467506a9b86ed"/><file name="Logger.php" hash="69f5416f6a3176907b40fce72c2d6e23"/><file name="Queue.php" hash="add92864192b0950c29c91ffe5e5a3ee"/><file name="SynchronizedMediaRepository.php" hash="9e7e1dae66b40ce991b0e86ecdff4c24"/><file name="Task.php" hash="ac11d06c531d48b38cf88f6e8f2bdc19"/></dir><dir name="Security"><file name="ApiSignature.php" hash="049c7db2684ec2a6cf5bb4efcd064951"/><file name="CloudinaryEnvironmentVariable.php" hash="2b5c28381b52350586ea1589854ca498"/><file name="ConsoleUrl.php" hash="4e748cfe0f5a0aeab2307c623179c6f9"/><file name="EnvironmentVariable.php" hash="297fa60b819ffc028b9a32dae6eef63d"/><file name="Key.php" hash="ac3a50b59f2a7db1edcf30386759c7ec"/><file name="Secret.php" hash="b1010679976575d57752dbb07f1b94ed"/><file name="SignedConsoleUrl.php" hash="791e1f1080be23423c2ad87f431f6221"/></dir><file name="ValidateRemoteUrlRequest.php" hash="c2e2eb712e5293ad508a23610dfbbd6d"/></dir><dir name="Cloudinary"><file name="Api.php" hash="379d88082229a03372cbc57c1350a476"/><file name="cacert.pem" hash="c4290b9deb70d0bef2f88b67fc68c8ec"/><file name="CloudinaryField.php" hash="411714580d21b58115ab07737367173a"/><file name="Cloudinary.php" hash="18d39ee53fa1c23561e499367dcb0fe7"/><file name="Helpers.php" hash="913f4d02f97c8dc5c763a692cff3a57b"/><file name="PreloadedFile.php" hash="73cc9e276f96553814f05eae592d11ee"/><file name="Uploader.php" hash="e9aecbc6a72e999f46d20d0cbc9ebe72"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="cloudinary"><file name="cloudinary.xml" hash="8cf333ec4b49c684ea6a209061f5128b"/></dir></dir><dir name="template"><dir name="cloudinary"><file name="manage.phtml" hash="c5a74ed0528f36b409039d5fbdeb8cb9"/><dir name="system"><dir name="config"><file name="signup.phtml" hash="2a0e06990eb542f22531ac2ebb5996f5"/></dir></dir></dir></dir></dir></dir></dir></target></contents>
25
  <compatible/>
26
  <dependencies><required><php><min>5.4.0</min><max>7.0.0</max></php></required></dependencies>
27
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Cloudinary_Cloudinary</name>
4
+ <version>1.1.0</version>
5
  <stability>stable</stability>
6
  <license>MIT License (MITL)</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Cloudinary - Image Management In The Cloud</summary>
10
  <description>Cloudinary supercharges your images! Upload images to the cloud, deliver optimized via a fast CDN, perform smart resizing and apply effects.</description>
11
+ <notes>v1.1.0&#xD;
12
  &#xD;
13
+ * Fix bug when image sizes contain a decimal point&#xD;
14
+ * Update to latest Cloudinary PHP Library</notes>
 
 
 
 
 
 
15
  <authors><author><name>Cloudinary</name><user>cloudinary</user><email>accounts+magento@cloudinary.com</email></author></authors>
16
+ <date>2015-06-08</date>
17
+ <time>13:05:01</time>
18
+ <contents><target name="magecommunity"><dir name="Cloudinary"><dir name="Cloudinary"><dir name="Block"><dir name="Adminhtml"><dir name="Manage"><file name="Grid.php" hash="b6a05f6ba08c5ba0d08846a7b0a06776"/></dir><file name="Manage.php" hash="0e5969a1fb7ce270776c3c80fb07a072"/><dir name="Page"><file name="Menu.php" hash="891d6a4c075ba03c9a20658076c86ad0"/></dir><dir name="System"><dir name="Config"><file name="Signup.php" hash="235c27f236e45900eb94dea0181027cc"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="CloudinaryController.php" hash="e14ba0c37dafefca8347783b3616403c"/></dir></dir><dir name="data"><dir name="cloudinary_setup"><file name="data-upgrade-0.1.0-0.1.1.php" hash="4c6ce6cd9ab0d94654afb4a398fb3d6c"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="46e365e2f4b1d543aad248dfcfb99c50"/><file name="config.xml" hash="76e9a03863c9599d13adcb2d2a834778"/><file name="system.xml" hash="ea40bfc4a7ef533b1800d49c70bc3706"/></dir><dir name="Helper"><file name="Autoloader.php" hash="393b3e2fc25e63ca28157152d2542b18"/><dir name="Configuration"><file name="Validation.php" hash="6d17d39ba39f67888701fadf0fe3de62"/></dir><file name="Configuration.php" hash="a5c02c7b02a0c263d9f6b8f58b08e746"/><file name="Console.php" hash="e4ca7f9bf450b05383def130b2819ce0"/><file name="Data.php" hash="42c9d44f1bbe530e30cf5379846dea65"/><file name="Image.php" hash="018d99d47230d570c40e4c4dabcdfa2f"/></dir><dir name="Model"><dir name="Catalog"><dir name="Product"><file name="Image.php" hash="3634cce83bfa42768f7dbbc2958bbe9a"/><dir name="Media"><file name="Config.php" hash="678422f87913a2ea70ec717aaa2169b1"/></dir><file name="Media.php" hash="4804b00885bfe279ee43a1b290d801da"/></dir></dir><dir name="Cms"><dir name="Adminhtml"><dir name="Template"><file name="Filter.php" hash="4ef453061d790fff6b772286e90439f2"/></dir></dir><file name="Synchronisation.php" hash="c62e3ed78d7463267951157d6ff8bdc9"/><dir name="Template"><file name="Filter.php" hash="5ec9589ef22b1e9c88b20c3272d01f8c"/></dir><file name="Uploader.php" hash="bcaca2303cf806d41bac82a009ba9eb6"/><dir name="Wysiwyg"><dir name="Images"><file name="Storage.php" hash="b3eae9a3a4810d9de5ab6a91243d047d"/></dir></dir></dir><file name="Cron.php" hash="a02414ee2fca1b1e65cb9c5fa59ee657"/><dir name="Exception"><file name="BadFilePathException.php" hash="68135da8dfe2f0589a531b4bd36e3330"/></dir><file name="Image.php" hash="4a2ee22c0ca6510b7633ef2ef3541587"/><file name="Logger.php" hash="c497bae551881533afbb08882f73e91d"/><file name="MediaCollectionCounter.php" hash="a7772d711b6d5fcdde2fa042fc1f7b1d"/><file name="Migration.php" hash="e923053b36d2ab469362b3590935ecfe"/><file name="Observer.php" hash="22a8e380ac895894f218e7239560b2e2"/><file name="PreConditionsValidator.php" hash="8f5f33e3b8c7755d80ae5036848dd5ff"/><dir name="Resource"><dir name="Cms"><dir name="Synchronisation"><file name="Collection.php" hash="94108abee4e5e4a0a7534bfbb7f7e85b"/></dir></dir><dir name="Media"><file name="Collection.php" hash="1805b96c4ad84aa72862b605054ecdfb"/></dir><file name="Migration.php" hash="69a545d0627016afc03ea097641aa749"/><dir name="Synchronisation"><file name="Collection.php" hash="04fe388bb68b38248922884f80126e80"/></dir><file name="Synchronisation.php" hash="5b721d854d8f89bc3310e46081be7153"/></dir><file name="Synchronisation.php" hash="53de366c8e304c5c0a823df1095a276c"/><file name="SynchronisedMediaUnifier.php" hash="7cd30f02d4877caff089230809699b0f"/><dir name="System"><dir name="Config"><dir name="Source"><dir name="Dropdown"><file name="Dpr.php" hash="2b9bfd5f836dbdb5d7224d298264f540"/><file name="Gravity.php" hash="c241498e2093640892170673cd7550cd"/><file name="Quality.php" hash="e0c5902f5c36c96fb8a8ba7cc741ce1f"/></dir></dir></dir></dir></dir><dir name="sql"><dir name="cloudinary_setup"><file name="install-0.1.0.php" hash="55d93b3dab573c2a932edbb5a2fa4865"/><file name="upgrade-0.1.0-0.1.1.php" hash="6c8d430fbf7b9714586b67db3d455008"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Cloudinary_Cloudinary.xml" hash="9337962a4ccf8a43164d5d71dfd2d756"/></dir></target><target name="magelib"><dir name="CloudinaryExtension"><file name="CloudinaryImageProvider.php" hash="4142e17a23c4a36380a8efeae504cf0c"/><file name="Cloud.php" hash="59b0debf9ae297e4e824e39ba819b1d1"/><file name="Configuration.php" hash="b4ece3c87e2aa2af83b8362311ad7850"/><file name="Credentials.php" hash="ccd2da6450df39f3218cfd64ac47103f"/><dir name="Exception"><file name="InvalidCredentials.php" hash="abecc635a25f6c9896c605ad16e1f7d7"/></dir><dir name="Image"><file name="Synchronizable.php" hash="dffcdc40ed5a5cde556ef200d3c544ba"/><dir name="Transformation"><file name="Dimensions.php" hash="8b9a09da6980aa2ff42e8f00d79a1b83"/><file name="Dpr.php" hash="f78cd1bfabaf3088ca8d4af972bfd453"/><file name="FetchFormat.php" hash="b81c62dd756dee4ad085ee6f0a83356a"/><file name="Format.php" hash="ab8ea9b6a8c813a24f23b079ea6236da"/><file name="Gravity.php" hash="c1c2adf4dbbeaa6b06d67d2014300559"/><file name="Quality.php" hash="23a857f3910aecf6e45645194ff7f54e"/></dir><file name="Transformation.php" hash="fc443a6abad4a478e94df5661e4aef12"/></dir><file name="Image.php" hash="ea59732b244899cb5b69b3e3e86cffee"/><file name="ImageProvider.php" hash="f4eb49d5e1e4c1728a5dde29b6b5a3fa"/><dir name="Migration"><file name="BatchUploader.php" hash="7cd66596475070673e2467506a9b86ed"/><file name="Logger.php" hash="69f5416f6a3176907b40fce72c2d6e23"/><file name="Queue.php" hash="add92864192b0950c29c91ffe5e5a3ee"/><file name="SynchronizedMediaRepository.php" hash="9e7e1dae66b40ce991b0e86ecdff4c24"/><file name="Task.php" hash="ac11d06c531d48b38cf88f6e8f2bdc19"/></dir><dir name="Security"><file name="ApiSignature.php" hash="049c7db2684ec2a6cf5bb4efcd064951"/><file name="CloudinaryEnvironmentVariable.php" hash="2b5c28381b52350586ea1589854ca498"/><file name="ConsoleUrl.php" hash="4e748cfe0f5a0aeab2307c623179c6f9"/><file name="EnvironmentVariable.php" hash="297fa60b819ffc028b9a32dae6eef63d"/><file name="Key.php" hash="ac3a50b59f2a7db1edcf30386759c7ec"/><file name="Secret.php" hash="b1010679976575d57752dbb07f1b94ed"/><file name="SignedConsoleUrl.php" hash="791e1f1080be23423c2ad87f431f6221"/></dir><file name="ValidateRemoteUrlRequest.php" hash="c2e2eb712e5293ad508a23610dfbbd6d"/></dir><dir name="Cloudinary"><file name="Api.php" hash="972fbd112fdf3745b5c1efa457e71a7f"/><file name="cacert.pem" hash="c4290b9deb70d0bef2f88b67fc68c8ec"/><file name="CloudinaryField.php" hash="411714580d21b58115ab07737367173a"/><file name="Cloudinary.php" hash="1e3709faea6e006fa09c0d1fc2052836"/><file name="Helpers.php" hash="63035ebeaa237bd69dcad2d756a00b44"/><file name="PreloadedFile.php" hash="73cc9e276f96553814f05eae592d11ee"/><file name="Uploader.php" hash="0d62ad1f0816fbb5d1dddd30bdf3f082"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="cloudinary"><file name="cloudinary.xml" hash="8cf333ec4b49c684ea6a209061f5128b"/></dir></dir><dir name="template"><dir name="cloudinary"><file name="manage.phtml" hash="c5a74ed0528f36b409039d5fbdeb8cb9"/><dir name="system"><dir name="config"><file name="signup.phtml" hash="2a0e06990eb542f22531ac2ebb5996f5"/></dir></dir></dir></dir></dir></dir></dir></target></contents>
19
  <compatible/>
20
  <dependencies><required><php><min>5.4.0</min><max>7.0.0</max></php></required></dependencies>
21
  </package>