import * as uuidv4 from 'uuid/v4'
import { ActivityPubActor, ActivityPubActorType } from '../../../shared/models/activitypub'
import { ActivityPubAttributedTo } from '../../../shared/models/activitypub/objects'
-import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub'
+import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
import { isActorObjectValid, normalizeActor } from '../../helpers/custom-validators/activitypub/actor'
import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
import { retryTransactionWrapper, updateInstanceWithAnother } from '../../helpers/database-utils'
recurseIfNeeded = true,
updateCollections = false
) {
- const actorUrl = getAPUrl(activityActor)
+ const actorUrl = getAPId(activityActor)
let created = false
+ let accountPlaylistsUrl: string
let actor = await fetchActorByUrl(actorUrl, fetchType)
// Orphan actor (not associated to an account of channel) so recreate it
try {
// Don't recurse another time
- ownerActor = await getOrCreateActorAndServerAndModel(accountAttributedTo.id, 'all', false)
+ const recurseIfNeeded = false
+ ownerActor = await getOrCreateActorAndServerAndModel(accountAttributedTo.id, 'all', recurseIfNeeded)
} catch (err) {
logger.error('Cannot get or create account attributed to video channel ' + actor.url)
throw new Error(err)
actor = await retryTransactionWrapper(saveActorAndServerAndModelIfNotExist, result, ownerActor)
created = true
+ accountPlaylistsUrl = result.playlists
}
if (actor.Account) actor.Account.Actor = actor
await JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload })
}
+ // We created a new account: fetch the playlists
+ if (created === true && actor.Account && accountPlaylistsUrl) {
+ const payload = { uri: accountPlaylistsUrl, accountId: actor.Account.id, type: 'account-playlists' as 'account-playlists' }
+ await JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload })
+ }
+
return actorRefreshed
}
const actor = fetchedType === 'all' ? actorArg : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url)
try {
- const actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
+ let actorUrl: string
+ try {
+ actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
+ } catch (err) {
+ logger.warn('Cannot get actor URL from webfinger, keeping the old one.', err)
+ actorUrl = actor.url
+ }
+
const { result, statusCode } = await fetchRemoteActor(actorUrl)
if (statusCode === 404) {
name: string
summary: string
support?: string
+ playlists?: string
avatarName?: string
attributedTo: ActivityPubAttributedTo[]
}
logger.info('Fetching remote actor %s.', actorUrl)
- const requestResult = await doRequest(options)
+ const requestResult = await doRequest<ActivityPubActor>(options)
normalizeActor(requestResult.body)
- const actorJSON: ActivityPubActor = requestResult.body
+ const actorJSON = requestResult.body
if (isActorObjectValid(actorJSON) === false) {
logger.debug('Remote actor JSON is not valid.', { actorJSON })
return { result: undefined, statusCode: requestResult.response.statusCode }
avatarName,
summary: actorJSON.summary,
support: actorJSON.support,
+ playlists: actorJSON.playlists,
attributedTo: actorJSON.attributedTo
}
}
return videoChannelCreated
}
-
-