Replace LF with CRLF

This commit is contained in:
freearhey
2025-10-09 03:20:46 +03:00
parent 4861c60b74
commit 60fde4cc8c
30 changed files with 3590 additions and 3588 deletions

View File

@@ -1,26 +1,26 @@
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import fs from 'fs-extra'
const ENV_VAR =
'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/input/api_generate API_DIR=tests/__data__/output/.api'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
})
describe('api:generate', () => {
it('can create streams.json', () => {
const cmd = `${ENV_VAR} npm run api:generate`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
expect(content('tests/__data__/output/.api/streams.json')).toMatchObject(
content('tests/__data__/expected/api_generate/.api/streams.json')
)
})
})
function content(filepath: string) {
return JSON.parse(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }))
}
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import fs from 'fs-extra'
const ENV_VAR =
'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/input/api_generate API_DIR=tests/__data__/output/.api'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
})
describe('api:generate', () => {
it('can create streams.json', () => {
const cmd = `${ENV_VAR} npm run api:generate`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
expect(content('tests/__data__/output/.api/streams.json')).toMatchObject(
content('tests/__data__/expected/api_generate/.api/streams.json')
)
})
})
function content(filepath: string) {
return JSON.parse(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }))
}

View File

@@ -1,38 +1,38 @@
import { execSync } from 'child_process'
import fs from 'fs-extra'
type ExecError = {
status: number
stdout: string
}
const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
fs.copySync(
'tests/__data__/input/playlist_edit/playlist.m3u',
'tests/__data__/output/playlist.m3u'
)
})
describe('playlist:edit', () => {
it('shows list of options for a streams', () => {
const cmd = `${ENV_VAR} npm run playlist:edit --- tests/__data__/output/playlist.m3u`
try {
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
checkStdout(stdout)
} catch (error) {
// NOTE: for Windows only
if (process.env.DEBUG === 'true') console.log(cmd, error)
checkStdout((error as ExecError).stdout)
}
})
})
function checkStdout(stdout: string) {
expect(stdout).toContain('TF1.fr (TF1, Télévision française 1)')
expect(stdout).toContain('Type...')
expect(stdout).toContain('Skip')
}
import { execSync } from 'child_process'
import fs from 'fs-extra'
type ExecError = {
status: number
stdout: string
}
const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
fs.copySync(
'tests/__data__/input/playlist_edit/playlist.m3u',
'tests/__data__/output/playlist.m3u'
)
})
describe('playlist:edit', () => {
it('shows list of options for a streams', () => {
const cmd = `${ENV_VAR} npm run playlist:edit --- tests/__data__/output/playlist.m3u`
try {
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
checkStdout(stdout)
} catch (error) {
// NOTE: for Windows only
if (process.env.DEBUG === 'true') console.log(cmd, error)
checkStdout((error as ExecError).stdout)
}
})
})
function checkStdout(stdout: string) {
expect(stdout).toContain('TF1.fr (TF1, Télévision française 1)')
expect(stdout).toContain('Type...')
expect(stdout).toContain('Skip')
}

View File

@@ -1,36 +1,37 @@
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import * as fs from 'fs-extra'
import { glob } from 'glob'
const ENV_VAR = 'cross-env STREAMS_DIR=tests/__data__/output/streams DATA_DIR=tests/__data__/input/data'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
fs.copySync('tests/__data__/input/playlist_format', 'tests/__data__/output/streams')
})
describe('playlist:format', () => {
it('can format playlists', () => {
const cmd = `${ENV_VAR} npm run playlist:format`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
const files = glob.sync('tests/__data__/expected/playlist_format/*.m3u').map(filepath => {
const fileUrl = pathToFileURL(filepath).toString()
const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_format/').toString()
return fileUrl.replace(pathToRemove, '')
})
files.forEach(filepath => {
expect(content(`tests/__data__/output/streams/${filepath}`)).toBe(
content(`tests/__data__/expected/playlist_format/${filepath}`)
)
})
})
})
function content(filepath: string) {
return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })
}
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import * as fs from 'fs-extra'
import { glob } from 'glob'
const ENV_VAR =
'cross-env STREAMS_DIR=tests/__data__/output/streams DATA_DIR=tests/__data__/input/data'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
fs.copySync('tests/__data__/input/playlist_format', 'tests/__data__/output/streams')
})
describe('playlist:format', () => {
it('can format playlists', () => {
const cmd = `${ENV_VAR} npm run playlist:format`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
const files = glob.sync('tests/__data__/expected/playlist_format/*.m3u').map(filepath => {
const fileUrl = pathToFileURL(filepath).toString()
const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_format/').toString()
return fileUrl.replace(pathToRemove, '')
})
files.forEach(filepath => {
expect(content(`tests/__data__/output/streams/${filepath}`)).toBe(
content(`tests/__data__/expected/playlist_format/${filepath}`)
)
})
})
})
function content(filepath: string) {
return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })
}

View File

@@ -1,43 +1,43 @@
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import { EOL } from 'node:os'
import * as fs from 'fs-extra'
import * as glob from 'glob'
const ENV_VAR =
'cross-env STREAMS_DIR=tests/__data__/input/playlist_generate DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output/.gh-pages LOGS_DIR=tests/__data__/output/logs'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
})
describe('playlist:generate', () => {
it('can generate playlists and logs', () => {
const cmd = `${ENV_VAR} npm run playlist:generate`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
const playlists = glob
.sync('tests/__data__/expected/playlist_generate/.gh-pages/**/*.m3u')
.map(filepath => {
const fileUrl = pathToFileURL(filepath).toString()
const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_generate/').toString()
return fileUrl.replace(pathToRemove, '')
})
playlists.forEach((filepath: string) => {
expect(content(`tests/__data__/output/${filepath}`), filepath).toBe(
content(`tests/__data__/expected/playlist_generate/${filepath}`)
)
})
expect(content('tests/__data__/output/logs/generators.log').split(EOL).sort()).toStrictEqual(
content('tests/__data__/expected/playlist_generate/logs/generators.log').split(EOL).sort()
)
})
})
function content(filepath: string) {
return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })
}
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import { EOL } from 'node:os'
import * as fs from 'fs-extra'
import * as glob from 'glob'
const ENV_VAR =
'cross-env STREAMS_DIR=tests/__data__/input/playlist_generate DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output/.gh-pages LOGS_DIR=tests/__data__/output/logs'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
})
describe('playlist:generate', () => {
it('can generate playlists and logs', () => {
const cmd = `${ENV_VAR} npm run playlist:generate`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
const playlists = glob
.sync('tests/__data__/expected/playlist_generate/.gh-pages/**/*.m3u')
.map(filepath => {
const fileUrl = pathToFileURL(filepath).toString()
const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_generate/').toString()
return fileUrl.replace(pathToRemove, '')
})
playlists.forEach((filepath: string) => {
expect(content(`tests/__data__/output/${filepath}`), filepath).toBe(
content(`tests/__data__/expected/playlist_generate/${filepath}`)
)
})
expect(content('tests/__data__/output/logs/generators.log').split(EOL).sort()).toStrictEqual(
content('tests/__data__/expected/playlist_generate/logs/generators.log').split(EOL).sort()
)
})
})
function content(filepath: string) {
return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })
}

View File

@@ -1,21 +1,21 @@
import { execSync } from 'child_process'
type ExecError = {
status: number
stdout: string
}
const ENV_VAR = 'cross-env ROOT_DIR=tests/__data__/input DATA_DIR=tests/__data__/input/data'
describe('playlist:test', () => {
it('shows an error if the playlist contains a broken link', () => {
const cmd = `${ENV_VAR} npm run playlist:test playlist_test/ag.m3u`
try {
execSync(cmd, { encoding: 'utf8' })
} catch (error) {
if (process.env.DEBUG === 'true') console.log(cmd, error)
expect((error as ExecError).stdout).toContain('playlist_test/ag.m3u')
expect((error as ExecError).stdout).toContain('2 problems (1 errors, 1 warnings)')
}
})
})
import { execSync } from 'child_process'
type ExecError = {
status: number
stdout: string
}
const ENV_VAR = 'cross-env ROOT_DIR=tests/__data__/input DATA_DIR=tests/__data__/input/data'
describe('playlist:test', () => {
it('shows an error if the playlist contains a broken link', () => {
const cmd = `${ENV_VAR} npm run playlist:test playlist_test/ag.m3u`
try {
execSync(cmd, { encoding: 'utf8' })
} catch (error) {
if (process.env.DEBUG === 'true') console.log(cmd, error)
expect((error as ExecError).stdout).toContain('playlist_test/ag.m3u')
expect((error as ExecError).stdout).toContain('2 problems (1 errors, 1 warnings)')
}
})
})

View File

@@ -1,44 +1,45 @@
import { execSync } from 'child_process'
type ExecError = {
status: number
stdout: string
}
const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data ROOT_DIR=tests/__data__/input/playlist_validate'
describe('playlist:validate', () => {
it('show an error if channel id in the blocklist', () => {
const cmd = `${ENV_VAR} npm run playlist:validate -- us_blocked.m3u`
try {
execSync(cmd, { encoding: 'utf8' })
} catch (error) {
if (process.env.DEBUG === 'true') console.log(cmd, error)
expect((error as ExecError).stdout).toContain('us_blocked.m3u')
expect((error as ExecError).stdout).toContain(
'2 error "FoxSports2.us" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0002)'
)
expect((error as ExecError).stdout).toContain(
'4 error "TVN.pl" is on the blocklist due to NSFW content (https://github.com/iptv-org/iptv/issues/0003)'
)
expect((error as ExecError).stdout).toContain('2 problems (2 errors, 0 warnings)')
}
})
it('show a warning if channel has wrong id', () => {
const cmd = `${ENV_VAR} npm run playlist:validate -- wrong_id.m3u`
try {
execSync(cmd, { encoding: 'utf8' })
} catch (error) {
if (process.env.DEBUG === 'true') console.log(cmd, error)
expect((error as ExecError).stdout).toContain(
'wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n'
)
}
})
it('skip the file if it does not exist', () => {
const cmd = `${ENV_VAR} npm run playlist:validate -- missing.m3u`
execSync(cmd, { encoding: 'utf8' })
})
})
import { execSync } from 'child_process'
type ExecError = {
status: number
stdout: string
}
const ENV_VAR =
'cross-env DATA_DIR=tests/__data__/input/data ROOT_DIR=tests/__data__/input/playlist_validate'
describe('playlist:validate', () => {
it('show an error if channel id in the blocklist', () => {
const cmd = `${ENV_VAR} npm run playlist:validate -- us_blocked.m3u`
try {
execSync(cmd, { encoding: 'utf8' })
} catch (error) {
if (process.env.DEBUG === 'true') console.log(cmd, error)
expect((error as ExecError).stdout).toContain('us_blocked.m3u')
expect((error as ExecError).stdout).toContain(
'2 error "FoxSports2.us" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0002)'
)
expect((error as ExecError).stdout).toContain(
'4 error "TVN.pl" is on the blocklist due to NSFW content (https://github.com/iptv-org/iptv/issues/0003)'
)
expect((error as ExecError).stdout).toContain('2 problems (2 errors, 0 warnings)')
}
})
it('show a warning if channel has wrong id', () => {
const cmd = `${ENV_VAR} npm run playlist:validate -- wrong_id.m3u`
try {
execSync(cmd, { encoding: 'utf8' })
} catch (error) {
if (process.env.DEBUG === 'true') console.log(cmd, error)
expect((error as ExecError).stdout).toContain(
'wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n'
)
}
})
it('skip the file if it does not exist', () => {
const cmd = `${ENV_VAR} npm run playlist:validate -- missing.m3u`
execSync(cmd, { encoding: 'utf8' })
})
})

View File

@@ -1,26 +1,26 @@
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import fs from 'fs-extra'
const ENV_VAR =
'cross-env DATA_DIR=tests/__data__/input/data LOGS_DIR=tests/__data__/input/readme_update ROOT_DIR=tests/__data__/output'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
})
describe('readme:update', () => {
it('can update readme.md', () => {
const cmd = `${ENV_VAR} npm run readme:update`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
expect(content('tests/__data__/output/PLAYLISTS.md')).toEqual(
content('tests/__data__/expected/readme_update/playlists.md')
)
})
})
function content(filepath: string) {
return JSON.stringify(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }))
}
import { pathToFileURL } from 'node:url'
import { execSync } from 'child_process'
import fs from 'fs-extra'
const ENV_VAR =
'cross-env DATA_DIR=tests/__data__/input/data LOGS_DIR=tests/__data__/input/readme_update ROOT_DIR=tests/__data__/output'
beforeEach(() => {
fs.emptyDirSync('tests/__data__/output')
})
describe('readme:update', () => {
it('can update readme.md', () => {
const cmd = `${ENV_VAR} npm run readme:update`
const stdout = execSync(cmd, { encoding: 'utf8' })
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
expect(content('tests/__data__/output/PLAYLISTS.md')).toEqual(
content('tests/__data__/expected/readme_update/playlists.md')
)
})
})
function content(filepath: string) {
return JSON.stringify(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }))
}