1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
import { getAbsoluteAPIUrl } from '@app/helpers'
import { objectKeysTyped } from '@peertube/peertube-core-utils'
import { VideoPassword, VideoPrivacy, VideoPrivacyType, VideoScheduleUpdate, VideoUpdate } from '@peertube/peertube-models'
import { VideoDetails } from './video-details.model'
export class VideoEdit implements VideoUpdate {
static readonly SPECIAL_SCHEDULED_PRIVACY = -1
category: number
licence: number
language: string
description: string
name: string
tags: string[]
nsfw: boolean
commentsEnabled: boolean
downloadEnabled: boolean
waitTranscoding: boolean
channelId: number
privacy: VideoPrivacyType
videoPassword?: string
support: string
thumbnailfile?: any
previewfile?: any
thumbnailUrl: string
previewUrl: string
scheduleUpdate?: VideoScheduleUpdate
originallyPublishedAt?: Date | string
id?: number
uuid?: string
shortUUID?: string
pluginData?: any
constructor (video?: VideoDetails, videoPassword?: VideoPassword) {
if (!video) return
this.id = video.id
this.uuid = video.uuid
this.shortUUID = video.shortUUID
this.category = video.category.id
this.licence = video.licence.id
this.language = video.language.id
this.description = video.description
this.name = video.name
this.tags = video.tags
this.nsfw = video.nsfw
this.waitTranscoding = video.waitTranscoding
this.channelId = video.channel.id
this.privacy = video.privacy.id
this.support = video.support
this.commentsEnabled = video.commentsEnabled
this.downloadEnabled = video.downloadEnabled
if (video.thumbnailPath) this.thumbnailUrl = getAbsoluteAPIUrl() + video.thumbnailPath
if (video.previewPath) this.previewUrl = getAbsoluteAPIUrl() + video.previewPath
this.scheduleUpdate = video.scheduledUpdate
this.originallyPublishedAt = video.originallyPublishedAt
? new Date(video.originallyPublishedAt)
: null
this.pluginData = video.pluginData
if (videoPassword) this.videoPassword = videoPassword.password
}
patch (values: { [ id: string ]: any }) {
objectKeysTyped(values).forEach(key => {
(this as any)[key] = values[key]
})
// If schedule publication, the video is private and will be changed to public privacy
if (parseInt(values['privacy'], 10) === VideoEdit.SPECIAL_SCHEDULED_PRIVACY) {
const updateAt = new Date(values['schedulePublicationAt'])
updateAt.setSeconds(0)
this.privacy = VideoPrivacy.PRIVATE
this.scheduleUpdate = {
updateAt: updateAt.toISOString(),
privacy: VideoPrivacy.PUBLIC
}
} else {
this.scheduleUpdate = null
}
// Convert originallyPublishedAt to string so that function objectToFormData() works correctly
if (this.originallyPublishedAt) {
const originallyPublishedAt = new Date(this.originallyPublishedAt)
this.originallyPublishedAt = originallyPublishedAt.toISOString()
}
// Use the same file than the preview for the thumbnail
if (this.previewfile) {
this.thumbnailfile = this.previewfile
}
}
toFormPatch () {
const json = {
category: this.category,
licence: this.licence,
language: this.language,
description: this.description,
support: this.support,
name: this.name,
tags: this.tags,
nsfw: this.nsfw,
commentsEnabled: this.commentsEnabled,
downloadEnabled: this.downloadEnabled,
waitTranscoding: this.waitTranscoding,
channelId: this.channelId,
privacy: this.privacy,
videoPassword: this.videoPassword,
originallyPublishedAt: this.originallyPublishedAt
}
// Special case if we scheduled an update
if (this.scheduleUpdate) {
Object.assign(json, {
privacy: VideoEdit.SPECIAL_SCHEDULED_PRIVACY,
schedulePublicationAt: new Date(this.scheduleUpdate.updateAt.toString())
})
}
return json
}
}
|