prevent downloading playlist with format selection
This commit is contained in:
56
server/formats/parser.go
Normal file
56
server/formats/parser.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package formats
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log/slog"
|
||||
"os/exec"
|
||||
"sync"
|
||||
|
||||
"github.com/marcopeocchi/yt-dlp-web-ui/v3/server/config"
|
||||
)
|
||||
|
||||
func ParseURL(url string) (*Metadata, error) {
|
||||
cmd := exec.Command(config.Instance().DownloaderPath, url, "-J")
|
||||
|
||||
stdout, err := cmd.Output()
|
||||
if err != nil {
|
||||
slog.Error("failed to retrieve metadata", slog.String("err", err.Error()))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
slog.Info(
|
||||
"retrieving metadata",
|
||||
slog.String("caller", "getFormats"),
|
||||
slog.String("url", url),
|
||||
)
|
||||
|
||||
info := &Metadata{URL: url}
|
||||
best := &Format{}
|
||||
|
||||
var (
|
||||
wg sync.WaitGroup
|
||||
decodingError error
|
||||
)
|
||||
|
||||
wg.Add(2)
|
||||
|
||||
go func() {
|
||||
decodingError = json.Unmarshal(stdout, &info)
|
||||
wg.Done()
|
||||
}()
|
||||
|
||||
go func() {
|
||||
decodingError = json.Unmarshal(stdout, &best)
|
||||
wg.Done()
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
|
||||
if decodingError != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info.Best = *best
|
||||
|
||||
return info, nil
|
||||
}
|
||||
28
server/formats/types.go
Normal file
28
server/formats/types.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package formats
|
||||
|
||||
// Used to deser the formats in the -J output
|
||||
type Metadata struct {
|
||||
Type string `json:"_type"`
|
||||
Formats []Format `json:"formats"`
|
||||
Best Format `json:"best"`
|
||||
Thumbnail string `json:"thumbnail"`
|
||||
Title string `json:"title"`
|
||||
URL string `json:"url"`
|
||||
Entries []Metadata `json:"entries"` // populated if url is playlist
|
||||
}
|
||||
|
||||
func (m *Metadata) IsPlaylist() bool {
|
||||
return m.Type == "playlist"
|
||||
}
|
||||
|
||||
// A skimmed yt-dlp format node
|
||||
type Format struct {
|
||||
Format_id string `json:"format_id"`
|
||||
Format_note string `json:"format_note"`
|
||||
FPS float32 `json:"fps"`
|
||||
Resolution string `json:"resolution"`
|
||||
VCodec string `json:"vcodec"`
|
||||
ACodec string `json:"acodec"`
|
||||
Size float32 `json:"filesize_approx"`
|
||||
Language string `json:"language"`
|
||||
}
|
||||
Reference in New Issue
Block a user