aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/activitypub/playlist.ts
diff options
context:
space:
mode:
Diffstat (limited to 'server/lib/activitypub/playlist.ts')
-rw-r--r--server/lib/activitypub/playlist.ts56
1 files changed, 54 insertions, 2 deletions
diff --git a/server/lib/activitypub/playlist.ts b/server/lib/activitypub/playlist.ts
index 70389044e..c4a8f12ec 100644
--- a/server/lib/activitypub/playlist.ts
+++ b/server/lib/activitypub/playlist.ts
@@ -95,7 +95,7 @@ async function createOrUpdateVideoPlaylist (playlistObject: PlaylistObject, byAc
95 return Promise.resolve() 95 return Promise.resolve()
96 }) 96 })
97 97
98 // Empty playlists generally do not have a miniature, so skip it 98 // Empty playlists generally do not have a miniature, so skip this
99 if (accItems.length !== 0) { 99 if (accItems.length !== 0) {
100 try { 100 try {
101 await generateThumbnailFromUrl(playlist, playlistObject.icon) 101 await generateThumbnailFromUrl(playlist, playlistObject.icon)
@@ -107,13 +107,45 @@ async function createOrUpdateVideoPlaylist (playlistObject: PlaylistObject, byAc
107 return resetVideoPlaylistElements(accItems, playlist) 107 return resetVideoPlaylistElements(accItems, playlist)
108} 108}
109 109
110async function refreshVideoPlaylistIfNeeded (videoPlaylist: VideoPlaylistModel): Promise<VideoPlaylistModel> {
111 if (!videoPlaylist.isOutdated()) return videoPlaylist
112
113 try {
114 const { statusCode, playlistObject } = await fetchRemoteVideoPlaylist(videoPlaylist.url)
115 if (statusCode === 404) {
116 logger.info('Cannot refresh remote video playlist %s: it does not exist anymore. Deleting it.', videoPlaylist.url)
117
118 await videoPlaylist.destroy()
119 return undefined
120 }
121
122 if (playlistObject === undefined) {
123 logger.warn('Cannot refresh remote playlist %s: invalid body.', videoPlaylist.url)
124
125 await videoPlaylist.setAsRefreshed()
126 return videoPlaylist
127 }
128
129 const byAccount = videoPlaylist.OwnerAccount
130 await createOrUpdateVideoPlaylist(playlistObject, byAccount, playlistObject.to)
131
132 return videoPlaylist
133 } catch (err) {
134 logger.warn('Cannot refresh video playlist %s.', videoPlaylist.url, { err })
135
136 await videoPlaylist.setAsRefreshed()
137 return videoPlaylist
138 }
139}
140
110// --------------------------------------------------------------------------- 141// ---------------------------------------------------------------------------
111 142
112export { 143export {
113 createAccountPlaylists, 144 createAccountPlaylists,
114 playlistObjectToDBAttributes, 145 playlistObjectToDBAttributes,
115 playlistElementObjectToDBAttributes, 146 playlistElementObjectToDBAttributes,
116 createOrUpdateVideoPlaylist 147 createOrUpdateVideoPlaylist,
148 refreshVideoPlaylistIfNeeded
117} 149}
118 150
119// --------------------------------------------------------------------------- 151// ---------------------------------------------------------------------------
@@ -162,3 +194,23 @@ function generateThumbnailFromUrl (playlist: VideoPlaylistModel, icon: ActivityI
162 194
163 return downloadImage(icon.url, CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName, THUMBNAILS_SIZE) 195 return downloadImage(icon.url, CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName, THUMBNAILS_SIZE)
164} 196}
197
198async function fetchRemoteVideoPlaylist (playlistUrl: string): Promise<{ statusCode: number, playlistObject: PlaylistObject }> {
199 const options = {
200 uri: playlistUrl,
201 method: 'GET',
202 json: true,
203 activityPub: true
204 }
205
206 logger.info('Fetching remote playlist %s.', playlistUrl)
207
208 const { response, body } = await doRequest(options)
209
210 if (isPlaylistObjectValid(body) === false || checkUrlsSameHost(body.id, playlistUrl) !== true) {
211 logger.debug('Remote video playlist JSON is not valid.', { body })
212 return { statusCode: response.statusCode, playlistObject: undefined }
213 }
214
215 return { statusCode: response.statusCode, playlistObject: body }
216}