Files

110 lines
3.9 KiB
Go
Raw Permalink Normal View History

2026-05-23 17:17:56 -07:00
package tools
import (
"os"
"os/exec"
"strconv"
"strings"
"sync/atomic"
"time"
"golang.org/x/sync/semaphore"
)
const (
SNOWFLAKE_MAX_MACHINE_ID int64 = (1 << 10) - 1
SNOWFLAKE_MAX_SEQUENCE int64 = (1 << 12) - 1
SNOWFLAKE_EPOCH_MILLI = 1207008000000
SNOWFLAKE_EPOCH_SECONDS = SNOWFLAKE_EPOCH_MILLI / 1000 // Apr 1st 2008 (Teto B-Day!)
TIMEOUT_SHUTDOWN = 1 * time.Minute // Standard Timeout for Shutdowns
TIMEOUT_CONTEXT = 10 * time.Second // Standard Timeout for Requests
FILE_PUBLIC = os.FileMode(0770) // rwxrwx---
FILE_PRIVATE = os.FileMode(0700) // rwx------
)
var (
TEMP_CAPACITY atomic.Int64
LIMIT_JSON = EnvNumber("LIMIT_JSON", 8*1024) // ( 8KB) Size limit per incoming JSON string
LIMIT_FILE = EnvNumber("LIMIT_FILE", 25*1024*1024) // (25MB) Size limit per incoming media file
LIMIT_TEMP = EnvNumber("LIMIT_TEMP", 2*1024*1024*1024) // ( 2GB) Disk space allowed for temporary files
LIMIT_ENCODES = EnvNumber("LIMIT_ENCODES", 1) // Concurrent Uploads
LIMIT_PROBES = EnvNumber("LIMIT_PROBES", 4) // Concurrent Probes
LIMIT_MIME_TYPE = EnvSlice("LIMIT_MIME_TYPE", ",", []string{
/* STANDARD */ "image/jpeg", "image/png", "image/gif", "image/webp", "image/heic", "image/heif",
/* FUTURE */ "image/avif", "image/jxl",
/* LEGACY */ "image/tiff", "image/bmp",
/* STANDARD */ "video/mp4", "video/webm", "video/quicktime", "video/x-matroska",
/* LEGACY */ "video/avi", "video/x-ms-wmv",
})
TEMPLATE_BASE_WEB = EnvString("TEMPLATE_BASE_WEB", "http://localhost:5173")
TEMPLATE_BASE_CDN = EnvString("TEMPLATE_BASE_CDN", "http://localhost:3000")
TEMPLATE_BASE_API = EnvString("TEMPLATE_BASE_API", "http://localhost:8080")
MACHINE_ID = EnvString("MACHINE_ID", "0")
MACHINE_HOSTNAME = EnvString("MACHINE_HOSTNAME", "le fishe")
MACHINE_PROVERB = EnvString("MACHINE_PROVERB", "><> .o( blub blub)")
DATABASE_URL = EnvString("DATABASE_URL", "postgresql://postgres:password@localhost:5432")
STORAGE_DISK_TEMP = EnvString("STORAGE_DISK_TEMP", "_temp")
STORAGE_DISK_PUBLIC = EnvString("STORAGE_DISK_PUBLIC", "_public")
ONNX_RUNTIME_PATH = EnvString("ONNX_RUNTIME_PATH", "")
ONNX_RUNTIME_CUDA = EnvString("ONNX_RUNTIME_CUDA", "") != ""
HTTP_ADDRESS = EnvString("HTTP_ADDRESS", "127.0.0.1:8080")
HTTP_PROXY = EnvString("HTTP_PROXY", "")
)
var (
SEMA_UPLOADS = semaphore.NewWeighted(int64(LIMIT_TEMP))
SEMA_ENCODES = semaphore.NewWeighted(int64(LIMIT_ENCODES))
SEMA_PROBES = semaphore.NewWeighted(int64(LIMIT_PROBES))
)
func init() {
// Prepare Directories
if err := os.MkdirAll(STORAGE_DISK_PUBLIC, FILE_PUBLIC); err != nil {
LoggerInit.Log(FATAL, "Cannot Create Public Directory")
return
}
if err := os.MkdirAll(STORAGE_DISK_TEMP, FILE_PUBLIC); err != nil {
LoggerInit.Log(FATAL, "Cannot Create Temp Directory")
return
}
// Check Executables
if err := exec.Command("ffmpeg", "--help").Run(); err != nil {
LoggerInit.Log(FATAL, "FFmpeg failed to start: %s", err)
return
}
if err := exec.Command("ffprobe", "--help").Run(); err != nil {
LoggerInit.Log(FATAL, "FFprobe failed to start: %s", err)
return
}
}
// Read String from Environment
func EnvString(field, initial string) string {
if value := os.Getenv(field); value == "" {
return initial
} else {
return value
}
}
// Read String from Environment and Parse it as a number
func EnvNumber(field string, initial int) int {
if value := os.Getenv(field); value == "" {
return initial
} else if number, err := strconv.Atoi(value); err != nil {
return initial
} else {
return number
}
}
// Read String from Environment and Parse it as a slice using the given delimiter
func EnvSlice(field, delimiter string, initial []string) []string {
if value := os.Getenv(field); value == "" {
return initial
} else {
return strings.Split(value, delimiter)
}
}