]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/videos/shared/video.service.ts
Client: support video language
[github/Chocobozzz/PeerTube.git] / client / src / app / videos / shared / video.service.ts
index dcbef77177945e191a8ec317848442012708ae53..13d4ca246a11db03c8c2108fbb6308bcb1c7bbfc 100644 (file)
 import { Injectable } from '@angular/core';
-import { Http, Response, URLSearchParams } from '@angular/http';
+import { Http } from '@angular/http';
 import { Observable } from 'rxjs/Observable';
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/map';
 
-import { Pagination } from './pagination.model';
 import { Search } from '../../shared';
 import { SortField } from './sort-field.type';
-import { AuthService } from '../../shared';
+import { RateType } from './rate-type.type';
+import { AuthService } from '../../core';
+import {
+  AuthHttp,
+  RestExtractor,
+  RestPagination,
+  RestService,
+  ResultList,
+  UserService
+} from '../../shared';
 import { Video } from './video.model';
 
 @Injectable()
 export class VideoService {
   private static BASE_VIDEO_URL = '/api/v1/videos/';
 
+  videoCategories: Array<{ id: number, label: string }> = [];
+  videoLicences: Array<{ id: number, label: string }> = [];
+  videoLanguages: Array<{ id: number, label: string }> = [];
+
   constructor(
     private authService: AuthService,
-    private http: Http
+    private authHttp: AuthHttp,
+    private http: Http,
+    private restExtractor: RestExtractor,
+    private restService: RestService
   ) {}
 
-  getVideo(id: string) {
-    return this.http.get(VideoService.BASE_VIDEO_URL + id)
-                    .map(res => <Video> res.json())
-                    .catch(this.handleError);
+  loadVideoCategories() {
+    return this.http.get(VideoService.BASE_VIDEO_URL + 'categories')
+                    .map(this.restExtractor.extractDataGet)
+                    .subscribe(data => {
+                      Object.keys(data).forEach(categoryKey => {
+                        this.videoCategories.push({
+                          id: parseInt(categoryKey),
+                          label: data[categoryKey]
+                        });
+                      });
+                    });
+  }
+
+  loadVideoLicences() {
+    return this.http.get(VideoService.BASE_VIDEO_URL + 'licences')
+                    .map(this.restExtractor.extractDataGet)
+                    .subscribe(data => {
+                      Object.keys(data).forEach(licenceKey => {
+                        this.videoLicences.push({
+                          id: parseInt(licenceKey),
+                          label: data[licenceKey]
+                        });
+                      });
+                    });
+  }
+
+  loadVideoLanguages() {
+    return this.http.get(VideoService.BASE_VIDEO_URL + 'languages')
+                    .map(this.restExtractor.extractDataGet)
+                    .subscribe(data => {
+                      Object.keys(data).forEach(languageKey => {
+                        this.videoLanguages.push({
+                          id: parseInt(languageKey),
+                          label: data[languageKey]
+                        });
+                      });
+                    });
   }
 
-  getVideos(pagination: Pagination, sort: SortField) {
-    const params = this.createPaginationParams(pagination);
+  getVideo(id: string): Observable<Video> {
+    return this.http.get(VideoService.BASE_VIDEO_URL + id)
+                    .map(this.restExtractor.extractDataGet)
+                    .map(video_hash => new Video(video_hash))
+                    .catch((res) => this.restExtractor.handleError(res));
+  }
 
-    if (sort) params.set('sort', sort);
+  getVideos(pagination: RestPagination, sort: SortField) {
+    const params = this.restService.buildRestGetParams(pagination, sort);
 
     return this.http.get(VideoService.BASE_VIDEO_URL, { search: params })
                     .map(res => res.json())
                     .map(this.extractVideos)
-                    .catch(this.handleError);
+                    .catch((res) => this.restExtractor.handleError(res));
   }
 
   removeVideo(id: string) {
-    const options = this.authService.getAuthRequestOptions();
-    return this.http.delete(VideoService.BASE_VIDEO_URL + id, options)
-                    .map(res => <number> res.status)
-                    .catch(this.handleError);
+    return this.authHttp.delete(VideoService.BASE_VIDEO_URL + id)
+                        .map(this.restExtractor.extractDataBool)
+                        .catch((res) => this.restExtractor.handleError(res));
   }
 
-  searchVideos(search: Search, pagination: Pagination, sort: SortField) {
-    const params = this.createPaginationParams(pagination);
+  searchVideos(search: Search, pagination: RestPagination, sort: SortField) {
+    const params = this.restService.buildRestGetParams(pagination, sort);
 
     if (search.field) params.set('field', search.field);
-    if (sort) params.set('sort', sort);
 
     return this.http.get(VideoService.BASE_VIDEO_URL + 'search/' + encodeURIComponent(search.value), { search: params })
-                    .map(res => res.json())
+                    .map(this.restExtractor.extractDataList)
                     .map(this.extractVideos)
-                    .catch(this.handleError);
+                    .catch((res) => this.restExtractor.handleError(res));
+  }
+
+  reportVideo(id: string, reason: string) {
+    const url = VideoService.BASE_VIDEO_URL + id + '/abuse';
+    const body = {
+      reason
+    };
+
+    return this.authHttp.post(url, body)
+                        .map(this.restExtractor.extractDataBool)
+                        .catch((res) => this.restExtractor.handleError(res));
+  }
+
+  setVideoLike(id: string) {
+    return this.setVideoRate(id, 'like');
+  }
+
+  setVideoDislike(id: string) {
+    return this.setVideoRate(id, 'dislike');
   }
 
-  private createPaginationParams(pagination: Pagination) {
-    const params = new URLSearchParams();
-    const start: number = (pagination.currentPage - 1) * pagination.itemsPerPage;
-    const count: number = pagination.itemsPerPage;
+  getUserVideoRating(id: string) {
+    const url = UserService.BASE_USERS_URL + '/me/videos/' + id + '/rating';
+
+    return this.authHttp.get(url)
+                        .map(this.restExtractor.extractDataGet)
+                        .catch((res) => this.restExtractor.handleError(res));
+  }
 
-    params.set('start', start.toString());
-    params.set('count', count.toString());
+  private setVideoRate(id: string, rateType: RateType) {
+    const url = VideoService.BASE_VIDEO_URL + id + '/rate';
+    const body = {
+      rating: rateType
+    };
 
-    return params;
+    return this.authHttp.put(url, body)
+                        .map(this.restExtractor.extractDataBool)
+                        .catch((res) => this.restExtractor.handleError(res));
   }
 
-  private extractVideos(body: any) {
-    const videos_json = body.data;
-    const totalVideos = body.total;
+  private extractVideos(result: ResultList) {
+    const videosJson = result.data;
+    const totalVideos = result.total;
     const videos = [];
-    for (const video_json of videos_json) {
-      videos.push(new Video(video_json));
+    for (const videoJson of videosJson) {
+      videos.push(new Video(videoJson));
     }
 
     return { videos, totalVideos };
   }
-
-  private handleError(error: Response) {
-    console.error(error);
-    return Observable.throw(error.json().error || 'Server error');
-  }
 }