-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
117 lines (104 loc) · 2.85 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
package main
import (
"database/sql"
"encoding/xml"
"fmt"
_ "github.com/mattn/go-sqlite3"
"github.com/pccr10001/mod-xmltv-generator/xmltv"
"io"
"log"
"os"
"strconv"
"strings"
"time"
)
type Channel struct {
ContentTitle string
ChannelNumber int
ContentId int
SdUrl string
HdUrl sql.NullString
FourKUrl sql.NullString
}
type Program struct {
Id int64
ContentTitle string
ContentId int
StartTime time.Time
EndTime time.Time
Description string
}
func main() {
db, err := sql.Open("sqlite3", "file:epg_all.sqlite?cache=shared")
if err != nil {
log.Println(err)
}
db.SetMaxOpenConns(1)
var mu = `#EXTM3U name="中華電信 MOD"
#EXTREM: Hinet MOD Playlist
#EXTREM:
#EXTREM: Chinese
`
var epg xmltv.TV
epg.SourceInfoName = "CHT MOD"
epg.SourceDataURL = "https://mod.cht.com.tw"
epg.GeneratorInfoName = "mod-xmltv-generator"
epg.GeneratorInfoURL = "https://github.com/pccr10001/mod-xmltv-generator"
r, err := db.Query("SELECT contentTitle, ContentId, channelNumber, sdURL, hdURL, fourKURL from tab_live_channel")
for r.Next() {
var c Channel
_ = r.Scan(&c.ContentTitle, &c.ContentId, &c.ChannelNumber, &c.SdUrl, &c.HdUrl, &c.FourKUrl)
var u = c.SdUrl
if c.HdUrl.Valid && c.HdUrl.String != "" {
u = c.HdUrl.String
}
if c.FourKUrl.Valid && c.FourKUrl.String != "" {
u = c.FourKUrl.String
}
// no link
if u == "" {
continue
}
mu = mu + fmt.Sprintf("#EXTINF:-1 tvg-id=\"%d\" tvg-chno=\"%d\",%s\n%s\n",
c.ContentId,
c.ChannelNumber,
c.ContentTitle,
strings.Replace(u, "igmp://", "udp://@", -1))
epg.Channels = append(epg.Channels, xmltv.Channel{
DisplayNames: []xmltv.CommonElement{{
Lang: "zh",
Value: c.ContentTitle,
}},
LCN: c.ChannelNumber,
ID: strconv.Itoa(c.ContentId),
})
}
f, _ := os.OpenFile("mod.m3u8", os.O_CREATE|os.O_WRONLY, 0666)
_, _ = io.WriteString(f, mu)
_ = f.Close()
var cstZone = time.FixedZone("CST", 0)
r, err = db.Query("SELECT programId, contentId, programName, startTime, endTime, description from tab_epg")
for r.Next() {
var p Program
_ = r.Scan(&p.Id, &p.ContentId, &p.ContentTitle, &p.StartTime, &p.EndTime, &p.Description)
epg.Programmes = append(epg.Programmes, xmltv.Programme{
Titles: []xmltv.CommonElement{{
Lang: "zh",
Value: p.ContentTitle,
}},
Descriptions: []xmltv.CommonElement{{
Lang: "zh",
Value: p.Description,
}},
Start: &xmltv.Time{Time: p.StartTime.In(cstZone)},
Stop: &xmltv.Time{Time: p.EndTime.In(cstZone)},
Channel: strconv.Itoa(p.ContentId),
})
}
f, _ = os.OpenFile("mod_epg.xml", os.O_CREATE|os.O_WRONLY, 0666)
e, _ := xml.Marshal(epg)
_, _ = io.WriteString(f, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
_, _ = io.WriteString(f, "<!DOCTYPE tv SYSTEM \"http://api.torrent-tv.ru/xmltv.dtd\">\n")
_, _ = io.WriteString(f, string(e))
_ = f.Close()
}