Chat Federation: send the information to the frontend.
This commit is contained in:
parent
b1f1271389
commit
333590defd
@ -1,4 +1,6 @@
|
|||||||
import type { RegisterServerOptions, Video } from '@peertube/peertube-types'
|
import type { RegisterServerOptions, Video, MVideoThumbnail } from '@peertube/peertube-types'
|
||||||
|
import { getVideoLiveChatInfos } from './federation/storage'
|
||||||
|
|
||||||
async function initCustomFields (options: RegisterServerOptions): Promise<void> {
|
async function initCustomFields (options: RegisterServerOptions): Promise<void> {
|
||||||
const registerHook = options.registerHook
|
const registerHook = options.registerHook
|
||||||
const storageManager = options.storageManager
|
const storageManager = options.storageManager
|
||||||
@ -32,8 +34,11 @@ async function initCustomFields (options: RegisterServerOptions): Promise<void>
|
|||||||
registerHook({
|
registerHook({
|
||||||
target: 'filter:api.video.get.result',
|
target: 'filter:api.video.get.result',
|
||||||
handler: async (video: Video): Promise<Video> => {
|
handler: async (video: Video): Promise<Video> => {
|
||||||
logger.debug('Getting a video, searching for custom fields')
|
logger.debug('Getting a video, searching for custom fields and data')
|
||||||
await fillVideoCustomFields(options, video)
|
await fillVideoCustomFields(options, video)
|
||||||
|
if (!video.isLocal) {
|
||||||
|
await fillVideoRemoteLiveChat(options, video)
|
||||||
|
}
|
||||||
return video
|
return video
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -46,6 +51,7 @@ interface LiveChatCustomFieldsVideo {
|
|||||||
isLive: boolean
|
isLive: boolean
|
||||||
pluginData?: {
|
pluginData?: {
|
||||||
'livechat-active'?: boolean
|
'livechat-active'?: boolean
|
||||||
|
'livechat-remote'?: boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +74,22 @@ async function fillVideoCustomFields (options: RegisterServerOptions, video: Liv
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function fillVideoRemoteLiveChat (
|
||||||
|
options: RegisterServerOptions,
|
||||||
|
video: Video | MVideoThumbnail
|
||||||
|
): Promise<void> {
|
||||||
|
if (('remote' in video) && !video.remote) { return }
|
||||||
|
if (('isLocal' in video) && video.isLocal) { return }
|
||||||
|
const infos = await getVideoLiveChatInfos(options, video)
|
||||||
|
if (!infos) { return }
|
||||||
|
|
||||||
|
const v: LiveChatCustomFieldsVideo = video
|
||||||
|
if (!v.pluginData) v.pluginData = {}
|
||||||
|
v.pluginData['livechat-remote'] = true
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
initCustomFields,
|
initCustomFields,
|
||||||
fillVideoCustomFields
|
fillVideoCustomFields,
|
||||||
|
fillVideoRemoteLiveChat
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import type { RegisterServerOptions, MVideoFullLight, MVideoAP } from '@peertube/peertube-types'
|
import type { RegisterServerOptions, MVideoFullLight, MVideoAP, Video, MVideoThumbnail } from '@peertube/peertube-types'
|
||||||
import type { LiveChatJSONLDAttribute } from './types'
|
import type { LiveChatJSONLDAttribute } from './types'
|
||||||
|
import { sanitizePeertubeLiveChatInfos } from './sanitize'
|
||||||
import { URL } from 'url'
|
import { URL } from 'url'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
@ -50,10 +51,34 @@ async function storeVideoLiveChatInfos (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.debug(`${remote ? 'Remote' : 'Local'} video ${video.uuid} has caht infos to store`)
|
logger.debug(`${remote ? 'Remote' : 'Local'} video ${video.uuid} has chat infos to store`)
|
||||||
await _store(options, filePath, liveChatInfos)
|
await _store(options, filePath, liveChatInfos)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the stored livechat information (if any).
|
||||||
|
* @param options server options
|
||||||
|
* @param video video object
|
||||||
|
* @returns livechat stored data
|
||||||
|
*/
|
||||||
|
async function getVideoLiveChatInfos (
|
||||||
|
options: RegisterServerOptions,
|
||||||
|
video: MVideoFullLight | MVideoAP | Video | MVideoThumbnail
|
||||||
|
): Promise<LiveChatJSONLDAttribute> {
|
||||||
|
const logger = options.peertubeHelpers.logger
|
||||||
|
const remote = ('remote' in video) ? video.remote : !video.isLocal
|
||||||
|
const filePath = await _getFilePath(options, remote, video.uuid, video.url)
|
||||||
|
if (!filePath) {
|
||||||
|
logger.error('Cant compute the file path for storing liveChat infos for video ' + video.uuid)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const content = await _get(options, filePath)
|
||||||
|
if (content === null) { return false }
|
||||||
|
// We must sanitize here, in case a previous plugin version did not sanitize enougth.
|
||||||
|
return sanitizePeertubeLiveChatInfos(content)
|
||||||
|
}
|
||||||
|
|
||||||
async function _getFilePath (
|
async function _getFilePath (
|
||||||
options: RegisterServerOptions,
|
options: RegisterServerOptions,
|
||||||
remote: boolean,
|
remote: boolean,
|
||||||
@ -123,6 +148,23 @@ async function _store (options: RegisterServerOptions, filePath: string, content
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export {
|
async function _get (options: RegisterServerOptions, filePath: string): Promise<any | null> {
|
||||||
storeVideoLiveChatInfos
|
const logger = options.peertubeHelpers.logger
|
||||||
|
try {
|
||||||
|
if (!fs.existsSync(filePath)) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const content = await fs.promises.readFile(filePath, {
|
||||||
|
encoding: 'utf-8'
|
||||||
|
})
|
||||||
|
return JSON.parse(content)
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(err)
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
storeVideoLiveChatInfos,
|
||||||
|
getVideoLiveChatInfos
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import { prosodyCheckUserPassword, prosodyRegisterUser, prosodyUserRegistered }
|
|||||||
import { getUserNickname } from '../helpers'
|
import { getUserNickname } from '../helpers'
|
||||||
import { Affiliations, getVideoAffiliations, getChannelAffiliations } from '../prosody/config/affiliations'
|
import { Affiliations, getVideoAffiliations, getChannelAffiliations } from '../prosody/config/affiliations'
|
||||||
import { getProsodyDomain } from '../prosody/config/domain'
|
import { getProsodyDomain } from '../prosody/config/domain'
|
||||||
import { fillVideoCustomFields } from '../custom-fields'
|
import { fillVideoCustomFields, fillVideoRemoteLiveChat } from '../custom-fields'
|
||||||
import { getChannelInfosById } from '../database/channel'
|
import { getChannelInfosById } from '../database/channel'
|
||||||
|
|
||||||
// See here for description: https://modules.prosody.im/mod_muc_http_defaults.html
|
// See here for description: https://modules.prosody.im/mod_muc_http_defaults.html
|
||||||
@ -96,8 +96,9 @@ async function initApiRouter (options: RegisterServerOptions): Promise<Router> {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adding the custom fields:
|
// Adding the custom fields and data:
|
||||||
await fillVideoCustomFields(options, video)
|
await fillVideoCustomFields(options, video)
|
||||||
|
if (video.remote) { await fillVideoRemoteLiveChat(options, video) }
|
||||||
|
|
||||||
// check settings (chat enabled for this video?)
|
// check settings (chat enabled for this video?)
|
||||||
const settings = await options.settingsManager.getSettings([
|
const settings = await options.settingsManager.getSettings([
|
||||||
|
Loading…
x
Reference in New Issue
Block a user