74 lines
2.9 KiB
TypeScript
74 lines
2.9 KiB
TypeScript
import { Router } from 'express'
|
|
import { readSettings, writeSettings } from '../settings.js'
|
|
import { readUsers, createUser, safeUser } from '../users.js'
|
|
import { testJellyfinConnection, fetchJellyfinUsers } from '../lib/jellyfin.js'
|
|
import { logger } from '../logger.js'
|
|
|
|
const router = Router()
|
|
|
|
router.get('/jellyfin/settings', (_req, res) => {
|
|
const { jellyfinUrl, jellyfinAdminToken } = readSettings()
|
|
res.json({
|
|
jellyfinUrl,
|
|
// Clé API jamais renvoyée : seulement sa présence
|
|
hasToken: !!jellyfinAdminToken,
|
|
})
|
|
})
|
|
|
|
router.post('/jellyfin/settings', (req, res) => {
|
|
const { jellyfinUrl, jellyfinAdminToken } = req.body
|
|
const update: Record<string, string> = {}
|
|
if (jellyfinUrl !== undefined) update.jellyfinUrl = String(jellyfinUrl).trim()
|
|
if (jellyfinAdminToken !== undefined) update.jellyfinAdminToken = String(jellyfinAdminToken).trim()
|
|
const updated = writeSettings(update)
|
|
res.json({ jellyfinUrl: updated.jellyfinUrl, hasToken: !!updated.jellyfinAdminToken })
|
|
})
|
|
|
|
router.post('/jellyfin/test', async (_req, res) => {
|
|
const { jellyfinUrl, jellyfinAdminToken } = readSettings()
|
|
if (!jellyfinUrl || !jellyfinAdminToken) {
|
|
res.status(400).json({ ok: false, error: 'URL et clé API requises' }); return
|
|
}
|
|
const result = await testJellyfinConnection(jellyfinUrl, jellyfinAdminToken)
|
|
res.json(result)
|
|
})
|
|
|
|
export async function runJellyfinSync(): Promise<{ created: number; skipped: number; users: string[] }> {
|
|
const { jellyfinUrl, jellyfinAdminToken } = readSettings()
|
|
if (!jellyfinUrl || !jellyfinAdminToken) return { created: 0, skipped: 0, users: [] }
|
|
|
|
const jellyfinUsers = await fetchJellyfinUsers()
|
|
const fankarrUsers = readUsers()
|
|
const results = { created: 0, skipped: 0, users: [] as string[] }
|
|
|
|
for (const jUser of jellyfinUsers) {
|
|
if (jUser.Policy?.IsDisabled) { results.skipped++; continue }
|
|
|
|
const exists = fankarrUsers.some(u =>
|
|
u.username.toLowerCase() === jUser.Name.toLowerCase()
|
|
)
|
|
if (exists) { results.skipped++; continue }
|
|
|
|
const randomPass = Math.random().toString(36).slice(2, 10) +
|
|
Math.random().toString(36).slice(2, 10)
|
|
createUser(jUser.Name, randomPass, 'user')
|
|
results.created++
|
|
results.users.push(jUser.Name)
|
|
logger.info('jellyfin', `Compte créé pour « ${jUser.Name} » (synchronisation Jellyfin)`)
|
|
}
|
|
|
|
logger.info('jellyfin', `Synchronisation Jellyfin : ${results.created} compte(s) créé(s), ${results.skipped} ignoré(s) (existant ou désactivé)`)
|
|
return results
|
|
}
|
|
|
|
router.post('/jellyfin/sync', async (_req, res) => {
|
|
try {
|
|
const results = await runJellyfinSync()
|
|
res.json(results)
|
|
} catch (err) {
|
|
res.status(500).json({ error: err instanceof Error ? err.message : 'Échec de la synchronisation Jellyfin' })
|
|
}
|
|
})
|
|
|
|
export default router
|