BEARKING CHANGE: Update videos API response

before beta
pull/364/head
Chocobozzz 2018-03-19 11:04:40 +01:00
parent ae5a3dd664
commit 09700934b9
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
12 changed files with 86 additions and 86 deletions

View File

@ -1,5 +1,32 @@
# Changelog
## v1.0.0-alpha.9
### BREAKING CHANGES
* Update videos list/search/get API response:
* Removed `resolution` field
* Removed `resolutionLabel` field
* Removed `category` field
* Removed `categoryLabel` field
* Removed `licence` field
* Removed `licenceLabel` field
* Removed `language` field
* Removed `languageLabel` field
* Removed `privacy` field
* Removed `privacyLabel` field
* Added `resolution.id` field
* Added `resolution.label` field
* Added `category.id` field
* Added `category.label` field
* Added `licence.id` field
* Added `licence.label` field
* Added `language.id` field
* Added `language.label` field
* Added `privacy.id` field
* Added `privacy.label` field
## v1.0.0-alpha.8
### Features

View File

@ -1,57 +1,33 @@
import {
UserRight, VideoChannel, VideoDetails as VideoDetailsServerModel, VideoFile, VideoPrivacy,
UserRight,
VideoChannel,
VideoDetails as VideoDetailsServerModel,
VideoFile,
VideoPrivacy,
VideoResolution
} from '../../../../../shared'
import { Account } from '../../../../../shared/models/actors'
import { VideoConstant } from '../../../../../shared/models/videos/video.model'
import { AuthUser } from '../../core'
import { Video } from '../../shared/video/video.model'
export class VideoDetails extends Video implements VideoDetailsServerModel {
accountName: string
by: string
createdAt: Date
updatedAt: Date
categoryLabel: string
category: number
licenceLabel: string
licence: number
languageLabel: string
language: number
description: string
support: string
duration: number
durationLabel: string
id: number
uuid: string
isLocal: boolean
name: string
serverHost: string
tags: string[]
thumbnailPath: string
thumbnailUrl: string
previewPath: string
previewUrl: string
embedPath: string
embedUrl: string
views: number
likes: number
dislikes: number
nsfw: boolean
privacy: VideoConstant<VideoPrivacy>
descriptionPath: string
files: VideoFile[]
support: string
channel: VideoChannel
privacy: VideoPrivacy
privacyLabel: string
tags: string[]
files: VideoFile[]
account: Account
commentsEnabled: boolean
likesPercent: number
dislikesPercent: number
commentsEnabled: boolean
constructor (hash: VideoDetailsServerModel) {
super(hash)
this.privacy = hash.privacy
this.privacyLabel = hash.privacyLabel
this.descriptionPath = hash.descriptionPath
this.files = hash.files
this.channel = hash.channel
@ -72,14 +48,14 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
// 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)
betterResolutionFile = this.files.find(f => f.resolution.id === VideoResolution.H_240P)
}
return betterResolutionFile.magnetUri
}
isRemovableBy (user: AuthUser) {
return user && this.isLocal === true && (this.accountName === user.username || user.hasRight(UserRight.REMOVE_ANY_VIDEO))
return user && this.isLocal === true && (this.account.name === user.username || user.hasRight(UserRight.REMOVE_ANY_VIDEO))
}
isBlackistableBy (user: AuthUser) {
@ -87,7 +63,7 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
}
isUpdatableBy (user: AuthUser) {
return user && this.isLocal === true && (this.accountName === user.username || user.hasRight(UserRight.UPDATE_ANY_VIDEO))
return user && this.isLocal === true && (this.account.name === user.username || user.hasRight(UserRight.UPDATE_ANY_VIDEO))
}
buildLikeAndDislikePercents () {

View File

@ -24,16 +24,16 @@ export class VideoEdit {
if (videoDetails) {
this.id = videoDetails.id
this.uuid = videoDetails.uuid
this.category = videoDetails.category
this.licence = videoDetails.licence
this.language = videoDetails.language
this.category = videoDetails.category.id
this.licence = videoDetails.licence.id
this.language = videoDetails.language.id
this.description = videoDetails.description
this.name = videoDetails.name
this.tags = videoDetails.tags
this.nsfw = videoDetails.nsfw
this.commentsEnabled = videoDetails.commentsEnabled
this.channel = videoDetails.channel.id
this.privacy = videoDetails.privacy
this.privacy = videoDetails.privacy.id
this.support = videoDetails.support
this.thumbnailUrl = videoDetails.thumbnailUrl
this.previewUrl = videoDetails.previewUrl

View File

@ -2,18 +2,16 @@ 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 { VideoConstant } from '../../../../../shared/models/videos/video.model'
import { getAbsoluteAPIUrl } from '../misc/utils'
export class Video implements VideoServerModel {
by: string
createdAt: Date
updatedAt: Date
categoryLabel: string
category: number
licenceLabel: string
licence: number
languageLabel: string
language: number
category: VideoConstant<number>
licence: VideoConstant<number>
language: VideoConstant<number>
description: string
duration: number
durationLabel: string
@ -58,11 +56,8 @@ export class Video implements VideoServerModel {
const absoluteAPIUrl = getAbsoluteAPIUrl()
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

View File

@ -72,7 +72,7 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
]
// We cannot set private a video that was not private
if (video.privacy !== VideoPrivacy.PRIVATE) {
if (video.privacy.id !== VideoPrivacy.PRIVATE) {
const newVideoPrivacies = []
for (const p of this.videoPrivacies) {
if (p.id !== VideoPrivacy.PRIVATE) newVideoPrivacies.push(p)

View File

@ -9,8 +9,8 @@
<div class="modal-body">
<div class="peertube-select-container">
<select [(ngModel)]="resolution">
<option *ngFor="let file of video.files" [value]="file.resolution">{{ file.resolutionLabel }}</option>
<select [(ngModel)]="resolutionId">
<option *ngFor="let file of video.files" [value]="file.resolution.id">{{ file.resolution.label }}</option>
</select>
</div>

View File

@ -13,14 +13,14 @@ export class VideoDownloadComponent implements OnInit {
@ViewChild('modal') modal: ModalDirective
downloadType: 'direct' | 'torrent' = 'torrent'
resolution: number | string = -1
resolutionId: number | string = -1
constructor () {
// empty
}
ngOnInit () {
this.resolution = this.video.files[0].resolution
this.resolutionId = this.video.files[0].resolution.id
}
show () {
@ -33,11 +33,11 @@ export class VideoDownloadComponent implements OnInit {
download () {
// HTML select send us a string, so convert it to a number
this.resolution = parseInt(this.resolution.toString(), 10)
this.resolutionId = parseInt(this.resolutionId.toString(), 10)
const file = this.video.files.find(f => f.resolution === this.resolution)
const file = this.video.files.find(f => f.resolution.id === this.resolutionId)
if (!file) {
console.error('Could not find file with resolution %d.', this.resolution)
console.error('Could not find file with resolution %d.', this.resolutionId)
return
}

View File

@ -122,7 +122,7 @@
Privacy
</span>
<span class="video-attribute-value">
{{ video.privacyLabel }}
{{ video.privacy.label }}
</span>
</div>
@ -131,7 +131,7 @@
Category
</span>
<span class="video-attribute-value">
{{ video.categoryLabel }}
{{ video.category.label }}
</span>
</div>
@ -140,7 +140,7 @@
Licence
</span>
<span class="video-attribute-value">
{{ video.licenceLabel }}
{{ video.licence.label }}
</span>
</div>
@ -149,7 +149,7 @@
Language
</span>
<span class="video-attribute-value">
{{ video.languageLabel }}
{{ video.language.label }}
</span>
</div>

View File

@ -2,6 +2,7 @@
import * as videojs from 'video.js'
import * as WebTorrent from 'webtorrent'
import { VideoConstant, VideoResolution } from '../../../../shared/models/videos'
import { VideoFile } from '../../../../shared/models/videos/video.model'
import { renderVideo } from './video-renderer'
@ -52,8 +53,8 @@ class ResolutionMenuItem extends MenuItem {
options.selectable = true
super(player, options)
const currentResolution = this.player_.peertube().getCurrentResolution()
this.selected(this.options_.id === currentResolution)
const currentResolutionId = this.player_.peertube().getCurrentResolutionId()
this.selected(this.options_.id === currentResolutionId)
}
handleClick (event) {
@ -89,10 +90,10 @@ class ResolutionMenuButton extends MenuButton {
menuItems.push(new ResolutionMenuItem(
this.player_,
{
id: videoFile.resolution,
label: videoFile.resolutionLabel,
id: videoFile.resolution.id,
label: videoFile.resolution.label,
src: videoFile.magnetUri,
selected: videoFile.resolution === this.currentSelection
selected: videoFile.resolution.id === this.currentSelectionId
})
)
}
@ -269,12 +270,12 @@ class PeerTubePlugin extends Plugin {
this.flushVideoFile(this.currentVideoFile, false)
}
getCurrentResolution () {
return this.currentVideoFile ? this.currentVideoFile.resolution : -1
getCurrentResolutionId () {
return this.currentVideoFile ? this.currentVideoFile.resolution.id : -1
}
getCurrentResolutionLabel () {
return this.currentVideoFile ? this.currentVideoFile.resolutionLabel : ''
return this.currentVideoFile ? this.currentVideoFile.resolution.label : ''
}
updateVideoFile (videoFile?: VideoFile, done?: () => void) {
@ -339,7 +340,7 @@ class PeerTubePlugin extends Plugin {
this.trigger('videoFileUpdate')
}
updateResolution (resolution) {
updateResolution (resolutionId: number) {
// Remember player state
const currentTime = this.player.currentTime()
const isPaused = this.player.paused()
@ -352,7 +353,7 @@ class PeerTubePlugin extends Plugin {
this.player.bigPlayButton.hide()
}
const newVideoFile = this.videoFiles.find(f => f.resolution === resolution)
const newVideoFile = this.videoFiles.find(f => f.resolution.id === resolutionId)
this.updateVideoFile(newVideoFile, () => {
this.player.currentTime(currentTime)
this.player.handleTechSeeked_()

View File

@ -327,7 +327,7 @@ function areDifferences (videos1: Video[], videos2: Video[]) {
return `Video ${video1.uuid} has missing video file ${videoFile1.magnetUri}.`
}
if (videoFile1.size !== videoFile2.size || videoFile1.resolutionLabel !== videoFile2.resolutionLabel) {
if (videoFile1.size !== videoFile2.size || videoFile1.resolution.label !== videoFile2.resolution.label) {
return `Video ${video1.uuid} has different video file ${videoFile1.magnetUri}.`
}
})

View File

@ -407,12 +407,12 @@ async function completeVideoCheck (
if (!attributes.dislikes) attributes.dislikes = 0
expect(video.name).to.equal(attributes.name)
expect(video.category).to.equal(attributes.category)
expect(video.categoryLabel).to.equal(VIDEO_CATEGORIES[attributes.category] || 'Misc')
expect(video.licence).to.equal(attributes.licence)
expect(video.licenceLabel).to.equal(VIDEO_LICENCES[attributes.licence] || 'Unknown')
expect(video.language).to.equal(attributes.language)
expect(video.languageLabel).to.equal(VIDEO_LANGUAGES[attributes.language] || 'Unknown')
expect(video.category.id).to.equal(attributes.category)
expect(video.category.label).to.equal(VIDEO_CATEGORIES[attributes.category] || 'Misc')
expect(video.licence.id).to.equal(attributes.licence)
expect(video.licence.label).to.equal(VIDEO_LICENCES[attributes.licence] || 'Unknown')
expect(video.language.id).to.equal(attributes.language)
expect(video.language.label).to.equal(VIDEO_LANGUAGES[attributes.language] || 'Unknown')
expect(video.nsfw).to.equal(attributes.nsfw)
expect(video.description).to.equal(attributes.description)
expect(video.account.host).to.equal(attributes.account.host)
@ -429,8 +429,8 @@ async function completeVideoCheck (
expect(videoDetails.files).to.have.lengthOf(attributes.files.length)
expect(videoDetails.tags).to.deep.equal(attributes.tags)
expect(videoDetails.privacy).to.deep.equal(attributes.privacy)
expect(videoDetails.privacyLabel).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy])
expect(videoDetails.privacy.id).to.deep.equal(attributes.privacy)
expect(videoDetails.privacy.label).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy])
expect(videoDetails.account.name).to.equal(attributes.account.name)
expect(videoDetails.account.host).to.equal(attributes.account.host)
expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled)
@ -453,8 +453,8 @@ async function completeVideoCheck (
expect(file.magnetUri).to.have.lengthOf.above(2)
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')
expect(file.resolution.id).to.equal(attributeFile.resolution)
expect(file.resolution.label).to.equal(attributeFile.resolution + 'p')
const minSize = attributeFile.size - ((10 * attributeFile.size) / 100)
const maxSize = attributeFile.size + ((10 * attributeFile.size) / 100)

View File

@ -1,3 +1,4 @@
import { VideoResolution } from '../../index'
import { Account } from '../actors'
import { Avatar } from '../avatars/avatar.model'
import { VideoChannel } from './video-channel.model'
@ -10,7 +11,7 @@ export interface VideoConstant <T> {
export interface VideoFile {
magnetUri: string
resolution: VideoConstant<number>
resolution: VideoConstant<VideoResolution>
size: number // Bytes
torrentUrl: string
fileUrl: string