48 lines
877 B
Go
48 lines
877 B
Go
package ytdl
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os/exec"
|
|
"time"
|
|
|
|
"github.com/tidwall/gjson"
|
|
)
|
|
|
|
type YTdl struct {
|
|
Title string
|
|
Url string
|
|
Channel string
|
|
Len time.Duration
|
|
}
|
|
|
|
func NewYTdl(uri string) (*YTdl, error) {
|
|
ytdl_js, err := exec.Command(
|
|
"./bin/yt-dlp_linux",
|
|
uri,
|
|
"--cookies", "./cookies.txt",
|
|
"--no-call-home",
|
|
"--no-cache-dir",
|
|
"--ignore-errors",
|
|
"--newline",
|
|
"--restrict-filenames",
|
|
"-f", "140",
|
|
"-j",
|
|
).Output()
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !gjson.ValidBytes(ytdl_js) {
|
|
return nil, errors.New("invalid json")
|
|
}
|
|
|
|
results := gjson.GetManyBytes(ytdl_js, "title", "url", "duration", "channel")
|
|
title := results[0].String()
|
|
geturl := results[1].String()
|
|
duration, err := time.ParseDuration(fmt.Sprintf("%ds", results[2].Int()))
|
|
channel := results[3].String()
|
|
|
|
return &YTdl{title, geturl, channel, duration}, nil
|
|
}
|