]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/videos/recommendations/recent-videos-recommendation.service.ts
Add to playlist dropdown
[github/Chocobozzz/PeerTube.git] / client / src / app / videos / recommendations / recent-videos-recommendation.service.ts
index 708d6769972b46c141c845becb83cede644800a3..6d7b159dad90e1cc13952a65f2979f690cbe2a4a 100644 (file)
@@ -1,39 +1,52 @@
-import { Inject, Injectable } from '@angular/core'
+import { Injectable } from '@angular/core'
 import { RecommendationService } from '@app/videos/recommendations/recommendations.service'
 import { Video } from '@app/shared/video/video.model'
-import { VideoService, VideosProvider } from '@app/shared/video/video.service'
-import { map } from 'rxjs/operators'
-import { Observable } from 'rxjs'
+import { RecommendationInfo } from '@app/shared/video/recommendation-info.model'
+import { VideoService } from '@app/shared/video/video.service'
+import { map, switchMap } from 'rxjs/operators'
+import { Observable, of } from 'rxjs'
+import { SearchService } from '@app/search/search.service'
+import { AdvancedSearch } from '@app/search/advanced-search.model'
 
 /**
  * Provides "recommendations" by providing the most recently uploaded videos.
  */
 @Injectable()
 export class RecentVideosRecommendationService implements RecommendationService {
-
   readonly pageSize = 5
 
   constructor (
-    @Inject(VideoService) private videos: VideosProvider
-  ) {
-  }
+    private videos: VideoService,
+    private searchService: SearchService
+  ) { }
 
-  getRecommendations (uuid: string): Observable<Video[]> {
-    return this.fetchPage(1)
+  getRecommendations (recommendation: RecommendationInfo): Observable<Video[]> {
+    return this.fetchPage(1, recommendation)
       .pipe(
-        map(vids => {
-          const otherVideos = vids.filter(v => v.uuid !== uuid)
+        map(videos => {
+          const otherVideos = videos.filter(v => v.uuid !== recommendation.uuid)
           return otherVideos.slice(0, this.pageSize)
         })
       )
   }
 
-  private fetchPage (page: number): Observable<Video[]> {
-    let pagination = { currentPage: page, itemsPerPage: this.pageSize + 1 }
-    return this.videos.getVideos(pagination, '-createdAt')
-      .pipe(
-        map(v => v.videos)
-      )
-  }
+  private fetchPage (page: number, recommendation: RecommendationInfo): Observable<Video[]> {
+    const pagination = { currentPage: page, itemsPerPage: this.pageSize + 1 }
+    const defaultSubscription = this.videos.getVideos(pagination, '-createdAt')
+                                    .pipe(map(v => v.videos))
+
+    if (!recommendation.tags || recommendation.tags.length === 0) return defaultSubscription
 
+    return this.searchService.searchVideos('',
+      pagination,
+      new AdvancedSearch({ tagsOneOf: recommendation.tags.join(','), sort: '-createdAt' })
+    ).pipe(
+      map(v => v.videos),
+      switchMap(videos => {
+        if (videos.length <= 1) return defaultSubscription
+
+        return of(videos)
+      })
+    )
+  }
 }