feat: add FFmpeg status check and shutdown button

- FFmpeg check no longer blocks server startup
- Add /api/checkFFmpeg endpoint to query FFmpeg availability
- Add /api/shutdown endpoint to gracefully stop the server
- Add FFmpeg status indicator in web header
- Add shutdown button in web interface
- Move static files output to cmd/bilidown/static for embedding
- Update .gitignore to exclude cmd/bilidown/static

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-07 15:27:55 +08:00
parent dd8eaef97d
commit eb662a8b66
7 changed files with 69 additions and 37 deletions
+3 -22
View File
@@ -5,7 +5,6 @@ import (
"errors"
"fmt"
"log"
"os"
"strings"
"sync"
)
@@ -97,37 +96,19 @@ func GetCurrentFolder(db *sql.DB) (string, error) {
if err != nil {
return "", err
}
err = os.MkdirAll(folder, os.ModePerm)
if err != nil {
return "", err
}
err = SaveDownloadFolder(db, folder)
if err != nil {
return "", err
}
return folder, nil
}
err = os.MkdirAll(folder, os.ModePerm)
if err != nil {
return "", err
}
return folder, nil
return folder, err
}
// SaveDownloadFolder 保存下载路径,不存在则自动创建
// SaveDownloadFolder 保存下载路径(不自动创建目录)
func SaveDownloadFolder(db *sql.DB, downloadFolder string) error {
_, err := os.Stat(downloadFolder)
if err != nil {
if os.IsNotExist(err) {
err = os.MkdirAll(downloadFolder, os.ModePerm)
if err != nil {
return err
}
}
return err
}
SqliteLock.Lock()
_, err = db.Exec(`INSERT OR REPLACE INTO "field" ("name", "value") VALUES ('download_folder', ?)`, downloadFolder)
_, err := db.Exec(`INSERT OR REPLACE INTO "field" ("name", "value") VALUES ('download_folder', ?)`, downloadFolder)
SqliteLock.Unlock()
return err
}