main
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}