This commit is contained in:
Linrador 2026-05-02 11:02:45 +02:00
parent de4bfe8cef
commit 973a07fef8
4 changed files with 74 additions and 23 deletions

View File

@ -18,13 +18,22 @@ var autostartPaused int32 // 0=false, 1=true
var autostartSubsMu sync.Mutex
type autostartStatePayload struct {
Enabled bool `json:"enabled"`
Active bool `json:"active"`
Paused bool `json:"paused"`
PausedByUser bool `json:"pausedByUser"`
PausedByDisk bool `json:"pausedByDisk"`
Reason string `json:"reason,omitempty"`
}
var autostartSubs = map[chan autostartStatePayload]struct{}{}
func isAutostartFeatureEnabled() bool {
s := getSettings()
return s.UseChaturbateAPI || s.UseMyFreeCamsWatcher
}
func broadcastAutostartPaused() {
state := getAutostartStatePayload()
@ -50,13 +59,28 @@ func isAutostartPaused() bool {
}
func getAutostartStatePayload() autostartStatePayload {
enabled := isAutostartFeatureEnabled()
userPaused := atomic.LoadInt32(&autostartPaused) == 1
diskPaused := atomic.LoadInt32(&diskEmergency) == 1
paused := userPaused || diskPaused
reason := ""
switch {
case !enabled:
reason = "disabled"
case diskPaused:
reason = "disk"
case userPaused:
reason = "user"
}
return autostartStatePayload{
Paused: userPaused || diskPaused,
Enabled: enabled,
Active: enabled && !paused,
Paused: paused,
PausedByUser: userPaused,
PausedByDisk: diskPaused,
Reason: reason,
}
}
@ -138,19 +162,22 @@ func autostartStateHandler(w http.ResponseWriter, r *http.Request) {
writeAutostartState(w)
}
// GET/POST /api/autostart/pause (POST ohne Body pausiert)
// GET/POST /api/autostart/pause
// POST muss explizit paused=true/false enthalten.
// Wichtig: Kein "POST ohne Body pausiert" mehr, weil das beim Frontend-Refresh
// unbemerkt den Autostart stoppen kann.
func autostartPauseQuickHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
writeAutostartState(w)
return
case http.MethodPost:
setAutostartPaused(true)
writeAutostartState(w)
return
default:
http.Error(w, "Nur GET/POST erlaubt", http.StatusMethodNotAllowed)
return
autostartPauseHandler(w, r)
}
func resetAutostartPauseOnStartup() {
old := getAutostartStatePayload()
atomic.StoreInt32(&autostartPaused, 0)
newState := getAutostartStatePayload()
if old != newState {
broadcastAutostartPaused()
}
}

View File

@ -98,6 +98,11 @@ func main() {
}
defer appLn.Close()
// ✅ Hier: alte manuelle Autostart-Pause beim echten App-Start zurücksetzen.
// Disk-Notbremse bleibt trotzdem aktiv, weil isAutostartPaused()
// zusätzlich diskEmergency prüft.
resetAutostartPauseOnStartup()
fixKeepRootFilesIntoModelSubdirs()
postWorkQ.StartWorkers(1)
@ -137,10 +142,10 @@ func main() {
}
// Hintergrund-Worker
go startDiskSpaceGuard()
go startChaturbateOnlinePoller(store)
go startChaturbateAutoStartWorker(store)
go startMyFreeCamsAutoStartWorker(store)
go startDiskSpaceGuard()
// optional: Bootstrap nur im Hintergrund
if getSettings().UseChaturbateAPI {

View File

@ -2196,9 +2196,6 @@ export default function App() {
prev?.id === updated.id ? mergeStoredModel(prev, updated) : prev
)
setPlayerModel((prev) =>
prev?.id === updated.id ? mergeStoredModel(prev, updated) : prev
)
scheduleOverviewLoad()
return
}
@ -3255,7 +3252,6 @@ export default function App() {
fillDonePageFromPrefetch,
donePage,
prefetchDonePage,
doneCount,
loadDoneCount,
]
)
@ -4009,7 +4005,11 @@ export default function App() {
doneTotal={doneCount}
page={donePage}
pageSize={donePageSize}
onPageSizeChange={setDonePageSize}
onPageSizeChange={(size) => {
setDonePageSize(size)
setDonePage(1)
donePrefetchRef.current = null
}}
onPageChange={setDonePage}
onOpenPlayer={openPlayer}
onDeleteJob={handleDeleteJobWithUndo}

View File

@ -18,6 +18,7 @@ type RecorderSettings = {
doneDir: string
ffmpegPath?: string
autoAddToDownloadList?: boolean
autoStartAddedDownloads?: boolean
enableConcurrentDownloadsLimit?: boolean
maxConcurrentDownloads?: number
useChaturbateApi?: boolean
@ -58,6 +59,7 @@ const DEFAULTS: RecorderSettings = {
doneDir: 'records/done',
ffmpegPath: '',
autoAddToDownloadList: true,
autoStartAddedDownloads: true,
enableConcurrentDownloadsLimit: false,
maxConcurrentDownloads: 20,
useChaturbateApi: false,
@ -396,6 +398,8 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
// ✅ falls backend die Felder noch nicht hat -> defaults nutzen
autoAddToDownloadList: data.autoAddToDownloadList ?? DEFAULTS.autoAddToDownloadList,
autoStartAddedDownloads:
(data as any).autoStartAddedDownloads ?? DEFAULTS.autoStartAddedDownloads,
enableConcurrentDownloadsLimit:
(data as any).enableConcurrentDownloadsLimit ?? DEFAULTS.enableConcurrentDownloadsLimit,
maxConcurrentDownloads:
@ -690,6 +694,7 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
// ✅ Switch-Logik: Autostart nur sinnvoll, wenn Auto-Add aktiv ist
const autoAddToDownloadList = !!value.autoAddToDownloadList
const autoStartAddedDownloads = !!value.autoStartAddedDownloads
const enableConcurrentDownloadsLimit = !!(value as any).enableConcurrentDownloadsLimit
const maxConcurrentDownloads = Math.max(
1,
@ -736,6 +741,7 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
doneDir,
ffmpegPath,
autoAddToDownloadList,
autoStartAddedDownloads,
enableConcurrentDownloadsLimit,
maxConcurrentDownloads,
useChaturbateApi,
@ -1284,6 +1290,19 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
description="Neue Links/Modelle werden automatisch in die Downloadliste übernommen."
/>
<LabeledSwitch
checked={!!value.autoStartAddedDownloads}
onChange={(checked) =>
setValue((v) => ({
...v,
autoStartAddedDownloads: checked,
autoAddToDownloadList: checked ? true : v.autoAddToDownloadList,
}))
}
label="Automatisch starten"
description="Neue Links aus der Zwischenablage werden automatisch gestartet. Aktiviert automatisch auch das Hinzufügen zur Downloadliste."
/>
<LabeledSwitch
checked={!!value.useChaturbateApi}
onChange={(checked) => setValue((v) => ({ ...v, useChaturbateApi: checked }))}