diff options
Diffstat (limited to 'server/lib/activitypub')
-rw-r--r-- | server/lib/activitypub/playlist.ts | 2 | ||||
-rw-r--r-- | server/lib/activitypub/videos.ts | 154 |
2 files changed, 90 insertions, 66 deletions
diff --git a/server/lib/activitypub/playlist.ts b/server/lib/activitypub/playlist.ts index 53298e968..d5a3ef7c8 100644 --- a/server/lib/activitypub/playlist.ts +++ b/server/lib/activitypub/playlist.ts | |||
@@ -103,7 +103,7 @@ async function createOrUpdateVideoPlaylist (playlistObject: PlaylistObject, byAc | |||
103 | 103 | ||
104 | if (playlistObject.icon) { | 104 | if (playlistObject.icon) { |
105 | try { | 105 | try { |
106 | const thumbnailModel = await createPlaylistMiniatureFromUrl(playlistObject.icon.url, refreshedPlaylist) | 106 | const thumbnailModel = await createPlaylistMiniatureFromUrl({ downloadUrl: playlistObject.icon.url, playlist: refreshedPlaylist }) |
107 | await refreshedPlaylist.setAndSaveThumbnail(thumbnailModel, undefined) | 107 | await refreshedPlaylist.setAndSaveThumbnail(thumbnailModel, undefined) |
108 | } catch (err) { | 108 | } catch (err) { |
109 | logger.warn('Cannot generate thumbnail of %s.', playlistObject.id, { err }) | 109 | logger.warn('Cannot generate thumbnail of %s.', playlistObject.id, { err }) |
diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index 201ef0302..66981f43f 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts | |||
@@ -313,7 +313,11 @@ async function updateVideoFromAP (options: { | |||
313 | let thumbnailModel: MThumbnail | 313 | let thumbnailModel: MThumbnail |
314 | 314 | ||
315 | try { | 315 | try { |
316 | thumbnailModel = await createVideoMiniatureFromUrl(getThumbnailFromIcons(videoObject).url, video, ThumbnailType.MINIATURE) | 316 | thumbnailModel = await createVideoMiniatureFromUrl({ |
317 | downloadUrl: getThumbnailFromIcons(videoObject).url, | ||
318 | video, | ||
319 | type: ThumbnailType.MINIATURE | ||
320 | }) | ||
317 | } catch (err) { | 321 | } catch (err) { |
318 | logger.warn('Cannot generate thumbnail of %s.', videoObject.id, { err }) | 322 | logger.warn('Cannot generate thumbnail of %s.', videoObject.id, { err }) |
319 | } | 323 | } |
@@ -362,7 +366,12 @@ async function updateVideoFromAP (options: { | |||
362 | 366 | ||
363 | if (videoUpdated.getPreview()) { | 367 | if (videoUpdated.getPreview()) { |
364 | const previewUrl = getPreviewUrl(getPreviewFromIcons(videoObject), video) | 368 | const previewUrl = getPreviewUrl(getPreviewFromIcons(videoObject), video) |
365 | const previewModel = createPlaceholderThumbnail(previewUrl, video, ThumbnailType.PREVIEW, PREVIEWS_SIZE) | 369 | const previewModel = createPlaceholderThumbnail({ |
370 | fileUrl: previewUrl, | ||
371 | video, | ||
372 | type: ThumbnailType.PREVIEW, | ||
373 | size: PREVIEWS_SIZE | ||
374 | }) | ||
366 | await videoUpdated.addAndSaveThumbnail(previewModel, t) | 375 | await videoUpdated.addAndSaveThumbnail(previewModel, t) |
367 | } | 376 | } |
368 | 377 | ||
@@ -585,11 +594,14 @@ async function createVideo (videoObject: VideoObject, channel: MChannelAccountLi | |||
585 | const videoData = await videoActivityObjectToDBAttributes(channel, videoObject, videoObject.to) | 594 | const videoData = await videoActivityObjectToDBAttributes(channel, videoObject, videoObject.to) |
586 | const video = VideoModel.build(videoData) as MVideoThumbnail | 595 | const video = VideoModel.build(videoData) as MVideoThumbnail |
587 | 596 | ||
588 | const promiseThumbnail = createVideoMiniatureFromUrl(getThumbnailFromIcons(videoObject).url, video, ThumbnailType.MINIATURE) | 597 | const promiseThumbnail = createVideoMiniatureFromUrl({ |
589 | .catch(err => { | 598 | downloadUrl: getThumbnailFromIcons(videoObject).url, |
590 | logger.error('Cannot create miniature from url.', { err }) | 599 | video, |
591 | return undefined | 600 | type: ThumbnailType.MINIATURE |
592 | }) | 601 | }).catch(err => { |
602 | logger.error('Cannot create miniature from url.', { err }) | ||
603 | return undefined | ||
604 | }) | ||
593 | 605 | ||
594 | let thumbnailModel: MThumbnail | 606 | let thumbnailModel: MThumbnail |
595 | if (waitThumbnail === true) { | 607 | if (waitThumbnail === true) { |
@@ -597,81 +609,93 @@ async function createVideo (videoObject: VideoObject, channel: MChannelAccountLi | |||
597 | } | 609 | } |
598 | 610 | ||
599 | const { autoBlacklisted, videoCreated } = await sequelizeTypescript.transaction(async t => { | 611 | const { autoBlacklisted, videoCreated } = await sequelizeTypescript.transaction(async t => { |
600 | const sequelizeOptions = { transaction: t } | 612 | try { |
613 | const sequelizeOptions = { transaction: t } | ||
601 | 614 | ||
602 | const videoCreated = await video.save(sequelizeOptions) as MVideoFullLight | 615 | const videoCreated = await video.save(sequelizeOptions) as MVideoFullLight |
603 | videoCreated.VideoChannel = channel | 616 | videoCreated.VideoChannel = channel |
604 | 617 | ||
605 | if (thumbnailModel) await videoCreated.addAndSaveThumbnail(thumbnailModel, t) | 618 | if (thumbnailModel) await videoCreated.addAndSaveThumbnail(thumbnailModel, t) |
606 | 619 | ||
607 | const previewIcon = getPreviewFromIcons(videoObject) | 620 | const previewUrl = getPreviewUrl(getPreviewFromIcons(videoObject), videoCreated) |
608 | const previewUrl = getPreviewUrl(previewIcon, videoCreated) | 621 | const previewModel = createPlaceholderThumbnail({ |
609 | const previewModel = createPlaceholderThumbnail(previewUrl, videoCreated, ThumbnailType.PREVIEW, PREVIEWS_SIZE) | 622 | fileUrl: previewUrl, |
623 | video: videoCreated, | ||
624 | type: ThumbnailType.PREVIEW, | ||
625 | size: PREVIEWS_SIZE | ||
626 | }) | ||
610 | 627 | ||
611 | if (thumbnailModel) await videoCreated.addAndSaveThumbnail(previewModel, t) | 628 | if (thumbnailModel) await videoCreated.addAndSaveThumbnail(previewModel, t) |
612 | 629 | ||
613 | // Process files | 630 | // Process files |
614 | const videoFileAttributes = videoFileActivityUrlToDBAttributes(videoCreated, videoObject.url) | 631 | const videoFileAttributes = videoFileActivityUrlToDBAttributes(videoCreated, videoObject.url) |
615 | 632 | ||
616 | const videoFilePromises = videoFileAttributes.map(f => VideoFileModel.create(f, { transaction: t })) | 633 | const videoFilePromises = videoFileAttributes.map(f => VideoFileModel.create(f, { transaction: t })) |
617 | const videoFiles = await Promise.all(videoFilePromises) | 634 | const videoFiles = await Promise.all(videoFilePromises) |
618 | 635 | ||
619 | const streamingPlaylistsAttributes = streamingPlaylistActivityUrlToDBAttributes(videoCreated, videoObject, videoFiles) | 636 | const streamingPlaylistsAttributes = streamingPlaylistActivityUrlToDBAttributes(videoCreated, videoObject, videoFiles) |
620 | videoCreated.VideoStreamingPlaylists = [] | 637 | videoCreated.VideoStreamingPlaylists = [] |
621 | 638 | ||
622 | for (const playlistAttributes of streamingPlaylistsAttributes) { | 639 | for (const playlistAttributes of streamingPlaylistsAttributes) { |
623 | const playlistModel = await VideoStreamingPlaylistModel.create(playlistAttributes, { transaction: t }) | 640 | const playlistModel = await VideoStreamingPlaylistModel.create(playlistAttributes, { transaction: t }) |
624 | 641 | ||
625 | const playlistFiles = videoFileActivityUrlToDBAttributes(playlistModel, playlistAttributes.tagAPObject) | 642 | const playlistFiles = videoFileActivityUrlToDBAttributes(playlistModel, playlistAttributes.tagAPObject) |
626 | const videoFilePromises = playlistFiles.map(f => VideoFileModel.create(f, { transaction: t })) | 643 | const videoFilePromises = playlistFiles.map(f => VideoFileModel.create(f, { transaction: t })) |
627 | playlistModel.VideoFiles = await Promise.all(videoFilePromises) | 644 | playlistModel.VideoFiles = await Promise.all(videoFilePromises) |
628 | 645 | ||
629 | videoCreated.VideoStreamingPlaylists.push(playlistModel) | 646 | videoCreated.VideoStreamingPlaylists.push(playlistModel) |
630 | } | 647 | } |
631 | 648 | ||
632 | // Process tags | 649 | // Process tags |
633 | const tags = videoObject.tag | 650 | const tags = videoObject.tag |
634 | .filter(isAPHashTagObject) | 651 | .filter(isAPHashTagObject) |
635 | .map(t => t.name) | 652 | .map(t => t.name) |
636 | await setVideoTags({ video: videoCreated, tags, transaction: t }) | 653 | await setVideoTags({ video: videoCreated, tags, transaction: t }) |
637 | 654 | ||
638 | // Process captions | 655 | // Process captions |
639 | const videoCaptionsPromises = videoObject.subtitleLanguage.map(c => { | 656 | const videoCaptionsPromises = videoObject.subtitleLanguage.map(c => { |
640 | const caption = new VideoCaptionModel({ | 657 | const caption = new VideoCaptionModel({ |
641 | videoId: videoCreated.id, | 658 | videoId: videoCreated.id, |
642 | filename: VideoCaptionModel.generateCaptionName(c.identifier), | 659 | filename: VideoCaptionModel.generateCaptionName(c.identifier), |
643 | language: c.identifier, | 660 | language: c.identifier, |
644 | fileUrl: c.url | 661 | fileUrl: c.url |
645 | }) as MVideoCaption | 662 | }) as MVideoCaption |
646 | 663 | ||
647 | return VideoCaptionModel.insertOrReplaceLanguage(caption, t) | 664 | return VideoCaptionModel.insertOrReplaceLanguage(caption, t) |
648 | }) | 665 | }) |
649 | await Promise.all(videoCaptionsPromises) | 666 | await Promise.all(videoCaptionsPromises) |
650 | 667 | ||
651 | videoCreated.VideoFiles = videoFiles | 668 | videoCreated.VideoFiles = videoFiles |
652 | 669 | ||
653 | if (videoCreated.isLive) { | 670 | if (videoCreated.isLive) { |
654 | const videoLive = new VideoLiveModel({ | 671 | const videoLive = new VideoLiveModel({ |
655 | streamKey: null, | 672 | streamKey: null, |
656 | saveReplay: videoObject.liveSaveReplay, | 673 | saveReplay: videoObject.liveSaveReplay, |
657 | permanentLive: videoObject.permanentLive, | 674 | permanentLive: videoObject.permanentLive, |
658 | videoId: videoCreated.id | 675 | videoId: videoCreated.id |
659 | }) | 676 | }) |
660 | 677 | ||
661 | videoCreated.VideoLive = await videoLive.save({ transaction: t }) | 678 | videoCreated.VideoLive = await videoLive.save({ transaction: t }) |
662 | } | 679 | } |
663 | 680 | ||
664 | const autoBlacklisted = await autoBlacklistVideoIfNeeded({ | 681 | const autoBlacklisted = await autoBlacklistVideoIfNeeded({ |
665 | video: videoCreated, | 682 | video: videoCreated, |
666 | user: undefined, | 683 | user: undefined, |
667 | isRemote: true, | 684 | isRemote: true, |
668 | isNew: true, | 685 | isNew: true, |
669 | transaction: t | 686 | transaction: t |
670 | }) | 687 | }) |
671 | 688 | ||
672 | logger.info('Remote video with uuid %s inserted.', videoObject.uuid) | 689 | logger.info('Remote video with uuid %s inserted.', videoObject.uuid) |
673 | 690 | ||
674 | return { autoBlacklisted, videoCreated } | 691 | return { autoBlacklisted, videoCreated } |
692 | } catch (err) { | ||
693 | // FIXME: Use rollback hook when https://github.com/sequelize/sequelize/pull/13038 is released | ||
694 | // Remove thumbnail | ||
695 | if (thumbnailModel) await thumbnailModel.removeThumbnail() | ||
696 | |||
697 | throw err | ||
698 | } | ||
675 | }) | 699 | }) |
676 | 700 | ||
677 | if (waitThumbnail === false) { | 701 | if (waitThumbnail === false) { |