main
Raw Download raw file
 1package main
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"log"
 7	"os"
 8	"os/exec"
 9	"path/filepath"
10
11	"github.com/bryfry/singles/internal/playlist"
12)
13
14func main() {
15
16	if len(os.Args) < 2 {
17		err := fmt.Errorf("Usage: go run fetch.go <path to playlist.json>")
18		log.Fatal(err)
19	}
20	playlistPath := os.Args[1]
21	playlistDir := filepath.Dir(playlistPath)
22	f, err := os.Open(playlistPath)
23	if err != nil {
24		err = fmt.Errorf("opening playlist: %w", err)
25		log.Fatal(err)
26	}
27
28	var pl playlist.Playlist
29	d := json.NewDecoder(f)
30	err = d.Decode(&pl)
31	if err != nil {
32		err = fmt.Errorf("decoding playlist: %w", err)
33		log.Fatal(err)
34	}
35
36	playlistURL := fmt.Sprintf(
37		"https://music.youtube.com/playlist?list=%s",
38		pl.Id,
39	)
40
41	yt := "yt-dlp"
42	ytPath, err := exec.LookPath(yt)
43	if err != nil {
44		err = fmt.Errorf("%s not found in PATH %w", yt, err)
45		log.Fatal(err)
46	}
47
48	cmd := exec.Command(
49		ytPath,
50		"--extract-audio",
51		"--audio-format", "wav",
52		"--paths", playlistDir,
53		"--output", "%(id)s.%(ext)s",
54		playlistURL,
55	)
56	cmd.Stdout = os.Stdout
57	cmd.Stderr = os.Stderr
58
59	err = cmd.Run()
60	if err != nil {
61		err = fmt.Errorf("running yt-dlp: %w", err)
62		log.Fatal(err)
63	}
64}