]>
Commit | Line | Data |
---|---|---|
1 | import { logger, loggerTagsFactory } from '@server/helpers/logger' | |
2 | import { PeerTubeRequestError } from '@server/helpers/requests' | |
3 | import { MVideoPlaylistOwner } from '@server/types/models' | |
4 | import { HttpStatusCode } from '@shared/core-utils' | |
5 | import { createOrUpdateVideoPlaylist } from './create-update' | |
6 | import { fetchRemoteVideoPlaylist } from './shared' | |
7 | ||
8 | async function refreshVideoPlaylistIfNeeded (videoPlaylist: MVideoPlaylistOwner): Promise<MVideoPlaylistOwner> { | |
9 | if (!videoPlaylist.isOutdated()) return videoPlaylist | |
10 | ||
11 | const lTags = loggerTagsFactory('ap', 'video-playlist', 'refresh', videoPlaylist.uuid, videoPlaylist.url) | |
12 | ||
13 | logger.info('Refreshing playlist %s.', videoPlaylist.url, lTags()) | |
14 | ||
15 | try { | |
16 | const { playlistObject } = await fetchRemoteVideoPlaylist(videoPlaylist.url) | |
17 | ||
18 | if (playlistObject === undefined) { | |
19 | logger.warn('Cannot refresh remote playlist %s: invalid body.', videoPlaylist.url, lTags()) | |
20 | ||
21 | await videoPlaylist.setAsRefreshed() | |
22 | return videoPlaylist | |
23 | } | |
24 | ||
25 | const byAccount = videoPlaylist.OwnerAccount | |
26 | await createOrUpdateVideoPlaylist(playlistObject, byAccount, playlistObject.to) | |
27 | ||
28 | return videoPlaylist | |
29 | } catch (err) { | |
30 | if ((err as PeerTubeRequestError).statusCode === HttpStatusCode.NOT_FOUND_404) { | |
31 | logger.info('Cannot refresh not existing playlist %s. Deleting it.', videoPlaylist.url, lTags()) | |
32 | ||
33 | await videoPlaylist.destroy() | |
34 | return undefined | |
35 | } | |
36 | ||
37 | logger.warn('Cannot refresh video playlist %s.', videoPlaylist.url, { err, ...lTags() }) | |
38 | ||
39 | await videoPlaylist.setAsRefreshed() | |
40 | return videoPlaylist | |
41 | } | |
42 | } | |
43 | ||
44 | export { | |
45 | refreshVideoPlaylistIfNeeded | |
46 | } |