fedicrawl/application/src/Fediverse/Providers/Peertube/retrieveVideoChannels.ts

86 wiersze
2.5 KiB
TypeScript
Czysty Zwykły widok Historia

2022-11-29 13:11:27 +00:00
import getTimeoutMilliseconds from '../../getTimeoutMilliseconds.js'
2021-12-23 14:14:06 +00:00
import { FeedData } from '../FeedData'
import { assertSuccessJsonResponse } from '../../assertSuccessJsonResponse'
import { z } from 'zod'
import { FieldData } from '../FieldData'
import { avatarSchema } from './Avatar'
import { parseAvatarUrl } from './parseAvatarUrl'
2022-01-03 13:05:00 +00:00
import { parseDescription } from './parseDescription'
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,
2022-11-22 15:37:11 +00:00
page,
robotsTxt
2022-09-18 11:32:25 +00:00
) => {
2022-11-29 13:11:27 +00:00
const response = await robotsTxt.getIfAllowed(new URL(`https://${domain}/api/v1/video-channels`), {
2021-12-23 14:14:06 +00:00
params: {
count: limit,
sort: 'createdAt',
start: page * limit
},
2022-11-29 13:11:27 +00:00
timeout: getTimeoutMilliseconds(domain)
2021-12-23 14:14:06 +00:00
})
assertSuccessJsonResponse(response)
const responseData = schema.parse(response.data)
if (responseData.data.length === 0) {
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
2022-11-22 16:01:25 +00:00
},
indexable: true
2021-12-23 14:14:06 +00:00
}
})
}