]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/videos/refresh.ts
3af08acf4d0b5642a9b23e1c1498cfa1ab8929db
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / videos / refresh.ts
1 import { logger, loggerTagsFactory } from '@server/helpers/logger'
2 import { PeerTubeRequestError } from '@server/helpers/requests'
3 import { ActorFollowScoreCache } from '@server/lib/files-cache'
4 import { VideoLoadByUrlType } from '@server/lib/model-loaders'
5 import { VideoModel } from '@server/models/video/video'
6 import { MVideoAccountLightBlacklistAllFiles, MVideoThumbnail } from '@server/types/models'
7 import { HttpStatusCode } from '@shared/models'
8 import { fetchRemoteVideo, SyncParam, syncVideoExternalAttributes } from './shared'
9 import { APVideoUpdater } from './updater'
10
11 async function refreshVideoIfNeeded (options: {
12 video: MVideoThumbnail
13 fetchedType: VideoLoadByUrlType
14 syncParam: SyncParam
15 }): Promise<MVideoThumbnail> {
16 if (!options.video.isOutdated()) return options.video
17
18 // We need more attributes if the argument video was fetched with not enough joints
19 const video = options.fetchedType === 'all'
20 ? options.video as MVideoAccountLightBlacklistAllFiles
21 : await VideoModel.loadByUrlAndPopulateAccount(options.video.url)
22
23 const lTags = loggerTagsFactory('ap', 'video', 'refresh', video.uuid, video.url)
24
25 logger.info('Refreshing video %s.', video.url, lTags())
26
27 try {
28 const { videoObject } = await fetchRemoteVideo(video.url)
29
30 if (videoObject === undefined) {
31 logger.warn('Cannot refresh remote video %s: invalid body.', video.url, lTags())
32
33 await video.setAsRefreshed()
34 return video
35 }
36
37 const videoUpdater = new APVideoUpdater(videoObject, video)
38 await videoUpdater.update()
39
40 await syncVideoExternalAttributes(video, videoObject, options.syncParam)
41
42 ActorFollowScoreCache.Instance.addGoodServerId(video.VideoChannel.Actor.serverId)
43
44 return video
45 } catch (err) {
46 if ((err as PeerTubeRequestError).statusCode === HttpStatusCode.NOT_FOUND_404) {
47 logger.info('Cannot refresh remote video %s: video does not exist anymore. Deleting it.', video.url, lTags())
48
49 // Video does not exist anymore
50 await video.destroy()
51 return undefined
52 }
53
54 logger.warn('Cannot refresh video %s.', options.video.url, { err, ...lTags() })
55
56 ActorFollowScoreCache.Instance.addBadServerId(video.VideoChannel.Actor.serverId)
57
58 // Don't refresh in loop
59 await video.setAsRefreshed()
60 return video
61 }
62 }
63
64 // ---------------------------------------------------------------------------
65
66 export {
67 refreshVideoIfNeeded
68 }