import * as debug from 'debug'
import { Observable, Subject } from 'rxjs'
-import { first, map } from 'rxjs/operators'
-import { Injectable, NgZone } from '@angular/core'
+import { filter, first, map } from 'rxjs/operators'
+import { Injectable } from '@angular/core'
import { buildBulkObservable } from '@app/helpers'
import { ResultList } from '@shared/models/common'
import { Video, VideoChannel } from '../shared-main'
import { VideoPlaylist } from '../shared-video-playlist'
import { SearchService } from './search.service'
+import { AdvancedSearch } from './advanced-search.model'
-const logger = debug('peertube:search:FindInBulkService')
+const debugLogger = debug('peertube:search:FindInBulkService')
type BulkObservables <P extends number | string, R> = {
notifier: Subject<P>
- result: Observable<R>
+ result: Observable<{ params: P[], response: R }>
}
@Injectable()
export class FindInBulkService {
+ private advancedSearchForBulk: AdvancedSearch
+
private getVideoInBulk: BulkObservables<string, ResultList<Video>>
private getChannelInBulk: BulkObservables<string, ResultList<VideoChannel>>
private getPlaylistInBulk: BulkObservables<string, ResultList<VideoPlaylist>>
constructor (
- private searchService: SearchService,
- private ngZone: NgZone
+ private searchService: SearchService
) {
this.getVideoInBulk = this.buildBulkObservableObject(this.getVideosInBulk.bind(this))
this.getChannelInBulk = this.buildBulkObservableObject(this.getChannelsInBulk.bind(this))
this.getPlaylistInBulk = this.buildBulkObservableObject(this.getPlaylistsInBulk.bind(this))
+
+ this.advancedSearchForBulk = new AdvancedSearch({ searchTarget: 'local' })
}
getVideo (uuid: string): Observable<Video> {
- logger('Schedule video fetch for uuid %s.', uuid)
+ debugLogger('Schedule video fetch for uuid %s.', uuid)
return this.getData({
observableObject: this.getVideoInBulk,
}
getChannel (handle: string): Observable<VideoChannel> {
- logger('Schedule channel fetch for handle %s.', handle)
+ debugLogger('Schedule channel fetch for handle %s.', handle)
return this.getData({
observableObject: this.getChannelInBulk,
}
getPlaylist (uuid: string): Observable<VideoPlaylist> {
- logger('Schedule playlist fetch for uuid %s.', uuid)
+ debugLogger('Schedule playlist fetch for uuid %s.', uuid)
return this.getData({
observableObject: this.getPlaylistInBulk,
return new Observable<R>(obs => {
observableObject.result
.pipe(
+ filter(result => result.params.includes(param)),
first(),
- map(({ data }) => data),
+ map(result => result.response.data),
map(data => data.find(finder))
)
- .subscribe(result => {
- if (!result) {
- obs.error(new Error($localize`Element ${param} not found`))
- } else {
+ .subscribe({
+ next: result => {
+ if (!result) {
+ obs.error(new Error($localize`Element ${param} not found`))
+ return
+ }
+
obs.next(result)
obs.complete()
- }
+ },
+
+ error: err => obs.error(err)
})
observableObject.notifier.next(param)
}
private getVideosInBulk (uuids: string[]) {
- logger('Fetching videos %s.', uuids.join(', '))
+ debugLogger('Fetching videos %s.', uuids.join(', '))
- return this.searchService.searchVideos({ uuids })
+ return this.searchService.searchVideos({
+ uuids,
+ componentPagination: { itemsPerPage: uuids.length, currentPage: 1 },
+ advancedSearch: this.advancedSearchForBulk
+ })
}
private getChannelsInBulk (handles: string[]) {
- logger('Fetching channels %s.', handles.join(', '))
+ debugLogger('Fetching channels %s.', handles.join(', '))
- return this.searchService.searchVideoChannels({ handles })
+ return this.searchService.searchVideoChannels({
+ handles,
+ componentPagination: { itemsPerPage: handles.length, currentPage: 1 },
+ advancedSearch: this.advancedSearchForBulk
+ })
}
private getPlaylistsInBulk (uuids: string[]) {
- logger('Fetching playlists %s.', uuids.join(', '))
+ debugLogger('Fetching playlists %s.', uuids.join(', '))
- return this.searchService.searchVideoPlaylists({ uuids })
+ return this.searchService.searchVideoPlaylists({
+ uuids,
+ componentPagination: { itemsPerPage: uuids.length, currentPage: 1 },
+ advancedSearch: this.advancedSearchForBulk
+ })
}
- private buildBulkObservableObject <T extends number | string, R> (bulkGet: (params: T[]) => Observable<R>) {
- const notifier = new Subject<T>()
+ private buildBulkObservableObject <P extends number | string, R> (bulkGet: (params: P[]) => Observable<R>) {
+ const notifier = new Subject<P>()
return {
notifier,
result: buildBulkObservable({
time: 500,
bulkGet,
- ngZone: this.ngZone,
notifierObservable: notifier.asObservable()
})
}