0.10.0-1 Update

This commit is contained in:
2026-03-14 18:24:30 +00:00
parent 96839ac05b
commit f628fdac50
4 changed files with 167 additions and 8 deletions

View File

@@ -143,7 +143,9 @@ router.post(
logger.info('post:audiobook:upload', {
reqId: req.reqId,
originalName: req.file.originalname,
sizeBytes: Number(req.file.size || 0)
sizeBytes: Number(req.file.size || 0),
mimeType: String(req.file.mimetype || '').trim() || null,
tempPath: String(req.file.path || '').trim() || null
});
const result = await pipelineService.uploadAudiobookFile(req.file, {
format: req.body?.format,

View File

@@ -10804,6 +10804,14 @@ class PipelineService extends EventEmitter {
try {
await historyService.resetProcessLog(job.id);
await historyService.appendLog(job.id, 'SYSTEM', `AAX-Upload empfangen: ${originalName}`);
logger.info('audiobook:upload:received', {
jobId: job.id,
originalName,
tempFilePath,
rawBaseDir,
outputFormat,
startImmediately
});
const probeConfig = audiobookService.buildProbeCommand(ffprobeCommand, tempFilePath);
const captured = await this.runCapturedCommand(probeConfig.cmd, probeConfig.args);
@@ -10822,12 +10830,25 @@ class PipelineService extends EventEmitter {
rawTemplate,
originalName
);
logger.info('audiobook:upload:staging', {
jobId: job.id,
tempFilePath,
rawDir: storagePaths.rawDir,
rawFilePath: storagePaths.rawFilePath,
rawTemplate,
outputTemplate
});
ensureDir(storagePaths.rawDir);
fs.renameSync(tempFilePath, storagePaths.rawFilePath);
moveFileWithFallback(tempFilePath, storagePaths.rawFilePath);
stagedRawDir = storagePaths.rawDir;
stagedRawFilePath = storagePaths.rawFilePath;
chownRecursive(storagePaths.rawDir, settings?.raw_dir_owner);
logger.info('audiobook:upload:staged', {
jobId: job.id,
stagedRawDir,
stagedRawFilePath
});
const makemkvInfo = this.withAnalyzeContextMediaProfile({
status: 'SUCCESS',
@@ -10899,6 +10920,14 @@ class PipelineService extends EventEmitter {
...(startResult && typeof startResult === 'object' ? startResult : {})
};
} catch (error) {
logger.error('audiobook:upload:failed', {
jobId: job.id,
originalName,
tempFilePath,
stagedRawDir,
stagedRawFilePath,
error: errorToMeta(error)
});
const updatePayload = {
status: 'ERROR',
last_state: 'ERROR',

View File

@@ -119,6 +119,64 @@ info "Frontend-Host: $FRONTEND_HOST"
command_exists() { command -v "$1" &>/dev/null; }
nginx_replace_or_insert_directive() {
local file="$1"
local directive_regex="$2"
local desired_line="$3"
local anchor_regex="$4"
local directive_sed_regex="${directive_regex//\//\\/}"
local anchor_sed_regex="${anchor_regex//\//\\/}"
local desired_sed_line="${desired_line//\//\\/}"
if grep -Eq "$directive_regex" "$file"; then
sed -i -E "0,/$directive_sed_regex/s//${desired_sed_line}/" "$file"
return 0
fi
sed -i "/$anchor_sed_regex/a\\$desired_line" "$file"
}
patch_existing_ripster_nginx_site() {
local file="$1"
local backup_file="${file}.bak-$(date +%Y%m%d%H%M%S)"
[[ -f "$file" ]] || return 1
cp -a "$file" "$backup_file"
info "Bestehende nginx-Konfiguration erkannt - ergänze Upload-/Proxy-Settings"
info "Backup erstellt: $backup_file"
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*client_max_body_size[[:space:]]+[^;]+;' \
' client_max_body_size 8G;' \
'server_name .*;'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_connect_timeout[[:space:]]+[^;]+;' \
' proxy_connect_timeout 60s;' \
'location /api/ {'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_send_timeout[[:space:]]+[^;]+;' \
' proxy_send_timeout 3600s;' \
'location /api/ {'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_read_timeout[[:space:]]+[^;]+;' \
' proxy_read_timeout 3600s;' \
'location /api/ {'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_request_buffering[[:space:]]+[^;]+;' \
' proxy_request_buffering off;' \
'location /api/ {'
}
install_node() {
header "Node.js installieren"
local required_major=20
@@ -844,6 +902,9 @@ ok "ripster-backend.service erstellt"
if [[ "$SKIP_NGINX" == false ]]; then
header "nginx konfigurieren"
if [[ -f /etc/nginx/sites-available/ripster ]]; then
patch_existing_ripster_nginx_site /etc/nginx/sites-available/ripster
else
cat > /etc/nginx/sites-available/ripster <<EOF
server {
listen 80;
@@ -866,8 +927,10 @@ server {
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_read_timeout 300s;
proxy_connect_timeout 10s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 60s;
proxy_request_buffering off;
}
# WebSocket → Backend
@@ -882,6 +945,7 @@ server {
}
}
EOF
fi
# Alte Default-Seite deaktivieren, Ripster aktivieren
rm -f /etc/nginx/sites-enabled/default

View File

@@ -124,6 +124,64 @@ download_file() {
return 1
}
nginx_replace_or_insert_directive() {
local file="$1"
local directive_regex="$2"
local desired_line="$3"
local anchor_regex="$4"
local directive_sed_regex="${directive_regex//\//\\/}"
local anchor_sed_regex="${anchor_regex//\//\\/}"
local desired_sed_line="${desired_line//\//\\/}"
if grep -Eq "$directive_regex" "$file"; then
sed -i -E "0,/$directive_sed_regex/s//${desired_sed_line}/" "$file"
return 0
fi
sed -i "/$anchor_sed_regex/a\\$desired_line" "$file"
}
patch_existing_ripster_nginx_site() {
local file="$1"
local backup_file="${file}.bak-$(date +%Y%m%d%H%M%S)"
[[ -f "$file" ]] || return 1
cp -a "$file" "$backup_file"
info "Bestehende nginx-Konfiguration erkannt - ergänze Upload-/Proxy-Settings"
info "Backup erstellt: $backup_file"
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*client_max_body_size[[:space:]]+[^;]+;' \
' client_max_body_size 8G;' \
'server_name .*;'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_connect_timeout[[:space:]]+[^;]+;' \
' proxy_connect_timeout 60s;' \
'location /api/ {'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_send_timeout[[:space:]]+[^;]+;' \
' proxy_send_timeout 3600s;' \
'location /api/ {'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_read_timeout[[:space:]]+[^;]+;' \
' proxy_read_timeout 3600s;' \
'location /api/ {'
nginx_replace_or_insert_directive \
"$file" \
'^[[:space:]]*proxy_request_buffering[[:space:]]+[^;]+;' \
' proxy_request_buffering off;' \
'location /api/ {'
}
install_node() {
header "Node.js installieren"
local required_major=20
@@ -647,6 +705,9 @@ ok "ripster-backend.service erstellt"
if [[ "$SKIP_NGINX" == false ]]; then
header "nginx konfigurieren"
if [[ -f /etc/nginx/sites-available/ripster ]]; then
patch_existing_ripster_nginx_site /etc/nginx/sites-available/ripster
else
cat > /etc/nginx/sites-available/ripster <<EOF
server {
listen 80;
@@ -666,8 +727,10 @@ server {
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_read_timeout 300s;
proxy_connect_timeout 10s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 60s;
proxy_request_buffering off;
}
location /ws {
@@ -681,6 +744,7 @@ server {
}
}
EOF
fi
rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/ripster /etc/nginx/sites-enabled/ripster