mirror of
https://github.com/iptv-org/database.git
synced 2024-11-21 18:42:31 -05:00
Update scripts
This commit is contained in:
parent
0feb6b1e89
commit
f0cbc45e14
4 changed files with 29 additions and 34 deletions
17
scripts/core/idCreator.ts
Normal file
17
scripts/core/idCreator.ts
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
export class IDCreator {
|
||||||
|
create(name: string, country: string): string {
|
||||||
|
const slug = normalize(name)
|
||||||
|
const code = country.toLowerCase()
|
||||||
|
|
||||||
|
return `${slug}.${code}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalize(name: string) {
|
||||||
|
return name
|
||||||
|
.replace(/^@/gi, 'At')
|
||||||
|
.replace(/^&/i, 'And')
|
||||||
|
.replace(/\+/gi, 'Plus')
|
||||||
|
.replace(/\s-(\d)/gi, ' Minus$1')
|
||||||
|
.replace(/[^a-z\d]+/gi, '')
|
||||||
|
}
|
|
@ -2,3 +2,4 @@ export * from './csv'
|
||||||
export * from './issueParser'
|
export * from './issueParser'
|
||||||
export * from './issueLoader'
|
export * from './issueLoader'
|
||||||
export * from './csvParser'
|
export * from './csvParser'
|
||||||
|
export * from './idCreator'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { CSV, IssueLoader, CSVParser } from '../core'
|
import { CSV, IssueLoader, CSVParser, IDCreator } from '../core'
|
||||||
import { Channel, Blocked, Issue } from '../models'
|
import { Channel, Blocked, Issue } from '../models'
|
||||||
import { DATA_DIR } from '../constants'
|
import { DATA_DIR } from '../constants'
|
||||||
import { Storage, Collection } from '@freearhey/core'
|
import { Storage, Collection } from '@freearhey/core'
|
||||||
|
@ -8,6 +8,7 @@ let channels = new Collection()
|
||||||
const processedIssues = new Collection()
|
const processedIssues = new Collection()
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
|
const idCreator = new IDCreator()
|
||||||
const dataStorage = new Storage(DATA_DIR)
|
const dataStorage = new Storage(DATA_DIR)
|
||||||
const parser = new CSVParser()
|
const parser = new CSVParser()
|
||||||
|
|
||||||
|
@ -20,8 +21,8 @@ async function main() {
|
||||||
const loader = new IssueLoader()
|
const loader = new IssueLoader()
|
||||||
|
|
||||||
await removeChannels({ loader })
|
await removeChannels({ loader })
|
||||||
await editChannels({ loader })
|
await editChannels({ loader, idCreator })
|
||||||
await addChannels({ loader })
|
await addChannels({ loader, idCreator })
|
||||||
await blockChannels({ loader })
|
await blockChannels({ loader })
|
||||||
await unblockChannels({ loader })
|
await unblockChannels({ loader })
|
||||||
|
|
||||||
|
@ -65,7 +66,7 @@ async function removeChannels({ loader }: { loader: IssueLoader }) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function editChannels({ loader }: { loader: IssueLoader }) {
|
async function editChannels({ loader, idCreator }: { loader: IssueLoader; idCreator: IDCreator }) {
|
||||||
const issues = await loader.load({ labels: ['channels:edit,approved'] })
|
const issues = await loader.load({ labels: ['channels:edit,approved'] })
|
||||||
issues.forEach((issue: Issue) => {
|
issues.forEach((issue: Issue) => {
|
||||||
const data = issue.data
|
const data = issue.data
|
||||||
|
@ -80,7 +81,7 @@ async function editChannels({ loader }: { loader: IssueLoader }) {
|
||||||
if (data.has('name') || data.has('country')) {
|
if (data.has('name') || data.has('country')) {
|
||||||
const name = data.get('name') || found.name
|
const name = data.get('name') || found.name
|
||||||
const country = data.get('country') || found.country
|
const country = data.get('country') || found.country
|
||||||
channelId = generateChannelId(name, country)
|
channelId = idCreator.create(name, country)
|
||||||
}
|
}
|
||||||
|
|
||||||
found.update({
|
found.update({
|
||||||
|
@ -107,13 +108,13 @@ async function editChannels({ loader }: { loader: IssueLoader }) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function addChannels({ loader }: { loader: IssueLoader }) {
|
async function addChannels({ loader, idCreator }: { loader: IssueLoader; idCreator: IDCreator }) {
|
||||||
const issues = await loader.load({ labels: ['channels:add,approved'] })
|
const issues = await loader.load({ labels: ['channels:add,approved'] })
|
||||||
issues.forEach((issue: Issue) => {
|
issues.forEach((issue: Issue) => {
|
||||||
const data = issue.data
|
const data = issue.data
|
||||||
if (data.missing('name') || data.missing('country')) return
|
if (data.missing('name') || data.missing('country')) return
|
||||||
|
|
||||||
const channelId = generateChannelId(data.get('name'), data.get('country'))
|
const channelId = idCreator.create(data.get('name'), data.get('country'))
|
||||||
|
|
||||||
const found: Channel = channels.first((channel: Channel) => channel.id === channelId)
|
const found: Channel = channels.first((channel: Channel) => channel.id === channelId)
|
||||||
if (found) return
|
if (found) return
|
||||||
|
@ -182,13 +183,3 @@ async function blockChannels({ loader }: { loader: IssueLoader }) {
|
||||||
processedIssues.push(issue)
|
processedIssues.push(issue)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateChannelId(name: string, country: string): string {
|
|
||||||
const slug = name
|
|
||||||
.replace(/\+/gi, 'Plus')
|
|
||||||
.replace(/^@/gi, 'At')
|
|
||||||
.replace(/[^a-z\d]+/gi, '')
|
|
||||||
country = country.toLowerCase()
|
|
||||||
|
|
||||||
return `${slug}.${country}`
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
import { Collection, Storage, File, Dictionary, Logger } from '@freearhey/core'
|
import { Collection, Storage, File, Dictionary, Logger } from '@freearhey/core'
|
||||||
import { DATA_DIR } from '../constants'
|
import { DATA_DIR } from '../constants'
|
||||||
import { transliterate } from 'transliteration'
|
|
||||||
import { program } from 'commander'
|
import { program } from 'commander'
|
||||||
import Joi from 'joi'
|
import Joi from 'joi'
|
||||||
import { CSVParser } from '../core'
|
import { CSVParser, IDCreator } from '../core'
|
||||||
import chalk from 'chalk'
|
import chalk from 'chalk'
|
||||||
|
|
||||||
program.argument('[filepath]', 'Path to file to validate').parse(process.argv)
|
program.argument('[filepath]', 'Path to file to validate').parse(process.argv)
|
||||||
|
@ -217,28 +216,15 @@ function findDuplicatesBy(rows: { [key: string]: string }[], key: string) {
|
||||||
function validateChannelId(row: { [key: string]: string }, i: number) {
|
function validateChannelId(row: { [key: string]: string }, i: number) {
|
||||||
const errors = new Collection()
|
const errors = new Collection()
|
||||||
|
|
||||||
const name = normalize(row.name)
|
const expectedId = new IDCreator().create(row.name, row.country)
|
||||||
const code = row.country.toLowerCase()
|
|
||||||
const expected = `${name}.${code}`
|
|
||||||
|
|
||||||
if (expected !== row.id) {
|
if (expectedId !== row.id) {
|
||||||
errors.push({
|
errors.push({
|
||||||
line: i + 2,
|
line: i + 2,
|
||||||
message: `"${row.id}" must be derived from the channel name "${row.name}" and the country code "${row.country}"`
|
message: `"${row.id}" must be derived from the channel name "${row.name}" and the country code "${row.country}"`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function normalize(name: string) {
|
|
||||||
const translit = transliterate(name)
|
|
||||||
|
|
||||||
return translit
|
|
||||||
.replace(/^@/i, 'At')
|
|
||||||
.replace(/^&/i, 'And')
|
|
||||||
.replace(/\+/gi, 'Plus')
|
|
||||||
.replace(/\s-(\d)/gi, ' Minus$1')
|
|
||||||
.replace(/[^a-z\d]+/gi, '')
|
|
||||||
}
|
|
||||||
|
|
||||||
return errors
|
return errors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue