58 lines
1.3 KiB
JavaScript
58 lines
1.3 KiB
JavaScript
const api = require('../core/api')
|
|
const _ = require('lodash')
|
|
|
|
module.exports = async function (streams = []) {
|
|
streams = _.filter(streams, stream => stream.is_nsfw === false)
|
|
|
|
await api.regions.load()
|
|
let regions = await api.regions.all()
|
|
regions = _.keyBy(regions, 'code')
|
|
|
|
let items = []
|
|
streams.forEach(stream => {
|
|
if (!stream.broadcast_area.length) {
|
|
const item = _.cloneDeep(stream)
|
|
item.group_title = 'Undefined'
|
|
items.push(item)
|
|
return
|
|
}
|
|
|
|
getChannelRegions(stream, { regions }).forEach(region => {
|
|
const item = _.cloneDeep(stream)
|
|
item.group_title = region.name
|
|
items.push(item)
|
|
})
|
|
})
|
|
|
|
items = _.sortBy(items, i => {
|
|
if (i.group_title === 'Undefined') return ''
|
|
|
|
return i.group_title
|
|
})
|
|
|
|
return { filepath: 'index.region.m3u', items }
|
|
}
|
|
|
|
function getChannelRegions(stream, { regions }) {
|
|
return stream.broadcast_area
|
|
.reduce((acc, item) => {
|
|
const [type, code] = item.split('/')
|
|
switch (type) {
|
|
case 'r':
|
|
acc.push(regions[code])
|
|
break
|
|
case 's':
|
|
const [c] = code.split('-')
|
|
const r1 = _.filter(regions, { countries: [c] })
|
|
acc = acc.concat(r1)
|
|
break
|
|
case 'c':
|
|
const r2 = _.filter(regions, { countries: [code] })
|
|
acc = acc.concat(r2)
|
|
break
|
|
}
|
|
return acc
|
|
}, [])
|
|
.filter(i => i)
|
|
}
|