diff --git a/helpers/update-readme.js b/helpers/update-readme.js
new file mode 100644
index 0000000000..0c523e5306
--- /dev/null
+++ b/helpers/update-readme.js
@@ -0,0 +1,151 @@
+const util = require('./util')
+const ISO6391 = require('iso-639-1')
+
+const debug = false
+const categories = util.supportedCategories.map(c => c.toLowerCase())
+let stats = {
+ countries: 0,
+ channels: 0
+}
+
+let languageBuffer = {
+ undefined: []
+}
+
+let categoryBuffer = {}
+categories.push('other')
+categories.forEach(category => {
+ categoryBuffer[category] = []
+})
+
+let repo = {
+ categories: {},
+ countries: {},
+ languages: {}
+}
+
+function main() {
+ console.log(`Parsing 'index.m3u'...`)
+ const playlist = util.parsePlaylist('index.m3u')
+ let countries = playlist.items
+ if(debug) {
+ console.log('Debug mode is turn on')
+ countries = countries.slice(0, 1)
+ }
+
+ for(let category of categories) {
+ const categoryName = util.supportedCategories.find(c => c.toLowerCase() === category) || 'Other'
+ repo.categories[category] = { category: categoryName, channels: 0, playlist: `https://iptv-org.github.io/iptv/${filename}
` }
+ }
+
+ for(let country of countries) {
+ console.log(`Parsing '${country.url}'...`)
+ const playlist = util.parsePlaylist(country.url)
+
+ const c = {
+ name: country.name,
+ code: util.getBasename(country.url).toUpperCase()
+ }
+
+ const epg = playlist.header.attrs['x-tvg-url'] ? `${playlist.header.attrs['x-tvg-url']}
` : ''
+ repo.countries[c.code] = { country: c.name, channels: playlist.items.length, playlist: `https://iptv-org.github.io/iptv/${country.url}
`, epg }
+
+ for(let item of playlist.items) {
+
+ let channel = util.createChannel(item)
+
+ let category = channel.group.toLowerCase()
+ if(categoryBuffer[category]) {
+ categoryBuffer[category].push(channel)
+ } else {
+ categoryBuffer['other'].push(channel)
+ }
+
+ let languageCode = ISO6391.getCode(channel.language)
+ if(languageCode) {
+ if(!languageBuffer[languageCode]) {
+ languageBuffer[languageCode] = []
+ }
+
+ languageBuffer[languageCode].push(channel)
+ } else {
+ languageBuffer['undefined'].push(channel)
+ }
+
+ stats.channels++
+ }
+
+ stats.countries++
+ }
+
+ for(const languageCode in languageBuffer) {
+ let languageName = ISO6391.getName(languageCode)
+ if(languageName) {
+ repo.languages[languageCode] = { language: languageName, channels: 0, playlist: `https://iptv-org.github.io/iptv/languages/${languageCode}.m3u
` }
+ }
+ }
+ repo.languages['undefined'] = { language: 'Undefined', channels: 0, playlist: `https://iptv-org.github.io/iptv/languages/undefined.m3u
` }
+
+ util.clearCache()
+ for(const languageCode in languageBuffer) {
+ let channels = util.sortByTitleAndUrl(languageBuffer[languageCode])
+ for(const channel of channels) {
+ if(!util.checkCache(channel.url)) {
+ util.addToCache(channel.url)
+ repo.languages[languageCode].channels++
+ }
+ }
+ }
+
+ util.clearCache()
+ for(const category in categoryBuffer) {
+ let channels = util.sortByTitleAndUrl(categoryBuffer[category])
+ for(const channel of channels) {
+ if(!util.checkCache(channel.url)) {
+ util.addToCache(channel.url)
+ repo.categories[category].channels++
+ }
+ }
+ }
+
+ const languages = Object.values(repo.languages)
+ const lastRow = languages.splice(languages.length - 1, 1)[0]
+ languages.sort((a, b) => {
+ if(a.language < b.language) { return -1 }
+ if(a.language > b.language) { return 1 }
+ return 0
+ })
+ languages.push(lastRow)
+
+ const languagesTable = util.generateTable(languages, {
+ columns: [
+ { name: 'Language', align: 'left' },
+ { name: 'Channels', align: 'right' },
+ { name: 'Playlist', align: 'left' }
+ ]
+ })
+ util.createFile('./helpers/languages.md', languagesTable)
+
+ const categoriesTable = util.generateTable(Object.values(repo.categories), {
+ columns: [
+ { name: 'Category', align: 'left' },
+ { name: 'Channels', align: 'right' },
+ { name: 'Playlist', align: 'left' }
+ ]
+ })
+ util.createFile('./helpers/categories.md', categoriesTable)
+
+ const countriesTable = util.generateTable(Object.values(repo.countries), {
+ columns: [
+ { name: 'Country', align: 'left' },
+ { name: 'Channels', align: 'right' },
+ { name: 'Playlist', align: 'left', nowrap: true },
+ { name: 'EPG', align: 'left' }
+ ]
+ })
+ util.createFile('./helpers/countries.md', countriesTable)
+}
+
+main()
+
+console.log(`Countries: ${stats.countries}. Channels: ${stats.channels}.`)