[ENTITY][AttachmentThumbnail] Every image should have width and height attributes
This commit is contained in:
parent
808da203ad
commit
a681acae67
|
@ -44,7 +44,7 @@ use Symfony\Component\HttpFoundation\Request;
|
||||||
* @copyright 2019, 2021 Free Software Foundation, Inc http://www.fsf.org
|
* @copyright 2019, 2021 Free Software Foundation, Inc http://www.fsf.org
|
||||||
* @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
|
* @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
|
||||||
*/
|
*/
|
||||||
class Embed extends Controller
|
class OEmbed extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle OEmbed server requests
|
* Handle OEmbed server requests
|
|
@ -118,8 +118,7 @@ class Embed extends Plugin
|
||||||
*/
|
*/
|
||||||
public function onAddRoute(RouteLoader $m): bool
|
public function onAddRoute(RouteLoader $m): bool
|
||||||
{
|
{
|
||||||
$m->connect('oembed', 'main/oembed', Controller\Embed::class);
|
$m->connect('oembed', 'main/oembed', Controller\OEmbed::class);
|
||||||
$m->connect('embed', 'main/embed', Controller\Embed::class);
|
|
||||||
return Event::next;
|
return Event::next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +140,7 @@ class Embed extends Plugin
|
||||||
'link' => [
|
'link' => [
|
||||||
'rel' => 'alternate',
|
'rel' => 'alternate',
|
||||||
'type' => "application/{$format}+oembed",
|
'type' => "application/{$format}+oembed",
|
||||||
'href' => Router::url('embed', ['format' => $format, 'url' => $url]),
|
'href' => Router::url('oembed', ['format' => $format, 'url' => $url]),
|
||||||
'title' => 'oEmbed',
|
'title' => 'oEmbed',
|
||||||
], ];
|
], ];
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,8 +57,6 @@ class AttachmentEmbed extends Entity
|
||||||
private ?string $author_name;
|
private ?string $author_name;
|
||||||
private ?string $author_url;
|
private ?string $author_url;
|
||||||
private ?string $thumbnail_url;
|
private ?string $thumbnail_url;
|
||||||
private ?int $thumbnail_width;
|
|
||||||
private ?int $thumbnail_height;
|
|
||||||
private \DateTimeInterface $modified;
|
private \DateTimeInterface $modified;
|
||||||
|
|
||||||
public function setLinkId(int $link_id): self
|
public function setLinkId(int $link_id): self
|
||||||
|
@ -188,12 +186,13 @@ class AttachmentEmbed extends Entity
|
||||||
{
|
{
|
||||||
$attr = ['class' => 'u-photo embed'];
|
$attr = ['class' => 'u-photo embed'];
|
||||||
$attachment = DB::find('attachment', ['id' => $this->getAttachmentId()]);
|
$attachment = DB::find('attachment', ['id' => $this->getAttachmentId()]);
|
||||||
|
$thumbnail = $attachment->getThumbnail('medium');
|
||||||
if (is_null($attachment) || is_null($attachment->getWidth()) || is_null($attachment->getHeight())) {
|
if (is_null($attachment) || is_null($attachment->getWidth()) || is_null($attachment->getHeight())) {
|
||||||
$attr['has_attachment'] = false;
|
$attr['has_attachment'] = false;
|
||||||
} else {
|
} else {
|
||||||
$attr['has_attachment'] = true;
|
$attr['has_attachment'] = true;
|
||||||
$attr['width'] = $attachment->getWidth();
|
$attr['width'] = $thumbnail->getWidth();
|
||||||
$attr['height'] = $attachment->getHeight();
|
$attr['height'] = $thumbnail->getHeight();
|
||||||
}
|
}
|
||||||
return $attr;
|
return $attr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
{% if attributes['has_attachment'] != false %}
|
{% if attributes['has_attachment'] != false %}
|
||||||
{% set thumbnail_parameters = {
|
{% set thumbnail_parameters = {
|
||||||
'id': embed.getAttachmentId(),
|
'id': embed.getAttachmentId(),
|
||||||
'size': 'small'
|
'size': 'medium'
|
||||||
} %}
|
} %}
|
||||||
<img alt="{{embed.getTitle() | escape}}" class="{{attributes['class']}}"
|
<img alt="{{embed.getTitle() | escape}}" class="{{attributes['class']}}"
|
||||||
width="{{attributes['width']}}" height="{{attributes['height']}}"
|
width="{{attributes['width']}}" height="{{attributes['height']}}"
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
<figure>
|
<figure>
|
||||||
|
{% set thumbnail = attachment.getThumbnail() %}
|
||||||
<img class="u-photo"
|
<img class="u-photo"
|
||||||
alt="{{ attachment.getBestTitle(note) }}"
|
alt="{{ attachment.getBestTitle(note) }}"
|
||||||
src="{{ attachment.getThumbnailUrl() }}">
|
src="{{ attachment.getThumbnailUrl() }}"
|
||||||
|
width="{{ thumbnail.getWidth() }}"
|
||||||
|
height="{{ thumbnail.getHeight() }}">
|
||||||
<figcaption><a
|
<figcaption><a
|
||||||
href="{{ path('attachment_show', {'id': attachment.getId()}) }}">{{ attachment.getBestTitle(note) }}</a>
|
href="{{ path('attachment_show', {'id': attachment.getId()}) }}">{{ attachment.getBestTitle(note) }}</a>
|
||||||
</figcaption>
|
</figcaption>
|
||||||
|
|
|
@ -178,7 +178,7 @@ class StoreRemoteMedia extends Plugin
|
||||||
if (!$this->getStoreOriginal()) {
|
if (!$this->getStoreOriginal()) {
|
||||||
$thumbnail = AttachmentThumbnail::getOrCreate(
|
$thumbnail = AttachmentThumbnail::getOrCreate(
|
||||||
attachment: $attachment,
|
attachment: $attachment,
|
||||||
size: 'small',
|
size: 'medium',
|
||||||
crop: $this->getSmartCrop()
|
crop: $this->getSmartCrop()
|
||||||
);
|
);
|
||||||
$attachment->deleteStorage();
|
$attachment->deleteStorage();
|
||||||
|
|
|
@ -174,11 +174,11 @@ class VideoEncoder extends Plugin
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function onViewAttachmentVideo(array $vars, array &$res): bool
|
public function onViewAttachment(array $vars, array &$res): bool
|
||||||
{
|
{
|
||||||
$res[] = Formatting::twigRenderFile('videoEncoder/videoEncoderView.html.twig',
|
$res[] = Formatting::twigRenderFile('videoEncoder/videoEncoderView.html.twig',
|
||||||
['attachment' => $vars['attachment'],
|
[
|
||||||
'thumbnail_parameters' => $vars['thumbnail_parameters'],
|
'attachment' => $vars['attachment'],
|
||||||
'note' => $vars['note'],
|
'note' => $vars['note'],
|
||||||
]);
|
]);
|
||||||
return Event::stop;
|
return Event::stop;
|
||||||
|
|
|
@ -30,6 +30,7 @@ use function App\Core\I18n\_m;
|
||||||
use App\Core\Log;
|
use App\Core\Log;
|
||||||
use App\Core\Router\Router;
|
use App\Core\Router\Router;
|
||||||
use App\Util\Common;
|
use App\Util\Common;
|
||||||
|
use App\Util\Exception\ClientException;
|
||||||
use App\Util\Exception\DuplicateFoundException;
|
use App\Util\Exception\DuplicateFoundException;
|
||||||
use App\Util\Exception\NotFoundException;
|
use App\Util\Exception\NotFoundException;
|
||||||
use App\Util\Exception\ServerException;
|
use App\Util\Exception\ServerException;
|
||||||
|
@ -345,6 +346,21 @@ class Attachment extends Entity
|
||||||
return Router::url('attachment_view', ['id' => $this->getId()]);
|
return Router::url('attachment_view', ['id' => $this->getId()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param null|string $size
|
||||||
|
* @param bool $crop
|
||||||
|
*
|
||||||
|
* @throws ClientException
|
||||||
|
* @throws NotFoundException
|
||||||
|
* @throws ServerException
|
||||||
|
*
|
||||||
|
* @return AttachmentThumbnail
|
||||||
|
*/
|
||||||
|
public function getThumbnail(?string $size = null, bool $crop = false): AttachmentThumbnail
|
||||||
|
{
|
||||||
|
return AttachmentThumbnail::getOrCreate(attachment: $this, size: $size, crop: $crop);
|
||||||
|
}
|
||||||
|
|
||||||
public function getThumbnailUrl(?string $size = null)
|
public function getThumbnailUrl(?string $size = null)
|
||||||
{
|
{
|
||||||
return Router::url('attachment_thumbnail', ['id' => $this->getId(), 'size' => $size ?? Common::config('thumbnail', 'default_size')]);
|
return Router::url('attachment_thumbnail', ['id' => $this->getId(), 'size' => $size ?? Common::config('thumbnail', 'default_size')]);
|
||||||
|
|
|
@ -65,6 +65,8 @@ class AttachmentThumbnail extends Entity
|
||||||
private ?string $mimetype;
|
private ?string $mimetype;
|
||||||
private int $size = self::SIZE_SMALL;
|
private int $size = self::SIZE_SMALL;
|
||||||
private string $filename;
|
private string $filename;
|
||||||
|
private int $width;
|
||||||
|
private int $height;
|
||||||
private \DateTimeInterface $modified;
|
private \DateTimeInterface $modified;
|
||||||
|
|
||||||
public function setAttachmentId(int $attachment_id): self
|
public function setAttachmentId(int $attachment_id): self
|
||||||
|
@ -122,6 +124,28 @@ class AttachmentThumbnail extends Entity
|
||||||
return $this->modified;
|
return $this->modified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getWidth(): int
|
||||||
|
{
|
||||||
|
return $this->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setWidth(int $width): self
|
||||||
|
{
|
||||||
|
$this->width = $width;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHeight(): int
|
||||||
|
{
|
||||||
|
return $this->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setHeight(int $height): self
|
||||||
|
{
|
||||||
|
$this->height = $height;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
// @codeCoverageIgnoreEnd
|
// @codeCoverageIgnoreEnd
|
||||||
// }}} Autocode
|
// }}} Autocode
|
||||||
|
|
||||||
|
@ -199,6 +223,8 @@ class AttachmentThumbnail extends Entity
|
||||||
$filename = "{$predicted_width}x{$predicted_height}{$ext}-" . $attachment->getFilehash();
|
$filename = "{$predicted_width}x{$predicted_height}{$ext}-" . $attachment->getFilehash();
|
||||||
$thumbnail->setFilename($filename);
|
$thumbnail->setFilename($filename);
|
||||||
$thumbnail->setMimetype($mimetype);
|
$thumbnail->setMimetype($mimetype);
|
||||||
|
$thumbnail->setWidth($predicted_width);
|
||||||
|
$thumbnail->setHeight($predicted_height);
|
||||||
DB::persist($thumbnail);
|
DB::persist($thumbnail);
|
||||||
DB::flush();
|
DB::flush();
|
||||||
$temp->move(Common::config('thumbnail', 'dir'), $filename);
|
$temp->move(Common::config('thumbnail', 'dir'), $filename);
|
||||||
|
@ -326,6 +352,8 @@ class AttachmentThumbnail extends Entity
|
||||||
'mimetype' => ['type' => 'varchar', 'length' => 129, 'description' => 'resource mime type 64+1+64, images hardly will show up with long mimetypes, this is probably safe considering rfc6838#section-4.2'],
|
'mimetype' => ['type' => 'varchar', 'length' => 129, 'description' => 'resource mime type 64+1+64, images hardly will show up with long mimetypes, this is probably safe considering rfc6838#section-4.2'],
|
||||||
'size' => ['type' => 'int', 'not null' => true, 'default' => 0, 'description' => '0 = small; 1 = medium; 2 = big'],
|
'size' => ['type' => 'int', 'not null' => true, 'default' => 0, 'description' => '0 = small; 1 = medium; 2 = big'],
|
||||||
'filename' => ['type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'thumbnail filename'],
|
'filename' => ['type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'thumbnail filename'],
|
||||||
|
'width' => ['type' => 'int', 'not null' => true, 'description' => 'width in pixels, if it can be described as such and data is available'],
|
||||||
|
'height' => ['type' => 'int', 'not null' => true, 'description' => 'height in pixels, if it can be described as such and data is available'],
|
||||||
'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'],
|
'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'],
|
||||||
],
|
],
|
||||||
'primary key' => ['attachment_id', 'size'],
|
'primary key' => ['attachment_id', 'size'],
|
||||||
|
|
Loading…
Reference in New Issue
Block a user