From 09700934b90e2ac7b1b9ed1694d9d4d52735e2e1 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Mar 2018 11:04:40 +0100 Subject: [PATCH] BEARKING CHANGE: Update videos API response before beta --- CHANGELOG.md | 27 ++++++++++ .../app/shared/video/video-details.model.ts | 54 ++++++------------- .../src/app/shared/video/video-edit.model.ts | 8 +-- client/src/app/shared/video/video.model.ts | 13 ++--- .../+video-edit/video-update.component.ts | 2 +- .../modal/video-download.component.html | 4 +- .../modal/video-download.component.ts | 10 ++-- .../+video-watch/video-watch.component.html | 8 +-- .../assets/player/peertube-videojs-plugin.ts | 21 ++++---- server/tests/real-world/real-world.ts | 2 +- server/tests/utils/videos/videos.ts | 20 +++---- shared/models/videos/video.model.ts | 3 +- 12 files changed, 86 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e3248835..04b8b7c31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/client/src/app/shared/video/video-details.model.ts b/client/src/app/shared/video/video-details.model.ts index 1882a8165..9fc326beb 100644 --- a/client/src/app/shared/video/video-details.model.ts +++ b/client/src/app/shared/video/video-details.model.ts @@ -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 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 () { diff --git a/client/src/app/shared/video/video-edit.model.ts b/client/src/app/shared/video/video-edit.model.ts index a8bbb63eb..c1a70d1b3 100644 --- a/client/src/app/shared/video/video-edit.model.ts +++ b/client/src/app/shared/video/video-edit.model.ts @@ -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 diff --git a/client/src/app/shared/video/video.model.ts b/client/src/app/shared/video/video.model.ts index 50ca9eb99..7b68933a1 100644 --- a/client/src/app/shared/video/video.model.ts +++ b/client/src/app/shared/video/video.model.ts @@ -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 + licence: VideoConstant + language: VideoConstant 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 diff --git a/client/src/app/videos/+video-edit/video-update.component.ts b/client/src/app/videos/+video-edit/video-update.component.ts index 2fc09278c..6cd204f72 100644 --- a/client/src/app/videos/+video-edit/video-update.component.ts +++ b/client/src/app/videos/+video-edit/video-update.component.ts @@ -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) diff --git a/client/src/app/videos/+video-watch/modal/video-download.component.html b/client/src/app/videos/+video-watch/modal/video-download.component.html index f8f17a471..617892b11 100644 --- a/client/src/app/videos/+video-watch/modal/video-download.component.html +++ b/client/src/app/videos/+video-watch/modal/video-download.component.html @@ -9,8 +9,8 @@ @@ -131,7 +131,7 @@ Category - {{ video.categoryLabel }} + {{ video.category.label }} @@ -140,7 +140,7 @@ Licence - {{ video.licenceLabel }} + {{ video.licence.label }} @@ -149,7 +149,7 @@ Language - {{ video.languageLabel }} + {{ video.language.label }} diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/peertube-videojs-plugin.ts index a96f6d1a1..c99363fb5 100644 --- a/client/src/assets/player/peertube-videojs-plugin.ts +++ b/client/src/assets/player/peertube-videojs-plugin.ts @@ -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_() diff --git a/server/tests/real-world/real-world.ts b/server/tests/real-world/real-world.ts index f10ca856d..ae02ef64d 100644 --- a/server/tests/real-world/real-world.ts +++ b/server/tests/real-world/real-world.ts @@ -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}.` } }) diff --git a/server/tests/utils/videos/videos.ts b/server/tests/utils/videos/videos.ts index 89db16fec..3c63bedb2 100644 --- a/server/tests/utils/videos/videos.ts +++ b/server/tests/utils/videos/videos.ts @@ -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) diff --git a/shared/models/videos/video.model.ts b/shared/models/videos/video.model.ts index 6a096195f..ebd2813ca 100644 --- a/shared/models/videos/video.model.ts +++ b/shared/models/videos/video.model.ts @@ -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 { export interface VideoFile { magnetUri: string - resolution: VideoConstant + resolution: VideoConstant size: number // Bytes torrentUrl: string fileUrl: string