X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fvideos%2Fshared%2Fvideo.model.ts;h=6e8dfaa6f4c9ef94a8297c2c0ff428b7bba2384b;hb=f5028693a896a3076dd286ac0030e3d8f78f5ebf;hp=fae001d78fa633ee6ca76a67fa47d9b194e3b5f8;hpb=99fe265a5fc077cb66c322e7f3d191ff7110aea0;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/videos/shared/video.model.ts b/client/src/app/videos/shared/video.model.ts index fae001d78..6e8dfaa6f 100644 --- a/client/src/app/videos/shared/video.model.ts +++ b/client/src/app/videos/shared/video.model.ts @@ -1,59 +1,174 @@ -export class Video { - author: string; - by: string; - createdAt: Date; - description: string; - duration: string; - id: string; - isLocal: boolean; - magnetUri: string; - name: string; - podHost: string; - tags: string[]; - thumbnailPath: string; - - private static createByString(author: string, podHost: string) { - return author + '@' + podHost; - } - - private static createDurationString(duration: number) { - const minutes = Math.floor(duration / 60); - const seconds = duration % 60; - const minutes_padding = minutes >= 10 ? '' : '0'; - const seconds_padding = seconds >= 10 ? '' : '0'; - - return minutes_padding + minutes.toString() + ':' + seconds_padding + seconds.toString(); - } - - constructor(hash: { +import { Video as VideoServerModel, VideoFile } from '../../../../../shared' +import { User } from '../../shared' +import { VideoResolution } from '../../../../../shared/models/videos/video-resolution.enum' + +export class Video implements VideoServerModel { + author: string + by: string + createdAt: Date + updatedAt: Date + categoryLabel: string + category: number + licenceLabel: string + licence: number + languageLabel: string + language: number + description: string + duration: number + durationLabel: string + id: number + uuid: string + isLocal: boolean + name: string + podHost: string + tags: string[] + thumbnailPath: string + thumbnailUrl: string + previewPath: string + previewUrl: string + embedPath: string + embedUrl: string + views: number + likes: number + dislikes: number + nsfw: boolean + files: VideoFile[] + + private static createByString (author: string, podHost: string) { + return author + '@' + podHost + } + + 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' + + return minutesPadding + minutes.toString() + ':' + secondsPadding + seconds.toString() + } + + constructor (hash: { author: string, - createdAt: string, + createdAt: Date | string, + categoryLabel: string, + category: number, + licenceLabel: string, + licence: number, + languageLabel: string + language: number description: string, - duration: number; - id: string, + duration: number + id: number, + uuid: string, isLocal: boolean, - magnetUri: string, name: string, podHost: string, tags: string[], - thumbnailPath: string + thumbnailPath: string, + previewPath: string, + embedPath: string, + views: number, + likes: number, + dislikes: number, + nsfw: boolean, + files: VideoFile[] }) { - this.author = hash.author; - this.createdAt = new Date(hash.createdAt); - this.description = hash.description; - this.duration = Video.createDurationString(hash.duration); - this.id = hash.id; - this.isLocal = hash.isLocal; - this.magnetUri = hash.magnetUri; - this.name = hash.name; - this.podHost = hash.podHost; - this.tags = hash.tags; - this.thumbnailPath = hash.thumbnailPath; - - this.by = Video.createByString(hash.author, hash.podHost); - } - - isRemovableBy(user) { - return this.isLocal === true && user && this.author === user.username; + let absoluteAPIUrl = API_URL + if (!absoluteAPIUrl) { + // The API is on the same domain + absoluteAPIUrl = window.location.origin + } + + this.author = hash.author + this.createdAt = new Date(hash.createdAt.toString()) + this.categoryLabel = hash.categoryLabel + this.category = hash.category + this.licenceLabel = hash.licenceLabel + this.licence = hash.licence + this.languageLabel = hash.languageLabel + this.language = hash.language + this.description = hash.description + this.duration = hash.duration + this.durationLabel = Video.createDurationString(hash.duration) + this.id = hash.id + this.uuid = hash.uuid + this.isLocal = hash.isLocal + this.name = hash.name + this.podHost = hash.podHost + this.tags = hash.tags + this.thumbnailPath = hash.thumbnailPath + this.thumbnailUrl = absoluteAPIUrl + hash.thumbnailPath + this.previewPath = hash.previewPath + this.previewUrl = absoluteAPIUrl + hash.previewPath + this.embedPath = hash.embedPath + this.embedUrl = absoluteAPIUrl + hash.embedPath + this.views = hash.views + this.likes = hash.likes + this.dislikes = hash.dislikes + this.nsfw = hash.nsfw + this.files = hash.files + + this.by = Video.createByString(hash.author, hash.podHost) + } + + isRemovableBy (user) { + return user && this.isLocal === true && (this.author === user.username || user.isAdmin() === true) + } + + isBlackistableBy (user) { + return user && user.isAdmin() === true && this.isLocal === false + } + + isUpdatableBy (user) { + return user && this.isLocal === true && user.username === this.author + } + + 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)) + } + + getAppropriateMagnetUri (actualDownloadSpeed = 0) { + if (this.files === undefined || this.files.length === 0) return '' + if (this.files.length === 1) return this.files[0].magnetUri + + // Find first video that is good for our download speed (remember they are sorted) + let betterResolutionFile = this.files.find(f => actualDownloadSpeed > (f.size / this.duration)) + + // If the download speed is too bad, return the lowest resolution we have + if (betterResolutionFile === undefined) { + betterResolutionFile = this.files.find(f => f.resolution === VideoResolution.H_240P) + } + + return betterResolutionFile.magnetUri + } + + patch (values: Object) { + Object.keys(values).forEach((key) => { + this[key] = values[key] + }) + } + + toJSON () { + return { + author: this.author, + createdAt: this.createdAt, + category: this.category, + licence: this.licence, + language: this.language, + description: this.description, + duration: this.duration, + id: this.id, + isLocal: this.isLocal, + name: this.name, + podHost: this.podHost, + tags: this.tags, + thumbnailPath: this.thumbnailPath, + views: this.views, + likes: this.likes, + dislikes: this.dislikes, + nsfw: this.nsfw, + files: this.files + } } }