diff --git a/pkg/api/handle_stream.go b/pkg/api/handle_stream.go index b59baeb..742a787 100644 --- a/pkg/api/handle_stream.go +++ b/pkg/api/handle_stream.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "log" + "msw-open-music/pkg/database" "net/http" "os" "os/exec" @@ -85,7 +86,7 @@ type PrepareFileStreamDirectRequest struct { } type PrepareFileStreamDirectResponse struct { - Filesize int64 `json:"filesize"` + File *database.File `json:"file"` } // /prepare_file_stream_direct?id=1&config=ffmpeg_config_name @@ -130,44 +131,37 @@ func (api *API) HandlePrepareFileStreamDirect(w http.ResponseWriter, r *http.Req // check obj file exists exists := api.Tmpfs.Exits(objPath) - if exists { - fileInfo, err := os.Stat(objPath) + if !exists { + // lock the object + api.Tmpfs.Lock(objPath) + + args := strings.Split(ffmpegConfig.Args, " ") + startArgs := []string{"-threads", strconv.FormatInt(api.APIConfig.FfmpegThreads, 10), "-i", srcPath} + endArgs := []string{"-vn", "-y", objPath} + ffmpegArgs := append(startArgs, args...) + ffmpegArgs = append(ffmpegArgs, endArgs...) + cmd := exec.Command("ffmpeg", ffmpegArgs...) + err = cmd.Run() if err != nil { api.HandleError(w, r, err) return } - prepareFileStreamDirectResponse := &PrepareFileStreamDirectResponse{ - Filesize: fileInfo.Size(), - } - json.NewEncoder(w).Encode(prepareFileStreamDirectResponse) - return - } - - // lock the object - api.Tmpfs.Lock(objPath) - args := strings.Split(ffmpegConfig.Args, " ") - startArgs := []string{"-threads", strconv.FormatInt(api.APIConfig.FfmpegThreads, 10), "-i", srcPath} - endArgs := []string{"-vn", "-y", objPath} - ffmpegArgs := append(startArgs, args...) - ffmpegArgs = append(ffmpegArgs, endArgs...) - cmd := exec.Command("ffmpeg", ffmpegArgs...) - err = cmd.Run() - if err != nil { - api.HandleError(w, r, err) - return - } + api.Tmpfs.Record(objPath) + api.Tmpfs.Unlock(objPath) - api.Tmpfs.Record(objPath) - api.Tmpfs.Unlock(objPath) + } fileInfo, err := os.Stat(objPath) if err != nil { api.HandleError(w, r, err) return } + + file.Filesize = fileInfo.Size() + prepareFileStreamDirectResponse := &PrepareFileStreamDirectResponse{ - Filesize: fileInfo.Size(), + File: file, } json.NewEncoder(w).Encode(prepareFileStreamDirectResponse) } diff --git a/web/src/component/AudioPlayer.js b/web/src/component/AudioPlayer.js index 32bf105..4f3f717 100644 --- a/web/src/component/AudioPlayer.js +++ b/web/src/component/AudioPlayer.js @@ -12,10 +12,12 @@ function AudioPlayer(props) { const [loop, setLoop] = useState(true); const [raw, setRaw] = useState(false); const [prepare, setPrepare] = useState(false); - const [selectedFfmpegConfig, setSelectedFfmpegConfig] = useState({}); + const [selectedFfmpegConfig, setSelectedFfmpegConfig] = useState({ + name: "", + args: "", + }); const [playingURL, setPlayingURL] = useState(""); const [isPreparing, setIsPreparing] = useState(false); - const [preparedFilesize, setPreparedFilesize] = useState(null); useEffect(() => { // no playing file @@ -40,7 +42,12 @@ function AudioPlayer(props) { }) .then((response) => response.json()) .then((data) => { - setPreparedFilesize(data.filesize); + if (data.error) { + alert(data.error); + setIsPreparing(false); + return; + } + props.setPlayingFile(data.file); setIsPreparing(false); setPlayingURL( `/api/v1/get_file_stream_direct?id=${props.playingFile.id}&config=${selectedFfmpegConfig.name}` @@ -79,17 +86,13 @@ function AudioPlayer(props) { {isPreparing && }