Fix player play exception on chromium
[oweals/peertube.git] / server / lib / activitypub / videos.ts
1 import { join } from 'path'
2 import * as request from 'request'
3 import { Transaction } from 'sequelize'
4 import { ActivityIconObject } from '../../../shared/index'
5 import { doRequest, doRequestAndSaveToFile } from '../../helpers'
6 import { CONFIG, REMOTE_SCHEME, STATIC_PATHS } from '../../initializers'
7 import { AccountModel } from '../../models/account/account'
8 import { VideoModel } from '../../models/video/video'
9 import {
10   sendCreateDislikeToOrigin,
11   sendCreateDislikeToVideoFollowers,
12   sendLikeToOrigin,
13   sendLikeToVideoFollowers,
14   sendUndoDislikeToOrigin,
15   sendUndoDislikeToVideoFollowers,
16   sendUndoLikeToOrigin,
17   sendUndoLikeToVideoFollowers
18 } from './send'
19
20 function fetchRemoteVideoPreview (video: VideoModel) {
21   // FIXME: use url
22   const host = video.VideoChannel.Account.Actor.Server.host
23   const path = join(STATIC_PATHS.PREVIEWS, video.getPreviewName())
24
25   return request.get(REMOTE_SCHEME.HTTP + '://' + host + path)
26 }
27
28 async function fetchRemoteVideoDescription (video: VideoModel) {
29   // FIXME: use url
30   const host = video.VideoChannel.Account.Actor.Server.host
31   const path = video.getDescriptionPath()
32   const options = {
33     uri: REMOTE_SCHEME.HTTP + '://' + host + path,
34     json: true
35   }
36
37   const { body } = await doRequest(options)
38   return body.description ? body.description : ''
39 }
40
41 function generateThumbnailFromUrl (video: VideoModel, icon: ActivityIconObject) {
42   const thumbnailName = video.getThumbnailName()
43   const thumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName)
44
45   const options = {
46     method: 'GET',
47     uri: icon.url
48   }
49   return doRequestAndSaveToFile(options, thumbnailPath)
50 }
51
52 async function sendVideoRateChangeToFollowers (
53   account: AccountModel,
54   video: VideoModel,
55   likes: number,
56   dislikes: number,
57   t: Transaction
58 ) {
59   const actor = account.Actor
60
61   // Keep the order: first we undo and then we create
62
63   // Undo Like
64   if (likes < 0) await sendUndoLikeToVideoFollowers(actor, video, t)
65   // Undo Dislike
66   if (dislikes < 0) await sendUndoDislikeToVideoFollowers(actor, video, t)
67
68   // Like
69   if (likes > 0) await sendLikeToVideoFollowers(actor, video, t)
70   // Dislike
71   if (dislikes > 0) await sendCreateDislikeToVideoFollowers(actor, video, t)
72 }
73
74 async function sendVideoRateChangeToOrigin (
75   account: AccountModel,
76   video: VideoModel,
77   likes: number,
78   dislikes: number,
79   t: Transaction
80 ) {
81   const actor = account.Actor
82
83   // Keep the order: first we undo and then we create
84
85   // Undo Like
86   if (likes < 0) await sendUndoLikeToOrigin(actor, video, t)
87   // Undo Dislike
88   if (dislikes < 0) await sendUndoDislikeToOrigin(actor, video, t)
89
90   // Like
91   if (likes > 0) await sendLikeToOrigin(actor, video, t)
92   // Dislike
93   if (dislikes > 0) await sendCreateDislikeToOrigin(actor, video, t)
94 }
95
96 export {
97   fetchRemoteVideoPreview,
98   fetchRemoteVideoDescription,
99   generateThumbnailFromUrl,
100   sendVideoRateChangeToFollowers,
101   sendVideoRateChangeToOrigin
102 }