From 42d8a670d2c6445f0270640d4ff8c0388f77e8f4 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Sun, 12 Dec 2021 07:12:06 +0300 Subject: [PATCH] Create scripts/store/setters --- scripts/store/setters/categories.js | 8 ++++++++ scripts/store/setters/countries.js | 25 +++++++++++++++++++++++++ scripts/store/setters/guides.js | 3 +++ scripts/store/setters/index.js | 12 ++++++++++++ scripts/store/setters/is_broken.js | 7 +++++++ scripts/store/setters/is_nsfw.js | 3 +++ scripts/store/setters/languages.js | 12 ++++++++++++ scripts/store/setters/name.js | 10 ++++++++++ scripts/store/setters/regions.js | 22 ++++++++++++++++++++++ scripts/store/setters/resolution.js | 9 +++++++++ scripts/store/setters/src_country.js | 13 +++++++++++++ scripts/store/setters/status.js | 25 +++++++++++++++++++++++++ scripts/store/setters/url.js | 7 +++++++ 13 files changed, 156 insertions(+) create mode 100644 scripts/store/setters/categories.js create mode 100644 scripts/store/setters/countries.js create mode 100644 scripts/store/setters/guides.js create mode 100644 scripts/store/setters/index.js create mode 100644 scripts/store/setters/is_broken.js create mode 100644 scripts/store/setters/is_nsfw.js create mode 100644 scripts/store/setters/languages.js create mode 100644 scripts/store/setters/name.js create mode 100644 scripts/store/setters/regions.js create mode 100644 scripts/store/setters/resolution.js create mode 100644 scripts/store/setters/src_country.js create mode 100644 scripts/store/setters/status.js create mode 100644 scripts/store/setters/url.js diff --git a/scripts/store/setters/categories.js b/scripts/store/setters/categories.js new file mode 100644 index 0000000000..8dc50974bb --- /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 0000000000..b193911b8a --- /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 0000000000..0c0ff7296c --- /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 0000000000..436bea49a6 --- /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 0000000000..cf4cea231b --- /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 0000000000..886b850a69 --- /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 0000000000..a5ee56dcc3 --- /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 0000000000..d566053371 --- /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 0000000000..7016eecd1b --- /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 0000000000..1722e6aa2e --- /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 0000000000..6eaa9d4d30 --- /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 0000000000..463ac0d05b --- /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 0000000000..9951593992 --- /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, '+') +}