feat: add build for arm64

feat: add developer settings on settings and dashboard debug
This commit is contained in:
MasutaYunikon committed 2026-04-07 16:10:57 +02:00
1 parent 0ba2144f2f
commit 1290d5c925
11 files changed
+308 -84

No files matched your search

+47 -3
View File
@@ -10,7 +10,7 @@ import {
sanitizeClient, dispatchDownload, dispatchList
} from './torrent-clients/index.js'
import qbittorrentDriver from './torrent-clients/qbittorrent.js'
import { organizeTorrent, autoOrganizeAll, scanMediaPath } from './organize.js'
import { organizeTorrent, autoOrganizeAll, scanMediaPath, workerRunning } from './organize.js'
import { logger, readLogs, clearLogs, logsFileSize } from './logger.js'
import { DATA_DIR, BASE_DIR } from './config.js'
@@ -41,8 +41,8 @@ app.get('/api/settings', requireAuth, (_req, res) => {
res.json(readSettings())
})
app.post('/api/settings', requireAuth, (req, res) => {
const { mediaPath, completePath, organizeMode, category, nfoSupport, autoImport } = req.body
const updated = writeSettings({ mediaPath, completePath, organizeMode, category, nfoSupport, autoImport })
const { mediaPath, completePath, organizeMode, category, nfoSupport, autoImport, devMode } = req.body
const updated = writeSettings({ mediaPath, completePath, organizeMode, category, nfoSupport, autoImport, devMode })
logger.info('api', 'Paramètres mis à jour')
res.json(updated)
})
@@ -456,6 +456,50 @@ app.post('/api/scan', requireAuth, async (_req, res) => {
}
})
// ── Debug (dev mode uniquement) ───────────────────────────────
app.get('/api/debug/stats', requireAuth, (req, res) => {
const { devMode } = readSettings()
if (!devMode) { res.status(403).json({ error: 'Dev mode désactivé' }); return }
const mem = process.memoryUsage()
const uptimeS = Math.floor(process.uptime())
const h = Math.floor(uptimeS / 3600)
const m = Math.floor((uptimeS % 3600) / 60)
const s = uptimeS % 60
let organizedCount = 0
try {
const orgPath = path.join(DATA_DIR, 'organized.json')
if (fs.existsSync(orgPath)) {
const org = JSON.parse(fs.readFileSync(orgPath, 'utf-8'))
organizedCount = Object.values(org).reduce((acc: number, files: any) => acc + Object.keys(files).length, 0)
}
} catch {}
res.json({
memory: {
heapUsed : Math.round(mem.heapUsed / 1024 / 1024),
heapTotal: Math.round(mem.heapTotal / 1024 / 1024),
rss : Math.round(mem.rss / 1024 / 1024),
},
cache: {
entries : _cache.size,
ttlHours : 6,
},
uptime: `${h}h ${m}m ${s}s`,
uptimeSeconds: uptimeS,
worker: {
running: workerRunning,
},
organized: {
trackedFiles: organizedCount,
},
requests: {
notifs: recentOrganized.length,
},
})
})
if (fs.existsSync(PUBLIC_PATH)) {
app.get('*path', (_req, res) => { res.sendFile(path.join(PUBLIC_PATH, 'index.html')) })
}
+4 -3
View File
@@ -13,7 +13,7 @@ import { readSettings } from './settings.js'
const ORGANIZED_PATH = path.join(DATA_DIR, 'organized.json')
let workerRunning = false
export let workerRunning = false
const _prevStates = new Map<string, string>()
function resolveWorkerPath(): string {
@@ -211,7 +211,8 @@ export async function autoOrganizeAll(
workerRunning = false
})
worker.on('exit', (code) => {
if (code !== 0) logger.error('organize', `Worker exit avec code ${code}`)
if (code > 1) logger.error('organize', `Worker exit inattendu avec code ${code}`)
else logger.debug('organize', `Worker terminé (code ${code})`)
workerRunning = false
})
@@ -261,7 +262,7 @@ export async function organizeTorrent(
reject(err)
})
worker.on('exit', (code) => {
if (code !== 0) reject(new Error(`Worker exit ${code}`))
if (code > 1) reject(new Error(`Worker exit inattendu: code ${code}`))
})
worker.postMessage({ type: 'run', torrents: [fakeTorrent], seriesData })
+2
View File
@@ -11,6 +11,7 @@ export interface Settings {
category : string
nfoSupport : boolean
autoImport : boolean
devMode : boolean
}
const defaults: Settings = {
@@ -20,6 +21,7 @@ const defaults: Settings = {
category : 'fankai',
nfoSupport : false,
autoImport : true,
devMode : false,
}
export function readSettings(): Settings {