mes-engine 0.0.1 → 0.0.2

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/dist/index.js CHANGED
@@ -75,6 +75,7 @@ class StreamManager {
75
75
  }
76
76
  }
77
77
 
78
+ // engines/GStreamerEngine.ts
78
79
  class GStreamerEngine extends VideoEngine {
79
80
  async processChunk(inputPath, outputPath, startTime, quality) {
80
81
  return new Promise((resolve, reject) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/core/events.ts","../../src/core/VideoEngine.ts","../../src/engines/FFmpegEngine.ts","../../src/streaming/StreamManager.ts","../../src/engines/GStreamerEngine.ts","../../src/storage/StorageProvider.ts","../../src/storage/FileSystemStorage.ts","../../src/cache/cacheStrategy.ts","../../src/cache/LRU.ts","../../src/cache/internalCache.ts","../../src/cache/ExternalCache.ts","../../src/processor.ts"],"sourcesContent":["\r\nexport enum VideoEvent {\r\n CHUNK_PROCESSED = 'chunkProcessed',\r\n QUALITY_PROCESSED = 'qualityProcessed',\r\n PROCESSING_COMPLETE = 'processingComplete',\r\n ERROR = 'error'\r\n}\r\n","\r\n// core/VideoEngine.ts\r\nimport { EventEmitter } from 'events';\r\nimport { VideoConfig, QualityLevel, VideoManifest } from './types';\r\nimport { VideoEvent } from './events';\r\n\r\nexport abstract class VideoEngine extends EventEmitter {\r\n abstract processChunk(\r\n inputPath: string,\r\n outputPath: string,\r\n startTime: number,\r\n quality: QualityLevel\r\n ): Promise<void>;\r\n\r\n abstract getDuration(inputPath: string): Promise<number>;\r\n}","\r\n// engines/FFmpegEngine.ts\r\nimport { spawn } from 'child_process';\r\nimport { VideoEngine } from '../core/VideoEngine';\r\nimport { QualityLevel } from '../core/types';\r\n\r\nexport class FFmpegEngine extends VideoEngine {\r\n async processChunk(\r\n inputPath: string,\r\n outputPath: string,\r\n startTime: number,\r\n quality: QualityLevel\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const ffmpeg = spawn('ffmpeg', [\r\n '-i', inputPath,\r\n '-ss', startTime.toString(),\r\n '-t', '10',\r\n '-vf', `scale=-1:${quality.height}`,\r\n '-c:v', 'libx264',\r\n '-b:v', quality.bitrate,\r\n '-c:a', 'aac',\r\n '-b:a', '128k',\r\n '-preset', 'fast',\r\n '-y',\r\n outputPath\r\n ]);\r\n\r\n ffmpeg.on('close', code => {\r\n code === 0 ? resolve() : reject(new Error(`FFmpeg error: ${code}`));\r\n });\r\n });\r\n }\r\n\r\n async getDuration(inputPath: string): Promise<number> {\r\n return new Promise((resolve, reject) => {\r\n const ffprobe = spawn('ffprobe', [\r\n '-v', 'error',\r\n '-show_entries', 'format=duration',\r\n '-of', 'default=noprint_wrappers=1:nokey=1',\r\n inputPath\r\n ]);\r\n\r\n let output = '';\r\n ffprobe.stdout.on('data', data => output += data);\r\n ffprobe.on('close', code => {\r\n code === 0 ? resolve(parseFloat(output)) : reject(new Error(`FFprobe error: ${code}`));\r\n });\r\n });\r\n }\r\n}","\r\n// streaming/StreamManager.ts\r\nimport { Readable } from 'stream';\r\nimport { StorageProvider } from '../storage/StorageProvider';\r\n\r\nexport class StreamManager {\r\n private storage: StorageProvider;\r\n\r\n constructor(storage: StorageProvider) {\r\n this.storage = storage;\r\n }\r\n\r\n async createStream(chunkPath: string, range?: { start: number; end: number }): Promise<Readable> {\r\n const data = await this.storage.getChunk(chunkPath);\r\n const stream = new Readable();\r\n\r\n if (range) {\r\n stream.push(data.slice(range.start, range.end + 1));\r\n } else {\r\n stream.push(data);\r\n }\r\n\r\n stream.push(null);\r\n return stream;\r\n }\r\n}","import { spawn } from 'child_process';\r\nimport { VideoEngine } from '../core/VideoEngine';\r\nimport { QualityLevel } from '../core/types';\r\n\r\nexport class GStreamerEngine extends VideoEngine {\r\n async processChunk(\r\n inputPath: string,\r\n outputPath: string,\r\n startTime: number,\r\n quality: QualityLevel\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const gst = spawn('gst-launch-1.0', [\r\n 'filesrc', `location=${inputPath}`,\r\n '!', 'decodebin',\r\n '!', 'videoconvert',\r\n '!', 'videoscale',\r\n '!', `video/x-raw,width=-1,height=${quality.height}`,\r\n '!', 'x264enc', `bitrate=${quality.bitrate}`,\r\n '!', 'mp4mux', '!', 'filesink', `location=${outputPath}`\r\n ]);\r\n\r\n gst.on('close', code => {\r\n code === 0 ? resolve() : reject(new Error(`GStreamer error: ${code}`));\r\n });\r\n });\r\n }\r\n\r\n async getDuration(inputPath: string): Promise<number> {\r\n return new Promise((resolve, reject) => {\r\n const gst = spawn('gst-launch-1.0', [\r\n 'filesrc', `location=${inputPath}`,\r\n '!', 'decodebin',\r\n '!', 'identity', '-debug', 'duration'\r\n ]);\r\n\r\n let output = '';\r\n gst.stdout.on('data', data => output += data);\r\n gst.on('close', code => {\r\n code === 0 ? resolve(parseFloat(output)) : reject(new Error(`GStreamer error: ${code}`));\r\n });\r\n });\r\n }\r\n}\r\n","\r\n// storage/StorageProvider.ts\r\nexport abstract class StorageProvider {\r\n abstract saveChunk(chunkPath: string, data: Buffer): Promise<void>;\r\n abstract getChunk(chunkPath: string): Promise<Buffer>;\r\n abstract deleteChunk(chunkPath: string): Promise<void>;\r\n}","\r\n\r\n// storage/FileSystemStorage.ts\r\nimport { promises as fs } from 'fs';\r\nimport { StorageProvider } from './StorageProvider';\r\n\r\nexport class FileSystemStorage extends StorageProvider {\r\n async saveChunk(chunkPath: string, data: Buffer): Promise<void> {\r\n await fs.writeFile(chunkPath, data);\r\n }\r\n\r\n async getChunk(chunkPath: string): Promise<Buffer> {\r\n return fs.readFile(chunkPath);\r\n }\r\n\r\n async deleteChunk(chunkPath: string): Promise<void> {\r\n await fs.unlink(chunkPath);\r\n }\r\n}","\r\n// cache/CacheStrategy.ts\r\nexport interface CacheOptions {\r\n maxSize: number;\r\n ttl: number;\r\n preloadNextChunk: boolean;\r\n externalCacheUrl?: string;\r\n}\r\n\r\nexport abstract class CacheStrategy {\r\n abstract set(key: string, value: Buffer): Promise<void>;\r\n abstract get(key: string): Promise<Buffer | null>;\r\n abstract preload(key: string): Promise<void>;\r\n abstract clear(): Promise<void>;\r\n}","\r\n// cache/LRU.ts\r\nexport class LRU<T> {\r\n private maxSize: number;\r\n private cache: Map<string, T>;\r\n\r\n constructor(maxSize: number) {\r\n this.maxSize = maxSize;\r\n this.cache = new Map();\r\n }\r\n\r\n set(key: string, value: T): void {\r\n if (this.cache.has(key)) {\r\n this.cache.delete(key);\r\n } else if (this.cache.size >= this.maxSize) {\r\n const oldestKey = this.cache.keys().next().value;\r\n if (oldestKey !== undefined) {\r\n this.cache.delete(oldestKey);\r\n }\r\n }\r\n this.cache.set(key, value);\r\n }\r\n\r\n get(key: string): T | undefined {\r\n if (!this.cache.has(key)) return undefined;\r\n const value = this.cache.get(key)!;\r\n this.cache.delete(key);\r\n this.cache.set(key, value);\r\n return value;\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}","\r\n// cache/internalCache.ts\r\nimport { LRU } from './LRU';\r\nimport { CacheStrategy, CacheOptions } from './cacheStrategy';\r\nimport { StorageProvider } from '../storage/StorageProvider';\r\n\r\nexport class InternalCache extends CacheStrategy {\r\n private cache: LRU<Buffer>;\r\n private options: CacheOptions;\r\n private storage: StorageProvider;\r\n\r\n constructor(options: CacheOptions, storage: StorageProvider) {\r\n super();\r\n this.options = options;\r\n this.cache = new LRU(options.maxSize);\r\n this.storage = storage;\r\n }\r\n\r\n async set(key: string, value: Buffer): Promise<void> {\r\n this.cache.set(key, value);\r\n }\r\n\r\n async get(key: string): Promise<Buffer | null> {\r\n const cached = this.cache.get(key);\r\n if (cached) return cached;\r\n\r\n try {\r\n const data = await this.storage.getChunk(key);\r\n await this.set(key, data);\r\n return data;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n async preload(key: string): Promise<void> {\r\n if (this.options.preloadNextChunk) {\r\n const nextChunkKey = this.getNextChunkKey(key);\r\n if (!this.cache.get(nextChunkKey)) {\r\n try {\r\n const data = await this.storage.getChunk(nextChunkKey);\r\n await this.set(nextChunkKey, data);\r\n } catch {\r\n // Ignore preload failures\r\n }\r\n }\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n }\r\n\r\n private getNextChunkKey(currentKey: string): string {\r\n const parts = currentKey.split('_');\r\n const currentChunk = parseInt(parts[parts.length - 1]);\r\n parts[parts.length - 1] = (currentChunk + 1).toString();\r\n return parts.join('_');\r\n }\r\n}","\r\n// cache/ExternalCache.ts\r\nimport fetch from 'node-fetch';\r\nimport { CacheStrategy, CacheOptions } from './cacheStrategy';\r\n\r\nexport class ExternalCache extends CacheStrategy {\r\n private baseUrl: string;\r\n private options: CacheOptions;\r\n\r\n constructor(options: CacheOptions) {\r\n super();\r\n this.options = options;\r\n this.baseUrl = options.externalCacheUrl!;\r\n }\r\n\r\n async set(key: string, value: Buffer): Promise<void> {\r\n await fetch(`${this.baseUrl}/cache/${key}`, {\r\n method: 'POST',\r\n body: value,\r\n headers: {\r\n 'Content-Type': 'application/octet-stream',\r\n 'TTL': this.options.ttl.toString()\r\n }\r\n });\r\n }\r\n\r\n async get(key: string): Promise<Buffer | null> {\r\n const response = await fetch(`${this.baseUrl}/cache/${key}`);\r\n return response.ok ? Buffer.from(await response.arrayBuffer()) : null;\r\n }\r\n\r\n async preload(key: string): Promise<void> {\r\n if (this.options.preloadNextChunk) {\r\n const nextChunkKey = this.getNextChunkKey(key);\r\n await fetch(`${this.baseUrl}/preload/${nextChunkKey}`);\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n await fetch(`${this.baseUrl}/cache`, { method: 'DELETE' });\r\n }\r\n\r\n private getNextChunkKey(currentKey: string): string {\r\n const parts = currentKey.split('_');\r\n const currentChunk = parseInt(parts[parts.length - 1]);\r\n parts[parts.length - 1] = (currentChunk + 1).toString();\r\n return parts.join('_');\r\n }\r\n}","\r\n// processor.ts\r\nimport { VideoEngine } from './core/VideoEngine';\r\nimport { EventEmitter } from 'events';\r\nimport { StorageProvider } from './storage/StorageProvider';\r\nimport { StreamManager } from './streaming/StreamManager';\r\nimport { VideoConfig, VideoManifest } from './core/types';\r\nimport { join } from 'path';\r\nimport { promises as fs } from 'fs';\r\nimport { Readable } from 'stream';\r\nimport { VideoEvent } from './core/events';\r\n\r\nexport class VideoProcessor extends EventEmitter {\r\n private engine: VideoEngine;\r\n private streamManager: StreamManager;\r\n private config: VideoConfig;\r\n\r\n constructor(\r\n engine: VideoEngine,\r\n storage: StorageProvider,\r\n config: VideoConfig\r\n ) {\r\n super();\r\n this.engine = engine;\r\n this.streamManager = new StreamManager(storage);\r\n this.config = config;\r\n }\r\n\r\n async processVideo(inputPath: string): Promise<VideoManifest> {\r\n const videoId = await this.generateVideoId(inputPath);\r\n const manifest: VideoManifest = {\r\n videoId,\r\n qualities: this.config.defaultQualities,\r\n chunks: []\r\n };\r\n\r\n const duration = await this.engine.getDuration(inputPath);\r\n const chunks = Math.ceil(duration / this.config.chunkSize);\r\n\r\n for (const quality of this.config.defaultQualities) {\r\n for (let i = 0; i < chunks; i++) {\r\n const chunkPath = this.getChunkPath(videoId, quality.height, i);\r\n\r\n try {\r\n await this.engine.processChunk(\r\n inputPath,\r\n chunkPath,\r\n i * this.config.chunkSize,\r\n quality\r\n );\r\n\r\n manifest.chunks.push({\r\n quality: quality.height,\r\n number: i,\r\n path: chunkPath\r\n });\r\n\r\n this.emit(VideoEvent.CHUNK_PROCESSED, { quality, chunkNumber: i });\r\n } catch (error) {\r\n this.emit(VideoEvent.ERROR, error);\r\n throw error;\r\n }\r\n }\r\n\r\n this.emit(VideoEvent.QUALITY_PROCESSED, quality);\r\n }\r\n\r\n this.emit(VideoEvent.PROCESSING_COMPLETE, manifest);\r\n return manifest;\r\n }\r\n\r\n async streamChunk(\r\n videoId: string,\r\n quality: number,\r\n chunkNumber: number,\r\n range?: { start: number; end: number }\r\n ): Promise<Readable> {\r\n const chunkPath = this.getChunkPath(videoId, quality, chunkNumber);\r\n return this.streamManager.createStream(chunkPath, range);\r\n }\r\n\r\n private getChunkPath(videoId: string, quality: number, chunkNumber: number): string {\r\n return join(this.config.cacheDir, videoId, `${quality}p`, `chunk_${chunkNumber}.mp4`);\r\n }\r\n\r\n private async generateVideoId(inputPath: string): Promise<string> {\r\n const stats = await fs.stat(inputPath);\r\n return `${inputPath.split('/').pop()?.split('.')[0]}_${stats.mtimeMs}`;\r\n }\r\n}"],"names":["fs"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/core/events.ts","../../src/core/VideoEngine.ts","../../src/engines/FFmpegEngine.ts","../../src/streaming/StreamManager.ts","../../src/engines/GStreamerEngine.ts","../../src/storage/StorageProvider.ts","../../src/storage/FileSystemStorage.ts","../../src/cache/cacheStrategy.ts","../../src/cache/LRU.ts","../../src/cache/internalCache.ts","../../src/cache/ExternalCache.ts","../../src/processor.ts"],"sourcesContent":["\r\nexport enum VideoEvent {\r\n CHUNK_PROCESSED = 'chunkProcessed',\r\n QUALITY_PROCESSED = 'qualityProcessed',\r\n PROCESSING_COMPLETE = 'processingComplete',\r\n ERROR = 'error'\r\n}\r\n","\r\n// core/VideoEngine.ts\r\nimport { EventEmitter } from 'events';\r\nimport { VideoConfig, QualityLevel, VideoManifest } from './types';\r\nimport { VideoEvent } from './events';\r\n\r\nexport abstract class VideoEngine extends EventEmitter {\r\n abstract processChunk(\r\n inputPath: string,\r\n outputPath: string,\r\n startTime: number,\r\n quality: QualityLevel\r\n ): Promise<void>;\r\n\r\n abstract getDuration(inputPath: string): Promise<number>;\r\n}","\r\n// engines/FFmpegEngine.ts\r\nimport { spawn } from 'child_process';\r\nimport { VideoEngine } from '../core/VideoEngine';\r\nimport { QualityLevel } from '../core/types';\r\n\r\nexport class FFmpegEngine extends VideoEngine {\r\n async processChunk(\r\n inputPath: string,\r\n outputPath: string,\r\n startTime: number,\r\n quality: QualityLevel\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const ffmpeg = spawn('ffmpeg', [\r\n '-i', inputPath,\r\n '-ss', startTime.toString(),\r\n '-t', '10',\r\n '-vf', `scale=-1:${quality.height}`,\r\n '-c:v', 'libx264',\r\n '-b:v', quality.bitrate,\r\n '-c:a', 'aac',\r\n '-b:a', '128k',\r\n '-preset', 'fast',\r\n '-y',\r\n outputPath\r\n ]);\r\n\r\n ffmpeg.on('close', code => {\r\n code === 0 ? resolve() : reject(new Error(`FFmpeg error: ${code}`));\r\n });\r\n });\r\n }\r\n\r\n async getDuration(inputPath: string): Promise<number> {\r\n return new Promise((resolve, reject) => {\r\n const ffprobe = spawn('ffprobe', [\r\n '-v', 'error',\r\n '-show_entries', 'format=duration',\r\n '-of', 'default=noprint_wrappers=1:nokey=1',\r\n inputPath\r\n ]);\r\n\r\n let output = '';\r\n ffprobe.stdout.on('data', data => output += data);\r\n ffprobe.on('close', code => {\r\n code === 0 ? resolve(parseFloat(output)) : reject(new Error(`FFprobe error: ${code}`));\r\n });\r\n });\r\n }\r\n}","\r\n// streaming/StreamManager.ts\r\nimport { Readable } from 'stream';\r\nimport { StorageProvider } from '../storage/StorageProvider';\r\n\r\nexport class StreamManager {\r\n private storage: StorageProvider;\r\n\r\n constructor(storage: StorageProvider) {\r\n this.storage = storage;\r\n }\r\n\r\n async createStream(chunkPath: string, range?: { start: number; end: number }): Promise<Readable> {\r\n const data = await this.storage.getChunk(chunkPath);\r\n const stream = new Readable();\r\n\r\n if (range) {\r\n stream.push(data.slice(range.start, range.end + 1));\r\n } else {\r\n stream.push(data);\r\n }\r\n\r\n stream.push(null);\r\n return stream;\r\n }\r\n}","// engines/GStreamerEngine.ts\r\nimport { spawn } from 'child_process';\r\nimport { VideoEngine } from '../core/VideoEngine';\r\nimport { QualityLevel } from '../core/types';\r\n\r\nexport class GStreamerEngine extends VideoEngine {\r\n async processChunk(\r\n inputPath: string,\r\n outputPath: string,\r\n startTime: number,\r\n quality: QualityLevel\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const gst = spawn('gst-launch-1.0', [\r\n 'filesrc', `location=${inputPath}`,\r\n '!', 'decodebin',\r\n '!', 'videoconvert',\r\n '!', 'videoscale',\r\n '!', `video/x-raw,width=-1,height=${quality.height}`,\r\n '!', 'x264enc', `bitrate=${quality.bitrate}`,\r\n '!', 'mp4mux', '!', 'filesink', `location=${outputPath}`\r\n ]);\r\n\r\n gst.on('close', code => {\r\n code === 0 ? resolve() : reject(new Error(`GStreamer error: ${code}`));\r\n });\r\n });\r\n }\r\n\r\n async getDuration(inputPath: string): Promise<number> {\r\n return new Promise((resolve, reject) => {\r\n const gst = spawn('gst-launch-1.0', [\r\n 'filesrc', `location=${inputPath}`,\r\n '!', 'decodebin',\r\n '!', 'identity', '-debug', 'duration'\r\n ]);\r\n\r\n let output = '';\r\n gst.stdout.on('data', data => output += data);\r\n gst.on('close', code => {\r\n code === 0 ? resolve(parseFloat(output)) : reject(new Error(`GStreamer error: ${code}`));\r\n });\r\n });\r\n }\r\n}\r\n","\r\n// storage/StorageProvider.ts\r\nexport abstract class StorageProvider {\r\n abstract saveChunk(chunkPath: string, data: Buffer): Promise<void>;\r\n abstract getChunk(chunkPath: string): Promise<Buffer>;\r\n abstract deleteChunk(chunkPath: string): Promise<void>;\r\n}","\r\n\r\n// storage/FileSystemStorage.ts\r\nimport { promises as fs } from 'fs';\r\nimport { StorageProvider } from './StorageProvider';\r\n\r\nexport class FileSystemStorage extends StorageProvider {\r\n async saveChunk(chunkPath: string, data: Buffer): Promise<void> {\r\n await fs.writeFile(chunkPath, data);\r\n }\r\n\r\n async getChunk(chunkPath: string): Promise<Buffer> {\r\n return fs.readFile(chunkPath);\r\n }\r\n\r\n async deleteChunk(chunkPath: string): Promise<void> {\r\n await fs.unlink(chunkPath);\r\n }\r\n}","\r\n// cache/CacheStrategy.ts\r\nexport interface CacheOptions {\r\n maxSize: number;\r\n ttl: number;\r\n preloadNextChunk: boolean;\r\n externalCacheUrl?: string;\r\n}\r\n\r\nexport abstract class CacheStrategy {\r\n abstract set(key: string, value: Buffer): Promise<void>;\r\n abstract get(key: string): Promise<Buffer | null>;\r\n abstract preload(key: string): Promise<void>;\r\n abstract clear(): Promise<void>;\r\n}","\r\n// cache/LRU.ts\r\nexport class LRU<T> {\r\n private maxSize: number;\r\n private cache: Map<string, T>;\r\n\r\n constructor(maxSize: number) {\r\n this.maxSize = maxSize;\r\n this.cache = new Map();\r\n }\r\n\r\n set(key: string, value: T): void {\r\n if (this.cache.has(key)) {\r\n this.cache.delete(key);\r\n } else if (this.cache.size >= this.maxSize) {\r\n const oldestKey = this.cache.keys().next().value;\r\n if (oldestKey !== undefined) {\r\n this.cache.delete(oldestKey);\r\n }\r\n }\r\n this.cache.set(key, value);\r\n }\r\n\r\n get(key: string): T | undefined {\r\n if (!this.cache.has(key)) return undefined;\r\n const value = this.cache.get(key)!;\r\n this.cache.delete(key);\r\n this.cache.set(key, value);\r\n return value;\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}","\r\n// cache/internalCache.ts\r\nimport { LRU } from './LRU';\r\nimport { CacheStrategy, CacheOptions } from './cacheStrategy';\r\nimport { StorageProvider } from '../storage/StorageProvider';\r\n\r\nexport class InternalCache extends CacheStrategy {\r\n private cache: LRU<Buffer>;\r\n private options: CacheOptions;\r\n private storage: StorageProvider;\r\n\r\n constructor(options: CacheOptions, storage: StorageProvider) {\r\n super();\r\n this.options = options;\r\n this.cache = new LRU(options.maxSize);\r\n this.storage = storage;\r\n }\r\n\r\n async set(key: string, value: Buffer): Promise<void> {\r\n this.cache.set(key, value);\r\n }\r\n\r\n async get(key: string): Promise<Buffer | null> {\r\n const cached = this.cache.get(key);\r\n if (cached) return cached;\r\n\r\n try {\r\n const data = await this.storage.getChunk(key);\r\n await this.set(key, data);\r\n return data;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n async preload(key: string): Promise<void> {\r\n if (this.options.preloadNextChunk) {\r\n const nextChunkKey = this.getNextChunkKey(key);\r\n if (!this.cache.get(nextChunkKey)) {\r\n try {\r\n const data = await this.storage.getChunk(nextChunkKey);\r\n await this.set(nextChunkKey, data);\r\n } catch {\r\n // Ignore preload failures\r\n }\r\n }\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n }\r\n\r\n private getNextChunkKey(currentKey: string): string {\r\n const parts = currentKey.split('_');\r\n const currentChunk = parseInt(parts[parts.length - 1]);\r\n parts[parts.length - 1] = (currentChunk + 1).toString();\r\n return parts.join('_');\r\n }\r\n}","\r\n// cache/ExternalCache.ts\r\nimport fetch from 'node-fetch';\r\nimport { CacheStrategy, CacheOptions } from './cacheStrategy';\r\n\r\nexport class ExternalCache extends CacheStrategy {\r\n private baseUrl: string;\r\n private options: CacheOptions;\r\n\r\n constructor(options: CacheOptions) {\r\n super();\r\n this.options = options;\r\n this.baseUrl = options.externalCacheUrl!;\r\n }\r\n\r\n async set(key: string, value: Buffer): Promise<void> {\r\n await fetch(`${this.baseUrl}/cache/${key}`, {\r\n method: 'POST',\r\n body: value,\r\n headers: {\r\n 'Content-Type': 'application/octet-stream',\r\n 'TTL': this.options.ttl.toString()\r\n }\r\n });\r\n }\r\n\r\n async get(key: string): Promise<Buffer | null> {\r\n const response = await fetch(`${this.baseUrl}/cache/${key}`);\r\n return response.ok ? Buffer.from(await response.arrayBuffer()) : null;\r\n }\r\n\r\n async preload(key: string): Promise<void> {\r\n if (this.options.preloadNextChunk) {\r\n const nextChunkKey = this.getNextChunkKey(key);\r\n await fetch(`${this.baseUrl}/preload/${nextChunkKey}`);\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n await fetch(`${this.baseUrl}/cache`, { method: 'DELETE' });\r\n }\r\n\r\n private getNextChunkKey(currentKey: string): string {\r\n const parts = currentKey.split('_');\r\n const currentChunk = parseInt(parts[parts.length - 1]);\r\n parts[parts.length - 1] = (currentChunk + 1).toString();\r\n return parts.join('_');\r\n }\r\n}","\r\n// processor.ts\r\nimport { VideoEngine } from './core/VideoEngine';\r\nimport { EventEmitter } from 'events';\r\nimport { StorageProvider } from './storage/StorageProvider';\r\nimport { StreamManager } from './streaming/StreamManager';\r\nimport { VideoConfig, VideoManifest } from './core/types';\r\nimport { join } from 'path';\r\nimport { promises as fs } from 'fs';\r\nimport { Readable } from 'stream';\r\nimport { VideoEvent } from './core/events';\r\n\r\nexport class VideoProcessor extends EventEmitter {\r\n private engine: VideoEngine;\r\n private streamManager: StreamManager;\r\n private config: VideoConfig;\r\n\r\n constructor(\r\n engine: VideoEngine,\r\n storage: StorageProvider,\r\n config: VideoConfig\r\n ) {\r\n super();\r\n this.engine = engine;\r\n this.streamManager = new StreamManager(storage);\r\n this.config = config;\r\n }\r\n\r\n async processVideo(inputPath: string): Promise<VideoManifest> {\r\n const videoId = await this.generateVideoId(inputPath);\r\n const manifest: VideoManifest = {\r\n videoId,\r\n qualities: this.config.defaultQualities,\r\n chunks: []\r\n };\r\n\r\n const duration = await this.engine.getDuration(inputPath);\r\n const chunks = Math.ceil(duration / this.config.chunkSize);\r\n\r\n for (const quality of this.config.defaultQualities) {\r\n for (let i = 0; i < chunks; i++) {\r\n const chunkPath = this.getChunkPath(videoId, quality.height, i);\r\n\r\n try {\r\n await this.engine.processChunk(\r\n inputPath,\r\n chunkPath,\r\n i * this.config.chunkSize,\r\n quality\r\n );\r\n\r\n manifest.chunks.push({\r\n quality: quality.height,\r\n number: i,\r\n path: chunkPath\r\n });\r\n\r\n this.emit(VideoEvent.CHUNK_PROCESSED, { quality, chunkNumber: i });\r\n } catch (error) {\r\n this.emit(VideoEvent.ERROR, error);\r\n throw error;\r\n }\r\n }\r\n\r\n this.emit(VideoEvent.QUALITY_PROCESSED, quality);\r\n }\r\n\r\n this.emit(VideoEvent.PROCESSING_COMPLETE, manifest);\r\n return manifest;\r\n }\r\n\r\n async streamChunk(\r\n videoId: string,\r\n quality: number,\r\n chunkNumber: number,\r\n range?: { start: number; end: number }\r\n ): Promise<Readable> {\r\n const chunkPath = this.getChunkPath(videoId, quality, chunkNumber);\r\n return this.streamManager.createStream(chunkPath, range);\r\n }\r\n\r\n private getChunkPath(videoId: string, quality: number, chunkNumber: number): string {\r\n return join(this.config.cacheDir, videoId, `${quality}p`, `chunk_${chunkNumber}.mp4`);\r\n }\r\n\r\n private async generateVideoId(inputPath: string): Promise<string> {\r\n const stats = await fs.stat(inputPath);\r\n return `${inputPath.split('/').pop()?.split('.')[0]}_${stats.mtimeMs}`;\r\n }\r\n}"],"names":["fs"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mes-engine",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "mes-engine is a video processing engine that handles video chunking, processing and other video high density and intensive processing and caching processes.",
5
5
  "keywords": [
6
6
  "mes",