From 3a0b0ffce5f26f9de8ae0f716d0c964f93662479 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 28 Feb 2023 08:06:49 +0000 Subject: [PATCH] Editing of media descriptions is now possible as well --- src/Factory/Api/Mastodon/Attachment.php | 84 ++++++++++++++++--------- src/Model/Post/Media.php | 24 +++++++ src/Module/Api/Mastodon/Media.php | 11 +++- 3 files changed, 88 insertions(+), 31 deletions(-) diff --git a/src/Factory/Api/Mastodon/Attachment.php b/src/Factory/Api/Mastodon/Attachment.php index 197ade0fe2..2b53ae67d9 100644 --- a/src/Factory/Api/Mastodon/Attachment.php +++ b/src/Factory/Api/Mastodon/Attachment.php @@ -51,41 +51,65 @@ class Attachment extends BaseFactory { $attachments = []; foreach (Post\Media::getByURIId($uriId, [Post\Media::AUDIO, Post\Media::VIDEO, Post\Media::IMAGE]) as $attachment) { - $filetype = !empty($attachment['mimetype']) ? strtolower(substr($attachment['mimetype'], 0, strpos($attachment['mimetype'], '/'))) : ''; - - if (($filetype == 'audio') || ($attachment['type'] == Post\Media::AUDIO)) { - $type = 'audio'; - } elseif (($filetype == 'video') || ($attachment['type'] == Post\Media::VIDEO)) { - $type = 'video'; - } elseif ($attachment['mimetype'] == 'image/gif') { - $type = 'gifv'; - } elseif (($filetype == 'image') || ($attachment['type'] == Post\Media::IMAGE)) { - $type = 'image'; - } else { - $type = 'unknown'; - } - - $remote = $attachment['url']; - if ($type == 'image') { - $url = Post\Media::getPreviewUrlForId($attachment['id']); - $preview = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_SMALL); - } else { - $url = $attachment['url']; - - if (!empty($attachment['preview'])) { - $preview = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_SMALL); - } else { - $preview = ''; - } - } - - $object = new \Friendica\Object\Api\Mastodon\Attachment($attachment, $type, $url, $preview, $remote); - $attachments[] = $object->toArray(); + $attachments[] = $this->createFromMediaArray($attachment); } return $attachments; } + /** + * @param int $id id of the media + * @return array + * @throws HTTPException\InternalServerErrorException + */ + public function createFromId(int $id): array + { + $attachment = Post\Media::getById($id); + if (empty($attachment)) { + return []; + } + return $this->createFromMediaArray($attachment); + } + + /** + * @param array $attachment + * @return array + * @throws HTTPException\InternalServerErrorException + */ + private function createFromMediaArray(array $attachment): array + { + $filetype = !empty($attachment['mimetype']) ? strtolower(substr($attachment['mimetype'], 0, strpos($attachment['mimetype'], '/'))) : ''; + + if (($filetype == 'audio') || ($attachment['type'] == Post\Media::AUDIO)) { + $type = 'audio'; + } elseif (($filetype == 'video') || ($attachment['type'] == Post\Media::VIDEO)) { + $type = 'video'; + } elseif ($attachment['mimetype'] == 'image/gif') { + $type = 'gifv'; + } elseif (($filetype == 'image') || ($attachment['type'] == Post\Media::IMAGE)) { + $type = 'image'; + } else { + $type = 'unknown'; + } + + $remote = $attachment['url']; + if ($type == 'image') { + $url = Post\Media::getPreviewUrlForId($attachment['id']); + $preview = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_SMALL); + } else { + $url = $attachment['url']; + + if (!empty($attachment['preview'])) { + $preview = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_SMALL); + } else { + $preview = ''; + } + } + + $object = new \Friendica\Object\Api\Mastodon\Attachment($attachment, $type, $url, $preview, $remote); + return $object->toArray(); + } + /** * @param int $id id of the photo * diff --git a/src/Model/Post/Media.php b/src/Model/Post/Media.php index 6454cefda1..8545760bef 100644 --- a/src/Model/Post/Media.php +++ b/src/Model/Post/Media.php @@ -697,6 +697,30 @@ class Media return DBA::selectToArray('post-media', [], $condition, ['order' => ['id']]); } + /** + * Retrieves the media attachment with the provided media id. + * + * @param int $id id + * @return array|bool Array on success, false on error + * @throws \Exception + */ + public static function getById(int $id) + { + return DBA::selectFirst('post-media', [], ['id' => $id]); + } + + /** + * Update post-media entries + * + * @param array $fields + * @param int $id + * @return bool + */ + public static function updateById(array $fields, int $id): bool + { + return DBA::update('post-media', $fields, ['id' => $id]); + } + /** * Checks if media attachments are associated with the provided item ID. * diff --git a/src/Module/Api/Mastodon/Media.php b/src/Module/Api/Mastodon/Media.php index 2f71d53c27..e26637601f 100644 --- a/src/Module/Api/Mastodon/Media.php +++ b/src/Module/Api/Mastodon/Media.php @@ -25,6 +25,7 @@ use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\DI; use Friendica\Model\Photo; +use Friendica\Model\Post; use Friendica\Module\BaseApi; /** @@ -71,7 +72,15 @@ class Media extends BaseApi $photo = Photo::selectFirst(['resource-id'], ['id' => $this->parameters['id'], 'uid' => $uid]); if (empty($photo['resource-id'])) { - DI::mstdnError()->RecordNotFound(); + $media = Post\Media::getById($this->parameters['id']); + if (empty($media['uri-id'])) { + DI::mstdnError()->RecordNotFound(); + } + if (!Post::exists(['uri-id' => $media['uri-id'], 'uid' => $uid, 'origin' => true])) { + DI::mstdnError()->RecordNotFound(); + } + Post\Media::updateById(['description' => $request['description']], $this->parameters['id']); + System::jsonExit(DI::mstdnAttachment()->createFromId($this->parameters['id'])); } Photo::update(['desc' => $request['description']], ['resource-id' => $photo['resource-id']]);