-import { Video as VideoServerModel } from '../../../../../shared'
+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
description: string
duration: number
durationLabel: string
- id: string
+ id: number
+ uuid: string
isLocal: boolean
- magnetUri: string
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
constructor (hash: {
author: string,
- createdAt: string,
+ createdAt: Date | string,
categoryLabel: string,
category: number,
licenceLabel: string,
language: number
description: string,
duration: number
- id: string,
+ id: number,
+ uuid: string,
isLocal: boolean,
- magnetUri: string,
name: string,
podHost: string,
tags: string[],
thumbnailPath: string,
+ previewPath: string,
+ embedPath: string,
views: number,
likes: number,
dislikes: number,
- nsfw: boolean
+ nsfw: boolean,
+ files: VideoFile[]
}) {
+ 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)
+ this.createdAt = new Date(hash.createdAt.toString())
this.categoryLabel = hash.categoryLabel
this.category = hash.category
this.licenceLabel = hash.licenceLabel
this.duration = hash.duration
this.durationLabel = Video.createDurationString(hash.duration)
this.id = hash.id
+ this.uuid = hash.uuid
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.thumbnailUrl = API_URL + 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)
}
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]
duration: this.duration,
id: this.id,
isLocal: this.isLocal,
- magnetUri: this.magnetUri,
name: this.name,
podHost: this.podHost,
tags: this.tags,
views: this.views,
likes: this.likes,
dislikes: this.dislikes,
- nsfw: this.nsfw
+ nsfw: this.nsfw,
+ files: this.files
}
}
}