Как заставить программу возвращаться при ошибке на канале ввода - PullRequest
5 голосов
/ 19 февраля 2020

В настоящее время у меня есть эта функция, которая отправляет команду youtubedl через ffmpeg, а затем передает вывод ffmpeg HTTP-клиенту.

func pipeThruFfmpegToMp3(vi *VideoInfo, rw web.ResponseWriter) error {
    var ffmpeg *exec.Cmd
        ffmpeg = exec.Command("ffmpeg", "-i", "-","-acodec", "libmp3lame","-f", "mp3","-")
    }

    youtube := exec.Command("youtube-dl", "-f", "137", "sdfsdf")

    var ytbuf, ffbuf bytes.Buffer
    youtube.Stderr = &ytbuf
    ffmpeg.Stderr = &ffbuf

    audio, err := youtube.StdoutPipe()
    if err != nil {
        log.Printf("pipeThruFfmpegToMp3: %v\n", err)
        return err
    }

    ffmpeg.Stdin = audio
    ffmpeg.Stdout = rw

    // Headers sent, no turning back now
    rw.Header().Set("Content-Type", "audio/mpeg")
    rw.Header().Set("Content-Disposition", fmt.Sprintf("attachment;filename=\"%s.mp3\"", vi.GetSlug()))
    rw.Flush()

    youtube.Start()
    ffmpeg.Start()
    ffmpeg.Wait()
    youtube.Wait()

    // check ytvbuf, ytbuf, ffbuf for stderr errors

    if ffbuf.Len() != 0 {
        log.Printf("pipeThruFfmpegToMp3: %v\n", ffbuf.String())
    }

    if ytbuf.Len() != 0 {
        log.Printf("pipeThruYouTubeDLToMp3: %v\n", ytbuf.String())
    }

    return nil
}

Проблема в том, что при возникновении ошибки youtubedl отправляет Файл 0 КБ, вместо того, чтобы возвращать ошибку и не отправлять файл.

Так есть ли в любом случае, я могу это исправить, если youtubedl ошибается, чтобы вернуться вместо продолжения отправки?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Как насчет того, чтобы просто не сбросить код ошибки, возвращенный youtube-dl?

Изменить

youtube.Wait()

на

err = youtube.Wait()
if err != nil {
    log.Printf("youtube-dl failed: %v\n", err)
    return err
}

См. Документацию на Go API ожидания () для более подробной информации.

3 голосов
/ 25 февраля 2020

Я получил эту работу, заменив Start() и Wait() на CombinedOutput()

var ffbuf bytes.Buffer
ffmpeg.Stderr = &ffbuf

audio, err := youtube.Output()
if err != nil {
    log.Printf("pipeThruFfmpegToMp3: %v\n", err)
    return err
}

ffmpeg.Stdin = bytes.NewReader(audio)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...