/
query.go
94 lines (84 loc) · 2.45 KB
/
query.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
package mpdqlib
import (
"log"
"strings"
"github.com/thoas/go-funk"
"github.com/zencoder/go-dash/mpd"
)
// This takes a lot of inspiration from CBS Interactive (Thank you!)
// https://github.com/cbsinteractive/bakery/blob/master/filters/dash.go
// https://github.com/cbsinteractive/bakery/blob/master/filters/filter.go
// Query returns a parsed manifest with elements matching query string
func Query(manifest *mpd.MPD, query string) {
queryMPD(manifest, query, true)
}
func queryMPD(manifest *mpd.MPD, query string, print bool) {
validParams := []string{"b", "bw", "bandwidth", "c", "codec", "fr", "fps", "l", "lang", "language", "t", "type", "ts", "timescale", "w", "width"}
validOps := []string{"=", "==", "!=", "<", "<=", ">", ">="}
queryList := getQueries(query)
for _, queryString := range queryList {
query := parseQuery(queryString)
if !funk.Contains(validParams, query.param) {
log.Fatalf("invalid query parameter %v\nvalid params: %v\n", query.param, validParams)
}
if !funk.Contains(validOps, query.op) {
log.Fatalf("invalid query operand %v\nvalid operands: %v\n", query.op, validOps)
}
switch query.param {
case "b", "bw", "bandwidth":
filterBandwidth(manifest, query)
case "c", "codec":
// filterCodecs == audio, video, text, image
log.Fatal("not there yet")
case "fr", "fps":
// filterFrameRate == ...
log.Fatal("not there yet")
case "h", "height":
// filterHeight == ...
log.Fatal("not there yet")
case "l", "lang", "language":
// filterLanguage == audio, video, text, image
log.Fatal("not there yet")
case "t", "type":
// filterContentType == ...
log.Fatal("not there yet")
case "ts", "timescale":
// filterTimescale == ...
log.Fatal("not there yet")
case "w", "width":
// filterTimescale == ...
log.Fatal("not there yet")
}
if print {
PrintManifest(manifest)
}
}
}
type query struct {
param, op, value string
}
func getQueries(query string) []string {
var queries []string
if strings.Contains(query, ",") {
queries = strings.Split(query, ",")
}
if strings.Contains(query, "&&") {
queries = strings.Split(query, "&&")
}
if len(queries) == 0 {
queries = append(queries, query)
}
return queries
}
func parseQuery(queryString string) query {
parts := strings.Split(queryString, " ")
if len(parts) != 3 {
log.Fatalf("expected '{name} {op} {value}' got %v", queryString)
}
query := query{
param: parts[0],
op: parts[1],
value: parts[2],
}
return query
}