|null $srcset * @property int|null $width * @property int|null $height * @property bool|null $skip_optimize * @property string|null $replicated_at * @property-read Profile|null $profile * @property-read Status|null $status * * @method static \Illuminate\Database\Eloquent\Builder|Media newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Media newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Media onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Media query() * @method static \Illuminate\Database\Eloquent\Builder|Media whereBlurhash($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereCaption($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereCdnUrl($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereDeletedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereFilterClass($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereFilterName($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereHeight($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereHlsPath($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereHlsTranscodedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereIsNsfw($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereKey($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereLicense($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereMediaPath($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereMetadata($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereMime($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereOptimizedSha256($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereOptimizedUrl($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereOrder($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereOrientation($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereOriginalSha256($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereProcessedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereProfileId($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereRemoteMedia($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereRemoteUrl($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereReplicatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereSize($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereSkipOptimize($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereSrcset($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereStatusId($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereThumbnailPath($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereThumbnailUrl($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereVersion($value) * @method static \Illuminate\Database\Eloquent\Builder|Media whereWidth($value) * @method static \Illuminate\Database\Eloquent\Builder|Media withTrashed(bool $withTrashed = true) * @method static \Illuminate\Database\Eloquent\Builder|Media withoutTrashed() * * @mixin \Eloquent */ class Media extends Model { use SoftDeletes; protected $guarded = []; protected function casts(): array { return [ 'srcset' => 'array', 'deleted_at' => 'datetime', 'skip_optimize' => 'boolean', ]; } public function status(): BelongsTo { return $this->belongsTo(Status::class); } /** * Direct message media has no status_id, just like an upload that was * never posted. This keeps it out of the queries that treat a null * status_id as "unattached" (garbage collection, attaching to a post). */ public function scopeNotInDirectMessage($query) { return $query->whereNotExists(function ($sub) { $sub->selectRaw('1') ->from('dm_message_media') ->whereColumn('dm_message_media.media_id', 'media.id'); }); } public function profile() { return $this->belongsTo(Profile::class); } public function url() { if ($this->cdn_url) { // return Storage::disk(config('filesystems.cloud'))->url($this->media_path); return $this->cdn_url; } if ($this->remote_media && $this->remote_url) { return $this->remote_url; } return url(Storage::url($this->media_path)); } public function thumbnailUrl() { if ($this->thumbnail_url) { return $this->thumbnail_url; } if (! $this->remote_media && $this->thumbnail_path) { return url(Storage::url($this->thumbnail_path)); } if (! $this->thumbnail_path && $this->cdn_url) { return $this->cdn_url; } if ($this->media_path && $this->mime && in_array($this->mime, ['image/jpeg', 'image/png', 'image/jpg'])) { return $this->remote_media || Str::startsWith($this->media_path, 'http') ? $this->media_path : url(Storage::url($this->media_path)); } return url(Storage::url('public/no-preview.png')); } public function thumb() { return $this->thumbnailUrl(); } public function mimeType() { if (! $this->mime) { return null; } return explode('/', $this->mime)[0]; } public function activityVerb(): string { $verb = 'Document'; switch ($this->mimeType()) { case 'audio': $verb = 'Audio'; break; case 'image': $verb = 'Document'; break; case 'video': $verb = 'Video'; break; default: $verb = 'Document'; break; } return $verb; } public function mediaType(): string { $verb = 'Document'; switch ($this->mimeType()) { case 'audio': $verb = 'Audio'; break; case 'image': $verb = 'Image'; break; case 'video': $verb = 'Video'; break; default: $verb = 'Image'; break; } return $verb; } public function getMetadata() { return json_decode($this->metadata, true, 3); } public function getModel() { if (empty($this->metadata)) { return false; } $meta = $this->getMetadata(); if ($meta && isset($meta['Model'])) { return $meta['Model']; } } public function getLicense() { $license = $this->license; if (! $license || strlen($license) > 2 || $license == 1) { return null; } if (! in_array($license, License::keys())) { return null; } $res = License::get()[$license]; return [ 'id' => $res['id'], 'title' => $res['title'], 'url' => $res['url'], ]; } }