From 9d23c7e7e142c6cf1a1418e37e41d711064593c4 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 14 Apr 2021 13:37:11 +0000 Subject: [PATCH] fix(avatar): use default avatar when no avatar url has been set - get avatar and cover urls from entity: if no image exists, retrieve the default ones. - always set icon and image in actor object: set the default ones if podcast hasn't set them. fixes #111 --- app/Config/ActivityPub.php | 11 +++++ .../ActivityPub/Config/ActivityPub.php | 11 +++++ .../2018-01-01-010000_add_actors.php | 2 + app/Libraries/ActivityPub/Entities/Actor.php | 40 +++++++++++++++++- .../ActivityPub/Objects/ActorObject.php | 13 +++--- app/Models/PodcastModel.php | 7 +-- .../images/castopod-avatar-default.jpg | Bin 0 -> 9509 bytes app/Views/podcast/_partials/header.php | 8 +--- app/Views/podcast/follow.php | 4 -- 9 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 app/Views/_assets/images/castopod-avatar-default.jpg diff --git a/app/Config/ActivityPub.php b/app/Config/ActivityPub.php index 7f2ea61c..062603db 100644 --- a/app/Config/ActivityPub.php +++ b/app/Config/ActivityPub.php @@ -11,4 +11,15 @@ class ActivityPub extends ActivityPubBase */ public $actorObject = 'App\Libraries\PodcastActor'; public $noteObject = 'App\Libraries\NoteObject'; + + /** + * -------------------------------------------------------------------- + * Default avatar and cover images + * -------------------------------------------------------------------- + */ + public $defaultAvatarImagePath = 'assets/images/castopod-avatar-default.jpg'; + public $defaultAvatarImageMimetype = 'image/jpeg'; + + public $defaultCoverImagePath = 'assets/images/castopod-cover-default.jpg'; + public $defaultCoverImageMimetype = 'image/jpeg'; } diff --git a/app/Libraries/ActivityPub/Config/ActivityPub.php b/app/Libraries/ActivityPub/Config/ActivityPub.php index 199817af..0feb9f16 100644 --- a/app/Libraries/ActivityPub/Config/ActivityPub.php +++ b/app/Libraries/ActivityPub/Config/ActivityPub.php @@ -19,4 +19,15 @@ class ActivityPub extends BaseConfig */ public $actorObject = 'ActivityPub\Objects\ActorObject'; public $noteObject = 'ActivityPub\Objects\NoteObject'; + + /** + * -------------------------------------------------------------------- + * Default avatar and cover images + * -------------------------------------------------------------------- + */ + public $defaultAvatarImagePath = 'assets/images/avatar-default.jpg'; + public $defaultAvatarImageMimetype = 'image/jpeg'; + + public $defaultCoverImagePath = 'assets/images/cover-default.jpg'; + public $defaultCoverImageMimetype = 'image/jpeg'; } diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php index 9e6ab14c..9e2b2f5c 100644 --- a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php @@ -54,12 +54,14 @@ class AddActors extends Migration 'avatar_image_url' => [ 'type' => 'VARCHAR', 'constraint' => 255, + 'null' => true, ], // constraint is 13 because the longest safe mimetype for images is image/svg+xml, // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types 'avatar_image_mimetype' => [ 'type' => 'VARCHAR', 'constraint' => 13, + 'null' => true, ], 'cover_image_url' => [ 'type' => 'VARCHAR', diff --git a/app/Libraries/ActivityPub/Entities/Actor.php b/app/Libraries/ActivityPub/Entities/Actor.php index 2d8d769d..acf73aa3 100644 --- a/app/Libraries/ActivityPub/Entities/Actor.php +++ b/app/Libraries/ActivityPub/Entities/Actor.php @@ -36,8 +36,8 @@ class Actor extends Entity 'summary' => '?string', 'private_key' => '?string', 'public_key' => '?string', - 'avatar_image_url' => 'string', - 'avatar_image_mimetype' => 'string', + 'avatar_image_url' => '?string', + 'avatar_image_mimetype' => '?string', 'cover_image_url' => '?string', 'cover_image_mimetype' => '?string', 'inbox_url' => 'string', @@ -81,4 +81,40 @@ class Actor extends Entity return $this->followers; } + + public function getAvatarImageUrl() + { + if (empty($this->attributes['avatar_image_url'])) { + return base_url(config('ActivityPub')->defaultAvatarImagePath); + } + + return $this->attributes['avatar_image_url']; + } + + public function getAvatarImageMimetype() + { + if (empty($this->attributes['avatar_image_mimetype'])) { + return config('ActivityPub')->defaultAvatarImageMimetype; + } + + return $this->attributes['avatar_image_mimetype']; + } + + public function getCoverImageUrl() + { + if (empty($this->attributes['cover_image_url'])) { + return base_url(config('ActivityPub')->defaultCoverImagePath); + } + + return $this->attributes['cover_image_url']; + } + + public function getCoverImageMimetype() + { + if (empty($this->attributes['cover_image_mimetype'])) { + return config('ActivityPub')->defaultCoverImageMimetype; + } + + return $this->attributes['cover_image_mimetype']; + } } diff --git a/app/Libraries/ActivityPub/Objects/ActorObject.php b/app/Libraries/ActivityPub/Objects/ActorObject.php index 5d9f07ee..4fa0b806 100644 --- a/app/Libraries/ActivityPub/Objects/ActorObject.php +++ b/app/Libraries/ActivityPub/Objects/ActorObject.php @@ -91,13 +91,12 @@ class ActorObject extends ObjectType $this->outbox = $actor->outbox_url; $this->followers = $actor->followers_url; - if ($actor->cover_image_url) { - $this->image = [ - 'type' => 'Image', - 'mediaType' => $actor->cover_image_mimetype, - 'url' => $actor->cover_image_url, - ]; - } + $this->image = [ + 'type' => 'Image', + 'mediaType' => $actor->cover_image_mimetype, + 'url' => $actor->cover_image_url, + ]; + $this->icon = [ 'type' => 'Image', 'mediaType' => $actor->avatar_image_mimetype, diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 67b2ef8b..e533bbb7 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -297,12 +297,6 @@ class PodcastModel extends Model 'public_key' => $publickey, 'display_name' => $data['data']['title'], 'summary' => $data['data']['description_html'], - 'avatar_image_url' => '', - 'avatar_image_mimetype' => '', - 'cover_image_url' => base_url( - 'assets/images/castopod-cover-default.jpg', - ), - 'cover_image_mimetype' => 'image/jpeg', 'inbox_url' => url_to('inbox', $username), 'outbox_url' => url_to('outbox', $username), 'followers_url' => url_to('followers', $username), @@ -342,6 +336,7 @@ class PodcastModel extends Model $actor->display_name = $podcast->title; $actor->summary = $podcast->description_html; $actor->avatar_image_url = $podcast->image->thumbnail_url; + $actor->avatar_image_mimetype = $podcast->image_mimetype; if ($actor->hasChanged()) { $actorModel->update($actor->id, $actor); diff --git a/app/Views/_assets/images/castopod-avatar-default.jpg b/app/Views/_assets/images/castopod-avatar-default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..644126c569b388f9d2ec614f32a41feecd8a088a GIT binary patch literal 9509 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 literal 0 HcmV?d00001 diff --git a/app/Views/podcast/_partials/header.php b/app/Views/podcast/_partials/header.php index 1002dea9..48ce183d 100644 --- a/app/Views/podcast/_partials/header.php +++ b/app/Views/podcast/_partials/header.php @@ -1,10 +1,6 @@
- actor->cover_image_url): ?> - - -
- +
<?= $podcast->title ?> diff --git a/app/Views/podcast/follow.php b/app/Views/podcast/follow.php index 06336766..8a564a2e 100644 --- a/app/Views/podcast/follow.php +++ b/app/Views/podcast/follow.php @@ -31,11 +31,7 @@ 'ActivityPub.follow.subtitle', ) ?>
- cover_image_url): ?> - -
-
<?= $actor->display_name ?>