-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
106 lines (88 loc) · 2.3 KB
/
main.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
import (
"database/sql"
"fmt"
"log"
"os"
"path"
_ "github.com/mattn/go-sqlite3"
)
func main() {
if len(os.Args) < 3 {
log.Fatal("Please specify a database file and an output directory.")
}
dbfile := os.Args[1]
outdir := os.Args[2]
// Play it cool with fields that might be empty
// But we won't write an m3u entry if either the path or file is null.
//
type Video struct {
name sql.NullString
artist sql.NullString
path sql.NullString
file sql.NullString
duration sql.NullString
}
db, err := sql.Open("sqlite3", dbfile)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Write a new .m3u file for each genre
genres, err := db.Query("select genre_id, name from genre")
if err != nil {
log.Fatal(err)
}
defer genres.Close()
for genres.Next() {
var gid int
var genreName string
err = genres.Scan(&gid, &genreName)
if err != nil {
log.Fatal(err)
}
fmt.Println("Found genre " + genreName)
f, err := os.Create(path.Join(outdir, genreName+".m3u"))
if err != nil {
log.Fatal(err)
}
defer f.Close()
f.WriteString("#EXTM3U\n")
// Get music videos
videos, err := db.Query("select musicvideo_view.c00 as name, musicvideo_view.c10 as artist, musicvideo_view.strPath as path, musicvideo_view.strFileName as file, musicvideo_view.totalTimeInSeconds as duration from genre_link, musicvideo_view where (genre_link.media_id = musicvideo_view.idMVideo) and media_type = 'musicvideo' and genre_id = ?", gid)
if err != nil {
log.Fatal(err)
}
defer videos.Close()
for videos.Next() {
v := Video{}
err = videos.Scan(&v.name, &v.artist, &v.path, &v.file, &v.duration)
if err != nil {
log.Fatal(err)
}
artist := "Unknown"
if v.artist.Valid {
artist = v.artist.String
}
name := "Unknown"
if v.name.Valid {
name = v.name.String
}
fmt.Printf(" %s - %s\n", artist, name)
if v.path.Valid && v.file.Valid {
duration := "-1"
if v.duration.Valid {
duration = v.duration.String
}
// #EXTINF:123, Sample artist - Sample title
// C:\Documents and Settings\I\My Music\Sample.mp3
f.WriteString(fmt.Sprintf("#EXTINF:%s,%s\n", duration, name))
f.WriteString(fmt.Sprintf("%s%s\n", v.path.String, v.file.String))
}
}
}
err = genres.Err()
if err != nil {
log.Fatal(err)
}
}