-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
119 lines (106 loc) · 2.32 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
107
108
109
110
111
112
113
114
115
116
117
118
119
package main
import (
"bytes"
"context"
"fmt"
"io/ioutil"
"os"
"os/exec"
"runtime"
"time"
"github.com/aquilax/m3u"
"github.com/gammazero/workerpool"
"github.com/kennygrant/sanitize"
)
const DEBUG = false
const TIMEOUT_SEC = 5 * time.Second
func runCommand(command string, args []string) error {
ctx, cancel := context.WithTimeout(context.Background(), TIMEOUT_SEC)
defer cancel()
cmd := exec.CommandContext(ctx, command, args...)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
if DEBUG {
fmt.Println(cmd.String() + " : " + fmt.Sprint(err) + " : " + stderr.String())
}
return err
}
return nil
}
func takeScreenshot(streamURL, fileName string) error {
return runCommand("ffmpeg", []string{
"-i",
streamURL,
"-ss",
"00:00:01.500",
"-f",
"image2",
"-vframes",
"1",
fileName,
})
}
func getJob(track m3u.Track, i, tracks int, success chan<- m3u.Track) func() {
return func() {
var b bytes.Buffer
fmt.Fprintf(&b, "[%d/%d] URI: %s Name: %s", i+1, tracks, track.URI, track.Name)
fileName := sanitize.BaseName(fmt.Sprintf("%s-%s", track.Name, time.Now().Format(time.RFC3339))) + ".jpg"
err := takeScreenshot(track.URI, fileName)
if err != nil {
fmt.Fprint(&b, " ERROR")
fmt.Println(b.String())
return
}
fmt.Fprint(&b, " Screenshot saved to: "+fileName)
fmt.Println(b.String())
track.Tags = append(track.Tags, m3u.Tag{"screenshot", fileName})
success <- track
}
}
func main() {
var err error
if len(os.Args) < 2 {
fmt.Printf(`Usage:
%s PLAYLIST`+"\n", os.Args[0])
return
}
playlist, err := m3u.Parse(os.Args[1])
success := m3u.Playlist{}
if err != nil {
panic(err)
}
results := make(chan m3u.Track)
var workers = runtime.NumCPU()
if workers > 1 {
workers--
}
wp := workerpool.New(workers)
tracks := len(playlist.Tracks)
for i := range playlist.Tracks {
track := playlist.Tracks[i]
wp.Submit(getJob(track, i, tracks, results))
}
go func() {
for {
track := <-results
success.Tracks = append(success.Tracks, track)
}
}()
wp.StopWait()
close(results)
reader, err := m3u.Marshall(success)
if err != nil {
panic(err)
}
data, err := ioutil.ReadAll(reader)
if err != nil {
panic(err)
}
err = ioutil.WriteFile("succeess.m3u", data, 0644)
if err != nil {
panic(err)
}
}