const ChannelItem = { props: ['channel'], template: `

` } const CountryItem = { components: { ChannelItem }, props: ['item', 'query'], data() { return { count: 0 } }, computed: { countryChannels() { if (!this.query) return this.item.channels return ( this.item.channels.filter(c => { return c.key.includes(this.query) }) || [] ) } }, watch: { countryChannels: function (value) { this.count = value.length } }, template: `
{{item.flag}} {{item.name}}
Name TVG-ID EPG
` } const App = { components: { CountryItem }, data() { return { isLoading: true, query: '', normQuery: '', items: [] } }, methods: { search() { this.normQuery = this.query.replace(/\s/g, '').toLowerCase() } }, async mounted() { const guides = await fetch('https://iptv-org.github.io/epg/api/channels.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.find(g => g.id === c.id) c.key = `${c.id}_${c.name}`.replace(/\s/g, '').toLowerCase() c.guides = found ? found.guides : [] 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')