feat: initial release — SRT Streamer v1.0.0
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>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* 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}`)
|
||||
}
|
||||
Reference in New Issue
Block a user