mastoradio-fork/src/services/misc.js

93 lines
2.7 KiB
JavaScript
Raw Normal View History

2020-03-06 14:38:44 +01:00
import { execPipe, asyncFilter, asyncMap } from 'iter-tools'
2021-11-07 00:11:15 +01:00
import { share } from '/src/routes.js'
2020-01-20 03:26:18 +01:00
2020-02-29 17:48:57 +01:00
const intersection = (xs, ys) => xs.filter(x => ys.includes(x))
const difference = (xs, ys) => xs.filter(x => !ys.includes(x))
const symmetricDifference = (xs, ys) => [...difference(xs, ys), ...difference(ys, xs)]
2020-03-06 14:38:44 +01:00
export const mapNullable = (nullable, f) => nullable === null ? nullable : f(nullable)
2020-01-20 03:26:18 +01:00
export const tap = f => x => {
f(x)
return x
}
export const defer = () => {
let resolve
let reject
const promise = new Promise((res, rej) => {
resolve = res
reject = rej
})
return { resolve, reject, promise }
}
2020-02-22 03:39:15 +01:00
export const queue = () => {
const deferred = defer()
let promise = deferred.promise
2020-01-20 03:26:18 +01:00
2020-02-22 03:39:15 +01:00
const enqueue = f => {
promise = promise.then(tap(f))
2020-02-24 23:18:51 +01:00
return promise
2020-01-20 03:26:18 +01:00
}
2020-02-22 03:39:15 +01:00
return { enqueue, run: deferred.resolve }
2020-01-20 03:26:18 +01:00
}
export const secondsToElapsedTime = (seconds) => {
const parts = [
Math.floor(seconds / 3600),
Math.floor(seconds / 60) % 60,
Math.floor(seconds) % 60
]
return parts
.filter((value, index) => value > 0 || index > 0)
.map(value => value < 10 ? '0' + value : value)
.join(':')
}
2020-03-07 19:00:39 +01:00
export async function* tracksIterator(partialTrackGenerator, cache) {
2020-02-22 03:39:15 +01:00
const notKnow = (values) => {
2020-02-16 17:02:39 +01:00
if (cache.has(values)) {
console.log(`Drop already processed ${values.join(':')}`)
2020-02-22 03:39:15 +01:00
return false
2020-02-16 17:02:39 +01:00
} else {
cache.add(values)
2020-02-22 03:39:15 +01:00
return true
2020-02-15 23:12:53 +01:00
}
}
2020-02-22 03:39:15 +01:00
try {
yield* execPipe(
2020-03-07 19:00:39 +01:00
partialTrackGenerator,
2020-03-06 14:38:44 +01:00
asyncFilter(({ referer: { credentials: { domain, id } } }) => notKnow(['referer', 'mastodon', domain, id])),
asyncFilter(({ partialMedia: { credentials: { id } } }) => notKnow(['media', 'youtube', id])),
asyncMap(async ({ referer, partialMedia }) => {
const metadata = await fetchMetadata(partialMedia.credentials)
2020-02-22 03:39:15 +01:00
return {
shareUrl: `${location.origin}${share.reverse({ domain: referer.credentials.domain, id: referer.credentials.id })}`,
referer,
media: {
title: metadata.title,
2020-03-06 14:38:44 +01:00
url: partialMedia.url,
cover: `https://img.youtube.com/vi/${partialMedia.credentials.id}/mqdefault.jpg`,
credentials: partialMedia.credentials
2020-02-22 03:39:15 +01:00
}
}
})
)
} finally {
2020-03-07 19:00:39 +01:00
partialTrackGenerator.return()
2020-01-20 03:26:18 +01:00
}
}
2020-02-22 03:39:15 +01:00
const fetchMetadata = (credentials) => {
return fetch(`https://noembed.com/embed?url=https://www.youtube.com/watch?v=${credentials.id}`)
.then(response => response.json())
2021-11-07 00:11:15 +01:00
}