]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/shared/video/video.model.ts
First implem global search
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / video / video.model.ts
index 060bf933f316d4d9f16be62ba56e93dd42a03bcc..97759f9c1b3f7679d8bafb14c92fa723670bebb3 100644 (file)
@@ -1,20 +1,28 @@
 import { User } from '../'
-import { Video as VideoServerModel } from '../../../../../shared'
-import { Account } from '../../../../../shared/models/actors'
-import { environment } from '../../../environments/environment'
-import { getAbsoluteAPIUrl } from '../misc/utils'
+import { UserRight, Video as VideoServerModel, VideoPrivacy, VideoState } from '../../../../../shared'
+import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
+import { VideoConstant } from '../../../../../shared/models/videos/video-constant.model'
+import { durationToString, getAbsoluteAPIUrl } from '../misc/utils'
+import { peertubeTranslate, ServerConfig } from '../../../../../shared/models'
+import { Actor } from '@app/shared/actor/actor.model'
+import { VideoScheduleUpdate } from '../../../../../shared/models/videos/video-schedule-update.model'
+import { AuthUser } from '@app/core'
 
 export class Video implements VideoServerModel {
-  accountName: string
-  by: string
+  byVideoChannel: string
+  byAccount: string
+
+  accountAvatarUrl: string
+  videoChannelAvatarUrl: string
+
   createdAt: Date
   updatedAt: Date
-  categoryLabel: string
-  category: number
-  licenceLabel: string
-  licence: number
-  languageLabel: string
-  language: number
+  publishedAt: Date
+  originallyPublishedAt: Date | string
+  category: VideoConstant<number>
+  licence: VideoConstant<number>
+  language: VideoConstant<string>
+  privacy: VideoConstant<VideoPrivacy>
   description: string
   duration: number
   durationLabel: string
@@ -25,64 +33,149 @@ export class Video implements VideoServerModel {
   serverHost: string
   thumbnailPath: string
   thumbnailUrl: string
+
   previewPath: string
   previewUrl: string
+
   embedPath: string
   embedUrl: string
+
+  url?: string
+
   views: number
   likes: number
   dislikes: number
   nsfw: boolean
-  account: Account
 
-  private static createByString (account: string, serverHost: string) {
-    return account + '@' + serverHost
+  originInstanceUrl: string
+  originInstanceHost: string
+
+  waitTranscoding?: boolean
+  state?: VideoConstant<VideoState>
+  scheduledUpdate?: VideoScheduleUpdate
+  blacklisted?: boolean
+  blacklistedReason?: string
+
+  account: {
+    id: number
+    name: string
+    displayName: string
+    url: string
+    host: string
+    avatar?: Avatar
+  }
+
+  channel: {
+    id: number
+    name: string
+    displayName: string
+    url: string
+    host: string
+    avatar?: Avatar
   }
 
-  private static createDurationString (duration: number) {
-    const minutes = Math.floor(duration / 60)
-    const seconds = duration % 60
-    const minutesPadding = minutes >= 10 ? '' : '0'
-    const secondsPadding = seconds >= 10 ? '' : '0'
+  userHistory?: {
+    currentTime: number
+  }
 
-    return minutesPadding + minutes.toString() + ':' + secondsPadding + seconds.toString()
+  static buildClientUrl (videoUUID: string) {
+    return '/videos/watch/' + videoUUID
   }
 
-  constructor (hash: VideoServerModel) {
+  constructor (hash: VideoServerModel, translations = {}) {
     const absoluteAPIUrl = getAbsoluteAPIUrl()
 
-    this.accountName = hash.accountName
     this.createdAt = new Date(hash.createdAt.toString())
-    this.categoryLabel = hash.categoryLabel
+    this.publishedAt = new Date(hash.publishedAt.toString())
     this.category = hash.category
-    this.licenceLabel = hash.licenceLabel
     this.licence = hash.licence
-    this.languageLabel = hash.languageLabel
     this.language = hash.language
+    this.privacy = hash.privacy
+    this.waitTranscoding = hash.waitTranscoding
+    this.state = hash.state
     this.description = hash.description
+
     this.duration = hash.duration
-    this.durationLabel = Video.createDurationString(hash.duration)
+    this.durationLabel = durationToString(hash.duration)
+
     this.id = hash.id
     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.thumbnailUrl = hash.thumbnailUrl || (absoluteAPIUrl + hash.thumbnailPath)
+
     this.previewPath = hash.previewPath
-    this.previewUrl = absoluteAPIUrl + hash.previewPath
+    this.previewUrl = hash.previewUrl || (absoluteAPIUrl + hash.previewPath)
+
     this.embedPath = hash.embedPath
-    this.embedUrl = absoluteAPIUrl + hash.embedPath
+    this.embedUrl = hash.embedUrl || (absoluteAPIUrl + hash.embedPath)
+
+    this.url = hash.url
+
     this.views = hash.views
     this.likes = hash.likes
     this.dislikes = hash.dislikes
+
     this.nsfw = hash.nsfw
 
-    this.by = Video.createByString(hash.accountName, hash.serverHost)
+    this.account = hash.account
+    this.channel = hash.channel
+
+    this.byAccount = Actor.CREATE_BY_STRING(hash.account.name, hash.account.host)
+    this.byVideoChannel = Actor.CREATE_BY_STRING(hash.channel.name, hash.channel.host)
+    this.accountAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.account)
+    this.videoChannelAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.channel)
+
+    this.category.label = peertubeTranslate(this.category.label, translations)
+    this.licence.label = peertubeTranslate(this.licence.label, translations)
+    this.language.label = peertubeTranslate(this.language.label, translations)
+    this.privacy.label = peertubeTranslate(this.privacy.label, translations)
+
+    this.scheduledUpdate = hash.scheduledUpdate
+    this.originallyPublishedAt = hash.originallyPublishedAt ? new Date(hash.originallyPublishedAt.toString()) : null
+
+    if (this.state) this.state.label = peertubeTranslate(this.state.label, translations)
+
+    this.blacklisted = hash.blacklisted
+    this.blacklistedReason = hash.blacklistedReason
+
+    this.userHistory = hash.userHistory
+
+    this.originInstanceHost = this.account.host
+    this.originInstanceUrl = 'https://' + this.originInstanceHost
+  }
+
+  isVideoNSFWForUser (user: User, serverConfig: ServerConfig) {
+    // Video is not NSFW, skip
+    if (this.nsfw === false) return false
+
+    // Return user setting if logged in
+    if (user) return user.nsfwPolicy !== 'display'
+
+    // Return default instance config
+    return serverConfig.instance.defaultNSFWPolicy !== 'display'
+  }
+
+  isRemovableBy (user: AuthUser) {
+    return user && this.isLocal === true && (this.account.name === user.username || user.hasRight(UserRight.REMOVE_ANY_VIDEO))
+  }
+
+  isBlackistableBy (user: AuthUser) {
+    return this.blacklisted !== true && user && user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) === true
+  }
+
+  isUnblacklistableBy (user: AuthUser) {
+    return this.blacklisted === true && user && user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) === true
+  }
+
+  isUpdatableBy (user: AuthUser) {
+    return user && this.isLocal === true && (this.account.name === user.username || user.hasRight(UserRight.UPDATE_ANY_VIDEO))
   }
 
-  isVideoNSFWForUser (user: User) {
-    // If the video is NSFW and the user is not logged in, or the user does not want to display NSFW videos...
-    return (this.nsfw && (!user || user.displayNSFW === false))
+  canBeDuplicatedBy (user: AuthUser) {
+    return user && this.isLocal === false && user.hasRight(UserRight.MANAGE_VIDEOS_REDUNDANCIES)
   }
 }