diff options
Diffstat (limited to 'server/lib/activitypub/playlists/create-update.ts')
-rw-r--r-- | server/lib/activitypub/playlists/create-update.ts | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/server/lib/activitypub/playlists/create-update.ts b/server/lib/activitypub/playlists/create-update.ts index 37d748de4..ea3e61ac5 100644 --- a/server/lib/activitypub/playlists/create-update.ts +++ b/server/lib/activitypub/playlists/create-update.ts | |||
@@ -1,3 +1,5 @@ | |||
1 | import * as Bluebird from 'bluebird' | ||
2 | import { getAPId } from '@server/helpers/activitypub' | ||
1 | import { isArray } from '@server/helpers/custom-validators/misc' | 3 | import { isArray } from '@server/helpers/custom-validators/misc' |
2 | import { logger, loggerTagsFactory } from '@server/helpers/logger' | 4 | import { logger, loggerTagsFactory } from '@server/helpers/logger' |
3 | import { CRAWL_REQUEST_CONCURRENCY } from '@server/initializers/constants' | 5 | import { CRAWL_REQUEST_CONCURRENCY } from '@server/initializers/constants' |
@@ -6,7 +8,7 @@ import { updatePlaylistMiniatureFromUrl } from '@server/lib/thumbnail' | |||
6 | import { VideoPlaylistModel } from '@server/models/video/video-playlist' | 8 | import { VideoPlaylistModel } from '@server/models/video/video-playlist' |
7 | import { VideoPlaylistElementModel } from '@server/models/video/video-playlist-element' | 9 | import { VideoPlaylistElementModel } from '@server/models/video/video-playlist-element' |
8 | import { FilteredModelAttributes } from '@server/types' | 10 | import { FilteredModelAttributes } from '@server/types' |
9 | import { MAccountDefault, MAccountId, MThumbnail, MVideoPlaylist, MVideoPlaylistFull } from '@server/types/models' | 11 | import { MThumbnail, MVideoPlaylist, MVideoPlaylistFull, MVideoPlaylistVideosLength } from '@server/types/models' |
10 | import { AttributesOnly } from '@shared/core-utils' | 12 | import { AttributesOnly } from '@shared/core-utils' |
11 | import { PlaylistObject } from '@shared/models' | 13 | import { PlaylistObject } from '@shared/models' |
12 | import { getOrCreateAPActor } from '../actors' | 14 | import { getOrCreateAPActor } from '../actors' |
@@ -19,11 +21,9 @@ import { | |||
19 | playlistObjectToDBAttributes | 21 | playlistObjectToDBAttributes |
20 | } from './shared' | 22 | } from './shared' |
21 | 23 | ||
22 | import Bluebird = require('bluebird') | ||
23 | |||
24 | const lTags = loggerTagsFactory('ap', 'video-playlist') | 24 | const lTags = loggerTagsFactory('ap', 'video-playlist') |
25 | 25 | ||
26 | async function createAccountPlaylists (playlistUrls: string[], account: MAccountDefault) { | 26 | async function createAccountPlaylists (playlistUrls: string[]) { |
27 | await Bluebird.map(playlistUrls, async playlistUrl => { | 27 | await Bluebird.map(playlistUrls, async playlistUrl => { |
28 | try { | 28 | try { |
29 | const exists = await VideoPlaylistModel.doesPlaylistExist(playlistUrl) | 29 | const exists = await VideoPlaylistModel.doesPlaylistExist(playlistUrl) |
@@ -35,19 +35,19 @@ async function createAccountPlaylists (playlistUrls: string[], account: MAccount | |||
35 | throw new Error(`Cannot refresh remote playlist ${playlistUrl}: invalid body.`) | 35 | throw new Error(`Cannot refresh remote playlist ${playlistUrl}: invalid body.`) |
36 | } | 36 | } |
37 | 37 | ||
38 | return createOrUpdateVideoPlaylist(playlistObject, account, playlistObject.to) | 38 | return createOrUpdateVideoPlaylist(playlistObject) |
39 | } catch (err) { | 39 | } catch (err) { |
40 | logger.warn('Cannot add playlist element %s.', playlistUrl, { err, ...lTags(playlistUrl) }) | 40 | logger.warn('Cannot add playlist element %s.', playlistUrl, { err, ...lTags(playlistUrl) }) |
41 | } | 41 | } |
42 | }, { concurrency: CRAWL_REQUEST_CONCURRENCY }) | 42 | }, { concurrency: CRAWL_REQUEST_CONCURRENCY }) |
43 | } | 43 | } |
44 | 44 | ||
45 | async function createOrUpdateVideoPlaylist (playlistObject: PlaylistObject, byAccount: MAccountId, to: string[]) { | 45 | async function createOrUpdateVideoPlaylist (playlistObject: PlaylistObject, to?: string[]) { |
46 | const playlistAttributes = playlistObjectToDBAttributes(playlistObject, byAccount, to) | 46 | const playlistAttributes = playlistObjectToDBAttributes(playlistObject, to || playlistObject.to) |
47 | 47 | ||
48 | await setVideoChannelIfNeeded(playlistObject, playlistAttributes) | 48 | await setVideoChannel(playlistObject, playlistAttributes) |
49 | 49 | ||
50 | const [ upsertPlaylist ] = await VideoPlaylistModel.upsert<MVideoPlaylist>(playlistAttributes, { returning: true }) | 50 | const [ upsertPlaylist ] = await VideoPlaylistModel.upsert<MVideoPlaylistVideosLength>(playlistAttributes, { returning: true }) |
51 | 51 | ||
52 | const playlistElementUrls = await fetchElementUrls(playlistObject) | 52 | const playlistElementUrls = await fetchElementUrls(playlistObject) |
53 | 53 | ||
@@ -56,7 +56,10 @@ async function createOrUpdateVideoPlaylist (playlistObject: PlaylistObject, byAc | |||
56 | 56 | ||
57 | await updatePlaylistThumbnail(playlistObject, playlist) | 57 | await updatePlaylistThumbnail(playlistObject, playlist) |
58 | 58 | ||
59 | return rebuildVideoPlaylistElements(playlistElementUrls, playlist) | 59 | const elementsLength = await rebuildVideoPlaylistElements(playlistElementUrls, playlist) |
60 | playlist.setVideosLength(elementsLength) | ||
61 | |||
62 | return playlist | ||
60 | } | 63 | } |
61 | 64 | ||
62 | // --------------------------------------------------------------------------- | 65 | // --------------------------------------------------------------------------- |
@@ -68,10 +71,12 @@ export { | |||
68 | 71 | ||
69 | // --------------------------------------------------------------------------- | 72 | // --------------------------------------------------------------------------- |
70 | 73 | ||
71 | async function setVideoChannelIfNeeded (playlistObject: PlaylistObject, playlistAttributes: AttributesOnly<VideoPlaylistModel>) { | 74 | async function setVideoChannel (playlistObject: PlaylistObject, playlistAttributes: AttributesOnly<VideoPlaylistModel>) { |
72 | if (!isArray(playlistObject.attributedTo) || playlistObject.attributedTo.length !== 1) return | 75 | if (!isArray(playlistObject.attributedTo) || playlistObject.attributedTo.length !== 1) { |
76 | throw new Error('Not attributed to for playlist object ' + getAPId(playlistObject)) | ||
77 | } | ||
73 | 78 | ||
74 | const actor = await getOrCreateAPActor(playlistObject.attributedTo[0]) | 79 | const actor = await getOrCreateAPActor(playlistObject.attributedTo[0], 'all') |
75 | 80 | ||
76 | if (!actor.VideoChannel) { | 81 | if (!actor.VideoChannel) { |
77 | logger.warn('Playlist "attributedTo" %s is not a video channel.', playlistObject.id, { playlistObject, ...lTags(playlistObject.id) }) | 82 | logger.warn('Playlist "attributedTo" %s is not a video channel.', playlistObject.id, { playlistObject, ...lTags(playlistObject.id) }) |
@@ -79,6 +84,7 @@ async function setVideoChannelIfNeeded (playlistObject: PlaylistObject, playlist | |||
79 | } | 84 | } |
80 | 85 | ||
81 | playlistAttributes.videoChannelId = actor.VideoChannel.id | 86 | playlistAttributes.videoChannelId = actor.VideoChannel.id |
87 | playlistAttributes.ownerAccountId = actor.VideoChannel.Account.id | ||
82 | } | 88 | } |
83 | 89 | ||
84 | async function fetchElementUrls (playlistObject: PlaylistObject) { | 90 | async function fetchElementUrls (playlistObject: PlaylistObject) { |
@@ -128,7 +134,7 @@ async function rebuildVideoPlaylistElements (elementUrls: string[], playlist: MV | |||
128 | 134 | ||
129 | logger.info('Rebuilt playlist %s with %s elements.', playlist.url, elementsToCreate.length, lTags(playlist.uuid, playlist.url)) | 135 | logger.info('Rebuilt playlist %s with %s elements.', playlist.url, elementsToCreate.length, lTags(playlist.uuid, playlist.url)) |
130 | 136 | ||
131 | return undefined | 137 | return elementsToCreate.length |
132 | } | 138 | } |
133 | 139 | ||
134 | async function buildElementsDBAttributes (elementUrls: string[], playlist: MVideoPlaylist) { | 140 | async function buildElementsDBAttributes (elementUrls: string[], playlist: MVideoPlaylist) { |