MediaService.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace App\Services;
  3. use App\Media;
  4. use App\Transformer\Api\MediaTransformer;
  5. use Cache;
  6. use Illuminate\Support\Arr;
  7. use League\Fractal;
  8. use League\Fractal\Serializer\ArraySerializer;
  9. class MediaService
  10. {
  11. const CACHE_KEY = 'status:transformer:media:attachments:';
  12. public static function get($statusId)
  13. {
  14. return Cache::remember(self::CACHE_KEY.$statusId, 21600, function () use ($statusId) {
  15. $media = Media::whereStatusId($statusId)->orderBy('order')->get();
  16. if (! $media) {
  17. return [];
  18. }
  19. $fractal = new Fractal\Manager;
  20. $fractal->setSerializer(new ArraySerializer);
  21. $resource = new Fractal\Resource\Collection($media, new MediaTransformer);
  22. return $fractal->createData($resource)->toArray();
  23. });
  24. }
  25. public static function getMastodon($id)
  26. {
  27. $media = self::get($id);
  28. if (! $media) {
  29. return [];
  30. }
  31. $medias = collect($media)
  32. ->map(function ($media) {
  33. $mime = $media['mime'] ? explode('/', $media['mime']) : false;
  34. unset(
  35. $media['optimized_url'],
  36. $media['license'],
  37. $media['is_nsfw'],
  38. $media['orientation'],
  39. $media['filter_name'],
  40. $media['filter_class'],
  41. $media['mime'],
  42. $media['hls_manifest']
  43. );
  44. $media['type'] = $mime ? strtolower($mime[0]) : 'unknown';
  45. return $media;
  46. })
  47. ->filter(function ($m) {
  48. return $m && isset($m['url']);
  49. })
  50. ->values();
  51. return $medias->toArray();
  52. }
  53. public static function del($statusId)
  54. {
  55. return Cache::forget(self::CACHE_KEY.$statusId);
  56. }
  57. public static function activitypub($statusId, $fresh = false)
  58. {
  59. if ($fresh) {
  60. self::del($statusId);
  61. }
  62. $status = self::get($statusId);
  63. if (! $status) {
  64. return [];
  65. }
  66. return collect($status)->map(function ($s) {
  67. $original = Arr::get($s, 'meta.original', []);
  68. $mime = $s['mime'] === 'image/jpg' ? 'image/jpeg' : $s['mime'];
  69. return [
  70. 'type' => 'Document',
  71. 'mediaType' => $mime,
  72. 'url' => $s['url'],
  73. 'name' => $s['description'],
  74. 'blurhash' => $s['blurhash'],
  75. 'focalPoint' => [0, 0],
  76. 'width' => $original['width'] ?? null,
  77. 'height' => $original['height'] ?? null,
  78. ];
  79. });
  80. }
  81. }