Update videos api list for account
authorChocobozzz <me@florianbigard.com>
Mon, 12 Mar 2018 10:06:15 +0000 (11:06 +0100)
committerChocobozzz <me@florianbigard.com>
Mon, 12 Mar 2018 10:44:28 +0000 (11:44 +0100)
13 files changed:
client/src/app/shared/video/video.model.ts
server/models/video/video.ts
server/tests/api/server/follows.ts
server/tests/api/server/handle-down.ts
server/tests/api/users/users.ts
server/tests/api/videos/multiple-servers.ts
server/tests/api/videos/services.ts
server/tests/api/videos/single-server.ts
server/tests/utils/server/servers.ts
server/tests/utils/videos/videos.ts
shared/models/videos/video.model.ts
support/doc/api/openapi.yaml
support/systemd/peertube.service

index 79351ba2a70458b8a84aee5a6cc9fe86ad76069d..8e46ce44bc9a7507935d0482bed1a1d63eefe07a 100644 (file)
@@ -1,10 +1,10 @@
 import { Account } from '@app/shared/account/account.model'
 import { User } from '../'
 import { Video as VideoServerModel } from '../../../../../shared'
+import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
 import { getAbsoluteAPIUrl } from '../misc/utils'
 
 export class Video implements VideoServerModel {
-  accountName: string
   by: string
   createdAt: Date
   updatedAt: Date
@@ -32,7 +32,14 @@ export class Video implements VideoServerModel {
   likes: number
   dislikes: number
   nsfw: boolean
-  account: Account
+
+  account: {
+    name: string
+    displayName: string
+    url: string
+    host: string
+    avatar: Avatar
+  }
 
   private static createDurationString (duration: number) {
     const minutes = Math.floor(duration / 60)
@@ -46,7 +53,6 @@ export class Video implements VideoServerModel {
   constructor (hash: VideoServerModel) {
     const absoluteAPIUrl = getAbsoluteAPIUrl()
 
-    this.accountName = hash.accountName
     this.createdAt = new Date(hash.createdAt.toString())
     this.categoryLabel = hash.categoryLabel
     this.category = hash.category
@@ -61,7 +67,6 @@ export class Video implements VideoServerModel {
     this.uuid = hash.uuid
     this.isLocal = hash.isLocal
     this.name = hash.name
-    this.serverHost = hash.serverHost
     this.thumbnailPath = hash.thumbnailPath
     this.thumbnailUrl = absoluteAPIUrl + hash.thumbnailPath
     this.previewPath = hash.previewPath
@@ -72,8 +77,9 @@ export class Video implements VideoServerModel {
     this.likes = hash.likes
     this.dislikes = hash.dislikes
     this.nsfw = hash.nsfw
+    this.account = hash.account
 
-    this.by = Account.CREATE_BY_STRING(hash.accountName, hash.serverHost)
+    this.by = Account.CREATE_BY_STRING(hash.account.name, hash.account.host)
   }
 
   isVideoNSFWForUser (user: User) {
index 1b9d68073186fac447e81137710aa45737e46a26..0e5dd0d2f13ced8c19c9e0676c7beed89da49b86 100644 (file)
@@ -40,7 +40,8 @@ import {
   isVideoLanguageValid,
   isVideoLicenceValid,
   isVideoNameValid,
-  isVideoPrivacyValid, isVideoSupportValid
+  isVideoPrivacyValid,
+  isVideoSupportValid
 } from '../../helpers/custom-validators/videos'
 import { generateImageFromVideoFile, getVideoFileResolution, transcode } from '../../helpers/ffmpeg-utils'
 import { logger } from '../../helpers/logger'
@@ -125,13 +126,18 @@ enum ScopeNames {
             required: true,
             include: [
               {
-                attributes: [ 'serverId' ],
+                attributes: [ 'preferredUsername', 'url', 'serverId' ],
                 model: ActorModel.unscoped(),
                 required: true,
                 include: [
                   {
                     attributes: [ 'host' ],
-                    model: ServerModel.unscoped()
+                    model: ServerModel.unscoped(),
+                    required: false
+                  },
+                  {
+                    model: AvatarModel.unscoped(),
+                    required: false
                   }
                 ]
               }
@@ -872,14 +878,7 @@ export class VideoModel extends Model<VideoModel> {
   }
 
   toFormattedJSON (): Video {
-    let serverHost
-
-    if (this.VideoChannel.Account.Actor.Server) {
-      serverHost = this.VideoChannel.Account.Actor.Server.host
-    } else {
-      // It means it's our video
-      serverHost = CONFIG.WEBSERVER.HOST
-    }
+    const formattedAccount = this.VideoChannel.Account.toFormattedJSON()
 
     return {
       id: this.id,
@@ -893,9 +892,7 @@ export class VideoModel extends Model<VideoModel> {
       languageLabel: this.getLanguageLabel(),
       nsfw: this.nsfw,
       description: this.getTruncatedDescription(),
-      serverHost,
       isLocal: this.isOwned(),
-      accountName: this.VideoChannel.Account.name,
       duration: this.duration,
       views: this.views,
       likes: this.likes,
@@ -904,7 +901,14 @@ export class VideoModel extends Model<VideoModel> {
       previewPath: this.getPreviewPath(),
       embedPath: this.getEmbedPath(),
       createdAt: this.createdAt,
-      updatedAt: this.updatedAt
+      updatedAt: this.updatedAt,
+      account: {
+        name: formattedAccount.name,
+        displayName: formattedAccount.displayName,
+        url: formattedAccount.url,
+        host: formattedAccount.host,
+        avatar: formattedAccount.avatar
+      }
     }
   }
 
index 19b8438610ed0a31610d94ba59eceb09c22c6982..010b488d8baf572f739a57559d93e92ad99e7b0e 100644 (file)
@@ -281,8 +281,10 @@ describe('Test follows', function () {
         nsfw: true,
         description: 'my super description',
         support: 'my super support text',
-        host: 'localhost:9003',
-        account: 'root',
+        account: {
+          name: 'root',
+          host: 'localhost:9003'
+        },
         isLocal,
         commentsEnabled: true,
         duration: 5,
index 84153b0979f204181bf7c27208399d2ab58376fa..f5ff3e9e52075fd406be4bcdf70c983740f9ef49 100644 (file)
@@ -53,8 +53,10 @@ describe('Test handle downs', function () {
     nsfw: true,
     description: 'my super description for server 1',
     support: 'my super support text for server 1',
-    host: 'localhost:9001',
-    account: 'root',
+    account: {
+      name: 'root',
+      host: 'localhost:9001'
+    },
     isLocal: false,
     duration: 10,
     tags: [ 'tag1p1', 'tag2p1' ],
index c650a74f54b3f77c4340c0fc04f0d6d5ee4d6733..b6ab4f6602495aa7124895ce8c4b6a0e0e6051d1 100644 (file)
@@ -94,7 +94,7 @@ describe('Test users', function () {
     const res = await getVideosList(server.url)
     const video = res.body.data[ 0 ]
 
-    expect(video.accountName).to.equal('root')
+    expect(video.account.name).to.equal('root')
     videoId = video.id
   })
 
@@ -432,7 +432,7 @@ describe('Test users', function () {
     expect(res.body.total).to.equal(1)
 
     const video = res.body.data[ 0 ]
-    expect(video.accountName).to.equal('root')
+    expect(video.account.name).to.equal('root')
   })
 
   it('Should register a new user', async function () {
index 27c4c30b8cb09597ffb449382cac821a0c625eeb..3f6b82c50fd8f7c5c2365ebd5fd0f39febe1988c 100644 (file)
@@ -8,13 +8,35 @@ import { VideoPrivacy } from '../../../../shared/models/videos'
 import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
 
 import {
-  addVideoChannel, checkVideoFilesWereRemoved, completeVideoCheck, createUser, dateIsValid, doubleFollow, flushAndRunMultipleServers,
-  flushTests, getVideo,
-  getVideoChannelsList, getVideosList, killallServers, rateVideo, removeVideo, ServerInfo, setAccessTokensToServers, testImage,
-  updateVideo, uploadVideo, userLogin, viewVideo, wait, webtorrentAdd
+  addVideoChannel,
+  checkVideoFilesWereRemoved,
+  completeVideoCheck,
+  createUser,
+  dateIsValid,
+  doubleFollow,
+  flushAndRunMultipleServers,
+  flushTests,
+  getVideo,
+  getVideoChannelsList,
+  getVideosList,
+  killallServers,
+  rateVideo,
+  removeVideo,
+  ServerInfo,
+  setAccessTokensToServers,
+  testImage,
+  updateVideo,
+  uploadVideo,
+  userLogin,
+  viewVideo,
+  wait,
+  webtorrentAdd
 } from '../../utils'
 import {
-  addVideoCommentReply, addVideoCommentThread, deleteVideoComment, getVideoCommentThreads,
+  addVideoCommentReply,
+  addVideoCommentThread,
+  deleteVideoComment,
+  getVideoCommentThreads,
   getVideoThreadComments
 } from '../../utils/videos/video-comments'
 
@@ -90,8 +112,10 @@ describe('Test multiple servers', function () {
           nsfw: true,
           description: 'my super description for server 1',
           support: 'my super support text for server 1',
-          host: 'localhost:9001',
-          account: 'root',
+          account: {
+            name: 'root',
+            host: 'localhost:9001'
+          },
           isLocal,
           duration: 10,
           tags: [ 'tag1p1', 'tag2p1' ],
@@ -160,8 +184,10 @@ describe('Test multiple servers', function () {
           nsfw: true,
           description: 'my super description for server 2',
           support: 'my super support text for server 2',
-          host: 'localhost:9002',
-          account: 'user1',
+          account: {
+            name: 'user1',
+            host: 'localhost:9002'
+          },
           isLocal,
           commentsEnabled: true,
           duration: 5,
@@ -264,8 +290,10 @@ describe('Test multiple servers', function () {
           nsfw: true,
           description: 'my super description for server 3',
           support: 'my super support text for server 3',
-          host: 'localhost:9003',
-          account: 'root',
+          account: {
+            name: 'root',
+            host: 'localhost:9003'
+          },
           isLocal,
           duration: 5,
           commentsEnabled: true,
@@ -294,8 +322,10 @@ describe('Test multiple servers', function () {
           nsfw: false,
           description: 'my super description for server 3-2',
           support: 'my super support text for server 3-2',
-          host: 'localhost:9003',
-          account: 'root',
+          account: {
+            name: 'root',
+            host: 'localhost:9003'
+          },
           commentsEnabled: true,
           isLocal,
           duration: 5,
@@ -570,8 +600,10 @@ describe('Test multiple servers', function () {
           nsfw: true,
           description: 'my super description updated',
           support: 'my super support text updated',
-          host: 'localhost:9003',
-          account: 'root',
+          account: {
+            name: 'root',
+            host: 'localhost:9003'
+          },
           isLocal,
           duration: 5,
           commentsEnabled: true,
@@ -648,7 +680,10 @@ describe('Test multiple servers', function () {
         expect(baseVideo.licence).to.equal(video.licence)
         expect(baseVideo.category).to.equal(video.category)
         expect(baseVideo.nsfw).to.equal(video.nsfw)
-        expect(baseVideo.accountName).to.equal(video.accountName)
+        expect(baseVideo.account.name).to.equal(video.account.name)
+        expect(baseVideo.account.displayName).to.equal(video.account.displayName)
+        expect(baseVideo.account.url).to.equal(video.account.url)
+        expect(baseVideo.account.host).to.equal(video.account.host)
         expect(baseVideo.tags).to.deep.equal(video.tags)
       }
     })
@@ -859,8 +894,10 @@ describe('Test multiple servers', function () {
           nsfw: false,
           description: null,
           support: null,
-          host: 'localhost:9002',
-          account: 'root',
+          account: {
+            name: 'root',
+            host: 'localhost:9002'
+          },
           isLocal,
           duration: 5,
           commentsEnabled: true,
index e456184cf0dc91be908baa0ce00ca2a9c9f55d57..45b4a1a8112404ca1e289c29f3547ed5c1be267f 100644 (file)
@@ -38,7 +38,7 @@ describe('Test services', function () {
 
     expect(res.body.html).to.equal(expectedHtml)
     expect(res.body.title).to.equal(server.video.name)
-    expect(res.body.author_name).to.equal(server.video.accountName)
+    expect(res.body.author_name).to.equal(server.video.account.name)
     expect(res.body.width).to.equal(560)
     expect(res.body.height).to.equal(315)
     expect(res.body.thumbnail_url).to.equal(expectedThumbnailUrl)
@@ -58,7 +58,7 @@ describe('Test services', function () {
 
     expect(res.body.html).to.equal(expectedHtml)
     expect(res.body.title).to.equal(server.video.name)
-    expect(res.body.author_name).to.equal(server.video.accountName)
+    expect(res.body.author_name).to.equal(server.video.account.name)
     expect(res.body.height).to.equal(50)
     expect(res.body.width).to.equal(50)
     expect(res.body).to.not.have.property('thumbnail_url')
index cf27218383aeefe3c7a4a49af8dcc9864caf5042..7c4bdf8bc888b6a0721bbc25cc2e56acfabac07c 100644 (file)
@@ -27,8 +27,10 @@ describe('Test a single server', function () {
     nsfw: true,
     description: 'my super description',
     support: 'my super support text',
-    host: 'localhost:9001',
-    account: 'root',
+    account: {
+      name: 'root',
+      host: 'localhost:9001'
+    },
     isLocal: true,
     duration: 5,
     tags: [ 'tag1', 'tag2', 'tag3' ],
@@ -56,8 +58,10 @@ describe('Test a single server', function () {
     nsfw: false,
     description: 'my super description updated',
     support: 'my super support text updated',
-    host: 'localhost:9001',
-    account: 'root',
+    account: {
+      name: 'root',
+      host: 'localhost:9001'
+    },
     isLocal: true,
     tags: [ 'tagup1', 'tagup2' ],
     privacy: VideoPrivacy.PUBLIC,
@@ -204,32 +208,6 @@ describe('Test a single server', function () {
     await completeVideoCheck(server.url, video, getCheckAttributes)
   })
 
-  // Not implemented yet
-  // it('Should search the video by serverHost', async function () {
-  //     const res = await   videosUtils.searchVideo(server.url, '9001', 'host')
-
-  //     expect(res.body.total).to.equal(1)
-  //     expect(res.body.data).to.be.an('array')
-  //     expect(res.body.data.length).to.equal(1)
-
-  //     const video = res.body.data[0]
-  //     expect(video.name).to.equal('my super name')
-  //     expect(video.description).to.equal('my super description')
-  //     expect(video.serverHost).to.equal('localhost:9001')
-  //     expect(video.author).to.equal('root')
-  //     expect(video.isLocal).to.be.true
-  //     expect(video.tags).to.deep.equal([ 'tag1', 'tag2', 'tag3' ])
-  //     expect(dateIsValid(video.createdAt)).to.be.true
-  //     expect(dateIsValid(video.updatedAt)).to.be.true
-
-  //     const test = await testVideoImage(server.url, 'video_short.webm', video.thumbnailPath)
-  //       expect(test).to.equal(true)
-
-  //       done()
-  //     })
-  //   })
-  // })
-
   // Not implemented yet
   // it('Should search the video by tag', async function () {
   //   const res = await searchVideo(server.url, 'tag1')
@@ -248,8 +226,8 @@ describe('Test a single server', function () {
   //   expect(video.languageLabel).to.equal('Mandarin')
   //   expect(video.nsfw).to.be.ok
   //   expect(video.description).to.equal('my super description')
-  //   expect(video.serverHost).to.equal('localhost:9001')
-  //   expect(video.accountName).to.equal('root')
+  //   expect(video.account.name).to.equal('root')
+  //   expect(video.account.host).to.equal('localhost:9001')
   //   expect(video.isLocal).to.be.true
   //   expect(video.tags).to.deep.equal([ 'tag1', 'tag2', 'tag3' ])
   //   expect(dateIsValid(video.createdAt)).to.be.true
index 878efe91a6f02e8af58f2432372a66e759ca3c2b..8373c73ab00314035be72595ade4b8259683ecde 100644 (file)
@@ -24,7 +24,9 @@ interface ServerInfo {
     id: number
     uuid: string
     name: string
-    accountName: string
+    account: {
+      name: string
+    }
   }
 
   remoteVideo?: {
index a06078d40bea3a6e5b21e5d182bc90c9a36f40e2..4b57f24b56c6ca950d45ff77dd013c26193312aa 100644 (file)
@@ -368,8 +368,10 @@ async function completeVideoCheck (
     commentsEnabled: boolean
     description: string
     support: string
-    host: string
-    account: string
+    account: {
+      name: string
+      host: string
+    }
     isLocal: boolean,
     tags: string[],
     privacy: number,
@@ -402,8 +404,8 @@ async function completeVideoCheck (
   expect(video.languageLabel).to.equal(VIDEO_LANGUAGES[attributes.language] || 'Unknown')
   expect(video.nsfw).to.equal(attributes.nsfw)
   expect(video.description).to.equal(attributes.description)
-  expect(video.serverHost).to.equal(attributes.host)
-  expect(video.accountName).to.equal(attributes.account)
+  expect(video.account.host).to.equal(attributes.account.host)
+  expect(video.account.name).to.equal(attributes.account.name)
   expect(video.likes).to.equal(attributes.likes)
   expect(video.dislikes).to.equal(attributes.dislikes)
   expect(video.isLocal).to.equal(attributes.isLocal)
@@ -433,12 +435,12 @@ async function completeVideoCheck (
 
     let extension = extname(attributes.fixture)
     // Transcoding enabled on server 2, extension will always be .mp4
-    if (attributes.host === 'localhost:9002') extension = '.mp4'
+    if (attributes.account.host === 'localhost:9002') extension = '.mp4'
 
     const magnetUri = file.magnetUri
     expect(file.magnetUri).to.have.lengthOf.above(2)
-    expect(file.torrentUrl).to.equal(`http://${attributes.host}/static/torrents/${videoDetails.uuid}-${file.resolution}.torrent`)
-    expect(file.fileUrl).to.equal(`http://${attributes.host}/static/webseed/${videoDetails.uuid}-${file.resolution}${extension}`)
+    expect(file.torrentUrl).to.equal(`http://${attributes.account.host}/static/torrents/${videoDetails.uuid}-${file.resolution}.torrent`)
+    expect(file.fileUrl).to.equal(`http://${attributes.account.host}/static/webseed/${videoDetails.uuid}-${file.resolution}${extension}`)
     expect(file.resolution).to.equal(attributeFile.resolution)
     expect(file.resolutionLabel).to.equal(attributeFile.resolution + 'p')
 
index deb81da449e2bf5cf4ace980f8359cfa5364bcd6..707cd42a71e4a137e3079bb6095c8731c00fb351 100644 (file)
@@ -1,4 +1,5 @@
 import { Account } from '../actors'
+import { Avatar } from '../avatars/avatar.model'
 import { VideoChannel } from './video-channel.model'
 import { VideoPrivacy } from './video-privacy.enum'
 
@@ -14,7 +15,6 @@ export interface VideoFile {
 export interface Video {
   id: number
   uuid: string
-  accountName: string
   createdAt: Date | string
   updatedAt: Date | string
   categoryLabel: string
@@ -27,7 +27,6 @@ export interface Video {
   duration: number
   isLocal: boolean
   name: string
-  serverHost: string
   thumbnailPath: string
   previewPath: string
   embedPath: string
@@ -35,6 +34,14 @@ export interface Video {
   likes: number
   dislikes: number
   nsfw: boolean
+
+  account: {
+    name: string
+    displayName: string
+    url: string
+    host: string
+    avatar: Avatar
+  }
 }
 
 export interface VideoDetails extends Video {
index e8e593420292c199f80e289252effdf2f5074b09..c67d8e477a4340d963322acc140f8d062b5a6793 100644 (file)
@@ -1043,8 +1043,6 @@ definitions:
         type: number
       uuid:
         type: string
-      accountName:
-        type: string
       createdAt:
         type: string
       updatedAt:
@@ -1069,8 +1067,6 @@ definitions:
         type: boolean
       name:
         type: string
-      serverHost:
-        type: string
       thumbnailPath:
         type: string
       previewPath:
@@ -1085,6 +1081,13 @@ definitions:
         type: number
       nsfw:
         type: boolean
+      account:
+        name: string
+        displayName: string
+        url: string
+        host: string
+        avatar:
+          $ref: "#/definitions/Avatar"
   VideoAbuse:
     properties:
       id:
index 047ce7e5609738e982d088a6a13c786aa6f57f98..346738159c6f97662b9c8a263aaa93d33d1b89d5 100644 (file)
@@ -1,6 +1,6 @@
 [Unit]
 Description=PeerTube daemon
-After=network.target
+After=network.target postgresql.service
 
 [Service]
 Type=simple