238 lines
4.8 KiB
JavaScript
238 lines
4.8 KiB
JavaScript
const categories = require('../data/categories')
|
|
const parser = require('./parser')
|
|
const utils = require('./utils')
|
|
const file = require('./file')
|
|
const epg = require('./epg')
|
|
|
|
const db = {}
|
|
|
|
db.load = async function () {
|
|
const files = await file.list()
|
|
const codes = await epg.codes.load()
|
|
for (const file of files) {
|
|
const playlist = await parser.parsePlaylist(file)
|
|
for (const channel of playlist.channels) {
|
|
const code = codes.find(ch => ch['tvg_id'] === channel.tvg.id)
|
|
if (code && Array.isArray(code.guides) && code.guides.length) {
|
|
channel.tvg.url = code.guides[0]
|
|
}
|
|
|
|
db.channels.add(channel)
|
|
|
|
for (const country of channel.countries) {
|
|
if (!db.countries.has(country)) {
|
|
db.countries.add(country)
|
|
}
|
|
}
|
|
|
|
for (const language of channel.languages) {
|
|
if (!db.languages.has(language)) {
|
|
db.languages.add(language)
|
|
}
|
|
}
|
|
}
|
|
|
|
db.playlists.add(playlist)
|
|
}
|
|
}
|
|
|
|
db.channels = {
|
|
list: [],
|
|
filter: null,
|
|
duplicates: true,
|
|
offline: true,
|
|
nsfw: true,
|
|
add(channel) {
|
|
this.list.push(channel)
|
|
},
|
|
get() {
|
|
let output
|
|
if (this.filter) {
|
|
switch (this.filter.field) {
|
|
case 'countries':
|
|
if (this.filter.value === 'undefined') {
|
|
output = this.list.filter(channel => !channel.countries.length)
|
|
} else {
|
|
output = this.list.filter(channel =>
|
|
channel.countries.map(c => c.code).includes(this.filter.value)
|
|
)
|
|
}
|
|
break
|
|
case 'languages':
|
|
if (this.filter.value === 'undefined') {
|
|
output = this.list.filter(channel => !channel.languages.length)
|
|
} else {
|
|
output = this.list.filter(channel =>
|
|
channel.languages.map(c => c.code).includes(this.filter.value)
|
|
)
|
|
}
|
|
break
|
|
case 'category':
|
|
if (this.filter.value === 'other') {
|
|
output = this.list.filter(channel => !channel.category)
|
|
} else {
|
|
output = this.list.filter(
|
|
channel => channel.category.toLowerCase() === this.filter.value
|
|
)
|
|
}
|
|
break
|
|
}
|
|
} else {
|
|
output = this.list
|
|
}
|
|
|
|
if (!this.duplicates) {
|
|
const buffer = []
|
|
output = output.filter(channel => {
|
|
if (buffer.includes(channel.hash)) return false
|
|
buffer.push(channel.hash)
|
|
|
|
return true
|
|
})
|
|
}
|
|
|
|
if (!this.nsfw) {
|
|
output = output.filter(channel => !channel.isNSFW())
|
|
}
|
|
|
|
if (!this.offline) {
|
|
output = output.filter(channel => channel.status !== 'Offline')
|
|
}
|
|
|
|
this.nsfw = true
|
|
this.duplicates = true
|
|
this.offline = true
|
|
this.filter = null
|
|
|
|
return output
|
|
},
|
|
removeDuplicates() {
|
|
this.duplicates = false
|
|
|
|
return this
|
|
},
|
|
removeNSFW() {
|
|
this.nsfw = false
|
|
|
|
return this
|
|
},
|
|
removeOffline() {
|
|
this.offline = false
|
|
|
|
return this
|
|
},
|
|
all() {
|
|
return this.list
|
|
},
|
|
forCountry(country) {
|
|
this.filter = {
|
|
field: 'countries',
|
|
value: country.code
|
|
}
|
|
|
|
return this
|
|
},
|
|
forLanguage(language) {
|
|
this.filter = {
|
|
field: 'languages',
|
|
value: language.code
|
|
}
|
|
|
|
return this
|
|
},
|
|
forCategory(category) {
|
|
this.filter = {
|
|
field: 'category',
|
|
value: category.id
|
|
}
|
|
|
|
return this
|
|
},
|
|
count() {
|
|
return this.get().length
|
|
},
|
|
sortBy(fields, order) {
|
|
this.list = utils.sortBy(this.list, fields, order)
|
|
|
|
return this
|
|
}
|
|
}
|
|
|
|
db.countries = {
|
|
list: [],
|
|
has(country) {
|
|
return this.list.map(c => c.code).includes(country.code)
|
|
},
|
|
add(country) {
|
|
this.list.push(country)
|
|
},
|
|
all() {
|
|
return this.list
|
|
},
|
|
count() {
|
|
return this.list.length
|
|
},
|
|
sortBy(fields, order) {
|
|
this.list = utils.sortBy(this.list, fields, order)
|
|
|
|
return this
|
|
}
|
|
}
|
|
|
|
db.languages = {
|
|
list: [],
|
|
has(language) {
|
|
return this.list.map(c => c.code).includes(language.code)
|
|
},
|
|
add(language) {
|
|
this.list.push(language)
|
|
},
|
|
all() {
|
|
return this.list
|
|
},
|
|
count() {
|
|
return this.list.length
|
|
},
|
|
sortBy(fields, order) {
|
|
this.list = utils.sortBy(this.list, fields, order)
|
|
|
|
return this
|
|
}
|
|
}
|
|
|
|
db.categories = {
|
|
list: categories,
|
|
all() {
|
|
return this.list
|
|
},
|
|
count() {
|
|
return this.list.length
|
|
}
|
|
}
|
|
|
|
db.playlists = {
|
|
list: [],
|
|
add(playlist) {
|
|
this.list.push(playlist)
|
|
},
|
|
all() {
|
|
return this.list
|
|
},
|
|
only(list = []) {
|
|
return this.list.filter(playlist => list.includes(playlist.filename))
|
|
},
|
|
except(list = []) {
|
|
return this.list.filter(playlist => !list.includes(playlist.filename))
|
|
},
|
|
sortBy(fields, order) {
|
|
this.list = utils.sortBy(this.list, fields, order)
|
|
|
|
return this
|
|
},
|
|
count() {
|
|
return this.list.length
|
|
}
|
|
}
|
|
|
|
module.exports = db
|