From 156c50af3085468a47b8ae73fe8cfcae46b42398 Mon Sep 17 00:00:00 2001 From: Lucas Declercq Date: Sat, 6 Oct 2018 19:17:21 +0200 Subject: [PATCH] Add downloadingEnabled property to video model --- .../video-import/video-import.service.ts | 1 + .../app/shared/video/video-details.model.ts | 2 ++ .../src/app/shared/video/video-edit.model.ts | 5 +++- client/src/app/shared/video/video.service.ts | 1 + .../video-import-torrent.component.ts | 2 ++ .../video-import-url.component.ts | 2 ++ .../video-upload.component.ts | 2 ++ .../+video-watch/video-watch.component.html | 2 +- .../+video-watch/video-watch.component.ts | 4 +++ server/controllers/api/videos/import.ts | 1 + server/controllers/api/videos/index.ts | 2 ++ server/helpers/activitypub.ts | 1 + server/helpers/audit-logger.ts | 3 ++- .../custom-validators/activitypub/videos.ts | 1 + .../0280-video-downloading-enabled.ts | 27 +++++++++++++++++++ server/lib/activitypub/videos.ts | 2 ++ .../middlewares/validators/videos/videos.ts | 4 +++ server/models/video/video-format-utils.ts | 2 ++ server/models/video/video.ts | 4 +++ .../tests/api/check-params/video-imports.ts | 1 + server/tests/api/check-params/videos.ts | 2 ++ server/tests/api/server/follows.ts | 1 + server/tests/api/server/handle-down.ts | 1 + server/tests/api/videos/multiple-servers.ts | 6 +++++ server/tests/api/videos/single-server.ts | 3 +++ server/tests/utils/videos/videos.ts | 6 +++++ server/tools/peertube-import-videos.ts | 1 + server/tools/peertube-upload.ts | 2 ++ .../objects/video-torrent-object.ts | 3 ++- shared/models/videos/video-create.model.ts | 1 + shared/models/videos/video-update.model.ts | 1 + shared/models/videos/video.model.ts | 1 + support/doc/api/openapi.yaml | 2 ++ support/doc/api/videos.yaml | 5 ++++ 34 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 server/initializers/migrations/0280-video-downloading-enabled.ts diff --git a/client/src/app/shared/video-import/video-import.service.ts b/client/src/app/shared/video-import/video-import.service.ts index 7ae66ddfc..74c458645 100644 --- a/client/src/app/shared/video-import/video-import.service.ts +++ b/client/src/app/shared/video-import/video-import.service.ts @@ -81,6 +81,7 @@ export class VideoImportService { nsfw: video.nsfw, waitTranscoding: video.waitTranscoding, commentsEnabled: video.commentsEnabled, + downloadingEnabled: video.downloadingEnabled, thumbnailfile: video.thumbnailfile, previewfile: video.previewfile, scheduleUpdate diff --git a/client/src/app/shared/video/video-details.model.ts b/client/src/app/shared/video/video-details.model.ts index fa4ca7f93..ad85641dc 100644 --- a/client/src/app/shared/video/video-details.model.ts +++ b/client/src/app/shared/video/video-details.model.ts @@ -12,6 +12,7 @@ export class VideoDetails extends Video implements VideoDetailsServerModel { files: VideoFile[] account: Account commentsEnabled: boolean + downloadingEnabled: boolean waitTranscoding: boolean state: VideoConstant @@ -29,6 +30,7 @@ export class VideoDetails extends Video implements VideoDetailsServerModel { this.tags = hash.tags this.support = hash.support this.commentsEnabled = hash.commentsEnabled + this.downloadingEnabled = hash.downloadingEnabled this.buildLikeAndDislikePercents() } diff --git a/client/src/app/shared/video/video-edit.model.ts b/client/src/app/shared/video/video-edit.model.ts index 0046be964..47703ff79 100644 --- a/client/src/app/shared/video/video-edit.model.ts +++ b/client/src/app/shared/video/video-edit.model.ts @@ -14,6 +14,7 @@ export class VideoEdit implements VideoUpdate { tags: string[] nsfw: boolean commentsEnabled: boolean + downloadingEnabled: boolean waitTranscoding: boolean channelId: number privacy: VideoPrivacy @@ -26,7 +27,7 @@ export class VideoEdit implements VideoUpdate { id?: number scheduleUpdate?: VideoScheduleUpdate - constructor (video?: Video & { tags: string[], commentsEnabled: boolean, support: string, thumbnailUrl: string, previewUrl: string }) { + constructor (video?: Video & { tags: string[], commentsEnabled: boolean, downloadingEnabled: boolean, support: string, thumbnailUrl: string, previewUrl: string }) { if (video) { this.id = video.id this.uuid = video.uuid @@ -38,6 +39,7 @@ export class VideoEdit implements VideoUpdate { this.tags = video.tags this.nsfw = video.nsfw this.commentsEnabled = video.commentsEnabled + this.downloadingEnabled = video.downloadingEnabled this.waitTranscoding = video.waitTranscoding this.channelId = video.channel.id this.privacy = video.privacy.id @@ -80,6 +82,7 @@ export class VideoEdit implements VideoUpdate { tags: this.tags, nsfw: this.nsfw, commentsEnabled: this.commentsEnabled, + downloadingEnabled: this.downloadingEnabled, waitTranscoding: this.waitTranscoding, channelId: this.channelId, privacy: this.privacy diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts index 724a0bde9..c0339dd39 100644 --- a/client/src/app/shared/video/video.service.ts +++ b/client/src/app/shared/video/video.service.ts @@ -95,6 +95,7 @@ export class VideoService implements VideosProvider { nsfw: video.nsfw, waitTranscoding: video.waitTranscoding, commentsEnabled: video.commentsEnabled, + downloadingEnabled: video.downloadingEnabled, thumbnailfile: video.thumbnailfile, previewfile: video.previewfile, scheduleUpdate diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts index 0f7184ff8..57cf0e395 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts @@ -77,6 +77,7 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca privacy: this.firstStepPrivacyId, waitTranscoding: false, commentsEnabled: true, + downloadingEnabled: true, channelId: this.firstStepChannelId } @@ -91,6 +92,7 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca this.video = new VideoEdit(Object.assign(res.video, { commentsEnabled: videoUpdate.commentsEnabled, + downloadingEnabled: videoUpdate.downloadingEnabled, support: null, thumbnailUrl: null, previewUrl: null diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts index 031e557ed..11db4a7ef 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts @@ -69,6 +69,7 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom privacy: this.firstStepPrivacyId, waitTranscoding: false, commentsEnabled: true, + downloadingEnabled: true, channelId: this.firstStepChannelId } @@ -83,6 +84,7 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom this.video = new VideoEdit(Object.assign(res.video, { commentsEnabled: videoUpdate.commentsEnabled, + downloadingEnabled: videoUpdate.downloadingEnabled, support: null, thumbnailUrl: null, previewUrl: null diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts index 941dc5441..53f72f4e6 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts @@ -159,6 +159,7 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy const nsfw = false const waitTranscoding = true const commentsEnabled = true + const downloadingEnabled = true const channelId = this.firstStepChannelId.toString() const formData = new FormData() @@ -167,6 +168,7 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy formData.append('privacy', VideoPrivacy.PRIVATE.toString()) formData.append('nsfw', '' + nsfw) formData.append('commentsEnabled', '' + commentsEnabled) + formData.append('downloadingEnabled', '' + downloadingEnabled) formData.append('waitTranscoding', '' + waitTranscoding) formData.append('channelId', '' + channelId) formData.append('videofile', videofile) diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html index 770785d02..ba04d638f 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.html +++ b/client/src/app/videos/+video-watch/video-watch.component.html @@ -80,7 +80,7 @@
- + Download diff --git a/client/src/app/videos/+video-watch/video-watch.component.ts b/client/src/app/videos/+video-watch/video-watch.component.ts index c5deddf05..7cc831ab1 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.ts +++ b/client/src/app/videos/+video-watch/video-watch.component.ts @@ -313,6 +313,10 @@ export class VideoWatchComponent implements OnInit, OnDestroy { return this.video && this.video.state.id === VideoState.TO_TRANSCODE } + isVideoDownloadable () { + return this.video && this.video.downloadingEnabled + } + isVideoToImport () { return this.video && this.video.state.id === VideoState.TO_IMPORT } diff --git a/server/controllers/api/videos/import.ts b/server/controllers/api/videos/import.ts index 398fd5a7f..a5cddba89 100644 --- a/server/controllers/api/videos/import.ts +++ b/server/controllers/api/videos/import.ts @@ -171,6 +171,7 @@ function buildVideo (channelId: number, body: VideoImportCreate, importData: You licence: body.licence || importData.licence, language: body.language || undefined, commentsEnabled: body.commentsEnabled || true, + downloadingEnabled: body.downloadingEnabled || true, waitTranscoding: body.waitTranscoding || false, state: VideoState.TO_IMPORT, nsfw: body.nsfw || importData.nsfw || false, diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts index 6a73e13d0..ec25006e8 100644 --- a/server/controllers/api/videos/index.ts +++ b/server/controllers/api/videos/index.ts @@ -179,6 +179,7 @@ async function addVideo (req: express.Request, res: express.Response) { licence: videoInfo.licence, language: videoInfo.language, commentsEnabled: videoInfo.commentsEnabled || false, + downloadingEnabled: videoInfo.downloadingEnabled || false, waitTranscoding: videoInfo.waitTranscoding || false, state: CONFIG.TRANSCODING.ENABLED ? VideoState.TO_TRANSCODE : VideoState.PUBLISHED, nsfw: videoInfo.nsfw || false, @@ -322,6 +323,7 @@ async function updateVideo (req: express.Request, res: express.Response) { if (videoInfoToUpdate.support !== undefined) videoInstance.set('support', videoInfoToUpdate.support) if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description) if (videoInfoToUpdate.commentsEnabled !== undefined) videoInstance.set('commentsEnabled', videoInfoToUpdate.commentsEnabled) + if (videoInfoToUpdate.downloadingEnabled !== undefined) videoInstance.set('downloadingEnabled', videoInfoToUpdate.downloadingEnabled) if (videoInfoToUpdate.privacy !== undefined) { const newPrivacy = parseInt(videoInfoToUpdate.privacy.toString(), 10) videoInstance.set('privacy', newPrivacy) diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts index 1304c7559..7f903e486 100644 --- a/server/helpers/activitypub.ts +++ b/server/helpers/activitypub.ts @@ -28,6 +28,7 @@ function activityPubContextify (data: T) { size: 'schema:Number', fps: 'schema:Number', commentsEnabled: 'schema:Boolean', + downloadingEnabled: 'schema:Boolean', waitTranscoding: 'schema:Boolean', expires: 'schema:expires', support: 'schema:Text', diff --git a/server/helpers/audit-logger.ts b/server/helpers/audit-logger.ts index 00311fce1..d2c9aee01 100644 --- a/server/helpers/audit-logger.ts +++ b/server/helpers/audit-logger.ts @@ -117,7 +117,8 @@ const videoKeysToKeep = [ 'channel-uuid', 'channel-name', 'support', - 'commentsEnabled' + 'commentsEnabled', + 'downloadingEnabled' ] class VideoAuditView extends EntityAuditView { constructor (private video: VideoDetails) { diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts index f88d26561..34e4cdff9 100644 --- a/server/helpers/custom-validators/activitypub/videos.ts +++ b/server/helpers/custom-validators/activitypub/videos.ts @@ -67,6 +67,7 @@ function sanitizeAndCheckVideoTorrentObject (video: any) { isVideoViewsValid(video.views) && isBooleanValid(video.sensitive) && isBooleanValid(video.commentsEnabled) && + isBooleanValid(video.downloadingEnabled) && isDateValid(video.published) && isDateValid(video.updated) && (!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) && diff --git a/server/initializers/migrations/0280-video-downloading-enabled.ts b/server/initializers/migrations/0280-video-downloading-enabled.ts new file mode 100644 index 000000000..c0700108c --- /dev/null +++ b/server/initializers/migrations/0280-video-downloading-enabled.ts @@ -0,0 +1,27 @@ +import * as Sequelize from 'sequelize' +import { Migration } from '../../models/migrations' + +async function up (utils: { + transaction: Sequelize.Transaction, + queryInterface: Sequelize.QueryInterface, + sequelize: Sequelize.Sequelize +}): Promise { + const data = { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: true + } as Migration.Boolean + await utils.queryInterface.addColumn('video', 'downloadingEnabled', data) + + data.defaultValue = null + return utils.queryInterface.changeColumn('video', 'downloadingEnabled', data) +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index 54cea542f..dd02141ee 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts @@ -230,6 +230,7 @@ async function updateVideoFromAP (options: { options.video.set('support', videoData.support) options.video.set('nsfw', videoData.nsfw) options.video.set('commentsEnabled', videoData.commentsEnabled) + options.video.set('downloadingEnabled', videoData.downloadingEnabled) options.video.set('waitTranscoding', videoData.waitTranscoding) options.video.set('state', videoData.state) options.video.set('duration', videoData.duration) @@ -441,6 +442,7 @@ async function videoActivityObjectToDBAttributes ( support, nsfw: videoObject.sensitive, commentsEnabled: videoObject.commentsEnabled, + downloadingEnabled: videoObject.downloadingEnabled, waitTranscoding: videoObject.waitTranscoding, state: videoObject.state, channelId: videoChannel.id, diff --git a/server/middlewares/validators/videos/videos.ts b/server/middlewares/validators/videos/videos.ts index d6b8aa725..bdba87496 100644 --- a/server/middlewares/validators/videos/videos.ts +++ b/server/middlewares/validators/videos/videos.ts @@ -349,6 +349,10 @@ function getCommonVideoAttributes () { .optional() .toBoolean() .custom(isBooleanValid).withMessage('Should have comments enabled boolean'), + body('downloadingEnabled') + .optional() + .toBoolean() + .custom(isBooleanValid).withMessage('Should have downloading enabled boolean'), body('scheduleUpdate') .optional() diff --git a/server/models/video/video-format-utils.ts b/server/models/video/video-format-utils.ts index 905e84449..0b0da4181 100644 --- a/server/models/video/video-format-utils.ts +++ b/server/models/video/video-format-utils.ts @@ -128,6 +128,7 @@ function videoModelToFormattedDetailsJSON (video: VideoModel): VideoDetails { account: video.VideoChannel.Account.toFormattedJSON(), tags, commentsEnabled: video.commentsEnabled, + downloadingEnabled: video.downloadingEnabled, waitTranscoding: video.waitTranscoding, state: { id: video.state, @@ -259,6 +260,7 @@ function videoModelToActivityPubObject (video: VideoModel): VideoTorrentObject { waitTranscoding: video.waitTranscoding, state: video.state, commentsEnabled: video.commentsEnabled, + downloadingEnabled: video.downloadingEnabled, published: video.publishedAt.toISOString(), updated: video.updatedAt.toISOString(), mediaType: 'text/markdown', diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 46d823240..a2fe53fb9 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -598,6 +598,10 @@ export class VideoModel extends Model { @Column commentsEnabled: boolean + @AllowNull(false) + @Column + downloadingEnabled: boolean + @AllowNull(false) @Column waitTranscoding: boolean diff --git a/server/tests/api/check-params/video-imports.ts b/server/tests/api/check-params/video-imports.ts index 44645b0e2..8dd87b8ae 100644 --- a/server/tests/api/check-params/video-imports.ts +++ b/server/tests/api/check-params/video-imports.ts @@ -84,6 +84,7 @@ describe('Test video imports API validator', function () { language: 'pt', nsfw: false, commentsEnabled: true, + downloadingEnabled: true, waitTranscoding: true, description: 'my super description', support: 'my super support text', diff --git a/server/tests/api/check-params/videos.ts b/server/tests/api/check-params/videos.ts index 904d22870..c5740087c 100644 --- a/server/tests/api/check-params/videos.ts +++ b/server/tests/api/check-params/videos.ts @@ -175,6 +175,7 @@ describe('Test videos API validator', function () { language: 'pt', nsfw: false, commentsEnabled: true, + downloadingEnabled: true, waitTranscoding: true, description: 'my super description', support: 'my super support text', @@ -419,6 +420,7 @@ describe('Test videos API validator', function () { language: 'pt', nsfw: false, commentsEnabled: false, + downloadingEnabled: false, description: 'my super description', privacy: VideoPrivacy.PUBLIC, tags: [ 'tag1', 'tag2' ] diff --git a/server/tests/api/server/follows.ts b/server/tests/api/server/follows.ts index 310c291bf..5cad1d09d 100644 --- a/server/tests/api/server/follows.ts +++ b/server/tests/api/server/follows.ts @@ -305,6 +305,7 @@ describe('Test follows', function () { }, isLocal, commentsEnabled: true, + downloadingEnabled: true, duration: 5, tags: [ 'tag1', 'tag2', 'tag3' ], privacy: VideoPrivacy.PUBLIC, diff --git a/server/tests/api/server/handle-down.ts b/server/tests/api/server/handle-down.ts index ed15c8090..971de4607 100644 --- a/server/tests/api/server/handle-down.ts +++ b/server/tests/api/server/handle-down.ts @@ -70,6 +70,7 @@ describe('Test handle downs', function () { tags: [ 'tag1p1', 'tag2p1' ], privacy: VideoPrivacy.PUBLIC, commentsEnabled: true, + downloadingEnabled: true, channel: { name: 'root_channel', displayName: 'Main root channel', diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts index 4553ee855..83e391ccd 100644 --- a/server/tests/api/videos/multiple-servers.ts +++ b/server/tests/api/videos/multiple-servers.ts @@ -127,6 +127,7 @@ describe('Test multiple servers', function () { tags: [ 'tag1p1', 'tag2p1' ], privacy: VideoPrivacy.PUBLIC, commentsEnabled: true, + downloadingEnabled: true, channel: { displayName: 'my channel', name: 'super_channel_name', @@ -198,6 +199,7 @@ describe('Test multiple servers', function () { }, isLocal, commentsEnabled: true, + downloadingEnabled: true, duration: 5, tags: [ 'tag1p2', 'tag2p2', 'tag3p2' ], privacy: VideoPrivacy.PUBLIC, @@ -306,6 +308,7 @@ describe('Test multiple servers', function () { isLocal, duration: 5, commentsEnabled: true, + downloadingEnabled: true, tags: [ 'tag1p3' ], privacy: VideoPrivacy.PUBLIC, channel: { @@ -337,6 +340,7 @@ describe('Test multiple servers', function () { host: 'localhost:9003' }, commentsEnabled: true, + downloadingEnabled: true, isLocal, duration: 5, tags: [ 'tag2p3', 'tag3p3', 'tag4p3' ], @@ -654,6 +658,7 @@ describe('Test multiple servers', function () { isLocal, duration: 5, commentsEnabled: true, + downloadingEnabled: true, tags: [ 'tag_up_1', 'tag_up_2' ], privacy: VideoPrivacy.PUBLIC, channel: { @@ -975,6 +980,7 @@ describe('Test multiple servers', function () { isLocal, duration: 5, commentsEnabled: false, + downloadingEnabled: false, tags: [ ], privacy: VideoPrivacy.PUBLIC, channel: { diff --git a/server/tests/api/videos/single-server.ts b/server/tests/api/videos/single-server.ts index e3d62b7a0..8995a8525 100644 --- a/server/tests/api/videos/single-server.ts +++ b/server/tests/api/videos/single-server.ts @@ -55,6 +55,7 @@ describe('Test a single server', function () { tags: [ 'tag1', 'tag2', 'tag3' ], privacy: VideoPrivacy.PUBLIC, commentsEnabled: true, + downloadingEnabled: true, channel: { displayName: 'Main root channel', name: 'root_channel', @@ -87,6 +88,7 @@ describe('Test a single server', function () { privacy: VideoPrivacy.PUBLIC, duration: 5, commentsEnabled: false, + downloadingEnabled: false, channel: { name: 'root_channel', displayName: 'Main root channel', @@ -356,6 +358,7 @@ describe('Test a single server', function () { nsfw: false, description: 'my super description updated', commentsEnabled: false, + downloadingEnabled: false, tags: [ 'tagup1', 'tagup2' ] } await updateVideo(server.url, server.accessToken, videoId, attributes) diff --git a/server/tests/utils/videos/videos.ts b/server/tests/utils/videos/videos.ts index 87c385f38..a7fd4c8a6 100644 --- a/server/tests/utils/videos/videos.ts +++ b/server/tests/utils/videos/videos.ts @@ -27,6 +27,7 @@ type VideoAttributes = { language?: string nsfw?: boolean commentsEnabled?: boolean + downloadingEnabled?: boolean waitTranscoding?: boolean description?: string tags?: string[] @@ -310,6 +311,7 @@ async function uploadVideo (url: string, accessToken: string, videoAttributesArg tags: [ 'tag' ], privacy: VideoPrivacy.PUBLIC, commentsEnabled: true, + downloadingEnabled: true, fixture: 'video_short.webm' }, videoAttributesArg) @@ -320,6 +322,7 @@ async function uploadVideo (url: string, accessToken: string, videoAttributesArg .field('name', attributes.name) .field('nsfw', JSON.stringify(attributes.nsfw)) .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled)) + .field('downloadingEnabled', JSON.stringify(attributes.downloadingEnabled)) .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding)) .field('privacy', attributes.privacy.toString()) .field('channelId', attributes.channelId) @@ -370,6 +373,7 @@ function updateVideo (url: string, accessToken: string, id: number | string, att if (attributes.language) body['language'] = attributes.language if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw) if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled) + if (attributes.downloadingEnabled !== undefined) body['downloadingEnabled'] = JSON.stringify(attributes.downloadingEnabled) if (attributes.description) body['description'] = attributes.description if (attributes.tags) body['tags'] = attributes.tags if (attributes.privacy) body['privacy'] = attributes.privacy @@ -435,6 +439,7 @@ async function completeVideoCheck ( language: string nsfw: boolean commentsEnabled: boolean + downloadingEnabled: boolean description: string publishedAt?: string support: string @@ -509,6 +514,7 @@ async function completeVideoCheck ( expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled) + expect(videoDetails.downloadingEnabled).to.equal(attributes.downloadingEnabled) for (const attributeFile of attributes.files) { const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution) diff --git a/server/tools/peertube-import-videos.ts b/server/tools/peertube-import-videos.ts index 13090a028..675c621df 100644 --- a/server/tools/peertube-import-videos.ts +++ b/server/tools/peertube-import-videos.ts @@ -212,6 +212,7 @@ async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string, cwd: st nsfw: isNSFW(videoInfo), waitTranscoding: true, commentsEnabled: true, + downloadingEnabled: true, description: videoInfo.description || undefined, support: undefined, tags, diff --git a/server/tools/peertube-upload.ts b/server/tools/peertube-upload.ts index 6248fb47d..e7b885a38 100644 --- a/server/tools/peertube-upload.ts +++ b/server/tools/peertube-upload.ts @@ -30,6 +30,7 @@ if (!program['tags']) program['tags'] = [] if (!program['nsfw']) program['nsfw'] = false if (!program['privacy']) program['privacy'] = VideoPrivacy.PUBLIC if (!program['commentsEnabled']) program['commentsEnabled'] = false +if (!program['downloadingEnabled']) program['downloadingEnabled'] = false getSettings() .then(settings => { @@ -116,6 +117,7 @@ async function run () { description: program['videoDescription'], tags: program['tags'], commentsEnabled: program['commentsEnabled'], + downloadingEnabled: program['downloadingEnabled'], fixture: program['file'], thumbnailfile: program['thumbnail'], previewfile: program['preview'], diff --git a/shared/models/activitypub/objects/video-torrent-object.ts b/shared/models/activitypub/objects/video-torrent-object.ts index 8504c178f..beb2f519e 100644 --- a/shared/models/activitypub/objects/video-torrent-object.ts +++ b/shared/models/activitypub/objects/video-torrent-object.ts @@ -20,7 +20,8 @@ export interface VideoTorrentObject { subtitleLanguage: ActivityIdentifierObject[] views: number sensitive: boolean - commentsEnabled: boolean + commentsEnabled: boolean, + downloadingEnabled: boolean, waitTranscoding: boolean state: VideoState published: string diff --git a/shared/models/videos/video-create.model.ts b/shared/models/videos/video-create.model.ts index 190d63783..6e5e03e0a 100644 --- a/shared/models/videos/video-create.model.ts +++ b/shared/models/videos/video-create.model.ts @@ -13,6 +13,7 @@ export interface VideoCreate { name: string tags?: string[] commentsEnabled?: boolean + downloadingEnabled?: boolean privacy: VideoPrivacy scheduleUpdate?: VideoScheduleUpdate } diff --git a/shared/models/videos/video-update.model.ts b/shared/models/videos/video-update.model.ts index ed141a824..bf7a9af37 100644 --- a/shared/models/videos/video-update.model.ts +++ b/shared/models/videos/video-update.model.ts @@ -11,6 +11,7 @@ export interface VideoUpdate { privacy?: VideoPrivacy tags?: string[] commentsEnabled?: boolean + downloadingEnabled?: boolean nsfw?: boolean waitTranscoding?: boolean channelId?: number diff --git a/shared/models/videos/video.model.ts b/shared/models/videos/video.model.ts index 4a9fa58b1..783cd86e5 100644 --- a/shared/models/videos/video.model.ts +++ b/shared/models/videos/video.model.ts @@ -82,6 +82,7 @@ export interface VideoDetails extends Video { files: VideoFile[] account: Account commentsEnabled: boolean + downloadingEnabled: boolean // Not optional in details (unlike in Video) waitTranscoding: boolean diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index 59ca8b29a..9ce24c0ed 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -536,6 +536,7 @@ paths: - $ref: "videos.yaml#/parameters/name" - $ref: "videos.yaml#/parameters/tags" - $ref: "videos.yaml#/parameters/commentsEnabled" + - $ref: "videos.yaml#/parameters/downloadingEnabled" - $ref: "videos.yaml#/parameters/privacy" - $ref: "videos.yaml#/parameters/scheduleUpdate" responses: @@ -632,6 +633,7 @@ paths: - $ref: "videos.yaml#/parameters/name" - $ref: "videos.yaml#/parameters/tags" - $ref: "videos.yaml#/parameters/commentsEnabled" + - $ref: "videos.yaml#/parameters/downloadingEnabled" - $ref: "videos.yaml#/parameters/privacy" - $ref: "videos.yaml#/parameters/scheduleUpdate" responses: diff --git a/support/doc/api/videos.yaml b/support/doc/api/videos.yaml index 593ae56e2..93aa26285 100644 --- a/support/doc/api/videos.yaml +++ b/support/doc/api/videos.yaml @@ -65,6 +65,11 @@ parameters: in: formData type: boolean description: 'Enable or disable comments for this video' + downloadingEnabled: + name: downloadingEnabled + in: formData + type: boolean + description: 'Enable or disable downloading for this video' privacy: name: privacy in: formData