main
Raw Download raw file
 1package main
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"log"
 7	"net/url"
 8	"os"
 9	"path/filepath"
10	"strings"
11
12	"github.com/bryfry/singles/internal/playlist"
13)
14
15func main() {
16
17	apiKey, apiKeyFound := os.LookupEnv("YOUTUBE_API_KEY")
18	if !apiKeyFound {
19		log.Fatal("YOUTUBE_API_KEY environment variable is not set")
20	}
21
22	if len(os.Args) < 2 {
23		log.Fatal("Usage: go run main.go <playlist_id>")
24	}
25	playlistID := os.Args[1]
26
27	if strings.Contains(playlistID, "youtube") {
28		parsed, err := url.Parse(playlistID)
29		if err != nil {
30			log.Fatal("parsing url")
31		}
32		q := parsed.Query()
33		id := q.Get("list")
34		if id == "" {
35			log.Fatal("list parameter not found in url")
36		}
37		playlistID = id
38	}
39
40	pl, err := playlist.LookupPlaylist(apiKey, playlistID)
41	if err != nil {
42		log.Fatal(err)
43	}
44
45	dirName, _ := strings.CutPrefix(pl.Title, "singles - ")
46	playlistPath := filepath.Join("playlist", dirName)
47	err = os.MkdirAll(playlistPath, 0o755)
48	if err != nil {
49		err = fmt.Errorf("creating playlist directory: %w", err)
50		log.Fatal(err)
51	}
52
53	metadataPath := filepath.Join(playlistPath, "playlist.json")
54	f, err := os.OpenFile(
55		metadataPath,
56		os.O_CREATE|os.O_EXCL|os.O_WRONLY,
57		0o655)
58	if err != nil {
59		err = fmt.Errorf("opening playlist metadata file: %w", err)
60		log.Fatal(err)
61	}
62
63	enc := json.NewEncoder(f)
64	enc.SetIndent("", "  ")
65	err = enc.Encode(pl)
66	if err != nil {
67		err = fmt.Errorf("opening playlist metadata file: %w", err)
68		log.Fatal(err)
69	}
70}