aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--client/src/app/+admin/admin.module.ts5
-rw-r--r--client/src/app/+admin/overview/videos/index.ts1
-rw-r--r--client/src/app/+admin/overview/videos/video-admin.service.ts97
-rw-r--r--client/src/app/+admin/overview/videos/video-list.component.ts8
-rw-r--r--client/src/app/shared/shared-main/video/video.service.ts103
5 files changed, 118 insertions, 96 deletions
diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts
index 0cb4d1056..3606fc6ea 100644
--- a/client/src/app/+admin/admin.module.ts
+++ b/client/src/app/+admin/admin.module.ts
@@ -33,7 +33,7 @@ import { VideoRedundancyInformationComponent } from './follows/video-redundancie
33import { AbuseListComponent, VideoBlockListComponent } from './moderation' 33import { AbuseListComponent, VideoBlockListComponent } from './moderation'
34import { InstanceAccountBlocklistComponent, InstanceServerBlocklistComponent } from './moderation/instance-blocklist' 34import { InstanceAccountBlocklistComponent, InstanceServerBlocklistComponent } from './moderation/instance-blocklist'
35import { VideoCommentListComponent } from './moderation/video-comment-list' 35import { VideoCommentListComponent } from './moderation/video-comment-list'
36import { UserCreateComponent, UserListComponent, UserPasswordComponent, UserUpdateComponent, VideoListComponent } from './overview' 36import { UserCreateComponent, UserListComponent, UserPasswordComponent, UserUpdateComponent, VideoAdminService, VideoListComponent } from './overview'
37import { PluginListInstalledComponent } from './plugins/plugin-list-installed/plugin-list-installed.component' 37import { PluginListInstalledComponent } from './plugins/plugin-list-installed/plugin-list-installed.component'
38import { PluginSearchComponent } from './plugins/plugin-search/plugin-search.component' 38import { PluginSearchComponent } from './plugins/plugin-search/plugin-search.component'
39import { PluginShowInstalledComponent } from './plugins/plugin-show-installed/plugin-show-installed.component' 39import { PluginShowInstalledComponent } from './plugins/plugin-show-installed/plugin-show-installed.component'
@@ -116,7 +116,8 @@ import { JobsComponent } from './system/jobs/jobs.component'
116 DebugService, 116 DebugService,
117 ConfigService, 117 ConfigService,
118 PluginApiService, 118 PluginApiService,
119 EditConfigurationService 119 EditConfigurationService,
120 VideoAdminService
120 ] 121 ]
121}) 122})
122export class AdminModule { } 123export class AdminModule { }
diff --git a/client/src/app/+admin/overview/videos/index.ts b/client/src/app/+admin/overview/videos/index.ts
index 40c2ffe72..7398b1663 100644
--- a/client/src/app/+admin/overview/videos/index.ts
+++ b/client/src/app/+admin/overview/videos/index.ts
@@ -1,2 +1,3 @@
1export * from './video-admin.service'
1export * from './video-list.component' 2export * from './video-list.component'
2export * from './video.routes' 3export * from './video.routes'
diff --git a/client/src/app/+admin/overview/videos/video-admin.service.ts b/client/src/app/+admin/overview/videos/video-admin.service.ts
new file mode 100644
index 000000000..696609cb2
--- /dev/null
+++ b/client/src/app/+admin/overview/videos/video-admin.service.ts
@@ -0,0 +1,97 @@
1import { Observable } from 'rxjs'
2import { catchError, switchMap } from 'rxjs/operators'
3import { HttpClient, HttpParams } from '@angular/common/http'
4import { Injectable } from '@angular/core'
5import { RestExtractor, RestPagination, RestService } from '@app/core'
6import { AdvancedInputFilter } from '@app/shared/shared-forms'
7import { CommonVideoParams, Video, VideoService } from '@app/shared/shared-main'
8import { ResultList, VideoInclude } from '@shared/models'
9
10@Injectable()
11export class VideoAdminService {
12
13 constructor (
14 private videoService: VideoService,
15 private authHttp: HttpClient,
16 private restExtractor: RestExtractor,
17 private restService: RestService
18 ) {}
19
20 getAdminVideos (
21 options: CommonVideoParams & { pagination: RestPagination, search?: string }
22 ): Observable<ResultList<Video>> {
23 const { pagination, search } = options
24
25 let params = new HttpParams()
26 params = this.videoService.buildCommonVideosParams({ params, ...options })
27
28 params = params.set('start', pagination.start.toString())
29 .set('count', pagination.count.toString())
30
31 params = this.buildAdminParamsFromSearch(search, params)
32
33 return this.authHttp
34 .get<ResultList<Video>>(VideoService.BASE_VIDEO_URL, { params })
35 .pipe(
36 switchMap(res => this.videoService.extractVideos(res)),
37 catchError(err => this.restExtractor.handleError(err))
38 )
39 }
40
41 buildAdminInputFilter (): AdvancedInputFilter[] {
42 return [
43 {
44 title: $localize`Videos scope`,
45 children: [
46 {
47 queryParams: { search: 'isLocal:false' },
48 label: $localize`Remote videos`
49 },
50 {
51 queryParams: { search: 'isLocal:true' },
52 label: $localize`Local videos`
53 }
54 ]
55 },
56
57 {
58 title: $localize`Include/Exclude`,
59 children: [
60 {
61 queryParams: { search: 'excludeMuted' },
62 label: $localize`Exclude muted accounts`
63 }
64 ]
65 }
66 ]
67 }
68
69 private buildAdminParamsFromSearch (search: string, params: HttpParams) {
70 let include = VideoInclude.BLACKLISTED |
71 VideoInclude.BLOCKED_OWNER |
72 VideoInclude.HIDDEN_PRIVACY |
73 VideoInclude.NOT_PUBLISHED_STATE |
74 VideoInclude.FILES
75
76 if (!search) return this.restService.addObjectParams(params, { include })
77
78 const filters = this.restService.parseQueryStringFilter(search, {
79 isLocal: {
80 prefix: 'isLocal:',
81 isBoolean: true
82 },
83 excludeMuted: {
84 prefix: 'excludeMuted',
85 handler: () => true
86 }
87 })
88
89 if (filters.excludeMuted) {
90 include &= ~VideoInclude.BLOCKED_OWNER
91
92 filters.excludeMuted = undefined
93 }
94
95 return this.restService.addObjectParams(params, { ...filters, include })
96 }
97}
diff --git a/client/src/app/+admin/overview/videos/video-list.component.ts b/client/src/app/+admin/overview/videos/video-list.component.ts
index 31bf1707b..b0e476569 100644
--- a/client/src/app/+admin/overview/videos/video-list.component.ts
+++ b/client/src/app/+admin/overview/videos/video-list.component.ts
@@ -7,6 +7,7 @@ import { AdvancedInputFilter } from '@app/shared/shared-forms'
7import { DropdownAction, Video, VideoService } from '@app/shared/shared-main' 7import { DropdownAction, Video, VideoService } from '@app/shared/shared-main'
8import { VideoActionsDisplayType } from '@app/shared/shared-video-miniature' 8import { VideoActionsDisplayType } from '@app/shared/shared-video-miniature'
9import { UserRight, VideoPrivacy, VideoState, VideoStreamingPlaylistType } from '@shared/models' 9import { UserRight, VideoPrivacy, VideoState, VideoStreamingPlaylistType } from '@shared/models'
10import { VideoAdminService } from './video-admin.service'
10 11
11@Component({ 12@Component({
12 selector: 'my-video-list', 13 selector: 'my-video-list',
@@ -46,7 +47,8 @@ export class VideoListComponent extends RestTable implements OnInit {
46 private confirmService: ConfirmService, 47 private confirmService: ConfirmService,
47 private auth: AuthService, 48 private auth: AuthService,
48 private notifier: Notifier, 49 private notifier: Notifier,
49 private videoService: VideoService 50 private videoService: VideoService,
51 private videoAdminService: VideoAdminService
50 ) { 52 ) {
51 super() 53 super()
52 } 54 }
@@ -58,7 +60,7 @@ export class VideoListComponent extends RestTable implements OnInit {
58 ngOnInit () { 60 ngOnInit () {
59 this.initialize() 61 this.initialize()
60 62
61 this.inputFilters = this.videoService.buildAdminInputFilter() 63 this.inputFilters = this.videoAdminService.buildAdminInputFilter()
62 64
63 this.bulkVideoActions = [ 65 this.bulkVideoActions = [
64 [ 66 [
@@ -128,7 +130,7 @@ export class VideoListComponent extends RestTable implements OnInit {
128 130
129 this.loading = true 131 this.loading = true
130 132
131 this.videoService.getAdminVideos({ 133 this.videoAdminService.getAdminVideos({
132 pagination: this.pagination, 134 pagination: this.pagination,
133 sort: this.sort, 135 sort: this.sort,
134 search: this.search 136 search: this.search
diff --git a/client/src/app/shared/shared-main/video/video.service.ts b/client/src/app/shared/shared-main/video/video.service.ts
index b7c563dca..6edcc3fe0 100644
--- a/client/src/app/shared/shared-main/video/video.service.ts
+++ b/client/src/app/shared/shared-main/video/video.service.ts
@@ -3,9 +3,8 @@ import { from, Observable } from 'rxjs'
3import { catchError, concatMap, map, switchMap, toArray } from 'rxjs/operators' 3import { catchError, concatMap, map, switchMap, toArray } from 'rxjs/operators'
4import { HttpClient, HttpParams, HttpRequest } from '@angular/common/http' 4import { HttpClient, HttpParams, HttpRequest } from '@angular/common/http'
5import { Injectable } from '@angular/core' 5import { Injectable } from '@angular/core'
6import { ComponentPaginationLight, RestExtractor, RestPagination, RestService, ServerService, UserService } from '@app/core' 6import { ComponentPaginationLight, RestExtractor, RestService, ServerService, UserService } from '@app/core'
7import { objectToFormData } from '@app/helpers' 7import { objectToFormData } from '@app/helpers'
8import { AdvancedInputFilter } from '@app/shared/shared-forms'
9import { 8import {
10 BooleanBothQuery, 9 BooleanBothQuery,
11 FeedFormat, 10 FeedFormat,
@@ -204,27 +203,6 @@ export class VideoService {
204 ) 203 )
205 } 204 }
206 205
207 getAdminVideos (
208 options: CommonVideoParams & { pagination: RestPagination, search?: string }
209 ): Observable<ResultList<Video>> {
210 const { pagination, search } = options
211
212 let params = new HttpParams()
213 params = this.buildCommonVideosParams({ params, ...options })
214
215 params = params.set('start', pagination.start.toString())
216 .set('count', pagination.count.toString())
217
218 params = this.buildAdminParamsFromSearch(search, params)
219
220 return this.authHttp
221 .get<ResultList<Video>>(VideoService.BASE_VIDEO_URL, { params })
222 .pipe(
223 switchMap(res => this.extractVideos(res)),
224 catchError(err => this.restExtractor.handleError(err))
225 )
226 }
227
228 getVideos (parameters: CommonVideoParams): Observable<ResultList<Video>> { 206 getVideos (parameters: CommonVideoParams): Observable<ResultList<Video>> {
229 let params = new HttpParams() 207 let params = new HttpParams()
230 params = this.buildCommonVideosParams({ params, ...parameters }) 208 params = this.buildCommonVideosParams({ params, ...parameters })
@@ -405,21 +383,7 @@ export class VideoService {
405 : 'both' 383 : 'both'
406 } 384 }
407 385
408 private setVideoRate (id: number, rateType: UserVideoRateType) { 386 buildCommonVideosParams (options: CommonVideoParams & { params: HttpParams }) {
409 const url = `${VideoService.BASE_VIDEO_URL}/${id}/rate`
410 const body: UserVideoRateUpdate = {
411 rating: rateType
412 }
413
414 return this.authHttp
415 .put(url, body)
416 .pipe(
417 map(this.restExtractor.extractDataBool),
418 catchError(err => this.restExtractor.handleError(err))
419 )
420 }
421
422 private buildCommonVideosParams (options: CommonVideoParams & { params: HttpParams }) {
423 const { 387 const {
424 params, 388 params,
425 videoPagination, 389 videoPagination,
@@ -453,60 +417,17 @@ export class VideoService {
453 return newParams 417 return newParams
454 } 418 }
455 419
456 buildAdminInputFilter (): AdvancedInputFilter[] { 420 private setVideoRate (id: number, rateType: UserVideoRateType) {
457 return [ 421 const url = `${VideoService.BASE_VIDEO_URL}/${id}/rate`
458 { 422 const body: UserVideoRateUpdate = {
459 title: $localize`Videos scope`, 423 rating: rateType
460 children: [
461 {
462 queryParams: { search: 'isLocal:false' },
463 label: $localize`Remote videos`
464 },
465 {
466 queryParams: { search: 'isLocal:true' },
467 label: $localize`Local videos`
468 }
469 ]
470 },
471
472 {
473 title: $localize`Include/Exclude`,
474 children: [
475 {
476 queryParams: { search: 'excludeMuted' },
477 label: $localize`Exclude muted accounts`
478 }
479 ]
480 }
481 ]
482 }
483
484 private buildAdminParamsFromSearch (search: string, params: HttpParams) {
485 let include = VideoInclude.BLACKLISTED |
486 VideoInclude.BLOCKED_OWNER |
487 VideoInclude.HIDDEN_PRIVACY |
488 VideoInclude.NOT_PUBLISHED_STATE |
489 VideoInclude.FILES
490
491 if (!search) return this.restService.addObjectParams(params, { include })
492
493 const filters = this.restService.parseQueryStringFilter(search, {
494 isLocal: {
495 prefix: 'isLocal:',
496 isBoolean: true
497 },
498 excludeMuted: {
499 prefix: 'excludeMuted',
500 handler: () => true
501 }
502 })
503
504 if (filters.excludeMuted) {
505 include &= ~VideoInclude.BLOCKED_OWNER
506
507 filters.excludeMuted = undefined
508 } 424 }
509 425
510 return this.restService.addObjectParams(params, { ...filters, include }) 426 return this.authHttp
427 .put(url, body)
428 .pipe(
429 map(this.restExtractor.extractDataBool),
430 catchError(err => this.restExtractor.handleError(err))
431 )
511 } 432 }
512} 433}