2021-12-23 14:14:06 +00:00
|
|
|
import { FeedData } from '../FeedData'
|
|
|
|
import axios from 'axios'
|
|
|
|
import { assertSuccessJsonResponse } from '../../assertSuccessJsonResponse'
|
|
|
|
import { z } from 'zod'
|
|
|
|
import { FieldData } from '../FieldData'
|
|
|
|
import { avatarSchema } from './Avatar'
|
|
|
|
import { parseAvatarUrl } from './parseAvatarUrl'
|
2022-01-03 12:26:17 +00:00
|
|
|
import { getDefaultTimeoutMilliseconds } from '../../getDefaultTimeoutMilliseconds'
|
2022-01-03 13:05:00 +00:00
|
|
|
import { parseDescription } from './parseDescription'
|
2022-04-17 12:03:53 +00:00
|
|
|
import { FeedProviderMethod } from '../FeedProviderMethod'
|
|
|
|
import { NoMoreFeedsError } from '../NoMoreFeedsError'
|
2021-12-23 14:14:06 +00:00
|
|
|
|
|
|
|
const limit = 100
|
|
|
|
|
|
|
|
const schema = z.object({
|
|
|
|
total: z.number(),
|
|
|
|
data: z.array(
|
|
|
|
z.object({
|
|
|
|
displayName: z.string(),
|
|
|
|
description: z.nullable(z.string()),
|
|
|
|
isLocal: z.boolean(),
|
|
|
|
url: z.optional(z.string()),
|
|
|
|
name: z.string(),
|
|
|
|
support: z.nullable(z.string()),
|
|
|
|
followingCount: z.number(),
|
|
|
|
followersCount: z.number(),
|
|
|
|
createdAt: z.string(),
|
|
|
|
updatedAt: z.string(),
|
|
|
|
host: z.string(),
|
|
|
|
avatar: avatarSchema,
|
|
|
|
ownerAccount: z.object({
|
|
|
|
name: z.string(),
|
|
|
|
host: z.string()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
2022-09-18 11:32:25 +00:00
|
|
|
export const retrieveVideoChannels: FeedProviderMethod = async (
|
|
|
|
domain,
|
|
|
|
page
|
|
|
|
) => {
|
2021-12-23 14:14:06 +00:00
|
|
|
const response = await axios.get(`https://${domain}/api/v1/video-channels`, {
|
|
|
|
params: {
|
|
|
|
count: limit,
|
|
|
|
sort: 'createdAt',
|
|
|
|
start: page * limit
|
|
|
|
},
|
2022-01-03 12:26:17 +00:00
|
|
|
timeout: getDefaultTimeoutMilliseconds()
|
2021-12-23 14:14:06 +00:00
|
|
|
})
|
|
|
|
assertSuccessJsonResponse(response)
|
|
|
|
const responseData = schema.parse(response.data)
|
|
|
|
if (responseData.data.length === 0) {
|
2022-04-17 12:03:53 +00:00
|
|
|
throw new NoMoreFeedsError('channel')
|
2021-12-23 14:14:06 +00:00
|
|
|
}
|
|
|
|
return responseData.data
|
2022-09-18 11:32:25 +00:00
|
|
|
.filter((item) => item.host === domain)
|
|
|
|
.map((item): FeedData => {
|
|
|
|
const fields: FieldData[] =
|
|
|
|
item.support !== null
|
|
|
|
? [{ name: 'support', value: item.support, verifiedAt: undefined }]
|
|
|
|
: []
|
2021-12-23 14:14:06 +00:00
|
|
|
return {
|
|
|
|
name: item.name,
|
|
|
|
url: item.url ?? `https://${domain}/video-channels/${item.name}/`,
|
|
|
|
avatar: parseAvatarUrl(item.avatar, domain),
|
|
|
|
locked: false,
|
2022-09-18 11:32:25 +00:00
|
|
|
fields,
|
2022-01-03 13:05:00 +00:00
|
|
|
description: parseDescription(item.description),
|
2021-12-23 14:14:06 +00:00
|
|
|
displayName: item.displayName,
|
|
|
|
followersCount: item.followersCount,
|
|
|
|
followingCount: item.followingCount,
|
|
|
|
createdAt: new Date(item.createdAt),
|
2022-09-14 19:16:04 +00:00
|
|
|
bot: undefined,
|
|
|
|
lastStatusAt: undefined,
|
|
|
|
statusesCount: undefined,
|
2021-12-23 14:14:06 +00:00
|
|
|
type: 'channel',
|
|
|
|
parentFeed: {
|
|
|
|
name: item.ownerAccount.name,
|
|
|
|
hostDomain: item.ownerAccount.host
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|