+async function videoRedundancyController (req: express.Request, res: express.Response) {
+ const videoRedundancy = res.locals.videoRedundancy
+ if (videoRedundancy.url.startsWith(WEBSERVER.URL) === false) return res.redirect(videoRedundancy.url)
+
+ const serverActor = await getServerActor()
+
+ const audience = getAudience(serverActor)
+ const object = audiencify(videoRedundancy.toActivityPubObject(), audience)
+
+ if (req.path.endsWith('/activity')) {
+ const data = buildCreateActivity(videoRedundancy.url, serverActor, object, audience)
+ return activityPubResponse(activityPubContextify(data, 'CacheFile'), res)
+ }
+
+ return activityPubResponse(activityPubContextify(object, 'CacheFile'), res)
+}
+
+async function videoPlaylistController (req: express.Request, res: express.Response) {
+ const playlist = res.locals.videoPlaylistFull
+
+ // We need more attributes
+ playlist.OwnerAccount = await AccountModel.load(playlist.ownerAccountId)
+
+ const json = await playlist.toActivityPubObject(req.query.page, null)
+ const audience = getAudience(playlist.OwnerAccount.Actor, playlist.privacy === VideoPlaylistPrivacy.PUBLIC)
+ const object = audiencify(json, audience)
+
+ return activityPubResponse(activityPubContextify(object), res)
+}
+
+function videoPlaylistElementController (req: express.Request, res: express.Response) {
+ const videoPlaylistElement = res.locals.videoPlaylistElementAP
+
+ const json = videoPlaylistElement.toActivityPubObject()
+ return activityPubResponse(activityPubContextify(json), res)
+}
+