2020-02-18 19:18:46 +01:00
|
|
|
import { get, writable, derived, scan, wait, startWith, writableLocalStorage } from '/services/store.js'
|
|
|
|
import { radioIterator, radioShareIterator } from '/services/radio.js'
|
|
|
|
import DeepSet from '/services/deep-set.js'
|
|
|
|
import { distinct } from './services/store'
|
|
|
|
|
|
|
|
|
|
|
|
const cache = new DeepSet()
|
2020-01-16 20:10:40 +01:00
|
|
|
|
|
|
|
export const domain = writableLocalStorage('domain', 'eldritch.cafe')
|
|
|
|
|
|
|
|
export const hashtags = writableLocalStorage('hashtags', [
|
|
|
|
'np',
|
|
|
|
'nowplaying',
|
|
|
|
'tootradio',
|
|
|
|
'pouetradio'
|
|
|
|
])
|
|
|
|
|
2020-01-18 05:13:38 +01:00
|
|
|
export const paused = writable(true)
|
2020-01-16 20:10:40 +01:00
|
|
|
export const muted = writableLocalStorage('muted', false)
|
|
|
|
export const volume = writableLocalStorage('volume', 100)
|
|
|
|
|
2020-02-14 16:48:49 +01:00
|
|
|
export const current = writable(null)
|
2020-01-16 20:10:40 +01:00
|
|
|
export const enqueueing = writable(false)
|
2020-01-20 04:49:38 +01:00
|
|
|
|
2020-02-18 19:18:46 +01:00
|
|
|
|
|
|
|
export const iterator = derived([domain, hashtags], ([$domain, $hashtags], set) => {
|
|
|
|
const iterator = radioIterator($domain, $hashtags, cache)
|
|
|
|
set(iterator)
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
iterator.return()
|
|
|
|
}
|
|
|
|
}, null)
|
|
|
|
|
|
|
|
|
|
|
|
export const next = derived([iterator, current], ([$iterator, $current]) => ({ $iterator, $current }))
|
|
|
|
.pipe(scan(($nextPromise, { $iterator, $current }) => {
|
|
|
|
return $nextPromise.then($next => {
|
|
|
|
if ($next == null || $next === $current) {
|
|
|
|
enqueueing.set(true)
|
|
|
|
return $iterator.next().then(({ done, value }) => {
|
|
|
|
enqueueing.set(false)
|
|
|
|
return value
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
return $nextPromise
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}, Promise.resolve(null)))
|
|
|
|
.pipe(wait(x => x))
|
|
|
|
// distinct but with strict check
|
|
|
|
.pipe(distinct())
|
|
|
|
.pipe(startWith(null))
|
|
|
|
|
|
|
|
|
|
|
|
export const queue = next
|
|
|
|
.pipe(scan((a, x) => x == null ? a : [...a, x], []))
|
|
|
|
|
|
|
|
|
2020-01-16 20:10:40 +01:00
|
|
|
export const loading = writable(false)
|
|
|
|
|
2020-02-14 16:48:49 +01:00
|
|
|
const index = derived([queue, current], ([$queue, $current]) => {
|
|
|
|
const i = $queue.indexOf($current)
|
|
|
|
return i === -1 ? null : i
|
|
|
|
})
|
2020-01-16 20:10:40 +01:00
|
|
|
|
2020-02-14 16:48:49 +01:00
|
|
|
export const canPrevious = derived([queue, index], ([$queue, $index]) => $index !== null && $index > 0)
|
|
|
|
export const canNext = derived([queue, index], ([$queue, $index]) => $index !== null && $index < $queue.length - 1)
|
2020-01-16 20:10:40 +01:00
|
|
|
|
2020-01-20 03:26:18 +01:00
|
|
|
|
2020-02-14 16:48:49 +01:00
|
|
|
export const select = track => {
|
2020-02-15 23:12:53 +01:00
|
|
|
console.log(`Select ${track.title}`)
|
2020-02-14 16:48:49 +01:00
|
|
|
current.set(track)
|
|
|
|
}
|
2020-01-16 20:10:40 +01:00
|
|
|
|
2020-01-20 04:49:38 +01:00
|
|
|
export const selectPrevious = () => {
|
|
|
|
if (get(canPrevious)) {
|
2020-02-14 16:48:49 +01:00
|
|
|
const $queue = get(queue)
|
|
|
|
const $index = get(index)
|
|
|
|
select($queue[$index - 1])
|
2020-01-20 04:49:38 +01:00
|
|
|
}
|
|
|
|
}
|
2020-01-20 03:26:18 +01:00
|
|
|
|
2020-01-20 04:49:38 +01:00
|
|
|
export const selectNext = () => {
|
|
|
|
if (get(canNext)) {
|
2020-02-14 16:48:49 +01:00
|
|
|
const $queue = get(queue)
|
2020-01-20 04:49:38 +01:00
|
|
|
const $index = get(index)
|
2020-02-14 16:48:49 +01:00
|
|
|
select($queue[$index + 1])
|
2020-01-16 20:10:40 +01:00
|
|
|
}
|
|
|
|
}
|