]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Some fixes for admin videos list
authorChocobozzz <me@florianbigard.com>
Tue, 2 Nov 2021 10:00:40 +0000 (11:00 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 2 Nov 2021 10:13:13 +0000 (11:13 +0100)
12 files changed:
client/src/app/+admin/overview/videos/video-list.component.html
client/src/app/+admin/overview/videos/video-list.component.ts
client/src/app/shared/shared-main/video/video.service.ts
server/models/video/sql/shared/abstract-run-query.ts [moved from server/models/video/sql/shared/abstract-videos-query-builder.ts with 93% similarity]
server/models/video/sql/shared/abstract-video-query-builder.ts [moved from server/models/video/sql/shared/abstract-videos-model-query-builder.ts with 97% similarity]
server/models/video/sql/shared/video-file-query-builder.ts
server/models/video/sql/shared/video-model-builder.ts
server/models/video/sql/shared/video-table-attributes.ts [moved from server/models/video/sql/shared/video-tables.ts with 90% similarity]
server/models/video/sql/video-model-get-query-builder.ts
server/models/video/sql/videos-id-list-query-builder.ts
server/models/video/sql/videos-model-list-query-builder.ts
support/doc/api/openapi.yaml

index eedf6f3dc082ecf02dc29c59029782f910fea7f7..dd4ab178e542e9b57f0a16df9a07b40c2820afbc 100644 (file)
@@ -69,7 +69,7 @@
 
         <span *ngIf="video.nsfw" class="badge badge-red" i18n>NSFW</span>
 
-        <span *ngIf="isUnpublished(video.state.id)" class="badge badge-yellow" i18n>Not published yet</span>
+        <span *ngIf="isUnpublished(video.state.id)" class="badge badge-yellow" i18n>{{ video.state.label }}</span>
 
         <span *ngIf="isAccountBlocked(video)" class="badge badge-red" i18n>Account muted</span>
         <span *ngIf="isServerBlocked(video)" class="badge badge-red" i18n>Server muted</span>
@@ -80,8 +80,9 @@
       <td>
         <span *ngIf="isHLS(video)" class="badge badge-blue">HLS</span>
         <span *ngIf="isWebTorrent(video)" class="badge badge-blue">WebTorrent</span>
+        <span *ngIf="video.isLive" class="badge badge-blue">Live</span>
 
-        <span *ngIf="!video.remote">{{ getFilesSize(video) | bytes: 1 }}</span>
+        <span *ngIf="!video.isLive && video.isLocal">{{ getFilesSize(video) | bytes: 1 }}</span>
       </td>
 
       <td>
index 6885abfc7835d7490f377ba44482a50928028a63..8bd171c53ece4122aa1fa679146104c95296ee3c 100644 (file)
@@ -16,7 +16,7 @@ export class VideoListComponent extends RestTable implements OnInit {
   videos: Video[] = []
 
   totalRecords = 0
-  sort: SortMeta = { field: 'publishedAt', order: 1 }
+  sort: SortMeta = { field: 'publishedAt', order: -1 }
   pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
 
   bulkVideoActions: DropdownAction<Video[]>[][] = []
@@ -99,7 +99,7 @@ export class VideoListComponent extends RestTable implements OnInit {
   }
 
   isUnpublished (state: VideoState) {
-    return state !== VideoState.PUBLISHED
+    return state !== VideoState.LIVE_ENDED && state !== VideoState.PUBLISHED
   }
 
   isAccountBlocked (video: Video) {
index 5db9a8704874bba2731984f5b6274b60e8b6b600..819847ac6975dcb0cb8f1136ed46bf444b206bba 100644 (file)
@@ -48,7 +48,7 @@ export type CommonVideoParams = {
 
 @Injectable()
 export class VideoService {
-  static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos/'
+  static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos'
   static BASE_FEEDS_URL = environment.apiUrl + '/feeds/videos.'
   static BASE_SUBSCRIPTION_FEEDS_URL = environment.apiUrl + '/feeds/subscriptions.'
 
@@ -60,18 +60,18 @@ export class VideoService {
   ) {}
 
   getVideoViewUrl (uuid: string) {
-    return VideoService.BASE_VIDEO_URL + uuid + '/views'
+    return VideoService.BASE_VIDEO_URL + '/' + uuid + '/views'
   }
 
   getUserWatchingVideoUrl (uuid: string) {
-    return VideoService.BASE_VIDEO_URL + uuid + '/watching'
+    return VideoService.BASE_VIDEO_URL + '/' + uuid + '/watching'
   }
 
   getVideo (options: { videoId: string }): Observable<VideoDetails> {
     return this.serverService.getServerLocale()
                .pipe(
                  switchMap(translations => {
-                   return this.authHttp.get<VideoDetailsServerModel>(VideoService.BASE_VIDEO_URL + options.videoId)
+                   return this.authHttp.get<VideoDetailsServerModel>(VideoService.BASE_VIDEO_URL + '/' + options.videoId)
                               .pipe(map(videoHash => ({ videoHash, translations })))
                  }),
                  map(({ videoHash, translations }) => new VideoDetails(videoHash, translations)),
@@ -111,7 +111,7 @@ export class VideoService {
 
     const data = objectToFormData(body)
 
-    return this.authHttp.put(VideoService.BASE_VIDEO_URL + video.id, data)
+    return this.authHttp.put(VideoService.BASE_VIDEO_URL + '/' + video.id, data)
                .pipe(
                  map(this.restExtractor.extractDataBool),
                  catchError(err => this.restExtractor.handleError(err))
@@ -119,7 +119,7 @@ export class VideoService {
   }
 
   uploadVideo (video: FormData) {
-    const req = new HttpRequest('POST', VideoService.BASE_VIDEO_URL + 'upload', video, { reportProgress: true })
+    const req = new HttpRequest('POST', VideoService.BASE_VIDEO_URL + '/' + 'upload', video, { reportProgress: true })
 
     return this.authHttp
                .request<{ video: { id: number, uuid: string } }>(req)
@@ -321,7 +321,7 @@ export class VideoService {
 
     return from(ids)
       .pipe(
-        concatMap(id => this.authHttp.delete(VideoService.BASE_VIDEO_URL + id)),
+        concatMap(id => this.authHttp.delete(VideoService.BASE_VIDEO_URL + '/' + id)),
         toArray(),
         catchError(err => this.restExtractor.handleError(err))
       )
@@ -413,7 +413,7 @@ export class VideoService {
   }
 
   private setVideoRate (id: number, rateType: UserVideoRateType) {
-    const url = VideoService.BASE_VIDEO_URL + id + '/rate'
+    const url = VideoService.BASE_VIDEO_URL + '/' + id + '/rate'
     const body: UserVideoRateUpdate = {
       rating: rateType
     }
similarity index 93%
rename from server/models/video/sql/shared/abstract-videos-query-builder.ts
rename to server/models/video/sql/shared/abstract-run-query.ts
index 09776bcb0e88585f0dc0a350e20bae15b907757c..8e7a7642d0513835988ef92727bc7b6f751606ca 100644 (file)
@@ -6,7 +6,7 @@ import { QueryTypes, Sequelize, Transaction } from 'sequelize'
  *
  */
 
-export class AbstractVideosQueryBuilder {
+export class AbstractRunQuery {
   protected sequelize: Sequelize
 
   protected query: string
similarity index 97%
rename from server/models/video/sql/shared/abstract-videos-model-query-builder.ts
rename to server/models/video/sql/shared/abstract-video-query-builder.ts
index 29827db2ad1f98e1ff3d895e65315ea52a8ed917..a6afb04e4a974faf410015c111682e4cfddde934 100644 (file)
@@ -1,8 +1,8 @@
 import { createSafeIn } from '@server/models/utils'
 import { MUserAccountId } from '@server/types/models'
 import validator from 'validator'
-import { AbstractVideosQueryBuilder } from './abstract-videos-query-builder'
-import { VideoTables } from './video-tables'
+import { AbstractRunQuery } from './abstract-run-query'
+import { VideoTableAttributes } from './video-table-attributes'
 
 /**
  *
@@ -10,18 +10,18 @@ import { VideoTables } from './video-tables'
  *
  */
 
-export class AbstractVideosModelQueryBuilder extends AbstractVideosQueryBuilder {
+export class AbstractVideoQueryBuilder extends AbstractRunQuery {
   protected attributes: { [key: string]: string } = {}
 
   protected joins = ''
   protected where: string
 
-  protected tables: VideoTables
+  protected tables: VideoTableAttributes
 
   constructor (protected readonly mode: 'list' | 'get') {
     super()
 
-    this.tables = new VideoTables(this.mode)
+    this.tables = new VideoTableAttributes(this.mode)
   }
 
   protected buildSelect () {
index 6b15c3b6979a8de22ae5ff457f24f2c9122d5152..3eb3dc07d559b86c86ad6d4244493944be1c8d76 100644 (file)
@@ -1,6 +1,6 @@
 import { Sequelize } from 'sequelize'
 import { BuildVideoGetQueryOptions } from '../video-model-get-query-builder'
-import { AbstractVideosModelQueryBuilder } from './abstract-videos-model-query-builder'
+import { AbstractVideoQueryBuilder } from './abstract-video-query-builder'
 
 /**
  *
@@ -8,7 +8,7 @@ import { AbstractVideosModelQueryBuilder } from './abstract-videos-model-query-b
  *
  */
 
-export class VideoFileQueryBuilder extends AbstractVideosModelQueryBuilder {
+export class VideoFileQueryBuilder extends AbstractVideoQueryBuilder {
   protected attributes: { [key: string]: string }
 
   constructor (protected readonly sequelize: Sequelize) {
index 0eac956610457089725a2edfb76764edec5fbe4d..7751d8e680a450c0afa0c7e3cb92d2c51bba0dba 100644 (file)
@@ -18,7 +18,7 @@ import { VideoChannelModel } from '../../video-channel'
 import { VideoFileModel } from '../../video-file'
 import { VideoLiveModel } from '../../video-live'
 import { VideoStreamingPlaylistModel } from '../../video-streaming-playlist'
-import { VideoTables } from './video-tables'
+import { VideoTableAttributes } from './video-table-attributes'
 
 type SQLRow = { [id: string]: string | number }
 
@@ -51,7 +51,7 @@ export class VideoModelBuilder {
 
   constructor (
     readonly mode: 'get' | 'list',
-    readonly tables: VideoTables
+    readonly tables: VideoTableAttributes
   ) {
 
   }
similarity index 90%
rename from server/models/video/sql/shared/video-tables.ts
rename to server/models/video/sql/shared/video-table-attributes.ts
index 042b9d5daa2b1d8830f6d115ab1b7b78856bed54..8a8d2073a09a96f50754eb317d014cd308fbd268 100644 (file)
@@ -4,7 +4,7 @@
  * Class to build video attributes/join names we want to fetch from the database
  *
  */
-export class VideoTables {
+export class VideoTableAttributes {
 
   constructor (readonly mode: 'get' | 'list') {
 
@@ -93,22 +93,20 @@ export class VideoTables {
   }
 
   getStreamingPlaylistAttributes () {
-    let playlistKeys = [ 'id', 'playlistUrl', 'playlistFilename', 'type' ]
-
-    if (this.mode === 'get') {
-      playlistKeys = playlistKeys.concat([
-        'p2pMediaLoaderInfohashes',
-        'p2pMediaLoaderPeerVersion',
-        'segmentsSha256Filename',
-        'segmentsSha256Url',
-        'videoId',
-        'createdAt',
-        'updatedAt',
-        'storage'
-      ])
-    }
-
-    return playlistKeys
+    return [
+      'id',
+      'playlistUrl',
+      'playlistFilename',
+      'type',
+      'p2pMediaLoaderInfohashes',
+      'p2pMediaLoaderPeerVersion',
+      'segmentsSha256Filename',
+      'segmentsSha256Url',
+      'videoId',
+      'createdAt',
+      'updatedAt',
+      'storage'
+    ]
   }
 
   getUserHistoryAttributes () {
index 2f34d560240baccc5c45ddf213b2a50028e17d15..a65c96097cae77741f21d7728f4677548eca8d41 100644 (file)
@@ -1,8 +1,8 @@
 import { Sequelize, Transaction } from 'sequelize'
-import { AbstractVideosModelQueryBuilder } from './shared/abstract-videos-model-query-builder'
+import { AbstractVideoQueryBuilder } from './shared/abstract-video-query-builder'
 import { VideoFileQueryBuilder } from './shared/video-file-query-builder'
 import { VideoModelBuilder } from './shared/video-model-builder'
-import { VideoTables } from './shared/video-tables'
+import { VideoTableAttributes } from './shared/video-table-attributes'
 
 /**
  *
@@ -46,7 +46,7 @@ export class VideoModelGetQueryBuilder {
     this.webtorrentFilesQueryBuilder = new VideoFileQueryBuilder(sequelize)
     this.streamingPlaylistFilesQueryBuilder = new VideoFileQueryBuilder(sequelize)
 
-    this.videoModelBuilder = new VideoModelBuilder('get', new VideoTables('get'))
+    this.videoModelBuilder = new VideoModelBuilder('get', new VideoTableAttributes('get'))
   }
 
   async queryVideo (options: BuildVideoGetQueryOptions) {
@@ -69,15 +69,16 @@ export class VideoModelGetQueryBuilder {
     })
 
     if (videos.length > 1) {
-      throw new Error('Video results is more than ')
+      throw new Error('Video results is more than 1')
     }
 
     if (videos.length === 0) return null
+
     return videos[0]
   }
 }
 
-export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuilder {
+export class VideosModelGetQuerySubBuilder extends AbstractVideoQueryBuilder {
   protected attributes: { [key: string]: string }
 
   protected webtorrentFilesQuery: string
index 4d6e0ea4bccdf475a97fb20e464aced959507193..5064afafe568946a49cf880638af2df0d284620b 100644 (file)
@@ -5,7 +5,7 @@ import { WEBSERVER } from '@server/initializers/constants'
 import { buildDirectionAndField, createSafeIn } from '@server/models/utils'
 import { MUserAccountId, MUserId } from '@server/types/models'
 import { VideoInclude, VideoPrivacy, VideoState } from '@shared/models'
-import { AbstractVideosQueryBuilder } from './shared/abstract-videos-query-builder'
+import { AbstractRunQuery } from './shared/abstract-run-query'
 
 /**
  *
@@ -72,7 +72,7 @@ export type BuildVideosListQueryOptions = {
   having?: string
 }
 
-export class VideosIdListQueryBuilder extends AbstractVideosQueryBuilder {
+export class VideosIdListQueryBuilder extends AbstractRunQuery {
   protected replacements: any = {}
 
   private attributes: string[]
@@ -105,7 +105,7 @@ export class VideosIdListQueryBuilder extends AbstractVideosQueryBuilder {
     return this.runQuery().then(rows => rows.length !== 0 ? rows[0].total : 0)
   }
 
-  getIdsListQueryAndSort (options: BuildVideosListQueryOptions) {
+  getQuery (options: BuildVideosListQueryOptions) {
     this.buildIdsListQuery(options)
 
     return { query: this.query, sort: this.sort, replacements: this.replacements }
index cd721f05519692676511984934c2d26c28b5777a..b15b29ec3a59f42a219c2b363357e2afd64d9b38 100644 (file)
@@ -1,6 +1,6 @@
 import { VideoInclude } from '@shared/models'
 import { Sequelize } from 'sequelize'
-import { AbstractVideosModelQueryBuilder } from './shared/abstract-videos-model-query-builder'
+import { AbstractVideoQueryBuilder } from './shared/abstract-video-query-builder'
 import { VideoModelBuilder } from './shared/video-model-builder'
 import { BuildVideosListQueryOptions, VideosIdListQueryBuilder } from './videos-id-list-query-builder'
 
@@ -10,7 +10,7 @@ import { BuildVideosListQueryOptions, VideosIdListQueryBuilder } from './videos-
  *
  */
 
-export class VideosModelListQueryBuilder extends AbstractVideosModelQueryBuilder {
+export class VideosModelListQueryBuilder extends AbstractVideoQueryBuilder {
   protected attributes: { [key: string]: string }
 
   private innerQuery: string
@@ -26,7 +26,7 @@ export class VideosModelListQueryBuilder extends AbstractVideosModelQueryBuilder
 
   queryVideos (options: BuildVideosListQueryOptions) {
     this.buildInnerQuery(options)
-    this.buildListQueryFromIdsQuery(options)
+    this.buildMainQuery(options)
 
     return this.runQuery()
       .then(rows => this.videoModelBuilder.buildVideosFromRows({ rows, include: options.include }))
@@ -34,14 +34,14 @@ export class VideosModelListQueryBuilder extends AbstractVideosModelQueryBuilder
 
   private buildInnerQuery (options: BuildVideosListQueryOptions) {
     const idsQueryBuilder = new VideosIdListQueryBuilder(this.sequelize)
-    const { query, sort, replacements } = idsQueryBuilder.getIdsListQueryAndSort(options)
+    const { query, sort, replacements } = idsQueryBuilder.getQuery(options)
 
     this.replacements = replacements
     this.innerQuery = query
     this.innerSort = sort
   }
 
-  private buildListQueryFromIdsQuery (options: BuildVideosListQueryOptions) {
+  private buildMainQuery (options: BuildVideosListQueryOptions) {
     this.attributes = {
       '"video".*': ''
     }
index cdb4dd3432745bccb82af6b24254f3d2a5d11afc..e9e7e1757e01bf1b07ace343708e1a80bb1f52bc 100644 (file)
@@ -4805,7 +4805,7 @@ components:
       required: false
       schema:
         type: boolean
-      description: 'Display only local or remote videos'
+      description: '**PeerTube >= 4.0** Display only local or remote videos'
     include:
       name: include
       in: query
@@ -4819,7 +4819,7 @@ components:
         - 4
         - 8
       description: >
-        Include additional videos in results (can be combined using bitwise or operator)
+        **PeerTube >= 4.0** Include additional videos in results (can be combined using bitwise or operator)
 
         - `0` NONE