Medium.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. /**
  3. * @package Grav\Common\Page
  4. *
  5. * @copyright Copyright (c) 2015 - 2023 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\File\CompiledYamlFile;
  10. use Grav\Common\Grav;
  11. use Grav\Common\Data\Data;
  12. use Grav\Common\Data\Blueprint;
  13. use Grav\Common\Media\Interfaces\MediaFileInterface;
  14. use Grav\Common\Media\Interfaces\MediaLinkInterface;
  15. use Grav\Common\Media\Traits\MediaFileTrait;
  16. use Grav\Common\Media\Traits\MediaObjectTrait;
  17. /**
  18. * Class Medium
  19. * @package Grav\Common\Page\Medium
  20. *
  21. * @property string $filepath
  22. * @property string $filename
  23. * @property string $basename
  24. * @property string $mime
  25. * @property int $size
  26. * @property int $modified
  27. * @property array $metadata
  28. * @property int|string $timestamp
  29. */
  30. class Medium extends Data implements RenderableInterface, MediaFileInterface
  31. {
  32. use MediaObjectTrait;
  33. use MediaFileTrait;
  34. use ParsedownHtmlTrait;
  35. /**
  36. * Construct.
  37. *
  38. * @param array $items
  39. * @param Blueprint|null $blueprint
  40. */
  41. public function __construct($items = [], Blueprint $blueprint = null)
  42. {
  43. parent::__construct($items, $blueprint);
  44. if (Grav::instance()['config']->get('system.media.enable_media_timestamp', true)) {
  45. $this->timestamp = Grav::instance()['cache']->getKey();
  46. }
  47. $this->def('mime', 'application/octet-stream');
  48. if (!$this->offsetExists('size')) {
  49. $path = $this->get('filepath');
  50. $this->def('size', filesize($path));
  51. }
  52. $this->reset();
  53. }
  54. /**
  55. * Clone medium.
  56. */
  57. #[\ReturnTypeWillChange]
  58. public function __clone()
  59. {
  60. // Allows future compatibility as parent::__clone() works.
  61. }
  62. /**
  63. * Add meta file for the medium.
  64. *
  65. * @param string $filepath
  66. */
  67. public function addMetaFile($filepath)
  68. {
  69. $this->metadata = (array)CompiledYamlFile::instance($filepath)->content();
  70. $this->merge($this->metadata);
  71. }
  72. /**
  73. * @return array
  74. */
  75. public function getMeta(): array
  76. {
  77. return [
  78. 'mime' => $this->mime,
  79. 'size' => $this->size,
  80. 'modified' => $this->modified,
  81. ];
  82. }
  83. /**
  84. * Return string representation of the object (html).
  85. *
  86. * @return string
  87. */
  88. #[\ReturnTypeWillChange]
  89. public function __toString()
  90. {
  91. return $this->html();
  92. }
  93. /**
  94. * @param string $thumb
  95. * @return Medium|null
  96. */
  97. protected function createThumbnail($thumb)
  98. {
  99. return MediumFactory::fromFile($thumb, ['type' => 'thumbnail']);
  100. }
  101. /**
  102. * @param array $attributes
  103. * @return MediaLinkInterface
  104. */
  105. protected function createLink(array $attributes)
  106. {
  107. return new Link($attributes, $this);
  108. }
  109. /**
  110. * @return Grav
  111. */
  112. protected function getGrav(): Grav
  113. {
  114. return Grav::instance();
  115. }
  116. /**
  117. * @return array
  118. */
  119. protected function getItems(): array
  120. {
  121. return $this->items;
  122. }
  123. }