Youtube-dl скачать прямо в браузер клиента - PullRequest
0 голосов
/ 28 июня 2019

Я хочу использовать youtube-dl exe-файл в Windows для загрузки видео в браузер клиента с помощью Golang Web App.

У меня есть страница, содержащая ввод для URL веб-сайта (например, URL-адреса YouTube), и я хочу вызвать exe-файл youtube.dl с этим URL на моем сервере с Golang. Но я не смог загрузить файл напрямую в браузер клиента.

Я не хочу загружать само видео на мой сервер. Я хочу, чтобы он был загружен непосредственно в браузер клиента.

Я много чего перепробовал в сети и здесь, где я. Вы можете найти мой фрагмент кода ниже.

func SearchHandler(w http.ResponseWriter, r *http.Request) {

// - --------------------------------------------------------------------------------------------------------------
// - Retrieve the HTML form parameter of POST method
// - --------------------------------------------------------------------------------------------------------------
url := r.FormValue("entry-domain")

logger.Printf("SearchHandler started to research the IP and MX data from %s domain", url)
fmt.Println("starting download................")
cmd := exec.Command("youtube-dl.exe", "-o", "-", url)
fmt.Println("downloading started...............")


out, err := cmd.CombinedOutput()
if err != nil {
    log.Fatalf("cmd.Run() failed with %s\n", err)
}

// //copy the relevant headers. If you want to preserve the downloaded file name, extract it with go's url parser.
w.Header().Set("Content-Disposition", "attachment; filename=BigBuckBunny.mp4")
w.Header().Set("Content-Type", "application/octet-stream")

//stream the body to the client without fully loading it into memory
reader := bytes.NewReader(out)
//w.Write(out)
io.Copy(w, reader)
fmt.Println("written to file.....................")
return}

Я мог загрузить файл, но он не работал должным образом. Я не мог даже открыть файл.

1 Ответ

2 голосов
/ 28 июня 2019

Просто назначьте ResponseWriter полю команды Stdout.Я также предлагаю использовать exec.CommandContext с контекстом запроса, чтобы youtube-dl быстро завершался, если клиент прерывает запрос.

func SearchHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Disposition", "attachment; filename=BigBuckBunny.mp4")
    w.Header().Set("Content-Type", "application/octet-stream") 
    // or more precisely: w.Header().Set("Content-Type", "video/mp4") 

    url := r.FormValue("entry-domain")

    stderr := &bytes.Buffer{}

    cmd := exec.CommandContext(r.Context(), "youtube-dl.exe", "-o", "-", url)
    cmd.Stdout = w
    cmd.Stderr = stderr

    if err := cmd.Run(); err != nil {
        log.Println(err)
        log.Println("stderr:", buf.String())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...