33 lines
1.0 KiB
TypeScript
33 lines
1.0 KiB
TypeScript
import { join, parse } from 'node:path'
|
|
import { createWriteStream } from 'node:fs'
|
|
import { lstat, unlink } from 'node:fs/promises'
|
|
import assert from 'node:assert'
|
|
import { $ } from 'execa'
|
|
import { makeFileRequest } from '@peertube/peertube-server-commands'
|
|
|
|
export const downloadFile = async (url: string, targetDirectory: string) => {
|
|
const { base } = parse(url)
|
|
const filePath = join(targetDirectory, base)
|
|
|
|
const fileStream = createWriteStream(filePath)
|
|
const stream = makeFileRequest(url).pipe(fileStream)
|
|
|
|
return await new Promise((resolve: (filePath: string) => void, reject) => {
|
|
stream.on('finish', () => resolve(filePath))
|
|
stream.on('error', async e => {
|
|
fileStream.close()
|
|
await unlink(filePath)
|
|
reject(e.message)
|
|
})
|
|
})
|
|
}
|
|
|
|
export const unzip = async (zipFilePath: string) => {
|
|
assert(await lstat(zipFilePath).then(stats => stats.isFile()), `${zipFilePath} isn't a file.`)
|
|
const { dir, name } = parse(zipFilePath)
|
|
|
|
await $`unzip -o ${zipFilePath} -d ${dir}`
|
|
|
|
return join(dir, name)
|
|
}
|