aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/standalone/videos/shared/video-fetcher.ts
blob: e78d38536f7128c20aa92f64572393750424f03d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { HttpStatusCode, LiveVideo, VideoDetails } from '../../../../../shared/models'
import { AuthHTTP } from './auth-http'

export class VideoFetcher {

  constructor (private readonly http: AuthHTTP) {

  }

  async loadVideo (videoId: string) {
    const videoPromise = this.loadVideoInfo(videoId)

    let videoResponse: Response
    let isResponseOk: boolean

    try {
      videoResponse = await videoPromise
      isResponseOk = videoResponse.status === HttpStatusCode.OK_200
    } catch (err) {
      console.error(err)

      isResponseOk = false
    }

    if (!isResponseOk) {
      if (videoResponse?.status === HttpStatusCode.NOT_FOUND_404) {
        throw new Error('This video does not exist.')
      }

      throw new Error('We cannot fetch the video. Please try again later.')
    }

    const captionsPromise = this.loadVideoCaptions(videoId)

    return { captionsPromise, videoResponse }
  }

  loadVideoWithLive (video: VideoDetails) {
    return this.http.fetch(this.getLiveUrl(video.uuid), { optionalAuth: true })
      .then(res => res.json())
      .then((live: LiveVideo) => ({ video, live }))
  }

  getVideoViewsUrl (videoUUID: string) {
    return this.getVideoUrl(videoUUID) + '/views'
  }

  private loadVideoInfo (videoId: string): Promise<Response> {
    return this.http.fetch(this.getVideoUrl(videoId), { optionalAuth: true })
  }

  private loadVideoCaptions (videoId: string): Promise<Response> {
    return this.http.fetch(this.getVideoUrl(videoId) + '/captions', { optionalAuth: true })
  }

  private getVideoUrl (id: string) {
    return window.location.origin + '/api/v1/videos/' + id
  }

  private getLiveUrl (videoId: string) {
    return window.location.origin + '/api/v1/videos/live/' + videoId
  }
}