Add downloadingEnabled property to video model

This commit is contained in:
Lucas Declercq 2018-10-06 19:17:21 +02:00
parent 35d50b7dd2
commit 156c50af30
34 changed files with 100 additions and 4 deletions

View File

@ -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

View File

@ -12,6 +12,7 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
files: VideoFile[]
account: Account
commentsEnabled: boolean
downloadingEnabled: boolean
waitTranscoding: boolean
state: VideoConstant<VideoState>
@ -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()
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -80,7 +80,7 @@
</div>
<div ngbDropdownMenu>
<a class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)">
<a *ngIf="isVideoDownloadable()" class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)">
<span class="icon icon-download"></span> <ng-container i18n>Download</ng-container>
</a>

View File

@ -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
}

View File

@ -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,

View File

@ -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)

View File

@ -28,6 +28,7 @@ function activityPubContextify <T> (data: T) {
size: 'schema:Number',
fps: 'schema:Number',
commentsEnabled: 'schema:Boolean',
downloadingEnabled: 'schema:Boolean',
waitTranscoding: 'schema:Boolean',
expires: 'schema:expires',
support: 'schema:Text',

View File

@ -117,7 +117,8 @@ const videoKeysToKeep = [
'channel-uuid',
'channel-name',
'support',
'commentsEnabled'
'commentsEnabled',
'downloadingEnabled'
]
class VideoAuditView extends EntityAuditView {
constructor (private video: VideoDetails) {

View File

@ -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)) &&

View File

@ -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<void> {
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
}

View File

@ -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,

View File

@ -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()

View File

@ -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',

View File

@ -598,6 +598,10 @@ export class VideoModel extends Model<VideoModel> {
@Column
commentsEnabled: boolean
@AllowNull(false)
@Column
downloadingEnabled: boolean
@AllowNull(false)
@Column
waitTranscoding: boolean

View File

@ -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',

View File

@ -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' ]

View File

@ -305,6 +305,7 @@ describe('Test follows', function () {
},
isLocal,
commentsEnabled: true,
downloadingEnabled: true,
duration: 5,
tags: [ 'tag1', 'tag2', 'tag3' ],
privacy: VideoPrivacy.PUBLIC,

View File

@ -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',

View File

@ -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: {

View File

@ -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)

View File

@ -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)

View File

@ -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,

View File

@ -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'],

View File

@ -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

View File

@ -13,6 +13,7 @@ export interface VideoCreate {
name: string
tags?: string[]
commentsEnabled?: boolean
downloadingEnabled?: boolean
privacy: VideoPrivacy
scheduleUpdate?: VideoScheduleUpdate
}

View File

@ -11,6 +11,7 @@ export interface VideoUpdate {
privacy?: VideoPrivacy
tags?: string[]
commentsEnabled?: boolean
downloadingEnabled?: boolean
nsfw?: boolean
waitTranscoding?: boolean
channelId?: number

View File

@ -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

View File

@ -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:

View File

@ -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