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: `
{{item.flag}} {{item.name}}
Name TVG-ID EPG
` } 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')