From 49af5ac8c2653cb0ef23479c9d3256c5b724d49d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 3 Jun 2021 14:30:09 +0200 Subject: Refactor AP playlists --- .../activitypub/playlists/shared/url-to-object.ts | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 server/lib/activitypub/playlists/shared/url-to-object.ts (limited to 'server/lib/activitypub/playlists/shared/url-to-object.ts') diff --git a/server/lib/activitypub/playlists/shared/url-to-object.ts b/server/lib/activitypub/playlists/shared/url-to-object.ts new file mode 100644 index 000000000..ec8c01255 --- /dev/null +++ b/server/lib/activitypub/playlists/shared/url-to-object.ts @@ -0,0 +1,47 @@ +import { isArray } from 'lodash' +import { checkUrlsSameHost } from '@server/helpers/activitypub' +import { isPlaylistElementObjectValid, isPlaylistObjectValid } from '@server/helpers/custom-validators/activitypub/playlist' +import { logger, loggerTagsFactory } from '@server/helpers/logger' +import { doJSONRequest } from '@server/helpers/requests' +import { PlaylistElementObject, PlaylistObject } from '@shared/models' + +async function fetchRemoteVideoPlaylist (playlistUrl: string): Promise<{ statusCode: number, playlistObject: PlaylistObject }> { + const lTags = loggerTagsFactory('ap', 'video-playlist', playlistUrl) + + logger.info('Fetching remote playlist %s.', playlistUrl, lTags()) + + const { body, statusCode } = await doJSONRequest(playlistUrl, { activityPub: true }) + + if (isPlaylistObjectValid(body) === false || checkUrlsSameHost(body.id, playlistUrl) !== true) { + logger.debug('Remote video playlist JSON is not valid.', { body, ...lTags() }) + return { statusCode, playlistObject: undefined } + } + + if (!isArray(body.to)) { + logger.debug('Remote video playlist JSON does not have a valid audience.', { body, ...lTags() }) + return { statusCode, playlistObject: undefined } + } + + return { statusCode, playlistObject: body } +} + +async function fetchRemotePlaylistElement (elementUrl: string): Promise<{ statusCode: number, elementObject: PlaylistElementObject }> { + const lTags = loggerTagsFactory('ap', 'video-playlist', 'element', elementUrl) + + logger.debug('Fetching remote playlist element %s.', elementUrl, lTags()) + + const { body, statusCode } = await doJSONRequest(elementUrl, { activityPub: true }) + + if (!isPlaylistElementObjectValid(body)) throw new Error(`Invalid body in fetch playlist element ${elementUrl}`) + + if (checkUrlsSameHost(body.id, elementUrl) !== true) { + throw new Error(`Playlist element url ${elementUrl} host is different from the AP object id ${body.id}`) + } + + return { statusCode, elementObject: body } +} + +export { + fetchRemoteVideoPlaylist, + fetchRemotePlaylistElement +} -- cgit v1.2.3