diff --git a/scripts/store/setters/categories.js b/scripts/store/setters/categories.js
new file mode 100644
index 000000000..8dc50974b
--- /dev/null
+++ b/scripts/store/setters/categories.js
@@ -0,0 +1,8 @@
+const categories = require('../../data/categories')
+
+module.exports = function ({ group_title }) {
+  return group_title
+    .split(';')
+    .map(i => categories[i.toLowerCase()])
+    .filter(i => i)
+}
diff --git a/scripts/store/setters/countries.js b/scripts/store/setters/countries.js
new file mode 100644
index 000000000..b193911b8
--- /dev/null
+++ b/scripts/store/setters/countries.js
@@ -0,0 +1,25 @@
+const dataRegions = require('../../data/regions')
+const dataCountries = require('../../data/countries')
+
+module.exports = function ({ tvg_country, countries = [] }) {
+  if (tvg_country) {
+    return tvg_country
+      .split(';')
+      .reduce((acc, curr) => {
+        const region = dataRegions[curr]
+        if (region) {
+          for (let code of region.country_codes) {
+            if (!acc.includes(code)) acc.push(code)
+          }
+        } else {
+          acc.push(curr)
+        }
+
+        return acc
+      }, [])
+      .map(item => dataCountries[item])
+      .filter(i => i)
+  }
+
+  return countries
+}
diff --git a/scripts/store/setters/guides.js b/scripts/store/setters/guides.js
new file mode 100644
index 000000000..0c0ff7296
--- /dev/null
+++ b/scripts/store/setters/guides.js
@@ -0,0 +1,3 @@
+module.exports = function ({ tvg_url, guides = [] }) {
+  return tvg_url ? [tvg_url] : guides
+}
diff --git a/scripts/store/setters/index.js b/scripts/store/setters/index.js
new file mode 100644
index 000000000..436bea49a
--- /dev/null
+++ b/scripts/store/setters/index.js
@@ -0,0 +1,12 @@
+exports.categories = require('./categories')
+exports.countries = require('./countries')
+exports.guides = require('./guides')
+exports.is_broken = require('./is_broken')
+exports.is_nsfw = require('./is_nsfw')
+exports.languages = require('./languages')
+exports.name = require('./name')
+exports.regions = require('./regions')
+exports.resolution = require('./resolution')
+exports.src_country = require('./src_country')
+exports.status = require('./status')
+exports.url = require('./url')
diff --git a/scripts/store/setters/is_broken.js b/scripts/store/setters/is_broken.js
new file mode 100644
index 000000000..cf4cea231
--- /dev/null
+++ b/scripts/store/setters/is_broken.js
@@ -0,0 +1,7 @@
+module.exports = function ({ is_broken = false, status }) {
+  if (status) {
+    return status.level > 3 ? true : false
+  }
+
+  return is_broken
+}
diff --git a/scripts/store/setters/is_nsfw.js b/scripts/store/setters/is_nsfw.js
new file mode 100644
index 000000000..886b850a6
--- /dev/null
+++ b/scripts/store/setters/is_nsfw.js
@@ -0,0 +1,3 @@
+module.exports = function ({ categories }) {
+  return Array.isArray(categories) ? categories.filter(c => c.nsfw).length > 0 : false
+}
diff --git a/scripts/store/setters/languages.js b/scripts/store/setters/languages.js
new file mode 100644
index 000000000..a5ee56dcc
--- /dev/null
+++ b/scripts/store/setters/languages.js
@@ -0,0 +1,12 @@
+const langs = require('../../data/languages')
+
+module.exports = function ({ tvg_language, languages = [] }) {
+  if (tvg_language) {
+    return tvg_language
+      .split(';')
+      .map(name => langs.find(l => l.name === name))
+      .filter(i => i)
+  }
+
+  return languages
+}
diff --git a/scripts/store/setters/name.js b/scripts/store/setters/name.js
new file mode 100644
index 000000000..d56605337
--- /dev/null
+++ b/scripts/store/setters/name.js
@@ -0,0 +1,10 @@
+module.exports = function ({ title }) {
+  return title
+    .trim()
+    .split(' ')
+    .map(s => s.trim())
+    .filter(s => {
+      return !/\[|\]/i.test(s) && !/\((\d+)P\)/i.test(s)
+    })
+    .join(' ')
+}
diff --git a/scripts/store/setters/regions.js b/scripts/store/setters/regions.js
new file mode 100644
index 000000000..7016eecd1
--- /dev/null
+++ b/scripts/store/setters/regions.js
@@ -0,0 +1,22 @@
+const _ = require('lodash')
+
+let regions = require('../../data/regions')
+
+module.exports = function ({ countries }) {
+  if (!countries.length) return []
+
+  const output = []
+  regions = Object.values(regions)
+  countries.forEach(country => {
+    regions
+      .filter(region => region.country_codes.includes(country.code))
+      .forEach(found => {
+        output.push({
+          name: found.name,
+          code: found.code
+        })
+      })
+  })
+
+  return _.uniqBy(output, 'code')
+}
diff --git a/scripts/store/setters/resolution.js b/scripts/store/setters/resolution.js
new file mode 100644
index 000000000..1722e6aa2
--- /dev/null
+++ b/scripts/store/setters/resolution.js
@@ -0,0 +1,9 @@
+module.exports = function ({ title, resolution = {} }) {
+  if (title) {
+    const [_, h] = title.match(/\((\d+)P\)/i) || [null, null]
+
+    return h ? { height: parseInt(h), width: null } : resolution
+  }
+
+  return resolution
+}
diff --git a/scripts/store/setters/src_country.js b/scripts/store/setters/src_country.js
new file mode 100644
index 000000000..6eaa9d4d3
--- /dev/null
+++ b/scripts/store/setters/src_country.js
@@ -0,0 +1,13 @@
+const { file } = require('../../core')
+const countries = require('../../data/countries')
+
+module.exports = function ({ filepath }) {
+  if (filepath) {
+    const basename = file.basename(filepath)
+    const [_, code] = basename.match(/([a-z]{2})(|_.*)\.m3u/i) || [null, null]
+
+    return code ? countries[code.toUpperCase()] : null
+  }
+
+  return null
+}
diff --git a/scripts/store/setters/status.js b/scripts/store/setters/status.js
new file mode 100644
index 000000000..463ac0d05
--- /dev/null
+++ b/scripts/store/setters/status.js
@@ -0,0 +1,25 @@
+const statuses = require('../../data/statuses')
+
+module.exports = function ({ title, status = {} }) {
+  if (title) {
+    const [_, label] = title.match(/\[(.*)\]/i) || [null, null]
+
+    return Object.values(statuses).find(s => s.label === label) || statuses['online']
+  }
+
+  if (status) {
+    switch (status.code) {
+      case 'not_247':
+      case 'geo_blocked':
+        return status
+      case 'offline':
+        return statuses['not_247']
+      case 'timeout':
+        return statuses['timeout']
+      default:
+        return statuses['online']
+    }
+  }
+
+  return status
+}
diff --git a/scripts/store/setters/url.js b/scripts/store/setters/url.js
new file mode 100644
index 000000000..995159399
--- /dev/null
+++ b/scripts/store/setters/url.js
@@ -0,0 +1,7 @@
+const normalize = require('normalize-url')
+
+module.exports = function ({ url }) {
+  const normalized = normalize(url, { stripWWW: false })
+
+  return decodeURIComponent(normalized).replace(/\s/g, '+')
+}