const ChannelItem = {
props: ['channel'],
template: `
|
|
|
|
`
}
const CountryItem = {
components: {
ChannelItem
},
props: ['item', 'normQuery', 'regQuery'],
data() {
return {
count: 0
}
},
computed: {
countryChannels() {
if (!this.normQuery) return this.item.channels
return (
this.item.channels.filter(c => {
const normResult = c.key.includes(this.normQuery)
const regResult = this.regQuery
? this.regQuery.test(c.name) || this.regQuery.test(c.id)
: false
return normResult || regResult
}) || []
)
}
},
watch: {
countryChannels: function (value) {
this.count = value.length
}
},
template: `
`
}
const App = {
components: {
CountryItem
},
data() {
return {
isLoading: true,
query: '',
normQuery: '',
regQuery: null,
items: []
}
},
methods: {
search() {
this.normQuery = this.query.replace(/\s/g, '').toLowerCase()
this.regQuery = new RegExp(this.query)
}
},
async mounted() {
const guides = await fetch('api/guides.json')
.then(response => response.json())
.catch(console.log)
const channels = await fetch('https://iptv-org.github.io/api/channels.json')
.then(response => response.json())
.then(arr =>
arr.map(c => {
const found = guides.filter(g => g.channel === c.id)
c.key = `${c.id}_${c.name}`.replace(/\s/g, '').toLowerCase()
c.guides = found.map(f => f.url) || []
return c
})
)
.then(arr => _.groupBy(arr, 'country'))
.catch(console.log)
const countries = await fetch('https://iptv-org.github.io/api/countries.json')
.then(response => response.json())
.catch(console.log)
this.items = countries.map(i => {
i.expanded = false
i.channels = channels[i.code] || []
return i
})
this.isLoading = false
}
}
Vue.createApp(App).mount('#app')