X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fplugins%2Fplugin-helpers-builder.ts;h=35945422c24e1db9900754390e14977339562588;hb=c43ed8e8624383db5a0cf22b210cee202bae323c;hp=39773f693757799c380f640dc4ad29a16f929087;hpb=1896bca09e088b0da9d5e845407ecebae330618c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/plugins/plugin-helpers-builder.ts b/server/lib/plugins/plugin-helpers-builder.ts index 39773f693..35945422c 100644 --- a/server/lib/plugins/plugin-helpers-builder.ts +++ b/server/lib/plugins/plugin-helpers-builder.ts @@ -1,19 +1,28 @@ -import { PeerTubeHelpers } from '@server/types/plugins' -import { sequelizeTypescript } from '@server/initializers/database' +import express from 'express' +import { join } from 'path' +import { ffprobePromise } from '@server/helpers/ffmpeg/ffprobe-utils' import { buildLogger } from '@server/helpers/logger' -import { VideoModel } from '@server/models/video/video' +import { CONFIG } from '@server/initializers/config' import { WEBSERVER } from '@server/initializers/constants' -import { ServerModel } from '@server/models/server/server' +import { sequelizeTypescript } from '@server/initializers/database' +import { AccountModel } from '@server/models/account/account' +import { AccountBlocklistModel } from '@server/models/account/account-blocklist' import { getServerActor } from '@server/models/application/application' -import { addServerInBlocklist, removeServerFromBlocklist, addAccountInBlocklist, removeAccountFromBlocklist } from '../blocklist' +import { ServerModel } from '@server/models/server/server' import { ServerBlocklistModel } from '@server/models/server/server-blocklist' -import { AccountModel } from '@server/models/account/account' -import { VideoBlacklistCreate } from '@shared/models' -import { blacklistVideo, unblacklistVideo } from '../video-blacklist' +import { UserModel } from '@server/models/user/user' +import { VideoModel } from '@server/models/video/video' import { VideoBlacklistModel } from '@server/models/video/video-blacklist' -import { AccountBlocklistModel } from '@server/models/account/account-blocklist' +import { MPlugin, MVideo, UserNotificationModelForApi } from '@server/types/models' +import { PeerTubeHelpers } from '@server/types/plugins' +import { VideoBlacklistCreate, VideoStorage } from '@shared/models' +import { addAccountInBlocklist, addServerInBlocklist, removeAccountFromBlocklist, removeServerFromBlocklist } from '../blocklist' +import { ServerConfigManager } from '../server-config-manager' +import { blacklistVideo, unblacklistVideo } from '../video-blacklist' +import { VideoPathManager } from '../video-path-manager' +import { PeerTubeSocket } from '../peertube-socket' -function buildPluginHelpers (npmName: string): PeerTubeHelpers { +function buildPluginHelpers (pluginModel: MPlugin, npmName: string): PeerTubeHelpers { const logger = buildPluginLogger(npmName) const database = buildDatabaseHelpers() @@ -25,13 +34,22 @@ function buildPluginHelpers (npmName: string): PeerTubeHelpers { const moderation = buildModerationHelpers() + const plugin = buildPluginRelatedHelpers(pluginModel, npmName) + + const socket = buildSocketHelpers() + + const user = buildUserHelpers() + return { logger, database, videos, config, moderation, - server + plugin, + server, + socket, + user } } @@ -63,12 +81,70 @@ function buildVideosHelpers () { return VideoModel.loadByUrl(url) }, + loadByIdOrUUID: (id: number | string) => { + return VideoModel.load(id) + }, + removeVideo: (id: number) => { return sequelizeTypescript.transaction(async t => { - const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(id, t) + const video = await VideoModel.loadFull(id, t) await video.destroy({ transaction: t }) }) + }, + + ffprobe: (path: string) => { + return ffprobePromise(path) + }, + + getFiles: async (id: number | string) => { + const video = await VideoModel.loadFull(id) + if (!video) return undefined + + const webtorrentVideoFiles = (video.VideoFiles || []).map(f => ({ + path: f.storage === VideoStorage.FILE_SYSTEM + ? VideoPathManager.Instance.getFSVideoFileOutputPath(video, f) + : null, + url: f.getFileUrl(video), + + resolution: f.resolution, + size: f.size, + fps: f.fps + })) + + const hls = video.getHLSPlaylist() + + const hlsVideoFiles = hls + ? (video.getHLSPlaylist().VideoFiles || []).map(f => { + return { + path: f.storage === VideoStorage.FILE_SYSTEM + ? VideoPathManager.Instance.getFSVideoFileOutputPath(hls, f) + : null, + url: f.getFileUrl(video), + resolution: f.resolution, + size: f.size, + fps: f.fps + } + }) + : [] + + const thumbnails = video.Thumbnails.map(t => ({ + type: t.type, + url: t.getFileUrl(video), + path: t.getPath() + })) + + return { + webtorrent: { + videoFiles: webtorrentVideoFiles + }, + + hls: { + videoFiles: hlsVideoFiles + }, + + thumbnails + } } } } @@ -106,14 +182,14 @@ function buildModerationHelpers () { }, blacklistVideo: async (options: { videoIdOrUUID: number | string, createOptions: VideoBlacklistCreate }) => { - const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(options.videoIdOrUUID) + const video = await VideoModel.loadFull(options.videoIdOrUUID) if (!video) return await blacklistVideo(video, options.createOptions) }, unblacklistVideo: async (options: { videoIdOrUUID: number | string }) => { - const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(options.videoIdOrUUID) + const video = await VideoModel.loadFull(options.videoIdOrUUID) if (!video) return const videoBlacklist = await VideoBlacklistModel.loadByVideoId(video.id) @@ -128,6 +204,46 @@ function buildConfigHelpers () { return { getWebserverUrl () { return WEBSERVER.URL + }, + + getServerConfig () { + return ServerConfigManager.Instance.getServerConfig() + } + } +} + +function buildPluginRelatedHelpers (plugin: MPlugin, npmName: string) { + return { + getBaseStaticRoute: () => `/plugins/${plugin.name}/${plugin.version}/static/`, + + getBaseRouterRoute: () => `/plugins/${plugin.name}/${plugin.version}/router/`, + + getDataDirectoryPath: () => join(CONFIG.STORAGE.PLUGINS_DIR, 'data', npmName) + } +} + +function buildSocketHelpers () { + return { + sendNotification: (userId: number, notification: UserNotificationModelForApi) => { + PeerTubeSocket.Instance.sendNotification(userId, notification) + }, + sendVideoLiveNewState: (video: MVideo) => { + PeerTubeSocket.Instance.sendVideoLiveNewState(video) + } + } +} + +function buildUserHelpers () { + return { + loadById: (id: number) => { + return UserModel.loadByIdFull(id) + }, + + getAuthUser: (res: express.Response) => { + const user = res.locals.oauth?.token?.User + if (!user) return undefined + + return UserModel.loadByIdFull(user.id) } } }