-
Notifications
You must be signed in to change notification settings - Fork 14
/
channel.go
60 lines (52 loc) · 1.47 KB
/
channel.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
package service
import (
"crypto/md5"
"encoding/base64"
"fmt"
"github.com/snowie2000/livetv/global"
"github.com/snowie2000/livetv/model"
)
func GetAllChannel() (channels []model.Channel, err error) {
err = global.DB.Find(&channels).Error
if err == nil {
// update all channel info to the cache
for i := range channels {
if ch, ok := global.ChannelCache.Load(channels[i].ID); ok {
channels[i].Token = ch.Token
} else {
channels[i].Token = generateToken(channels[i].ID)
global.ChannelCache.Store(channels[i].ID, channels[i])
}
}
}
return
}
func SaveChannel(channel model.Channel) error {
global.ChannelCache.Delete(channel.ID)
return global.DB.Save(&channel).Error
}
func DeleteChannel(id uint) error {
global.ChannelCache.Delete(id)
return global.DB.Delete(model.Channel{}, "id = ?", id).Error
}
func GetChannel(channelNumber uint) (channel model.Channel, err error) {
if ch, ok := global.ChannelCache.Load(channelNumber); ok {
return ch, nil
}
err = global.DB.Where("id = ?", channelNumber).First(&channel, channelNumber).Error
if err == nil {
channel.Token = generateToken(channelNumber)
global.ChannelCache.Store(channelNumber, channel)
}
return
}
const SALT string = "LiVeTv"
func generateToken(channelNumber uint) string {
secret := global.GetSecretToken()
if secret == "" {
return ""
}
text := fmt.Sprintf("%s_%s_%d", secret, SALT, channelNumber)
hash := md5.Sum([]byte(text))
return base64.URLEncoding.EncodeToString(hash[:])[1:10]
}