From 9f79ade627f0044606a9fbbe16ca0154661d12b9 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 19 Mar 2019 14:13:53 +0100 Subject: Refresh playlists --- server/lib/activitypub/actor.ts | 3 +- server/lib/activitypub/playlist.ts | 56 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) (limited to 'server/lib/activitypub') diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index f77df8b78..63e810642 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts @@ -375,7 +375,8 @@ async function fetchRemoteActor (actorUrl: string): Promise<{ statusCode?: numbe } if (checkUrlsSameHost(actorJSON.id, actorUrl) !== true) { - throw new Error('Actor url ' + actorUrl + ' has not the same host than its AP id ' + actorJSON.id) + logger.warn('Actor url %s has not the same host than its AP id %s', actorUrl, actorJSON.id) + return { result: undefined, statusCode: requestResult.response.statusCode } } const followersCount = await fetchActorTotalItems(actorJSON.followers) 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 return Promise.resolve() }) - // Empty playlists generally do not have a miniature, so skip it + // Empty playlists generally do not have a miniature, so skip this if (accItems.length !== 0) { try { await generateThumbnailFromUrl(playlist, playlistObject.icon) @@ -107,13 +107,45 @@ async function createOrUpdateVideoPlaylist (playlistObject: PlaylistObject, byAc return resetVideoPlaylistElements(accItems, playlist) } +async function refreshVideoPlaylistIfNeeded (videoPlaylist: VideoPlaylistModel): Promise { + if (!videoPlaylist.isOutdated()) return videoPlaylist + + try { + const { statusCode, playlistObject } = await fetchRemoteVideoPlaylist(videoPlaylist.url) + if (statusCode === 404) { + logger.info('Cannot refresh remote video playlist %s: it does not exist anymore. Deleting it.', videoPlaylist.url) + + await videoPlaylist.destroy() + return undefined + } + + if (playlistObject === undefined) { + logger.warn('Cannot refresh remote playlist %s: invalid body.', videoPlaylist.url) + + await videoPlaylist.setAsRefreshed() + return videoPlaylist + } + + const byAccount = videoPlaylist.OwnerAccount + await createOrUpdateVideoPlaylist(playlistObject, byAccount, playlistObject.to) + + return videoPlaylist + } catch (err) { + logger.warn('Cannot refresh video playlist %s.', videoPlaylist.url, { err }) + + await videoPlaylist.setAsRefreshed() + return videoPlaylist + } +} + // --------------------------------------------------------------------------- export { createAccountPlaylists, playlistObjectToDBAttributes, playlistElementObjectToDBAttributes, - createOrUpdateVideoPlaylist + createOrUpdateVideoPlaylist, + refreshVideoPlaylistIfNeeded } // --------------------------------------------------------------------------- @@ -162,3 +194,23 @@ function generateThumbnailFromUrl (playlist: VideoPlaylistModel, icon: ActivityI return downloadImage(icon.url, CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName, THUMBNAILS_SIZE) } + +async function fetchRemoteVideoPlaylist (playlistUrl: string): Promise<{ statusCode: number, playlistObject: PlaylistObject }> { + const options = { + uri: playlistUrl, + method: 'GET', + json: true, + activityPub: true + } + + logger.info('Fetching remote playlist %s.', playlistUrl) + + const { response, body } = await doRequest(options) + + if (isPlaylistObjectValid(body) === false || checkUrlsSameHost(body.id, playlistUrl) !== true) { + logger.debug('Remote video playlist JSON is not valid.', { body }) + return { statusCode: response.statusCode, playlistObject: undefined } + } + + return { statusCode: response.statusCode, playlistObject: body } +} -- cgit v1.2.3