+
+function getThumbnailFromIcons (videoObject: VideoObject) {
+ let validIcons = videoObject.icon.filter(i => i.width > THUMBNAILS_SIZE.minWidth)
+ // Fallback if there are not valid icons
+ if (validIcons.length === 0) validIcons = videoObject.icon
+
+ return minBy(validIcons, 'width')
+}
+
+function getPreviewFromIcons (videoObject: VideoObject) {
+ const validIcons = videoObject.icon.filter(i => i.width > PREVIEWS_SIZE.minWidth)
+
+ return maxBy(validIcons, 'width')
+}
+
+function getTrackerUrls (object: VideoObject, video: MVideoWithHost) {
+ let wsFound = false
+
+ const trackers = object.url.filter(u => isAPVideoTrackerUrlObject(u))
+ .map((u: ActivityTrackerUrlObject) => {
+ if (isArray(u.rel) && u.rel.includes('websocket')) wsFound = true
+
+ return u.href
+ })
+
+ if (wsFound) return trackers
+
+ return [
+ buildRemoteVideoBaseUrl(video, '/tracker/socket', REMOTE_SCHEME.WS),
+ buildRemoteVideoBaseUrl(video, '/tracker/announce')
+ ]
+}
+
+async function setVideoTrackers (options: {
+ video: MVideo
+ trackers: string[]
+ transaction?: Transaction
+}) {
+ const { video, trackers, transaction } = options
+
+ const trackerInstances = await TrackerModel.findOrCreateTrackers(trackers, transaction)
+
+ await video.$set('Trackers', trackerInstances, { transaction })
+}