X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-main%2Fvideo%2Fvideo.model.ts;h=2e4ab87d75ce0f65ef1f441f63f6c659db70ad81;hb=83b1b7eaf1c04837f92de497e74895bee808eb83;hp=b7720c8d21da3617869c159a391f2d1be60a5f6a;hpb=171efc48e67498406feb6d7873b3482b41505515;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-main/video/video.model.ts b/client/src/app/shared/shared-main/video/video.model.ts index b7720c8d2..2e4ab87d7 100644 --- a/client/src/app/shared/shared-main/video/video.model.ts +++ b/client/src/app/shared/shared-main/video/video.model.ts @@ -1,6 +1,6 @@ import { AuthUser } from '@app/core' import { User } from '@app/core/users/user.model' -import { durationToString, getAbsoluteAPIUrl, getAbsoluteEmbedUrl } from '@app/helpers' +import { durationToString, prepareIcu, getAbsoluteAPIUrl, getAbsoluteEmbedUrl } from '@app/helpers' import { Actor } from '@app/shared/shared-main/account/actor.model' import { buildVideoWatchPath } from '@shared/core-utils' import { peertubeTranslate } from '@shared/core-utils/i18n' @@ -10,12 +10,18 @@ import { UserRight, Video as VideoServerModel, VideoConstant, + VideoFile, VideoPrivacy, VideoScheduleUpdate, - VideoState + VideoState, + VideoStreamingPlaylist, + VideoStreamingPlaylistType } from '@shared/models' export class Video implements VideoServerModel { + private static readonly viewsICU = prepareIcu($localize`{views, plural, =0 {No view} =1 {1 view} other {{views} views}}`) + private static readonly viewersICU = prepareIcu($localize`{viewers, plural, =0 {No viewers} =1 {1 viewer} other {{viewers} viewers}}`) + byVideoChannel: string byAccount: string @@ -52,9 +58,11 @@ export class Video implements VideoServerModel { embedPath: string embedUrl: string - url?: string + url: string views: number + viewers: number + likes: number dislikes: number nsfw: boolean @@ -65,8 +73,12 @@ export class Video implements VideoServerModel { waitTranscoding?: boolean state?: VideoConstant scheduledUpdate?: VideoScheduleUpdate + blacklisted?: boolean - blockedReason?: string + blacklistedReason?: string + + blockedOwner?: boolean + blockedServer?: boolean account: { id: number @@ -74,7 +86,11 @@ export class Video implements VideoServerModel { displayName: string url: string host: string - avatar?: ActorImage + + // TODO: remove, deprecated in 4.2 + avatar: ActorImage + + avatars: ActorImage[] } channel: { @@ -83,7 +99,11 @@ export class Video implements VideoServerModel { displayName: string url: string host: string - avatar?: ActorImage + + // TODO: remove, deprecated in 4.2 + avatar: ActorImage + + avatars: ActorImage[] } userHistory?: { @@ -92,6 +112,9 @@ export class Video implements VideoServerModel { pluginData?: any + streamingPlaylists?: VideoStreamingPlaylist[] + files?: VideoFile[] + static buildWatchUrl (video: Partial>) { return buildVideoWatchPath({ shortUUID: video.shortUUID || video.uuid }) } @@ -100,7 +123,7 @@ export class Video implements VideoServerModel { return '/videos/update/' + video.uuid } - constructor (hash: VideoServerModel, translations = {}) { + constructor (hash: VideoServerModel, translations: { [ id: string ]: string } = {}) { const absoluteAPIUrl = getAbsoluteAPIUrl() this.createdAt = new Date(hash.createdAt.toString()) @@ -141,6 +164,7 @@ export class Video implements VideoServerModel { this.url = hash.url this.views = hash.views + this.viewers = hash.viewers this.likes = hash.likes this.dislikes = hash.dislikes @@ -163,7 +187,13 @@ export class Video implements VideoServerModel { if (this.state) this.state.label = peertubeTranslate(this.state.label, translations) this.blacklisted = hash.blacklisted - this.blockedReason = hash.blacklistedReason + this.blacklistedReason = hash.blacklistedReason + + this.blockedOwner = hash.blockedOwner + this.blockedServer = hash.blockedServer + + this.streamingPlaylists = hash.streamingPlaylists + this.files = hash.files this.userHistory = hash.userHistory @@ -200,6 +230,38 @@ export class Video implements VideoServerModel { return user && this.isLocal === true && (this.account.name === user.username || user.hasRight(UserRight.UPDATE_ANY_VIDEO)) } + isEditableBy (user: AuthUser, videoStudioEnabled: boolean) { + return videoStudioEnabled && + this.state?.id === VideoState.PUBLISHED && + this.isUpdatableBy(user) + } + + canSeeStats (user: AuthUser) { + return user && this.isLocal === true && (this.account.name === user.username || user.hasRight(UserRight.SEE_ALL_VIDEOS)) + } + + canRemoveFiles (user: AuthUser) { + return this.isLocal && + user && user.hasRight(UserRight.MANAGE_VIDEO_FILES) && + this.state.id !== VideoState.TO_TRANSCODE && + this.hasHLS() && + this.hasWebTorrent() + } + + canRunTranscoding (user: AuthUser) { + return this.isLocal && + user && user.hasRight(UserRight.RUN_VIDEO_TRANSCODING) && + this.state.id !== VideoState.TO_TRANSCODE + } + + hasHLS () { + return this.streamingPlaylists?.some(p => p.type === VideoStreamingPlaylistType.HLS) + } + + hasWebTorrent () { + return this.files && this.files.length !== 0 + } + isLiveInfoAvailableBy (user: AuthUser) { return this.isLive && user && this.isLocal === true && (this.account.name === user.username || user.hasRight(UserRight.GET_ANY_LIVE)) @@ -210,12 +272,10 @@ export class Video implements VideoServerModel { } getExactNumberOfViews () { - if (this.views < 1000) return '' - if (this.isLive) { - return $localize`${this.views} viewers` + return Video.viewersICU({ viewers: this.viewers }, $localize`${this.viewers} viewer(s)`) } - return $localize`${this.views} views` + return Video.viewsICU({ views: this.views }, $localize`{${this.views} view(s)}`) } }