import { PluginModel } from '@server/models/server/plugin'
import { PluginStorageManager } from '@shared/models/plugins/plugin-storage-manager.model'
import { PluginVideoLanguageManager } from '@shared/models/plugins/plugin-video-language-manager.model'
-import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES } from '@server/initializers/constants'
+import {
+ VIDEO_CATEGORIES,
+ VIDEO_LANGUAGES,
+ VIDEO_LICENCES,
+ VIDEO_PLAYLIST_PRIVACIES,
+ VIDEO_PRIVACIES
+} from '@server/initializers/constants'
import { PluginVideoLicenceManager } from '@shared/models/plugins/plugin-video-licence-manager.model'
import { PluginVideoCategoryManager } from '@shared/models/plugins/plugin-video-category-manager.model'
import { RegisterServerOptions } from '@server/typings/plugins'
import { serverHookObject } from '@shared/models/plugins/server-hook.model'
import { RegisterServerSettingOptions } from '@shared/models/plugins/register-server-setting.model'
import * as express from 'express'
+import { PluginVideoPrivacyManager } from '@shared/models/plugins/plugin-video-privacy-manager.model'
+import { PluginPlaylistPrivacyManager } from '@shared/models/plugins/plugin-playlist-privacy-manager.model'
-type AlterableVideoConstant = 'language' | 'licence' | 'category'
+type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy'
type VideoConstant = { [key in number | string]: string }
type UpdatedVideoConstant = {
export class RegisterHelpersStore {
private readonly updatedVideoConstants: UpdatedVideoConstant = {
+ playlistPrivacy: { added: [], deleted: [] },
+ privacy: { added: [], deleted: [] },
language: { added: [], deleted: [] },
licence: { added: [], deleted: [] },
category: { added: [], deleted: [] }
const videoLicenceManager = this.buildVideoLicenceManager()
const videoCategoryManager = this.buildVideoCategoryManager()
+ const videoPrivacyManager = this.buildVideoPrivacyManager()
+ const playlistPrivacyManager = this.buildPlaylistPrivacyManager()
+
const peertubeHelpers = buildPluginHelpers(this.npmName)
return {
videoCategoryManager,
videoLicenceManager,
+ videoPrivacyManager,
+ playlistPrivacyManager,
+
peertubeHelpers
}
}
const hash = {
language: VIDEO_LANGUAGES,
licence: VIDEO_LICENCES,
- category: VIDEO_CATEGORIES
+ category: VIDEO_CATEGORIES,
+ privacy: VIDEO_PRIVACIES,
+ playlistPrivacy: VIDEO_PLAYLIST_PRIVACIES
}
- const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category' ]
+ const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category', 'privacy', 'playlistPrivacy' ]
for (const type of types) {
const updatedConstants = this.updatedVideoConstants[type][npmName]
}
}
+ private buildVideoPrivacyManager (): PluginVideoPrivacyManager {
+ return {
+ deletePrivacy: (key: number) => {
+ return this.deleteConstant({ npmName: this.npmName, type: 'privacy', obj: VIDEO_PRIVACIES, key })
+ }
+ }
+ }
+
+ private buildPlaylistPrivacyManager (): PluginPlaylistPrivacyManager {
+ return {
+ deletePlaylistPrivacy: (key: number) => {
+ return this.deleteConstant({ npmName: this.npmName, type: 'playlistPrivacy', obj: VIDEO_PLAYLIST_PRIVACIES, key })
+ }
+ }
+ }
+
private buildVideoLicenceManager (): PluginVideoLicenceManager {
return {
addLicence: (key: number, label: string) => {
storageManager,
videoCategoryManager,
videoLicenceManager,
- videoLanguageManager
+ videoLanguageManager,
+ videoPrivacyManager,
+ playlistPrivacyManager
}) {
videoLanguageManager.addLanguage('al_bhed', 'Al Bhed')
videoLanguageManager.addLanguage('al_bhed2', 'Al Bhed 2')
videoLicenceManager.addLicence(43, 'High best licence')
videoLicenceManager.deleteLicence(1) // Attribution
videoLicenceManager.deleteLicence(7) // Public domain
+
+ videoPrivacyManager.deletePrivacy(2)
+ playlistPrivacyManager.deletePlaylistPrivacy(3)
}
async function unregister () {
import 'mocha'
import { cleanupTests, flushAndRunServer, ServerInfo } from '../../../shared/extra-utils/server/servers'
import {
+ createVideoPlaylist,
getPluginTestPath,
getVideo,
getVideoCategories,
getVideoLanguages,
- getVideoLicences,
+ getVideoLicences, getVideoPlaylistPrivacies, getVideoPrivacies,
installPlugin,
setAccessTokensToServers,
uninstallPlugin,
uploadVideo
} from '../../../shared/extra-utils'
-import { VideoDetails } from '../../../shared/models/videos'
+import { VideoDetails, VideoPlaylistPrivacy } from '../../../shared/models/videos'
const expect = chai.expect
expect(licences[43]).to.equal('High best licence')
})
+ it('Should have updated video privacies', async function () {
+ const res = await getVideoPrivacies(server.url)
+ const privacies = res.body
+
+ expect(privacies[1]).to.exist
+ expect(privacies[2]).to.not.exist
+ expect(privacies[3]).to.exist
+ expect(privacies[4]).to.exist
+ })
+
+ it('Should have updated playlist privacies', async function () {
+ const res = await getVideoPlaylistPrivacies(server.url)
+ const playlistPrivacies = res.body
+
+ expect(playlistPrivacies[1]).to.exist
+ expect(playlistPrivacies[2]).to.exist
+ expect(playlistPrivacies[3]).to.not.exist
+ })
+
+ it('Should not be able to create a video with this privacy', async function () {
+ const attrs = { name: 'video', privacy: 2 }
+ await uploadVideo(server.url, server.accessToken, attrs, 400)
+ })
+
+ it('Should not be able to create a video with this privacy', async function () {
+ const attrs = { displayName: 'video playlist', privacy: VideoPlaylistPrivacy.PRIVATE }
+ await createVideoPlaylist({ url: server.url, token: server.accessToken, playlistAttrs: attrs, expectedStatus: 400 })
+ })
+
it('Should be able to upload a video with these values', async function () {
const attrs = { name: 'video', category: 42, licence: 42, language: 'al_bhed2' }
const resUpload = await uploadVideo(server.url, server.accessToken, attrs)
expect(video.category.label).to.equal('Best category')
})
- it('Should uninstall the plugin and reset languages, categories and licences', async function () {
+ it('Should uninstall the plugin and reset languages, categories, licences and privacies', async function () {
await uninstallPlugin({ url: server.url, accessToken: server.accessToken, npmName: 'peertube-plugin-test-three' })
{
expect(licences[42]).to.not.exist
expect(licences[43]).to.not.exist
}
+
+ {
+ const res = await getVideoPrivacies(server.url)
+ const privacies = res.body
+
+ expect(privacies[1]).to.exist
+ expect(privacies[2]).to.exist
+ expect(privacies[3]).to.exist
+ expect(privacies[4]).to.exist
+ }
+
+ {
+ const res = await getVideoPlaylistPrivacies(server.url)
+ const playlistPrivacies = res.body
+
+ expect(playlistPrivacies[1]).to.exist
+ expect(playlistPrivacies[2]).to.exist
+ expect(playlistPrivacies[3]).to.exist
+ }
})
after(async function () {
import { PluginVideoLicenceManager } from '../../../shared/models/plugins/plugin-video-licence-manager.model'
import { Logger } from 'winston'
import { Router } from 'express'
+import { PluginVideoPrivacyManager } from '@shared/models/plugins/plugin-video-privacy-manager.model'
+import { PluginPlaylistPrivacyManager } from '@shared/models/plugins/plugin-playlist-privacy-manager.model'
export type PeerTubeHelpers = {
logger: Logger
videoLanguageManager: PluginVideoLanguageManager
videoLicenceManager: PluginVideoLicenceManager
+ videoPrivacyManager: PluginVideoPrivacyManager
+ playlistPrivacyManager: PluginPlaylistPrivacyManager
+
// Get plugin router to create custom routes
// Base routes of this router are
// * /plugins/:pluginName/:pluginVersion/router/...
--- /dev/null
+import { VideoPlaylistPrivacy } from '@shared/models'
+
+export interface PluginPlaylistPrivacyManager {
+ // PUBLIC = 1,
+ // UNLISTED = 2,
+ // PRIVATE = 3
+ deletePlaylistPrivacy: (privacyKey: VideoPlaylistPrivacy) => boolean
+}
--- /dev/null
+import { VideoPrivacy } from '@shared/models'
+
+export interface PluginVideoPrivacyManager {
+ // PUBLIC = 1
+ // UNLISTED = 2
+ // PRIVATE = 3
+ // INTERNAL = 4
+ deletePrivacy: (privacyKey: VideoPrivacy) => boolean
+}
- [Update video constants](#update-video-constants)
- [Add custom routes](#add-custom-routes)
- [Client helpers (themes & plugins)](#client-helpers-themes--plugins)
- - [Plugin static route](#plugin-static-route)
+ - [Plugin static route](#plugin-static-route)
+ - [Notifier](#notifier)
+ - [Markdown Renderer](#markdown-renderer)
+ - [Custom Modal](#custom-modal)
- [Translate](#translate)
- [Get public settings](#get-public-settings)
- [Publishing](#publishing)
videoLicenceManager.addLicence(42, 'Best licence')
videoLicenceManager.deleteLicence(7) // Public domain
+
+videoPrivacyManager.deletePrivacy(2) // Remove Unlisted video privacy
+playlistPrivacyManager.deletePlaylistPrivacy(3) // Remove Private video playlist privacy
```
#### Add custom routes