@@ -56,6 +57,7 @@ export class Video implements VideoServerModel {
const absoluteAPIUrl = getAbsoluteAPIUrl()
this.createdAt = new Date(hash.createdAt.toString())
+ this.publishedAt = new Date(hash.publishedAt.toString())
this.category = hash.category
this.licence = hash.licence
this.language = hash.language
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 6c7fc08e1..ec5bd30dc 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.html
+++ b/client/src/app/videos/+video-watch/video-watch.component.html
@@ -14,7 +14,7 @@
{{ video.name }}
- {{ video.createdAt | myFromNow }} - {{ video.views | myNumberFormatter }} views
+ {{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views
diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts
index 552e5edac..244099015 100644
--- a/server/controllers/api/videos/index.ts
+++ b/server/controllers/api/videos/index.ts
@@ -307,10 +307,17 @@ async function updateVideo (req: express.Request, res: express.Response) {
if (videoInfoToUpdate.licence !== undefined) videoInstance.set('licence', videoInfoToUpdate.licence)
if (videoInfoToUpdate.language !== undefined) videoInstance.set('language', videoInfoToUpdate.language)
if (videoInfoToUpdate.nsfw !== undefined) videoInstance.set('nsfw', videoInfoToUpdate.nsfw)
- if (videoInfoToUpdate.privacy !== undefined) videoInstance.set('privacy', parseInt(videoInfoToUpdate.privacy.toString(), 10))
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.privacy !== undefined) {
+ const newPrivacy = parseInt(videoInfoToUpdate.privacy.toString(), 10)
+ videoInstance.set('privacy', newPrivacy)
+
+ if (wasPrivateVideo === true && newPrivacy !== VideoPrivacy.PRIVATE) {
+ videoInstance.set('publishedAt', new Date())
+ }
+ }
const videoInstanceUpdated = await videoInstance.save(sequelizeOptions)
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
index 5152095b3..2622b2c71 100644
--- a/server/initializers/constants.ts
+++ b/server/initializers/constants.ts
@@ -12,7 +12,7 @@ let config: IConfig = require('config')
// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 195
+const LAST_MIGRATION_VERSION = 200
// ---------------------------------------------------------------------------
diff --git a/server/initializers/migrations/0200-video-published-at.ts b/server/initializers/migrations/0200-video-published-at.ts
new file mode 100644
index 000000000..edaf4a145
--- /dev/null
+++ b/server/initializers/migrations/0200-video-published-at.ts
@@ -0,0 +1,32 @@
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize
+}): Promise {
+
+ {
+ const data = {
+ type: Sequelize.DATE,
+ allowNull: false,
+ defaultValue: Sequelize.NOW
+ }
+ await utils.queryInterface.addColumn('video', 'publishedAt', data)
+ }
+
+ {
+ const query = 'UPDATE video SET "publishedAt" = video."createdAt"'
+ await utils.sequelize.query(query)
+ }
+
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index 7c56c65a6..2a1226f6d 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -376,6 +376,11 @@ export class VideoModel extends Model {
@UpdatedAt
updatedAt: Date
+ @AllowNull(false)
+ @Default(Sequelize.NOW)
+ @Column
+ publishedAt: Date
+
@ForeignKey(() => VideoChannelModel)
@Column
channelId: number
@@ -968,6 +973,7 @@ export class VideoModel extends Model {
embedPath: this.getEmbedPath(),
createdAt: this.createdAt,
updatedAt: this.updatedAt,
+ publishedAt: this.publishedAt,
account: {
name: formattedAccount.name,
displayName: formattedAccount.displayName,
@@ -1122,7 +1128,7 @@ export class VideoModel extends Model {
views: this.views,
sensitive: this.nsfw,
commentsEnabled: this.commentsEnabled,
- published: this.createdAt.toISOString(),
+ published: this.publishedAt.toISOString(),
updated: this.updatedAt.toISOString(),
mediaType: 'text/markdown',
content: this.getTruncatedDescription(),
diff --git a/shared/models/videos/video.model.ts b/shared/models/videos/video.model.ts
index ebd2813ca..1b5f1a09c 100644
--- a/shared/models/videos/video.model.ts
+++ b/shared/models/videos/video.model.ts
@@ -22,6 +22,7 @@ export interface Video {
uuid: string
createdAt: Date | string
updatedAt: Date | string
+ publishedAt: Date | string
category: VideoConstant
licence: VideoConstant
language: VideoConstant