-
Notifications
You must be signed in to change notification settings - Fork 0
/
playlist.go
84 lines (69 loc) · 1.89 KB
/
playlist.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package main
import (
"fmt"
"os"
"log"
"time"
)
func createM3U(cfg Config, name string, files []string) error {
f, err := os.OpenFile(cfg.PlaylistDir+name+".m3u", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
return err
}
for _, file := range files {
fullFile := fmt.Sprintf("%s%s.mp3\n",cfg.Youtube.DownloadDir, file)
_, err := f.Write([]byte(fullFile))
if err != nil {
log.Printf("Failed to write song to file: %s", err.Error())
}
}
return nil
}
func (cfg *Config) getPlaylistName(persist bool) {
playlistName := "Discover-Weekly"
if persist {
year, week := time.Now().ISOWeek()
playlistName = fmt.Sprintf("%s-%v-Week%v", playlistName, year, week)
}
cfg.PlaylistName = playlistName
}
func createPlaylist(cfg Config, songs, files []string, system string) error {
if system != "subsonic" && system != "mpd" {
return fmt.Errorf("unsupported music system: %s", system)
}
switch system {
case "subsonic":
if err := scan(cfg.Subsonic); err != nil {
return fmt.Errorf("failed to schedule a library scan")
}
if err := subsonicPlaylist(cfg.Subsonic, songs, cfg.PlaylistName); err != nil {
return fmt.Errorf("failed to create subsonic playlist: %w", err)
}
return nil
case "mpd":
if err := createM3U(cfg, cfg.PlaylistName, files); err != nil {
return fmt.Errorf("failed to create M3U playlist: %w", err)
}
return nil
}
return fmt.Errorf("something very strange happened")
}
func handlePlaylistDeletion(cfg Config, system string) error {
deleteSongs(cfg.Youtube)
switch system {
case "subsonic":
playlists, err := getDiscoveryPlaylist(cfg.Subsonic)
if err != nil {
return err
}
if err := delSubsonicPlaylists(playlists, cfg.Subsonic); err != nil {
return err
}
return nil
case "mpd":
if err := os.Remove(cfg.PlaylistDir+cfg.PlaylistName+".m3u"); err != nil {
return err
}
}
return nil
}