From e6030e5f82cc1279bca154bf1f8f94b4520b86bd Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 31 Oct 2020 16:10:27 +0000 Subject: [PATCH] API: Media attachments are now supported --- src/Factory/Api/Mastodon/Attachment.php | 96 +++++++++++++++++++++++++ src/Factory/Api/Mastodon/Status.php | 8 ++- src/Model/Post/Media.php | 12 ++++ src/Object/Api/Mastodon/Attachment.php | 80 +++++++++++++++++++++ src/Object/Api/Mastodon/Status.php | 4 +- 5 files changed, 195 insertions(+), 5 deletions(-) create mode 100644 src/Factory/Api/Mastodon/Attachment.php create mode 100644 src/Object/Api/Mastodon/Attachment.php diff --git a/src/Factory/Api/Mastodon/Attachment.php b/src/Factory/Api/Mastodon/Attachment.php new file mode 100644 index 0000000000..e681b34c2d --- /dev/null +++ b/src/Factory/Api/Mastodon/Attachment.php @@ -0,0 +1,96 @@ +. + * + */ + +namespace Friendica\Factory\Api\Mastodon; + +use Friendica\App\BaseURL; +use Friendica\BaseFactory; +use Friendica\Network\HTTPException; +use Friendica\Model\Post; +use Friendica\Repository\ProfileField; +use Friendica\Util\Proxy; +use Psr\Log\LoggerInterface; + +class Attachment extends BaseFactory +{ + /** @var BaseURL */ + protected $baseUrl; + /** @var ProfileField */ + protected $profileField; + /** @var Field */ + protected $mstdnField; + + public function __construct(LoggerInterface $logger, BaseURL $baseURL, ProfileField $profileField, Field $mstdnField) + { + parent::__construct($logger); + + $this->baseUrl = $baseURL; + $this->profileField = $profileField; + $this->mstdnField = $mstdnField; + } + + /** + * @param int $uriId Uri-ID of the attachments + * @return array + * @throws HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + public function createFromUriId(int $uriId) + { + $attachments = []; + foreach (Post\Media::getByURIId($uriId) 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') { + if (Proxy::isLocalImage($attachment['url'])) { + $url = $attachment['url']; + $preview = $attachment['preview'] ?? $url; + $remote = ''; + } else { + $url = Proxy::proxifyUrl($attachment['url']); + $preview = Proxy::proxifyUrl($attachment['url'], false, Proxy::SIZE_SMALL); + } + } else { + $url = ''; + $preview = ''; + } + + $object = new \Friendica\Object\Api\Mastodon\Attachment($attachment, $type, $url, $preview, $remote); + $attachments[] = $object->toArray(); + } + + return $attachments; + } +} diff --git a/src/Factory/Api/Mastodon/Status.php b/src/Factory/Api/Mastodon/Status.php index b4ef0a0f7f..5aac0f80c2 100644 --- a/src/Factory/Api/Mastodon/Status.php +++ b/src/Factory/Api/Mastodon/Status.php @@ -82,9 +82,11 @@ class Status extends BaseFactory $mentions = DI::mstdnMention()->createFromUriId($uriId); $tags = DI::mstdnTag()->createFromUriId($uriId); - $attachment = BBCode::getAttachmentData($item['body']); - $card = new \Friendica\Object\Api\Mastodon\Card($attachment); + $data = BBCode::getAttachmentData($item['body']); + $card = new \Friendica\Object\Api\Mastodon\Card($data); - return new \Friendica\Object\Api\Mastodon\Status($item, $account, $counts, $userAttributes, $sensitive, $application, $mentions, $tags, $card); + $attachments = DI::mstdnAttachment()->createFromUriId($uriId); + + return new \Friendica\Object\Api\Mastodon\Status($item, $account, $counts, $userAttributes, $sensitive, $application, $mentions, $tags, $card, $attachments); } } diff --git a/src/Model/Post/Media.php b/src/Model/Post/Media.php index b363551847..57668fa99e 100644 --- a/src/Model/Post/Media.php +++ b/src/Model/Post/Media.php @@ -258,4 +258,16 @@ class Media self::insert($media); } } + + /** + * Retrieves the media attachments associated with the provided item ID. + * + * @param int $uri_id + * @return array + * @throws \Exception + */ + public static function getByURIId(int $uri_id) + { + return DBA::selectToArray('post-media', [], ['uri-id' => $uri_id]); + } } diff --git a/src/Object/Api/Mastodon/Attachment.php b/src/Object/Api/Mastodon/Attachment.php new file mode 100644 index 0000000000..1651e9c40c --- /dev/null +++ b/src/Object/Api/Mastodon/Attachment.php @@ -0,0 +1,80 @@ +. + * + */ + +namespace Friendica\Object\Api\Mastodon; + +use Friendica\BaseEntity; + +/** + * Class Attachment + * + * @see https://docs.joinmastodon.org/entities/attachment + */ +class Attachment extends BaseEntity +{ + /** @var string */ + protected $id; + /** @var string */ + protected $type; + /** @var string */ + protected $url; + /** @var string */ + protected $preview_url; + /** @var string */ + protected $remote_url; + /** @var string */ + protected $text_url; + /** @var string */ + protected $description; + + /** + * Creates an attachment + * + * @param array $attachment + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function __construct(array $attachment, string $type, string $url, string $preview, string $remote) + { + $this->id = (string)$attachment['id']; + $this->type = $type; + $this->url = $url; + $this->preview_url = $preview; + $this->remote_url = $remote; + $this->text_url = $this->remote_url ?? $this->url; + $this->description = $attachment['description']; + } + + /** + * Returns the current entity as an array + * + * @return array + */ + public function toArray() + { + $attachment = parent::toArray(); + + if (empty($attachment['remote_url'])) { + $attachment['remote_url'] = null; + } + + return $attachment; + } +} diff --git a/src/Object/Api/Mastodon/Status.php b/src/Object/Api/Mastodon/Status.php index 2d2beb583f..558069f19a 100644 --- a/src/Object/Api/Mastodon/Status.php +++ b/src/Object/Api/Mastodon/Status.php @@ -97,7 +97,7 @@ class Status extends BaseEntity * @param array $item * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function __construct(array $item, Account $account, Counts $counts, UserAttributes $userAttributes, bool $sensitive, Application $application, array $mentions, array $tags, Card $card) + public function __construct(array $item, Account $account, Counts $counts, UserAttributes $userAttributes, bool $sensitive, Application $application, array $mentions, array $tags, Card $card, array $attachments) { $this->id = (string)$item['uri-id']; $this->created_at = DateTimeFormat::utc($item['created'], DateTimeFormat::ATOM); @@ -130,7 +130,7 @@ class Status extends BaseEntity $this->reblog = null; /// @todo $this->application = $application->toArray(); $this->account = $account->toArray(); - $this->media_attachments = []; /// @todo + $this->media_attachments = $attachments; $this->mentions = $mentions; $this->tags = $tags; $this->emojis = [];