// SPDX-FileCopyrightText: 2024 John Livingston // // SPDX-License-Identifier: AGPL-3.0-only import type { RegisterServerOptions, Video, MVideoThumbnail } from '@peertube/peertube-types' import { getVideoLiveChatInfos } from './federation/storage' import { anonymousConnectionInfos, compatibleRemoteAuthenticatedConnectionEnabled } from './federation/connection-infos' async function initCustomFields (options: RegisterServerOptions): Promise { const registerHook = options.registerHook const storageManager = options.storageManager const logger = options.peertubeHelpers.logger registerHook({ target: 'action:api.live-video.created', handler: async ({ video }: { video: Video | undefined }) => { if (!video?.id) { return } // When creating a new live, if the chat is an option 'per video', we enable the chat by default. // This is done for the Peertube live Android app, which does not update the video after creation. // See: https://github.com/JohnXLivingston/peertube-plugin-livechat/issues/400 const setting = await options.settingsManager.getSetting('chat-per-live-video') if (setting !== true) { return } logger.info( `New live created, enabling chat by default by setting livechat-active=true for video ${video.id.toString()}.` ) await storageManager.storeData(`livechat-active-${video.id.toString()}`, true) } }) registerHook({ target: 'action:api.video.updated', handler: async (params: any) => { logger.debug('Saving a video, checking for custom fields') const body: any = params.body const video: Video | undefined = params.video if (!video || !video.id) { return } if (!body.pluginData) return const value = body.pluginData['livechat-active'] // NB: on Peertube 3.2.1, value is "true", "false", or "null", as strings. if (value === true || value === 'true') { logger.info(`Saving livechat-active=true for video ${video.id.toString()}`) await storageManager.storeData(`livechat-active-${video.id.toString()}`, true) } else if (value === false || value === 'false' || value === 'null') { logger.info(`Saving livechat-active=false for video ${video.id.toString()}`) await storageManager.storeData(`livechat-active-${video.id.toString()}`, false) } else { logger.error('Unknown value ' + JSON.stringify(value) + ' for livechat-active field.') } } }) registerHook({ target: 'filter:api.video.get.result', handler: async (video: Video): Promise