-
Notifications
You must be signed in to change notification settings - Fork 0
/
check.go
132 lines (115 loc) · 3.25 KB
/
check.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
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"context"
"github.com/google/uuid"
"github.com/jkittell/data/api/client"
"github.com/jkittell/data/database"
"log"
"time"
)
type Result struct {
Id uuid.UUID
URL string
OKSegments int
TotalSegments int
OKPercent float64
CreatedAt time.Time
}
func (r *Result) Primary() (string, any) {
return "id", r.Id
}
func (r *Result) Scan(fields []string, scan database.ScanFunc) error {
return database.Scan(map[string]any{
"id": &r.Id,
"url": &r.URL,
"total_segments": &r.TotalSegments,
"ok_segments": &r.OKSegments,
"ok_percent": &r.OKPercent,
"created_at": &r.CreatedAt,
}, fields, scan)
}
func (r *Result) Params() map[string]any {
return map[string]any{
"id": r.Id,
"url": r.URL,
"total_segments": &r.TotalSegments,
"ok_segments": &r.OKSegments,
"ok_percent": &r.OKPercent,
"created_at": &r.CreatedAt,
}
}
type SegmentInfo struct {
URL string `bson:"URL"`
ABRStreamURL string `bson:"abr_stream_url" json:"abr_stream_url"`
StatusCode int `bson:"status_code" json:"status_code"`
ContentLength int64 `bson:"content_length" json:"content_length"`
Error string `bson:"error" json:"error"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
}
type SegmentCheckInfo struct {
Id uuid.UUID `bson:"_id" json:"id"`
URL string `bson:"URL" json:"URL"`
Segments []SegmentInfo `bson:"segments" json:"segments"`
}
func check(resultsDB database.PosgresDB[*Result], infoDB database.MongoDB[SegmentCheckInfo], stream Job, jobDone chan bool) {
var total int
var ok int
streamInfo := SegmentCheckInfo{
Id: stream.Id,
URL: stream.URL,
Segments: []SegmentInfo{},
}
for _, seg := range stream.Segments {
total++
segmentInfo := SegmentInfo{
URL: seg.SegmentURL,
ABRStreamURL: seg.StreamURL,
StatusCode: 0,
ContentLength: 0,
Error: "",
CreatedAt: time.Now(),
}
resp, err := client.Head(seg.SegmentURL)
if err != nil {
segmentInfo.Error = err.Error()
}
if resp != nil {
segmentInfo.StatusCode = resp.StatusCode
segmentInfo.ContentLength = resp.ContentLength
if resp.StatusCode == 200 {
if resp.ContentLength > 0 {
ok++
}
}
}
streamInfo.Segments = append(streamInfo.Segments, segmentInfo)
}
var okPercent float64
if total > 0 {
okPercent = (float64(ok) / float64(total)) * 100
}
result := Result{
Id: stream.Id,
URL: stream.URL,
TotalSegments: total,
OKSegments: ok,
OKPercent: okPercent,
CreatedAt: time.Now(),
}
// write to database
_, err := resultsDB.Create(context.TODO(), &result)
if err != nil {
log.Printf("[ %s ] error creating database entry: %s", stream.Id, err)
}
// save segment info to database
err = infoDB.Insert(context.TODO(), "segment_check_info", streamInfo)
if err != nil {
log.Printf("[ %s ] error inserting segment check info: %s", stream.Id, err)
}
jobDone <- true
}
func checkSegments(resultsDB database.PosgresDB[*Result], infoDB database.MongoDB[SegmentCheckInfo], streamsToCheck chan Job, jobDone chan bool) {
for stream := range streamsToCheck {
check(resultsDB, infoDB, stream, jobDone)
}
}