@lynker-desktop/electron-sdk 0.0.9-alpha.51 → 0.0.9-alpha.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/main/index.d.ts +2 -98
- package/esm/main/index.d.ts.map +1 -1
- package/esm/main/index.js +4 -687
- package/esm/main/index.js.map +1 -1
- package/esm/main/resource-cache.d.ts +164 -0
- package/esm/main/resource-cache.d.ts.map +1 -0
- package/esm/main/resource-cache.js +612 -0
- package/esm/main/resource-cache.js.map +1 -0
- package/esm/main/video-downloader.d.ts +39 -0
- package/esm/main/video-downloader.d.ts.map +1 -0
- package/esm/main/video-downloader.js +505 -0
- package/esm/main/video-downloader.js.map +1 -0
- package/main/index.d.ts +2 -98
- package/main/index.d.ts.map +1 -1
- package/main/index.js +11 -699
- package/main/index.js.map +1 -1
- package/main/resource-cache.d.ts +164 -0
- package/main/resource-cache.d.ts.map +1 -0
- package/main/resource-cache.js +612 -0
- package/main/resource-cache.js.map +1 -0
- package/main/video-downloader.d.ts +39 -0
- package/main/video-downloader.d.ts.map +1 -0
- package/main/video-downloader.js +510 -0
- package/main/video-downloader.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-downloader.js","sources":["../../src/main/video-downloader.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport http from 'node:http';\nimport https from 'node:https';\nimport { spawn } from 'node:child_process';\nimport { app } from 'electron';\nimport md5 from 'md5';\nimport type { VideoDownloadOptions, VideoProgressCallback, VideoDownloadResult } from '../common';\n\n/**\n * 生成跨平台的文件URL\n * @param filePath 文件路径\n * @returns file:// URL\n */\nexport function getFileUrl(filePath: string): string {\n if (!filePath) {\n return '';\n }\n if (filePath.startsWith('file://')) {\n return filePath;\n }\n // 在Windows上,需要添加驱动器字母前的斜杠\n if (process.platform === 'win32') {\n // 如果路径是绝对路径(如 C:\\path\\to\\file),转换为 /C:/path/to/file\n if (filePath.match(/^[A-Za-z]:/)) {\n return `file:///${filePath}`;\n }\n // 如果已经是 /C:/path/to/file 格式,直接添加 file://\n return `file://${filePath}`;\n }\n\n // macOS 和 Linux 使用 file:/// 前缀\n return `file://${filePath}`;\n}\n\n/**\n * 视频下载和转码类\n */\nclass VideoDownloader {\n private ffmpegPath: string = '';\n private static instance: VideoDownloader;\n private defaultCacheTTL: number = 24 * 60 * 60 * 1000; // 24小时缓存有效期\n\n static getInstance(): VideoDownloader {\n if (!VideoDownloader.instance) {\n VideoDownloader.instance = new VideoDownloader();\n }\n return VideoDownloader.instance;\n }\n\n setFFmpegPath(ffmpegPath: string): void {\n this.ffmpegPath = ffmpegPath;\n }\n\n /**\n * 下载视频文件\n */\n private async downloadVideoFile(\n url: string,\n outputPath: string,\n onProgress?: (progress: { downloaded: number; total: number; percentage: number; speed: number }) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const lib = url.startsWith('https') ? https : http;\n const file = fs.createWriteStream(outputPath);\n let downloadedBytes = 0;\n let totalBytes = 0;\n let startTime = Date.now();\n let lastTime = startTime;\n let lastBytes = 0;\n\n const cleanup = () => {\n if (file) {\n file.close();\n fs.unlinkSync(outputPath);\n }\n };\n\n const request = lib.get(url, (res) => {\n if (res.statusCode !== 200) {\n cleanup();\n reject(new Error(`下载失败,状态码: ${res.statusCode}`));\n return;\n }\n\n totalBytes = parseInt(res.headers['content-length'] || '0', 10);\n\n res.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const now = Date.now();\n\n if (onProgress && (now - lastTime > 100 || downloadedBytes === totalBytes)) {\n const speed = ((downloadedBytes - lastBytes) * 1000) / (now - lastTime);\n onProgress({\n downloaded: downloadedBytes,\n total: totalBytes,\n percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,\n speed: speed || 0\n });\n lastTime = now;\n lastBytes = downloadedBytes;\n }\n });\n\n res.pipe(file);\n\n file.on('finish', () => {\n file.close();\n resolve();\n });\n\n file.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n\n request.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n }\n\n /**\n * 使用FFmpeg转码视频\n */\n private async transcodeVideo(\n inputPath: string,\n outputPath: string,\n options: VideoDownloadOptions,\n onProgress?: (progress: { percentage: number; time: number; speed: number }) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const ffmpegPath = options.ffmpegPath || this.ffmpegPath;\n if (!ffmpegPath) {\n reject(new Error('FFmpeg路径未设置'));\n return;\n }\n const format = options.format || 'mp4';\n const quality = options.quality || 18;\n const videoCodec = options.videoCodec || 'h264';\n const audioCodec = options.audioCodec || 'aac';\n\n // 根据格式选择合适的编码器\n const getCodecForFormat = (format: string, videoCodec: string, audioCodec: string) => {\n switch (format) {\n case 'webm':\n return {\n videoCodec: videoCodec === 'h264' ? 'libvpx-vp9' : videoCodec,\n audioCodec: audioCodec === 'aac' ? 'libopus' : audioCodec\n };\n case 'avi':\n return {\n videoCodec: videoCodec === 'h265' ? 'h264' : videoCodec, // AVI不支持H265\n audioCodec: audioCodec === 'opus' ? 'mp3' : audioCodec\n };\n case 'mov':\n return {\n videoCodec: videoCodec === 'vp9' ? 'h264' : videoCodec, // MOV对VP9支持有限\n audioCodec: audioCodec === 'opus' ? 'aac' : audioCodec\n };\n default: // mp4, mkv\n return { videoCodec, audioCodec };\n }\n };\n\n const { videoCodec: finalVideoCodec, audioCodec: finalAudioCodec } = getCodecForFormat(format, videoCodec, audioCodec);\n\n // 构建FFmpeg命令\n const args = [\n '-i', inputPath,\n '-c:v', finalVideoCodec,\n '-c:a', finalAudioCodec,\n '-crf', quality.toString(),\n '-preset', 'medium',\n '-f', format, // 指定输出格式\n '-y', // 覆盖输出文件\n outputPath\n ];\n\n const ffmpegProcess = spawn(ffmpegPath, args);\n let duration = 0;\n let stderr = '';\n\n ffmpegProcess.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n\n // 解析FFmpeg输出获取进度\n if (onProgress) {\n const durationMatch = stderr.match(/Duration: (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (durationMatch && duration === 0) {\n const hours = parseInt(durationMatch[1] || '0', 10);\n const minutes = parseInt(durationMatch[2] || '0', 10);\n const seconds = parseInt(durationMatch[3] || '0', 10);\n const centiseconds = parseInt(durationMatch[4] || '0', 10);\n duration = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n }\n\n const timeMatch = stderr.match(/time=(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (timeMatch && duration > 0) {\n const hours = parseInt(timeMatch[1] || '0', 10);\n const minutes = parseInt(timeMatch[2] || '0', 10);\n const seconds = parseInt(timeMatch[3] || '0', 10);\n const centiseconds = parseInt(timeMatch[4] || '0', 10);\n const currentTime = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n\n const percentage = (currentTime / duration) * 100;\n const speedMatch = stderr.match(/speed=([\\d.]+)x/);\n const speed = speedMatch ? parseFloat(speedMatch[1] || '1') : 1;\n\n onProgress({\n percentage: Math.min(percentage, 100),\n time: currentTime,\n speed: speed\n });\n }\n }\n });\n\n ffmpegProcess.on('close', (code: number) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`FFmpeg转码失败,退出码: ${code}\\n${stderr}`));\n }\n });\n\n ffmpegProcess.on('error', (err: Error) => {\n reject(new Error(`FFmpeg执行失败: ${err.message}`));\n });\n });\n }\n\n /**\n * 检查FFmpeg是否可用\n */\n private async checkFFmpegAvailable(ffmpegPath?: string): Promise<boolean> {\n return new Promise((resolve) => {\n const command = ffmpegPath || this.ffmpegPath;\n if (!command) {\n resolve(false);\n return;\n }\n const childProcess = spawn(command, ['-version']);\n childProcess.on('error', (error) => {\n console.log(\"checkFFmpegAvailable\", error);\n resolve(false);\n });\n childProcess.on('close', (code) => {\n console.log(\"checkFFmpegAvailable\", code);\n resolve(code === 0);\n });\n });\n }\n\n /**\n * 获取视频信息\n */\n private async getVideoInfo(inputPath: string, ffmpegPath?: string): Promise<{ duration: number; fileSize: number }> {\n return new Promise((resolve, reject) => {\n const ffmpegPath_cmd = ffmpegPath || this.ffmpegPath;\n const args = ['-i', inputPath, '-f', 'null', '-'];\n if (!ffmpegPath_cmd) {\n resolve({ duration: 0, fileSize: 0 });\n return;\n }\n const ffmpegProcess = spawn(ffmpegPath_cmd, args);\n let stderr = '';\n let duration = 0;\n\n ffmpegProcess.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n const durationMatch = stderr.match(/Duration: (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{2})/);\n if (durationMatch) {\n const hours = parseInt(durationMatch[1] || '0', 10);\n const minutes = parseInt(durationMatch[2] || '0', 10);\n const seconds = parseInt(durationMatch[3] || '0', 10);\n const centiseconds = parseInt(durationMatch[4] || '0', 10);\n duration = hours * 3600 + minutes * 60 + seconds + centiseconds / 100;\n }\n });\n\n ffmpegProcess.on('close', () => {\n const stats = fs.statSync(inputPath);\n resolve({\n duration,\n fileSize: stats.size\n });\n });\n\n ffmpegProcess.on('error', (err: Error) => {\n reject(err);\n });\n });\n }\n\n /**\n * 生成缓存文件名(基于URL的MD5)\n */\n private generateCacheFileName(options: VideoDownloadOptions): string {\n const format = options.format || 'mp4';\n const urlMd5 = md5(options.url);\n return `${urlMd5}.${format}`;\n }\n\n /**\n * 检查缓存文件是否存在\n */\n private isCacheFileExists(cacheFilePath: string): boolean {\n console.log('检查缓存文件是否存在: ', cacheFilePath);\n return fs.existsSync(cacheFilePath);\n }\n\n /**\n * 清理过期缓存文件\n */\n private cleanExpiredCacheFiles(outputDir: string, cacheTTL: number = this.defaultCacheTTL): void {\n try {\n const files = fs.readdirSync(outputDir);\n const now = Date.now();\n\n files.forEach(file => {\n const filePath = path.join(outputDir, file);\n try {\n const stats = fs.statSync(filePath);\n // 如果文件超过缓存时间,删除它\n if (now - stats.mtimeMs > cacheTTL) {\n fs.unlinkSync(filePath);\n console.log(`🧹 删除过期缓存文件: ${file}`);\n }\n } catch (error) {\n // 忽略单个文件错误\n }\n });\n } catch (error) {\n // 忽略目录读取错误\n }\n }\n\n /**\n * 下载并转码视频\n */\n async downloadAndTranscode(\n options: VideoDownloadOptions,\n callbacks?: VideoProgressCallback\n ): Promise<VideoDownloadResult> {\n try {\n const outputDir = options.outputDir || app.getPath('temp');\n // 获取缓存配置\n const cacheConfig = options.cache || { enabled: true, ttl: this.defaultCacheTTL };\n const cacheEnabled = cacheConfig.enabled !== false;\n const cacheTTL = cacheConfig.ttl || this.defaultCacheTTL;\n\n // 确保输出目录存在\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // 清理过期缓存文件\n this.cleanExpiredCacheFiles(outputDir, cacheTTL);\n\n // 生成缓存文件名\n const cacheFileName = this.generateCacheFileName(options);\n const cacheFilePath = path.join(outputDir, cacheFileName);\n\n // 如果启用缓存,检查缓存文件是否存在\n if (cacheEnabled && this.isCacheFileExists(cacheFilePath)) {\n console.log('🎯 命中缓存,直接返回缓存文件');\n\n // 获取文件信息\n const stats = fs.statSync(cacheFilePath);\n\n const result: VideoDownloadResult = {\n success: true,\n outputPath: getFileUrl(cacheFilePath),\n fileSize: stats.size,\n fromCache: true\n };\n\n callbacks?.onComplete?.({\n success: true,\n outputPath: result.outputPath\n });\n\n return result;\n }\n\n // 检查FFmpeg是否可用\n const ffmpegAvailable = await this.checkFFmpegAvailable(options.ffmpegPath);\n if (!ffmpegAvailable) {\n throw new Error('FFmpeg不可用,请确保已安装FFmpeg或提供正确的路径');\n }\n\n // 生成临时文件名和最终输出路径\n const fileName = options.outputName || md5(options.url);\n const format = options.format || 'mp4';\n const tempPath = path.join(outputDir, `${fileName}.temp`);\n const finalOutputPath = path.join(outputDir, `${fileName}.${format}`);\n const outputPath = cacheEnabled ? cacheFilePath : finalOutputPath;\n\n console.log('📥 开始下载视频...');\n // 下载视频\n await this.downloadVideoFile(\n options.url,\n tempPath,\n callbacks?.onDownloadProgress\n );\n\n console.log('🔄 开始转码视频...');\n // 转码视频\n await this.transcodeVideo(\n tempPath,\n outputPath,\n {\n ...options,\n outputDir\n },\n callbacks?.onTranscodeProgress\n );\n\n // 如果启用了缓存,将缓存文件复制到最终输出路径\n if (cacheEnabled && outputPath !== finalOutputPath) {\n fs.copyFileSync(outputPath, finalOutputPath);\n console.log('📋 缓存文件已复制到最终输出路径');\n }\n\n // 获取视频信息\n const videoInfo = await this.getVideoInfo(outputPath, options.ffmpegPath);\n\n // 清理临时文件\n if (!options.keepOriginal) {\n fs.unlinkSync(tempPath);\n }\n\n console.log('💾 文件已保存到缓存');\n\n const result: VideoDownloadResult = {\n success: true,\n outputPath: getFileUrl(cacheEnabled ? finalOutputPath : outputPath),\n originalPath: options.keepOriginal ? getFileUrl(tempPath) : undefined,\n duration: videoInfo.duration,\n fileSize: videoInfo.fileSize,\n fromCache: false\n };\n\n callbacks?.onComplete?.({\n success: true,\n outputPath: result.outputPath\n });\n\n return result;\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '未知错误';\n\n const result: VideoDownloadResult = {\n success: false,\n error: errorMessage\n };\n\n callbacks?.onComplete?.({\n success: false,\n error: errorMessage\n });\n\n return result;\n }\n }\n\n /**\n * 清除指定目录的所有缓存文件\n */\n clearCache(outputDir: string): void {\n try {\n const files = fs.readdirSync(outputDir);\n files.forEach(file => {\n const filePath = path.join(outputDir, file);\n try {\n fs.unlinkSync(filePath);\n } catch (error) {\n // 忽略单个文件删除错误\n }\n });\n console.log('🧹 缓存文件已清空');\n } catch (error) {\n console.log('⚠️ 清理缓存时发生错误:', error instanceof Error ? error.message : '未知错误');\n }\n }\n\n /**\n * 获取缓存统计信息\n */\n getCacheStats(outputDir: string): { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> } {\n try {\n const files = fs.readdirSync(outputDir);\n const entries = files.map(file => {\n const filePath = path.join(outputDir, file);\n try {\n const stats = fs.statSync(filePath);\n return {\n fileName: file,\n filePath: filePath,\n fileSize: stats.size,\n mtime: stats.mtimeMs\n };\n } catch {\n return null;\n }\n }).filter((entry): entry is { fileName: string; filePath: string; fileSize: number; mtime: number } => entry !== null);\n\n return {\n size: entries.length,\n entries\n };\n } catch (error) {\n return { size: 0, entries: [] };\n }\n }\n\n /**\n * 删除指定URL的缓存文件\n */\n removeCache(options: VideoDownloadOptions): boolean {\n try {\n const cacheFileName = this.generateCacheFileName(options);\n const cacheFilePath = path.join(options.outputDir, cacheFileName);\n\n if (fs.existsSync(cacheFilePath)) {\n fs.unlinkSync(cacheFilePath);\n console.log(`🗑️ 删除缓存文件: ${cacheFileName}`);\n return true;\n }\n return false;\n } catch (error) {\n console.log('⚠️ 删除缓存文件时发生错误:', error instanceof Error ? error.message : '未知错误');\n return false;\n }\n }\n}\n\n/**\n * 下载视频并转码\n * @param options 下载和转码选项\n * @param callbacks 进度回调\n * @returns 转码结果\n */\nexport const downloadVideo = async (\n options: VideoDownloadOptions,\n callbacks?: VideoProgressCallback\n): Promise<VideoDownloadResult> => {\n const downloader = VideoDownloader.getInstance();\n return downloader.downloadAndTranscode(options, callbacks);\n};\n\n/**\n * 清除指定目录的所有缓存文件\n */\nexport const clearVideoCache = (outputDir: string): void => {\n const downloader = VideoDownloader.getInstance();\n downloader.clearCache(outputDir);\n};\n\n/**\n * 获取缓存统计信息\n */\nexport const getVideoCacheStats = (outputDir: string): { size: number; entries: Array<{ fileName: string; filePath: string; fileSize: number; mtime: number }> } => {\n const downloader = VideoDownloader.getInstance();\n return downloader.getCacheStats(outputDir);\n};\n\n/**\n * 删除指定URL的缓存文件\n */\nexport const removeVideoCache = (options: VideoDownloadOptions): boolean => {\n const downloader = VideoDownloader.getInstance();\n return downloader.removeCache(options);\n};\n\n/**\n * 设置FFmpeg路径\n */\nexport const setFFmpegPath = (ffmpegPath: string): void => {\n const downloader = VideoDownloader.getInstance();\n downloader.setFFmpegPath(ffmpegPath);\n};\n\n"],"names":[],"mappings":"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"}
|
package/main/index.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import * as ipc from '@lynker-desktop/electron-ipc/main';
|
|
|
3
3
|
import * as windowManager from '@lynker-desktop/electron-window-manager/main';
|
|
4
4
|
import type { PreloadWebContentsConfig } from '@lynker-desktop/electron-window-manager/common';
|
|
5
5
|
import { type ServeOptions, type VideoDownloadOptions, type VideoProgressCallback, type VideoDownloadResult } from '../common';
|
|
6
|
+
import { ResourceCache, type ResourceCacheOptions } from './resource-cache';
|
|
7
|
+
export { ResourceCache, type ResourceCacheOptions };
|
|
6
8
|
export declare let isInitialized: boolean;
|
|
7
9
|
export interface SDK_TYPE {
|
|
8
10
|
ipc: typeof ipc.mainIPC;
|
|
@@ -51,116 +53,18 @@ export declare const registerProtocol: (protocol: string) => void;
|
|
|
51
53
|
* @returns
|
|
52
54
|
*/
|
|
53
55
|
export declare const serve: (options: ServeOptions) => Promise<unknown>;
|
|
54
|
-
/**
|
|
55
|
-
* 资源缓存配置项
|
|
56
|
-
*/
|
|
57
|
-
export interface ResourceCacheOptions {
|
|
58
|
-
/** 缓存目录,必填 */
|
|
59
|
-
cacheDir: string;
|
|
60
|
-
/** 缓存有效期(毫秒),默认24小时 */
|
|
61
|
-
cacheTTL?: number;
|
|
62
|
-
/** 匹配需要缓存的资源,支持正则或函数 */
|
|
63
|
-
match?: RegExp | ((url: string) => boolean);
|
|
64
|
-
/** 允许缓存的资源来源,支持null/数组/函数 */
|
|
65
|
-
allowedOrigins?: null | string[] | ((url: string) => boolean);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* 资源缓存类:拦截并缓存静态资源,提升加载性能
|
|
69
|
-
*/
|
|
70
|
-
export declare class ResourceCache {
|
|
71
|
-
static scheme: string;
|
|
72
|
-
private cacheHost;
|
|
73
|
-
/** Electron session 实例 */
|
|
74
|
-
private session;
|
|
75
|
-
/** 缓存配置 */
|
|
76
|
-
private options;
|
|
77
|
-
/**
|
|
78
|
-
* 构造函数
|
|
79
|
-
* @param session Electron session
|
|
80
|
-
* @param options 缓存配置
|
|
81
|
-
*/
|
|
82
|
-
constructor(session: Electron.Session, options: ResourceCacheOptions);
|
|
83
|
-
/**
|
|
84
|
-
* 获取资源匹配函数
|
|
85
|
-
*/
|
|
86
|
-
private _getMatchFunction;
|
|
87
|
-
/**
|
|
88
|
-
* 获取来源校验函数
|
|
89
|
-
*/
|
|
90
|
-
private _getOriginAllowFunction;
|
|
91
|
-
/**
|
|
92
|
-
* 获取缓存文件路径
|
|
93
|
-
* @param url 资源URL
|
|
94
|
-
*/
|
|
95
|
-
getCachedPath(url: string): {
|
|
96
|
-
filePath: string;
|
|
97
|
-
hostPath: string;
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* 判断缓存是否有效
|
|
101
|
-
* @param filePath 缓存文件路径
|
|
102
|
-
*/
|
|
103
|
-
isCacheValid(filePath: string): boolean;
|
|
104
|
-
/**
|
|
105
|
-
* 下载资源到本地缓存
|
|
106
|
-
* @param url 资源URL
|
|
107
|
-
* @param filePath 本地缓存路径
|
|
108
|
-
*/
|
|
109
|
-
downloadResource(url: string, filePath: string): void;
|
|
110
|
-
/**
|
|
111
|
-
* 清理过期缓存文件
|
|
112
|
-
*/
|
|
113
|
-
private _cleanOldCache;
|
|
114
|
-
/**
|
|
115
|
-
* 注册 Electron 请求拦截器,实现资源缓存
|
|
116
|
-
*/
|
|
117
|
-
private _registerInterceptor;
|
|
118
|
-
}
|
|
119
56
|
/**
|
|
120
57
|
* @electron/remote/main enable方法
|
|
121
58
|
* @param webContents
|
|
122
59
|
* @returns
|
|
123
60
|
*/
|
|
124
61
|
export declare const enable: (webContents: WebContents) => void;
|
|
125
|
-
/**
|
|
126
|
-
* 生成跨平台的文件URL
|
|
127
|
-
* @param filePath 文件路径
|
|
128
|
-
* @returns file:// URL
|
|
129
|
-
*/
|
|
130
|
-
export declare function getFileUrl(filePath: string): string;
|
|
131
62
|
/**
|
|
132
63
|
* 获取随机UUID
|
|
133
64
|
* @param key
|
|
134
65
|
* @returns
|
|
135
66
|
*/
|
|
136
67
|
export declare function getRandomUUID(key?: string): string;
|
|
137
|
-
/**
|
|
138
|
-
* 下载视频并转码
|
|
139
|
-
* @param options 下载和转码选项
|
|
140
|
-
* @param callbacks 进度回调
|
|
141
|
-
* @returns 转码结果
|
|
142
|
-
*/
|
|
143
|
-
export declare const downloadVideo: (options: VideoDownloadOptions, callbacks?: VideoProgressCallback) => Promise<VideoDownloadResult>;
|
|
144
|
-
/**
|
|
145
|
-
* 清除指定目录的所有缓存文件
|
|
146
|
-
*/
|
|
147
|
-
export declare const clearVideoCache: (outputDir: string) => void;
|
|
148
|
-
/**
|
|
149
|
-
* 获取缓存统计信息
|
|
150
|
-
*/
|
|
151
|
-
export declare const getVideoCacheStats: (outputDir: string) => {
|
|
152
|
-
size: number;
|
|
153
|
-
entries: Array<{
|
|
154
|
-
fileName: string;
|
|
155
|
-
filePath: string;
|
|
156
|
-
fileSize: number;
|
|
157
|
-
mtime: number;
|
|
158
|
-
}>;
|
|
159
|
-
};
|
|
160
|
-
/**
|
|
161
|
-
* 删除指定URL的缓存文件
|
|
162
|
-
*/
|
|
163
|
-
export declare const removeVideoCache: (options: VideoDownloadOptions) => boolean;
|
|
164
68
|
/**
|
|
165
69
|
* 获取定制Session
|
|
166
70
|
*/
|
package/main/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAS3C,OAAO,KAAK,GAAG,MAAM,mCAAmC,CAAA;AAExD,OAAO,KAAK,aAAa,MAAM,8CAA8C,CAAA;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAA;AAC9F,OAAO,EAAuB,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,mBAAmB,EAAqB,MAAM,WAAW,CAAC;AAGvK,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,CAAC;AAMpD,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC;IAC5C,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,SAAS,CAAC,EAAE,qBAAqB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClH,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACrJ,gBAAgB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;CAC9D;AAkBD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,YAAa;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,QAqFlT,CAAA;AAED,YAAY;AACZ,eAAO,MAAM,MAAM,QAAO,QAOzB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,aAGT,MAAM,SAoDtB,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,KAAK,YAAa,YAAY,qBAsF1C,CAAA;AAGD;;;;GAIG;AACH,eAAO,MAAM,MAAM,gBAAiB,WAAW,SAA+B,CAAC;AAE/E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAwB,GAAG,MAAM,CAiBnE;AAGD;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAvVwB,SAC7C,OAsVsD,CAAC;AAE/D;;;GAGG;;AACH,wBAeG"}
|