diff --git a/PeerTube b/PeerTube
index 3e8c3fc..28216aa 160000
--- a/PeerTube
+++ b/PeerTube
@@ -1 +1 @@
-Subproject commit 3e8c3fcdb063e2d8f4b3ba04fdcdeda588538751
+Subproject commit 28216aa41a392ae3b3f87871fefa22dadc471cf6
diff --git a/client/src/components/ActorMiniature.vue b/client/src/components/ActorMiniature.vue
index 5eb1bb6..50d8245 100644
--- a/client/src/components/ActorMiniature.vue
+++ b/client/src/components/ActorMiniature.vue
@@ -7,8 +7,8 @@
:title="linkTitle"
>
{
+ if (a1.width < a2.width) return -1
+ if (a1.width > a2.width) return 1
+
+ return 0
+ })
+
+ return avatars[0].url
+ },
+
linkTitle (): string {
if (this.type === 'channel') return this.$gettext('Go on this channel page')
diff --git a/server/lib/elastic-search/elastic-search-channels.ts b/server/lib/elastic-search/elastic-search-channels.ts
index f24facf..2601648 100644
--- a/server/lib/elastic-search/elastic-search-channels.ts
+++ b/server/lib/elastic-search/elastic-search-channels.ts
@@ -5,7 +5,12 @@ import { DBChannel, EnhancedVideoChannel, IndexableChannel } from '../../types/c
import { ChannelsSearchQuery } from '../../types/search-query/channel-search.model'
import { buildSort, extractQueryResult } from './elastic-search-queries'
import { buildChannelOrAccountCommonMapping, buildMultiMatchBool } from './shared'
-import { formatAvatarForAPI, formatAvatarForDB } from './shared/elastic-search-avatar'
+import {
+ formatActorImageForAPI,
+ formatActorImageForDB,
+ formatActorImagesForAPI,
+ formatActorImagesForDB
+} from './shared/elastic-search-avatar'
async function queryChannels (search: ChannelsSearchQuery) {
const bool: any = {}
@@ -86,7 +91,12 @@ function formatChannelForAPI (c: DBChannel, fromHost?: string): EnhancedVideoCha
followersCount: c.followersCount,
createdAt: c.createdAt,
updatedAt: c.updatedAt,
- avatar: formatAvatarForAPI(c),
+
+ avatar: formatActorImageForAPI(c.avatar),
+ avatars: formatActorImagesForAPI(c.avatars, c.avatar),
+
+ banner: formatActorImageForAPI(c.banner),
+ banners: formatActorImagesForAPI(c.banners, c.banner),
displayName: c.displayName,
description: c.description,
@@ -106,7 +116,8 @@ function formatChannelForAPI (c: DBChannel, fromHost?: string): EnhancedVideoCha
createdAt: c.ownerAccount.createdAt,
updatedAt: c.ownerAccount.updatedAt,
- avatar: formatAvatarForAPI(c.ownerAccount)
+ avatar: formatActorImageForAPI(c.ownerAccount.avatar),
+ avatars: formatActorImagesForAPI(c.ownerAccount.avatars, c.ownerAccount.avatar)
}
}
}
@@ -119,7 +130,11 @@ function formatChannelForDB (c: IndexableChannel): DBChannel {
host: c.host,
url: c.url,
- avatar: formatAvatarForDB(c),
+ avatar: formatActorImageForDB(c.avatar, c.host),
+ avatars: formatActorImagesForDB(c.avatars, c.host),
+
+ banner: formatActorImageForDB(c.banner, c.host),
+ banners: formatActorImagesForDB(c.banners, c.host),
displayName: c.displayName,
@@ -151,7 +166,8 @@ function formatChannelForDB (c: IndexableChannel): DBChannel {
handle: `${c.ownerAccount.name}@${c.ownerAccount.host}`,
- avatar: formatAvatarForDB(c.ownerAccount)
+ avatar: formatActorImageForDB(c.ownerAccount.avatar, c.ownerAccount.host),
+ avatars: formatActorImagesForDB(c.ownerAccount.avatars, c.ownerAccount.host)
}
}
}
diff --git a/server/lib/elastic-search/shared/elastic-search-actor.ts b/server/lib/elastic-search/shared/elastic-search-actor.ts
index 0f44893..45ddaf0 100644
--- a/server/lib/elastic-search/shared/elastic-search-actor.ts
+++ b/server/lib/elastic-search/shared/elastic-search-actor.ts
@@ -1,6 +1,7 @@
import { AccountSummary, VideoChannelSummary } from '../../../../PeerTube/shared/models'
import { AdditionalActorAttributes } from '../../../types/actor.model'
-import { buildAvatarMapping, formatAvatarForAPI, formatAvatarForDB } from './elastic-search-avatar'
+import { formatActorImageForDB } from './'
+import { buildActorImageMapping, formatActorImageForAPI, formatActorImagesForAPI, formatActorImagesForDB } from './elastic-search-avatar'
function buildChannelOrAccountSummaryMapping () {
return {
@@ -30,7 +31,12 @@ function buildChannelOrAccountSummaryMapping () {
},
avatar: {
- properties: buildAvatarMapping()
+ properties: buildActorImageMapping()
+ },
+
+ // Introduced in 4.2
+ avatars: {
+ properties: buildActorImageMapping()
}
}
}
@@ -69,7 +75,8 @@ function formatActorSummaryForAPI (actor: (AccountSummary | VideoChannelSummary)
url: actor.url,
host: actor.host,
- avatar: formatAvatarForAPI(actor)
+ avatar: formatActorImageForAPI(actor.avatar),
+ avatars: formatActorImagesForAPI(actor.avatars, actor.avatar)
}
}
@@ -83,7 +90,8 @@ function formatActorForDB (actor: AccountSummary | VideoChannelSummary) {
handle: `${actor.name}@${actor.host}`,
- avatar: formatAvatarForDB(actor)
+ avatar: formatActorImageForDB(actor.avatar, actor.host),
+ avatars: formatActorImagesForDB(actor.avatars, actor.host)
}
}
diff --git a/server/lib/elastic-search/shared/elastic-search-avatar.ts b/server/lib/elastic-search/shared/elastic-search-avatar.ts
index 6141a1f..a0e1877 100644
--- a/server/lib/elastic-search/shared/elastic-search-avatar.ts
+++ b/server/lib/elastic-search/shared/elastic-search-avatar.ts
@@ -1,34 +1,59 @@
-
import { ActorImage } from '../../../../PeerTube/shared/models'
import { buildUrl } from '../../../helpers/utils'
-function formatAvatarForAPI (obj: { avatar?: ActorImage & { url: string } }) {
- if (!obj.avatar) return null
+function formatActorImageForAPI (image?: ActorImage) {
+ if (!image) return null
return {
- url: obj.avatar.url,
- path: obj.avatar.path,
- createdAt: obj.avatar.createdAt,
- updatedAt: obj.avatar.updatedAt
+ url: image.url,
+ path: image.path,
+ width: image.width,
+ createdAt: image.createdAt,
+ updatedAt: image.updatedAt
}
}
-function formatAvatarForDB (obj: { avatar?: ActorImage, host: string }) {
- if (!obj.avatar) return null
+function formatActorImagesForAPI (images?: ActorImage[], image?: ActorImage) {
+ // Does not exist in PeerTube < 4.2
+ if (!images) {
+ if (!image) return []
+
+ return [ image ]
+ }
+
+ return images.map(a => formatActorImageForAPI(a))
+}
+
+// ---------------------------------------------------------------------------
+
+function formatActorImageForDB (image: ActorImage, host: string) {
+ if (!image) return null
return {
- url: buildUrl(obj.host, obj.avatar.path),
- path: obj.avatar.path,
- createdAt: obj.avatar.createdAt,
- updatedAt: obj.avatar.updatedAt
+ url: buildUrl(host, image.path),
+ path: image.path,
+ width: image.width,
+ createdAt: image.createdAt,
+ updatedAt: image.updatedAt
}
}
-function buildAvatarMapping () {
+function formatActorImagesForDB (images: ActorImage[], host: string) {
+ if (!images) return null
+
+ return images.map(image => formatActorImageForDB(image, host))
+}
+
+// ---------------------------------------------------------------------------
+
+function buildActorImageMapping () {
return {
path: {
type: 'keyword'
},
+ width: {
+ type: 'long'
+ },
createdAt: {
type: 'date',
format: 'date_optional_time'
@@ -41,7 +66,11 @@ function buildAvatarMapping () {
}
export {
- formatAvatarForAPI,
- formatAvatarForDB,
- buildAvatarMapping
+ formatActorImageForAPI,
+ formatActorImagesForAPI,
+
+ formatActorImageForDB,
+ formatActorImagesForDB,
+
+ buildActorImageMapping
}
diff --git a/server/types/actor.model.ts b/server/types/actor.model.ts
index 46114fe..0d8e4b0 100644
--- a/server/types/actor.model.ts
+++ b/server/types/actor.model.ts
@@ -2,8 +2,10 @@ import { ActorImage } from '../../PeerTube/shared/models'
export type AdditionalActorAttributes = {
handle: string
- avatar: ActorImageExtended
url: string
+
+ avatar: ActorImageExtended
+ avatars: ActorImageExtended[]
}
export type ActorImageExtended = ActorImage & { url: string }
diff --git a/server/types/channel.model.ts b/server/types/channel.model.ts
index 45ca85c..e023d0d 100644
--- a/server/types/channel.model.ts
+++ b/server/types/channel.model.ts
@@ -13,7 +13,11 @@ export interface DBChannel extends Omit {
ownerAccount?: Account & AdditionalActorAttributes
- avatar?: ActorImageExtended
+ avatar: ActorImageExtended
+ avatars: ActorImageExtended[]
+
+ banner: ActorImageExtended
+ banners: ActorImageExtended[]
score?: number
}