mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-10 17:10:07 -04:00
115 lines
3 KiB
JavaScript
115 lines
3 KiB
JavaScript
const { Octokit } = require('@octokit/core')
|
|
const dayjs = require('dayjs')
|
|
const isToday = require('dayjs/plugin/isToday')
|
|
const utc = require('dayjs/plugin/utc')
|
|
const unzipit = require('unzipit')
|
|
const { file, logger } = require('../../core')
|
|
|
|
dayjs.extend(isToday)
|
|
dayjs.extend(utc)
|
|
|
|
const DB_DIR = process.env.DB_DIR || './scripts/database'
|
|
const programsPath = `${DB_DIR}/programs.db`
|
|
const queuePath = `${DB_DIR}/queue.db`
|
|
|
|
const octokit = new Octokit({
|
|
auth: process.env.GITHUB_TOKEN
|
|
})
|
|
|
|
async function main() {
|
|
try {
|
|
let workflows = await getWorkflows()
|
|
logger.info(`found ${workflows.length} workflows\r\n`)
|
|
|
|
await file.create(programsPath)
|
|
await file.create(queuePath)
|
|
const total = workflows.length
|
|
for (let [i, workflow] of workflows.entries()) {
|
|
logger.info(`[${i + 1}/${total}] ${workflow.name}`)
|
|
const run = await getWorkflowRun(workflow)
|
|
if (!run) continue
|
|
|
|
let artifact = await getRunArtifacts(run)
|
|
|
|
const programsBuffer = await downloadArtifact(artifact, 'programs.db')
|
|
await file.append(programsPath, programsBuffer)
|
|
|
|
const queueBuffer = await downloadArtifact(artifact, 'queue.db')
|
|
await file.append(queuePath, queueBuffer)
|
|
}
|
|
} catch (err) {
|
|
console.log(err.message)
|
|
}
|
|
}
|
|
|
|
main()
|
|
|
|
async function downloadArtifact(artifact, filename) {
|
|
let results = await octokit.request(
|
|
'GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}',
|
|
{
|
|
owner: 'iptv-org',
|
|
repo: 'epg',
|
|
artifact_id: artifact.id,
|
|
archive_format: 'zip'
|
|
}
|
|
)
|
|
|
|
const { entries } = await unzipit.unzip(results.data)
|
|
|
|
const arrayBuffer = await entries[filename].arrayBuffer()
|
|
|
|
return toString(arrayBuffer)
|
|
}
|
|
|
|
async function getRunArtifacts(run) {
|
|
let results = await octokit.request('GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts', {
|
|
owner: 'iptv-org',
|
|
repo: 'epg',
|
|
run_id: run.id
|
|
})
|
|
|
|
return results.data.artifacts.find(a => a.name === 'database')
|
|
}
|
|
|
|
async function getWorkflowRun(workflow) {
|
|
let today = dayjs.utc().subtract(1, 'd').format('YYYY-MM-DD')
|
|
let results = await octokit.request(
|
|
'GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs',
|
|
{
|
|
owner: 'iptv-org',
|
|
repo: 'epg',
|
|
workflow_id: workflow.id,
|
|
status: 'success',
|
|
created: `>=${today}`
|
|
}
|
|
)
|
|
|
|
return results.data.workflow_runs.find(
|
|
r => r.event === 'schedule' || r.event === 'workflow_dispatch'
|
|
)
|
|
}
|
|
|
|
async function getWorkflows() {
|
|
let workflows = []
|
|
for (let page of [1, 2, 3]) {
|
|
try {
|
|
let results = await octokit.request('GET /repos/{owner}/{repo}/actions/workflows', {
|
|
owner: 'iptv-org',
|
|
repo: 'epg',
|
|
per_page: 100,
|
|
page
|
|
})
|
|
|
|
workflows = workflows.concat(results.data.workflows)
|
|
} catch (err) {
|
|
console.log(err.message)
|
|
}
|
|
}
|
|
|
|
return workflows.filter(w => !/^_/.test(w.name) && w.name !== 'pages-build-deployment')
|
|
}
|
|
|
|
function toString(arrayBuffer) {
|
|
return new TextDecoder().decode(arrayBuffer)
|
|
}
|