From 54adc6f038758e3b7a759f9a5c2a71d0a6b9959b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 22 Oct 2024 13:12:06 +0200 Subject: [PATCH] Add instance avatar to default open graph tags --- packages/tests/src/client/embed-html.ts | 7 ++-- packages/tests/src/client/index-html.ts | 3 +- packages/tests/src/client/og-twitter-tags.ts | 36 ++++++++++++++++++ packages/tests/src/shared/client.ts | 24 +++++++++--- server/core/lib/html/shared/actor-html.ts | 4 +- .../core/lib/html/shared/common-embed-html.ts | 2 +- server/core/lib/html/shared/page-html.ts | 38 +++++++++++++++---- server/core/lib/html/shared/playlist-html.ts | 8 ++-- server/core/lib/html/shared/tags-html.ts | 12 +++--- server/core/lib/html/shared/video-html.ts | 14 ++++--- server/core/lib/video-pre-import.ts | 4 +- server/core/models/video/video.ts | 12 +++--- server/core/types/models/abuse/abuse.ts | 2 +- server/core/types/models/video/video.ts | 2 +- 14 files changed, 119 insertions(+), 49 deletions(-) diff --git a/packages/tests/src/client/embed-html.ts b/packages/tests/src/client/embed-html.ts index 99121b8f2..c1aaf58a0 100644 --- a/packages/tests/src/client/embed-html.ts +++ b/packages/tests/src/client/embed-html.ts @@ -23,7 +23,8 @@ describe('Test embed HTML generation', function () { let unlistedPlaylistId: string let playlistName: string let playlistDescription: string - let instanceDescription: string + + let instanceConfig: { shortDescription: string } before(async function () { this.timeout(120000); @@ -44,7 +45,7 @@ describe('Test embed HTML generation', function () { playlist, unlistedPlaylistId, privatePlaylistId, - instanceDescription + instanceConfig } = await prepareClientTests()) }) @@ -58,7 +59,7 @@ describe('Test embed HTML generation', function () { it('Should have the correct embed html instance tags', async function () { const res = await makeHTMLRequest(servers[0].url, '/videos/embed/toto') - checkIndexTags(res.text, `PeerTube`, instanceDescription, '', config) + checkIndexTags(res.text, `PeerTube`, instanceConfig.shortDescription, '', config) expect(res.text).to.not.contain(`"name":`) }) diff --git a/packages/tests/src/client/index-html.ts b/packages/tests/src/client/index-html.ts index 5f33955dc..30198ad57 100644 --- a/packages/tests/src/client/index-html.ts +++ b/packages/tests/src/client/index-html.ts @@ -35,8 +35,7 @@ describe('Test index HTML generation', function () { passwordProtectedVideoId, unlistedVideoId, privatePlaylistId, - unlistedPlaylistId, - instanceDescription + unlistedPlaylistId } = await prepareClientTests()) }) diff --git a/packages/tests/src/client/og-twitter-tags.ts b/packages/tests/src/client/og-twitter-tags.ts index 0244dce0b..05b1ad9da 100644 --- a/packages/tests/src/client/og-twitter-tags.ts +++ b/packages/tests/src/client/og-twitter-tags.ts @@ -22,11 +22,18 @@ describe('Test Open Graph and Twitter cards HTML tags', function () { let playlistIds: (string | number)[] = [] + let instanceConfig: { + name: string + shortDescription: string + avatar: string + } + before(async function () { this.timeout(120000); ({ servers, + instanceConfig, account, playlistIds, videoIds, @@ -41,6 +48,20 @@ describe('Test Open Graph and Twitter cards HTML tags', function () { describe('Open Graph', function () { + async function indexPageTest (path: string) { + const res = await makeGetRequest({ url: servers[0].url, path, accept: 'text/html', expectedStatus: HttpStatusCode.OK_200 }) + const text = res.text + + let url = servers[0].url + if (path !== '/') url += path + + expect(text).to.contain(``) + expect(text).to.contain(``) + expect(text).to.contain('') + expect(text).to.contain(``) expect(text).to.contain('') expect(text).to.contain(``) + expect(text).to.not.contain(``) expect(text).to.contain('') expect(text).to.contain(``) + expect(text).to.contain(``) expect(text).to.contain('') expect(text).to.contain(``) + expect(text).to.contain(``) expect(text).to.contain('') expect(text).to.contain(``) + expect(text).to.contain(`') expect(text).to.contain('') + expect(text).to.not.contain(`') expect(text).to.contain('') + expect(text).to.contain(`') expect(text).to.contain('') + expect(text).to.contain(`') expect(text).to.contain('') + expect(text).to.contain(`` } - if (indexationPolicy === 'never') { + if (forbidIndexation === true) { tagsStr += `` } diff --git a/server/core/lib/html/shared/video-html.ts b/server/core/lib/html/shared/video-html.ts index e1b285a9c..d6b35a98c 100644 --- a/server/core/lib/html/shared/video-html.ts +++ b/server/core/lib/html/shared/video-html.ts @@ -7,7 +7,7 @@ import validator from 'validator' import { CONFIG } from '../../../initializers/config.js' import { MEMOIZE_TTL, WEBSERVER } from '../../../initializers/constants.js' import { VideoModel } from '../../../models/video/video.js' -import { MVideo, MVideoThumbnailBlacklist } from '../../../types/models/index.js' +import { MVideo, MVideoThumbnail, MVideoThumbnailBlacklist } from '../../../types/models/index.js' import { getActivityStreamDuration } from '../../activitypub/activity.js' import { isVideoInPrivateDirectory } from '../../video-privacy.js' import { CommonEmbedHtml } from './common-embed-html.js' @@ -78,7 +78,7 @@ export class VideoHtml { private static buildVideoHTML (options: { html: string - video: MVideo + video: MVideoThumbnail addOG: boolean addTwitterCard: boolean @@ -111,6 +111,8 @@ export class VideoHtml { const schemaType = 'VideoObject' + const preview = video.getPreview() + return TagsHtml.addTags(customHTML, { url: WEBSERVER.URL + video.getWatchStaticPath(), @@ -118,11 +120,11 @@ export class VideoHtml { escapedTitle: escapeHTML(video.name), escapedTruncatedDescription, - indexationPolicy: video.remote || video.privacy !== VideoPrivacy.PUBLIC - ? 'never' - : 'always', + forbidIndexation: video.remote || video.privacy !== VideoPrivacy.PUBLIC, - image: { url: WEBSERVER.URL + video.getPreviewStaticPath() }, + image: preview + ? { url: WEBSERVER.URL + video.getPreviewStaticPath(), width: preview.width, height: preview.height } + : undefined, embed, oembedUrl: this.getOEmbedUrl(video, currentQuery), diff --git a/server/core/lib/video-pre-import.ts b/server/core/lib/video-pre-import.ts index 615429087..e17bf2797 100644 --- a/server/core/lib/video-pre-import.ts +++ b/server/core/lib/video-pre-import.ts @@ -79,8 +79,8 @@ async function insertFromImportIntoDB (parameters: { const videoImport = await sequelizeTypescript.transaction(async t => { const sequelizeOptions = { transaction: t } - // Save video object in database - const videoCreated = await video.save(sequelizeOptions) as (MVideoAccountDefault & MVideoWithBlacklistLight & MVideoTag) + // eslint-disable-next-line max-len + const videoCreated = await video.save(sequelizeOptions) as (MVideoAccountDefault & MVideoWithBlacklistLight & MVideoTag & MVideoThumbnail) videoCreated.VideoChannel = videoChannel if (thumbnailModel) await videoCreated.addAndSaveThumbnail(thumbnailModel, t) diff --git a/server/core/models/video/video.ts b/server/core/models/video/video.ts index b6aa85486..d72e5f744 100644 --- a/server/core/models/video/video.ts +++ b/server/core/models/video/video.ts @@ -1838,21 +1838,21 @@ export class VideoModel extends SequelizeModel { // --------------------------------------------------------------------------- - hasMiniature (this: MVideoThumbnail) { + hasMiniature (this: Pick) { return !!this.getMiniature() } - getMiniature (this: MVideoThumbnail) { + getMiniature (this: Pick) { if (Array.isArray(this.Thumbnails) === false) return undefined return this.Thumbnails.find(t => t.type === ThumbnailType.MINIATURE) } - hasPreview (this: MVideoThumbnail) { + hasPreview (this: Pick) { return !!this.getPreview() } - getPreview (this: MVideoThumbnail) { + getPreview (this: Pick) { if (Array.isArray(this.Thumbnails) === false) return undefined return this.Thumbnails.find(t => t.type === ThumbnailType.PREVIEW) @@ -1872,14 +1872,14 @@ export class VideoModel extends SequelizeModel { return buildVideoEmbedPath(this) } - getMiniatureStaticPath () { + getMiniatureStaticPath (this: Pick) { const thumbnail = this.getMiniature() if (!thumbnail) return null return thumbnail.getLocalStaticPath() } - getPreviewStaticPath () { + getPreviewStaticPath (this: Pick) { const preview = this.getPreview() if (!preview) return null diff --git a/server/core/types/models/abuse/abuse.ts b/server/core/types/models/abuse/abuse.ts index bf6680470..c0c8d3776 100644 --- a/server/core/types/models/abuse/abuse.ts +++ b/server/core/types/models/abuse/abuse.ts @@ -40,7 +40,7 @@ export type MVideoAbuseVideoFull = export type MVideoAbuseFormattable = MVideoAbuse & UseVideoAbuse<'Video', Pick> + 'id' | 'uuid' | 'name' | 'nsfw' | 'getMiniature' | 'getMiniatureStaticPath' | 'isBlacklisted' | 'VideoChannel' | 'Thumbnails'>> // ############################################################################ diff --git a/server/core/types/models/video/video.ts b/server/core/types/models/video/video.ts index 8db18f1fb..de462176b 100644 --- a/server/core/types/models/video/video.ts +++ b/server/core/types/models/video/video.ts @@ -217,7 +217,7 @@ export type MVideoForRedundancyAPI = // Format for API or AP object export type MVideoFormattable = - MVideo & + MVideoThumbnail & PickWithOpt & Use<'VideoChannel', MChannelAccountSummaryFormattable> & PickWithOpt> &