mirror of
https://github.com/iptv-org/epg
synced 2026-03-21 19:30:52 -04:00
additional updates.
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -5,4 +5,9 @@
|
|||||||
/guide.xml.gz
|
/guide.xml.gz
|
||||||
|
|
||||||
# macOS
|
# macOS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
# If Yarn is used (yarn.lock)
|
||||||
|
/.yarn/*
|
||||||
|
.yarnrc
|
||||||
|
.yarnrc.yml
|
||||||
36
package-lock.json
generated
36
package-lock.json
generated
@@ -25,6 +25,7 @@
|
|||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/langs": "^2.0.5",
|
"@types/langs": "^2.0.5",
|
||||||
"@types/lodash": "^4.17.18",
|
"@types/lodash": "^4.17.18",
|
||||||
|
"@types/node": "^24.0.7",
|
||||||
"@types/node-cleanup": "^2.1.5",
|
"@types/node-cleanup": "^2.1.5",
|
||||||
"@types/numeral": "^2.0.5",
|
"@types/numeral": "^2.0.5",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
||||||
@@ -78,6 +79,7 @@
|
|||||||
"tough-cookie": "^5.1.2",
|
"tough-cookie": "^5.1.2",
|
||||||
"transliteration": "^2.3.5",
|
"transliteration": "^2.3.5",
|
||||||
"tsx": "^4.20.3",
|
"tsx": "^4.20.3",
|
||||||
|
"typescript": "^5.8.3",
|
||||||
"unzipit": "^1.4.3",
|
"unzipit": "^1.4.3",
|
||||||
"wildcard-match": "^5.1.4"
|
"wildcard-match": "^5.1.4"
|
||||||
}
|
}
|
||||||
@@ -3472,9 +3474,13 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.7.1",
|
"version": "24.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.7.tgz",
|
||||||
"integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg=="
|
"integrity": "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"undici-types": "~7.8.0"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/node-cleanup": {
|
"node_modules/@types/node-cleanup": {
|
||||||
"version": "2.1.5",
|
"version": "2.1.5",
|
||||||
@@ -11277,7 +11283,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
|
||||||
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
|
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
"tsserver": "bin/tsserver"
|
"tsserver": "bin/tsserver"
|
||||||
@@ -11295,6 +11300,12 @@
|
|||||||
"node": ">=20.18.1"
|
"node": ">=20.18.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/undici-types": {
|
||||||
|
"version": "7.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
|
||||||
|
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/universal-user-agent": {
|
"node_modules/universal-user-agent": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
||||||
@@ -13963,9 +13974,12 @@
|
|||||||
"integrity": "sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g=="
|
"integrity": "sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g=="
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "20.7.1",
|
"version": "24.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.7.tgz",
|
||||||
"integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg=="
|
"integrity": "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==",
|
||||||
|
"requires": {
|
||||||
|
"undici-types": "~7.8.0"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"@types/node-cleanup": {
|
"@types/node-cleanup": {
|
||||||
"version": "2.1.5",
|
"version": "2.1.5",
|
||||||
@@ -19223,14 +19237,18 @@
|
|||||||
"typescript": {
|
"typescript": {
|
||||||
"version": "5.8.3",
|
"version": "5.8.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
|
||||||
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
|
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"undici": {
|
"undici": {
|
||||||
"version": "7.10.0",
|
"version": "7.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/undici/-/undici-7.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici/-/undici-7.10.0.tgz",
|
||||||
"integrity": "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw=="
|
"integrity": "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw=="
|
||||||
},
|
},
|
||||||
|
"undici-types": {
|
||||||
|
"version": "7.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
|
||||||
|
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="
|
||||||
|
},
|
||||||
"universal-user-agent": {
|
"universal-user-agent": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
||||||
|
|||||||
23
package.json
23
package.json
@@ -3,15 +3,15 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"act:check": "act pull_request -W .github/workflows/check.yml",
|
"act:check": "act pull_request -W .github/workflows/check.yml",
|
||||||
"act:update": "act workflow_dispatch -W .github/workflows/update.yml",
|
"act:update": "act workflow_dispatch -W .github/workflows/update.yml",
|
||||||
"api:load": "npx tsx scripts/commands/api/load.ts",
|
"api:load": "tsx scripts/commands/api/load.ts",
|
||||||
"api:generate": "npx tsx scripts/commands/api/generate.ts",
|
"api:generate": "tsx scripts/commands/api/generate.ts",
|
||||||
"channels:lint": "npx tsx scripts/commands/channels/lint.mts",
|
"channels:lint": "tsx scripts/commands/channels/lint.mts",
|
||||||
"channels:parse": "npx tsx scripts/commands/channels/parse.ts",
|
"channels:parse": "tsx scripts/commands/channels/parse.ts",
|
||||||
"channels:edit": "npx tsx scripts/commands/channels/edit.ts",
|
"channels:edit": "tsx scripts/commands/channels/edit.ts",
|
||||||
"channels:validate": "npx tsx scripts/commands/channels/validate.ts",
|
"channels:validate": "tsx scripts/commands/channels/validate.ts",
|
||||||
"sites:init": "npx tsx scripts/commands/sites/init.ts",
|
"sites:init": "tsx scripts/commands/sites/init.ts",
|
||||||
"sites:update": "npx tsx scripts/commands/sites/update.ts",
|
"sites:update": "tsx scripts/commands/sites/update.ts",
|
||||||
"grab": "npx tsx scripts/commands/epg/grab.ts",
|
"grab": "tsx scripts/commands/epg/grab.ts",
|
||||||
"lint": "npx eslint \"{scripts,tests,sites}/**/*.{ts,mts,js}\"",
|
"lint": "npx eslint \"{scripts,tests,sites}/**/*.{ts,mts,js}\"",
|
||||||
"test": "cross-env TZ=Pacific/Nauru npx jest --runInBand",
|
"test": "cross-env TZ=Pacific/Nauru npx jest --runInBand",
|
||||||
"test:site": "cross-env TZ=Pacific/Nauru npx jest --runInBand --testPathPatterns",
|
"test:site": "cross-env TZ=Pacific/Nauru npx jest --runInBand --testPathPatterns",
|
||||||
@@ -55,6 +55,7 @@
|
|||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/langs": "^2.0.5",
|
"@types/langs": "^2.0.5",
|
||||||
"@types/lodash": "^4.17.18",
|
"@types/lodash": "^4.17.18",
|
||||||
|
"@types/node": "^24.0.7",
|
||||||
"@types/node-cleanup": "^2.1.5",
|
"@types/node-cleanup": "^2.1.5",
|
||||||
"@types/numeral": "^2.0.5",
|
"@types/numeral": "^2.0.5",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
||||||
@@ -108,7 +109,9 @@
|
|||||||
"tough-cookie": "^5.1.2",
|
"tough-cookie": "^5.1.2",
|
||||||
"transliteration": "^2.3.5",
|
"transliteration": "^2.3.5",
|
||||||
"tsx": "^4.20.3",
|
"tsx": "^4.20.3",
|
||||||
|
"typescript": "^5.8.3",
|
||||||
"unzipit": "^1.4.3",
|
"unzipit": "^1.4.3",
|
||||||
"wildcard-match": "^5.1.4"
|
"wildcard-match": "^5.1.4"
|
||||||
}
|
},
|
||||||
|
"packageManager": "yarn@4.9.2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ program
|
|||||||
.default(false)
|
.default(false)
|
||||||
.env('GZIP')
|
.env('GZIP')
|
||||||
)
|
)
|
||||||
.parse(process.argv)
|
.parse()
|
||||||
|
|
||||||
export type GrabOptions = {
|
export type GrabOptions = {
|
||||||
site?: string
|
site?: string
|
||||||
@@ -102,7 +102,10 @@ async function main() {
|
|||||||
runJob({ logger, parsedChannels })
|
runJob({ logger, parsedChannels })
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main().catch(error => {
|
||||||
|
console.error('ERR:', error.message)
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
|
|
||||||
async function runJob({ logger, parsedChannels }: { logger: Logger; parsedChannels: Collection }) {
|
async function runJob({ logger, parsedChannels }: { logger: Logger; parsedChannels: Collection }) {
|
||||||
const timer = new Timer()
|
const timer = new Timer()
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ export class Guide {
|
|||||||
const programs = this.programs
|
const programs = this.programs
|
||||||
|
|
||||||
const currDate = new DateTime(process.env.CURR_DATE || new Date().toISOString(), {
|
const currDate = new DateTime(process.env.CURR_DATE || new Date().toISOString(), {
|
||||||
zone: 'UTC'
|
timezone: 'UTC'
|
||||||
})
|
})
|
||||||
const xmltv = new XMLTV({
|
const xmltv = new XMLTV({
|
||||||
channels,
|
channels,
|
||||||
@@ -50,7 +50,7 @@ export class Guide {
|
|||||||
|
|
||||||
if (this.gzip) {
|
if (this.gzip) {
|
||||||
const zip = new Zip()
|
const zip = new Zip()
|
||||||
const compressed = await zip.compress(xmltv.toString())
|
const compressed = zip.compress(xmltv.toString())
|
||||||
const gzFilepath = `${this.filepath}.gz`
|
const gzFilepath = `${this.filepath}.gz`
|
||||||
const gzFilename = path.basename(gzFilepath)
|
const gzFilename = path.basename(gzFilepath)
|
||||||
this.logger.info(` saving to "${gzFilepath}"...`)
|
this.logger.info(` saving to "${gzFilepath}"...`)
|
||||||
|
|||||||
@@ -45,15 +45,15 @@ describe('epg:grab', () => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
const zip = new Zip()
|
const zip = new Zip()
|
||||||
const expected = await zip.decompress(fs.readFileSync('tests/__data__/output/guide.xml.gz'))
|
const expected = zip.decompress(fs.readFileSync('tests/__data__/output/guide.xml.gz'))
|
||||||
const result = await zip.decompress(
|
const result = zip.decompress(
|
||||||
fs.readFileSync('tests/__data__/expected/epg_grab/guide.xml.gz')
|
fs.readFileSync('tests/__data__/expected/epg_grab/guide.xml.gz')
|
||||||
)
|
)
|
||||||
expect(expected).toEqual(result)
|
expect(expected).toEqual(result)
|
||||||
}, 30000)
|
}, 30000)
|
||||||
|
|
||||||
it('can grab epg with wildcard as output', () => {
|
it('can grab epg with wildcard as output', () => {
|
||||||
const cmd = `${ENV_VAR} npm run grab --- --channels=tests/__data__/input/epg_grab/sites/example.com/example.com.channels.xml --output=tests/__data__/output/guides/{lang}/{site}.xml`
|
const cmd = `${ENV_VAR} npm run grab --- --channels="tests/__data__/input/epg_grab/sites/example.com/example.com.channels.xml" --output="tests/__data__/output/guides/{lang}/{site}.xml"`
|
||||||
const stdout = execSync(cmd, { encoding: 'utf8' })
|
const stdout = execSync(cmd, { encoding: 'utf8' })
|
||||||
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
|
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
|
||||||
|
|
||||||
@@ -97,11 +97,19 @@ describe('epg:grab', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('it will raise an error if the timeout is exceeded', () => {
|
it('it will raise an error if the timeout is exceeded', () => {
|
||||||
const cmd = `${ENV_VAR} npm run grab --- --channels=tests/__data__/input/epg_grab/custom.channels.xml --output=tests/__data__/output/guide.xml --timeout=100`
|
const cmd = `${ENV_VAR} npm run grab --- --channels=tests/__data__/input/epg_grab/custom.channels.xml --output=tests/__data__/output/guide.xml --timeout=0`
|
||||||
const stdout = execSync(cmd, { encoding: 'utf8' })
|
try {
|
||||||
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
|
const stdout = execSync(cmd, { encoding: 'utf8' })
|
||||||
|
expect(stdout).toContain('ERR: Connection timeout')
|
||||||
expect(stdout).toContain('ERR: Connection timeout')
|
} catch (error) {
|
||||||
|
// in the eventuality of an error that doesn't pipe in properly, check stdout and stderr.
|
||||||
|
const stderr = error.stderr?.toString() || ''
|
||||||
|
const stdout = error.stdout?.toString() || ''
|
||||||
|
const combined = stderr + stdout
|
||||||
|
|
||||||
|
if (process.env.DEBUG === 'true') console.log('Error output:', combined)
|
||||||
|
expect(combined).toContain('ERR: Connection timeout')
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
it('can grab epg via https proxy', () => {
|
it('can grab epg via https proxy', () => {
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
"./scripts/types"
|
"./scripts/types"
|
||||||
],
|
],
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"outDir": "./"
|
"outDir": "./dist"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*", "scripts/types/**/*"],
|
"include": ["scripts/**/*", "src/**/*"],
|
||||||
"exclude": ["node_modules", "dist"]
|
"exclude": ["node_modules", "dist"]
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user