funkwhale/front/src/utils/clientRadios.ts

61 wiersze
1.6 KiB
TypeScript

import type { ListenWS } from '~/composables/useWebSocketHandler'
import type { CurrentRadio } from '~/store/radios'
import type { Track } from '~/types'
import { useQueue } from '~/composables/audio/queue'
import axios from 'axios'
import useLogger from '~/composables/useLogger'
const logger = useLogger()
export const CLIENT_RADIOS = {
// some radios are client side only, so we have to implement the populateQueue
// method by hand
account: {
offset: 1,
async fetchNextTrack (current: CurrentRadio) {
const params = {
scope: `actor:${current.objectId?.fullUsername}`,
ordering: '-creation_date',
page_size: 1,
page: this.offset
}
// NOTE: This is unhandled as we want to pass the exception further down
const response = await axios.get('history/listenings', { params })
const latest = response.data.results[0]
if (!latest) {
logger.error('No more tracks')
return undefined
}
this.offset += 1
return latest.track as Track
},
stop () {
this.offset = 1
},
async handleListen (current: CurrentRadio, event: ListenWS) {
// TODO: handle actors from other pods
if (event.actor.local_id === current.objectId?.username) {
try {
const response = await axios.get(`tracks/${event.object.local_id}`)
if (response.data.uploads.length > 0) {
const { enqueue } = useQueue()
await enqueue(response.data as Track)
this.offset += 1
}
} catch (error) {
logger.error('Cannot retrieve track info', error)
}
}
}
}
}