diff --git a/app/Helper/HtmlMeta.php b/app/Helper/HtmlMeta.php index 08510d48..a3d039b6 100644 --- a/app/Helper/HtmlMeta.php +++ b/app/Helper/HtmlMeta.php @@ -45,26 +45,43 @@ public static function getFromUrl(string $url, bool $flashAlerts = false): array return self::$fallback; } - return self::buildLinkMeta($meta); + return self::buildLinkMeta($meta, $url); } /** * Build a response array containing the link meta including a success flag. * * @param array $metaTags + * @param string $url * @return array */ - protected static function buildLinkMeta(array $metaTags): array + protected static function buildLinkMeta(array $metaTags, string $url): array { $metaTags['description'] = $metaTags['description'] ?? $metaTags['og:description'] ?? $metaTags['twitter:description'] ?? null; + $thumbnail = $metaTags['og:image'] + ?? $metaTags['twitter:image'] + ?? null; + + //Edge case of Youtube only (because of Youtube EU cookie consent) + if (str_contains($url, 'youtube') + && str_contains($url, 'v=') + && is_null($thumbnail) + ) { + //Formula based on https://stackoverflow.com/a/2068371 + $explode = explode('v=', $url); + //https://img.youtube.com/vi/[video-id]/mqdefault.jpg + $thumbnail = 'https://img.youtube.com/vi/' . $explode[1] . '/mqdefault.jpg'; + } + return [ 'success' => true, 'title' => $metaTags['title'] ?? self::$fallback['title'], 'description' => $metaTags['description'], + 'thumbnail' => $thumbnail, ]; } @@ -79,6 +96,7 @@ protected static function buildFallback(string $url): void 'success' => false, 'title' => parse_url($url, PHP_URL_HOST) ?? $url, 'description' => false, + 'thumbnail' => null, ]; } } diff --git a/app/Models/Link.php b/app/Models/Link.php index 609f77c7..d1ffef05 100644 --- a/app/Models/Link.php +++ b/app/Models/Link.php @@ -60,6 +60,7 @@ class Link extends Model 'is_private', 'status', 'check_disabled', + 'thumbnail', ]; protected $casts = [ diff --git a/app/Repositories/LinkRepository.php b/app/Repositories/LinkRepository.php index b9e2d948..89f04f28 100644 --- a/app/Repositories/LinkRepository.php +++ b/app/Repositories/LinkRepository.php @@ -38,6 +38,7 @@ public static function create(array $data, bool $flashAlerts = false): Link $data['description'] = $data['description'] ?? $linkMeta['description']; $data['user_id'] = auth()->user()->id; $data['icon'] = LinkIconMapper::mapLink($data['url']); + $data['thumbnail'] = $linkMeta['thumbnail']; // If the meta helper was not successfull, disable future checks and set the status to broken if ($linkMeta['success'] === false) { diff --git a/database/migrations/2021_04_15_165138_add_thumbnail_column_to_links_table.php b/database/migrations/2021_04_15_165138_add_thumbnail_column_to_links_table.php new file mode 100644 index 00000000..8c9893a7 --- /dev/null +++ b/database/migrations/2021_04_15_165138_add_thumbnail_column_to_links_table.php @@ -0,0 +1,32 @@ +string('thumbnail', 255)->nullable()->default(null)->after('icon'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('links', function (Blueprint $table) { + $table->dropColumn('thumbnail'); + }); + } +} diff --git a/resources/assets/sass/custom/_app.scss b/resources/assets/sass/custom/_app.scss index d2fa87fe..84b6003d 100644 --- a/resources/assets/sass/custom/_app.scss +++ b/resources/assets/sass/custom/_app.scss @@ -165,3 +165,22 @@ code { #loader { display: none !important; } + +.link-thumbnail-detail { + width: 180px; + height: 100px; + background-size: cover !important; +} + +.link-thumbnail-list-holder { + width: 100%; + @include media-breakpoint-up('md') { + width: auto; + } + + .link-thumbnail-list { + width: 100px; + height: 75px; + background-size: cover !important; + } +} diff --git a/resources/views/models/links/partials/single-detailed.blade.php b/resources/views/models/links/partials/single-detailed.blade.php index c2397a45..773ff1de 100644 --- a/resources/views/models/links/partials/single-detailed.blade.php +++ b/resources/views/models/links/partials/single-detailed.blade.php @@ -1,7 +1,13 @@
-
+
+ @if($link->thumbnail) + + @endif
@if($link->is_private) diff --git a/resources/views/models/links/show.blade.php b/resources/views/models/links/show.blade.php index 09148b44..5b8d43c5 100644 --- a/resources/views/models/links/show.blade.php +++ b/resources/views/models/links/show.blade.php @@ -7,7 +7,15 @@
-
+
+ @if($link->thumbnail) +
+ + +
+ + @endif
{!! $link->getIcon('mr-1 mr-sm-2') !!} @if($link->is_private)