GlobalMedia.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. /**
  3. * @package Grav\Common\Page
  4. *
  5. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Page\Medium;
  9. use Grav\Common\Grav;
  10. use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
  11. class GlobalMedia extends AbstractMedia
  12. {
  13. /**
  14. * Return media path.
  15. *
  16. * @return null
  17. */
  18. public function getPath()
  19. {
  20. return null;
  21. }
  22. /**
  23. * @param mixed $offset
  24. *
  25. * @return bool
  26. */
  27. public function offsetExists($offset)
  28. {
  29. return parent::offsetExists($offset) ?: !empty($this->resolveStream($offset));
  30. }
  31. /**
  32. * @param mixed $offset
  33. *
  34. * @return mixed
  35. */
  36. public function offsetGet($offset)
  37. {
  38. return parent::offsetGet($offset) ?: $this->addMedium($offset);
  39. }
  40. /**
  41. * @param string $filename
  42. * @return string|null
  43. */
  44. protected function resolveStream($filename)
  45. {
  46. /** @var UniformResourceLocator $locator */
  47. $locator = Grav::instance()['locator'];
  48. return $locator->isStream($filename) ? ($locator->findResource($filename) ?: null) : null;
  49. }
  50. /**
  51. * @param string $stream
  52. * @return Medium|null
  53. */
  54. protected function addMedium($stream)
  55. {
  56. $filename = $this->resolveStream($stream);
  57. if (!$filename) {
  58. return null;
  59. }
  60. $path = dirname($filename);
  61. list($basename, $ext,, $extra) = $this->getFileParts(basename($filename));
  62. $medium = MediumFactory::fromFile($filename);
  63. if (empty($medium)) {
  64. return null;
  65. }
  66. $medium->set('size', filesize($filename));
  67. $scale = (int) ($extra ?: 1);
  68. if ($scale !== 1) {
  69. $altMedium = $medium;
  70. // Create scaled down regular sized image.
  71. $medium = MediumFactory::scaledFromMedium($altMedium, $scale, 1)['file'];
  72. if (empty($medium)) {
  73. return null;
  74. }
  75. // Add original sized image as alternative.
  76. $medium->addAlternative($scale, $altMedium['file']);
  77. // Locate or generate smaller retina images.
  78. for ($i = $scale-1; $i > 1; $i--) {
  79. $altFilename = "{$path}/{$basename}@{$i}x.{$ext}";
  80. if (file_exists($altFilename)) {
  81. $scaled = MediumFactory::fromFile($altFilename);
  82. } else {
  83. $scaled = MediumFactory::scaledFromMedium($altMedium, $scale, $i)['file'];
  84. }
  85. if ($scaled) {
  86. $medium->addAlternative($i, $scaled);
  87. }
  88. }
  89. }
  90. $meta = "{$path}/{$basename}.{$ext}.yaml";
  91. if (file_exists($meta)) {
  92. $medium->addMetaFile($meta);
  93. }
  94. $meta = "{$path}/{$basename}.{$ext}.meta.yaml";
  95. if (file_exists($meta)) {
  96. $medium->addMetaFile($meta);
  97. }
  98. $thumb = "{$path}/{$basename}.thumb.{$ext}";
  99. if (file_exists($thumb)) {
  100. $medium->set('thumbnails.page', $thumb);
  101. }
  102. $this->add($stream, $medium);
  103. return $medium;
  104. }
  105. }