1f7dbc2a7d
Cross-platform Electron + React + FFmpeg desktop app for sending multiple SRT streams simultaneously. Features: - Multiple simultaneous SRT output streams - Video sources: desktop, window capture, cameras, capture cards - Audio sources: microphones, system loopback, sound cards - H.264 encoding with HW acceleration (NVENC/QSV/AMF/VideoToolbox) - SRT modes: caller / listener / rendezvous - Frame profile presets (4K, 1080p, 720p, 480p, 360p) - Tolbek SRT receiver with configurable mode - System tray: minimize-to-tray, exit confirmation dialog - Portable build via electron-builder Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
73 lines
1.9 KiB
JavaScript
73 lines
1.9 KiB
JavaScript
/**
|
|
* Creates minimal placeholder PNG icons without any dependencies.
|
|
* Run: node assets/create-placeholder-icons.js
|
|
*/
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
|
|
// Minimal valid 16x16 PNG (dark blue background)
|
|
function createSimplePng(size) {
|
|
// Use a canvas-like approach with raw PNG data
|
|
// This creates a simple colored square PNG
|
|
const { createCanvas } = (() => {
|
|
try { return require('canvas') } catch { return null }
|
|
})() || {}
|
|
|
|
if (createCanvas) {
|
|
const canvas = createCanvas(size, size)
|
|
const ctx = canvas.getContext('2d')
|
|
|
|
// Background
|
|
ctx.fillStyle = '#1a1a2e'
|
|
const r = size * 0.19
|
|
ctx.beginPath()
|
|
ctx.moveTo(r, 0)
|
|
ctx.lineTo(size - r, 0)
|
|
ctx.quadraticCurveTo(size, 0, size, r)
|
|
ctx.lineTo(size, size - r)
|
|
ctx.quadraticCurveTo(size, size, size - r, size)
|
|
ctx.lineTo(r, size)
|
|
ctx.quadraticCurveTo(0, size, 0, size - r)
|
|
ctx.lineTo(0, r)
|
|
ctx.quadraticCurveTo(0, 0, r, 0)
|
|
ctx.closePath()
|
|
ctx.fill()
|
|
|
|
// Play triangle
|
|
const cx = size / 2, cy = size / 2
|
|
const s = size * 0.3
|
|
ctx.fillStyle = '#4f8ef7'
|
|
ctx.beginPath()
|
|
ctx.moveTo(cx - s * 0.5, cy - s * 0.6)
|
|
ctx.lineTo(cx + s * 0.7, cy)
|
|
ctx.lineTo(cx - s * 0.5, cy + s * 0.6)
|
|
ctx.closePath()
|
|
ctx.fill()
|
|
|
|
// Red dot
|
|
ctx.fillStyle = '#ef4444'
|
|
ctx.beginPath()
|
|
ctx.arc(size * 0.75, size * 0.25, size * 0.1, 0, Math.PI * 2)
|
|
ctx.fill()
|
|
|
|
return canvas.toBuffer('image/png')
|
|
}
|
|
|
|
// Fallback: minimal 1x1 PNG
|
|
return Buffer.from(
|
|
'89504e470d0a1a0a0000000d4948445200000001000000010802000000' +
|
|
'9001' + '2e00000000c4944415408d7626060600000000200014fd7181000000049454e44ae426082', 'hex'
|
|
)
|
|
}
|
|
|
|
const sizes = [
|
|
{ name: 'icon.png', size: 512 },
|
|
{ name: 'tray-icon.png', size: 32 }
|
|
]
|
|
|
|
for (const { name, size } of sizes) {
|
|
const buf = createSimplePng(size)
|
|
fs.writeFileSync(path.join(__dirname, name), buf)
|
|
console.log(`Created ${name}`)
|
|
}
|