70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.7 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')
 | |
| 
 | |
| 	await api.countries.load()
 | |
| 	let countries = await api.countries.all()
 | |
| 	countries = _.keyBy(countries, 'code')
 | |
| 
 | |
| 	await api.subdivisions.load()
 | |
| 	let subdivisions = await api.subdivisions.all()
 | |
| 	subdivisions = _.keyBy(subdivisions, 'code')
 | |
| 
 | |
| 	let items = []
 | |
| 	streams.forEach(stream => {
 | |
| 		if (!stream.broadcast_area.length) {
 | |
| 			const item = _.cloneDeep(stream)
 | |
| 			item.group_title = 'Undefined'
 | |
| 			items.push(item)
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		const broadcastCountries = getBroadcastCountries(stream, { countries, regions, subdivisions })
 | |
| 		broadcastCountries.forEach(country => {
 | |
| 			const item = _.cloneDeep(stream)
 | |
| 			item.group_title = country.name
 | |
| 			items.push(item)
 | |
| 		})
 | |
| 	})
 | |
| 
 | |
| 	items = _.sortBy(items, item => {
 | |
| 		if (item.group_title === 'Undefined') return ''
 | |
| 
 | |
| 		return item.group_title
 | |
| 	})
 | |
| 
 | |
| 	return { filepath: 'index.country.m3u', items }
 | |
| }
 | |
| 
 | |
| function getBroadcastCountries(stream, { countries, regions, subdivisions }) {
 | |
| 	let codes = stream.broadcast_area.reduce((acc, item) => {
 | |
| 		const [type, code] = item.split('/')
 | |
| 		switch (type) {
 | |
| 			case 'c':
 | |
| 				acc.push(code)
 | |
| 				break
 | |
| 			case 'r':
 | |
| 				if (regions[code]) {
 | |
| 					acc = acc.concat(regions[code].countries)
 | |
| 				}
 | |
| 				break
 | |
| 			case 's':
 | |
| 				if (subdivisions[code]) {
 | |
| 					acc.push(subdivisions[code].country)
 | |
| 				}
 | |
| 				break
 | |
| 		}
 | |
| 		return acc
 | |
| 	}, [])
 | |
| 
 | |
| 	codes = _.uniq(codes)
 | |
| 
 | |
| 	return codes.map(code => countries[code]).filter(c => c)
 | |
| }
 |