Files
xTeVe/src/m3u.go
marmei 717fa68b7e Add an error message if the filter rule is empty.
Set the streaming status to active only once.
2019-08-28 17:56:15 +02:00

243 lines
4.8 KiB
Go

package src
import (
"encoding/json"
"fmt"
"path"
"regexp"
"sort"
"strconv"
"strings"
m3u "../src/internal/m3u-parser"
)
// Playlisten parsen
func parsePlaylist(filename, fileType string) (channels []interface{}, err error) {
content, err := readByteFromFile(filename)
var id = strings.TrimSuffix(getFilenameFromPath(filename), path.Ext(getFilenameFromPath(filename)))
var playlistName = getProviderParameter(id, fileType, "name")
if err == nil {
switch fileType {
case "m3u":
channels, err = m3u.MakeInterfaceFromM3U(content)
case "hdhr":
channels, err = makeInteraceFromHDHR(content, playlistName, id)
}
}
return
}
// Streams filtern
func filterThisStream(s interface{}) (status bool) {
status = false
var stream = s.(map[string]string)
var regexpYES = `[{]+[^.]+[}]`
var regexpNO = `!+[{]+[^.]+[}]`
for _, filter := range Data.Filter {
if filter.Rule == "" {
continue
}
var group, name, search string
var exclude, include string
var match = false
var streamValues = strings.Replace(stream["_values"], "\r", "", -1)
if v, ok := stream["group-title"]; ok {
group = v
}
if v, ok := stream["name"]; ok {
name = v
}
// Unerwünschte Streams !{DEU}
r := regexp.MustCompile(regexpNO)
val := r.FindStringSubmatch(filter.Rule)
if len(val) == 1 {
exclude = val[0][2 : len(val[0])-1]
filter.Rule = strings.Replace(filter.Rule, " "+val[0], "", -1)
filter.Rule = strings.Replace(filter.Rule, val[0], "", -1)
}
// Muss zusätzlich erfüllt sein {DEU}
r = regexp.MustCompile(regexpYES)
val = r.FindStringSubmatch(filter.Rule)
if len(val) == 1 {
include = val[0][1 : len(val[0])-1]
filter.Rule = strings.Replace(filter.Rule, " "+val[0], "", -1)
filter.Rule = strings.Replace(filter.Rule, val[0], "", -1)
}
switch filter.CaseSensitive {
case false:
streamValues = strings.ToLower(streamValues)
filter.Rule = strings.ToLower(filter.Rule)
exclude = strings.ToLower(exclude)
include = strings.ToLower(include)
group = strings.ToLower(group)
name = strings.ToLower(name)
}
switch filter.Type {
case "group-title":
search = name
if group == filter.Rule {
match = true
}
case "custom-filter":
search = streamValues
if strings.Contains(search, filter.Rule) {
match = true
}
}
if match == true {
if len(exclude) > 0 {
var status = checkConditions(search, exclude, "exclude")
if status == false {
return false
}
}
if len(include) > 0 {
var status = checkConditions(search, include, "include")
if status == false {
return false
}
}
return true
}
}
return false
}
// Bedingungen für den Filter
func checkConditions(streamValues, conditions, coType string) (status bool) {
switch coType {
case "exclude":
status = true
case "include":
status = false
}
conditions = strings.Replace(conditions, ", ", ",", -1)
conditions = strings.Replace(conditions, " ,", ",", -1)
var keys = strings.Split(conditions, ",")
for _, key := range keys {
if strings.Contains(streamValues, key) {
switch coType {
case "exclude":
return false
case "include":
return true
}
}
}
return
}
// xTeVe M3U Datei erstellen
func buildM3U(groups []string) (m3u string, err error) {
var m3uChannels = make(map[float64]XEPGChannelStruct)
var channelNumbers []float64
for _, dxc := range Data.XEPG.Channels {
var xepgChannel XEPGChannelStruct
err := json.Unmarshal([]byte(mapToJSON(dxc)), &xepgChannel)
if err == nil {
if xepgChannel.XActive == true {
if len(groups) > 0 {
if indexOfString(xepgChannel.XGroupTitle, groups) == -1 {
goto Done
}
}
var channelNumber, err = strconv.ParseFloat(strings.TrimSpace(xepgChannel.XChannelID), 64)
if err == nil {
m3uChannels[channelNumber] = xepgChannel
channelNumbers = append(channelNumbers, channelNumber)
}
}
}
Done:
}
// M3U Inhalt erstellen
sort.Float64s(channelNumbers)
var xmltvURL = fmt.Sprintf("%s://%s/xmltv/xteve.xml", System.ServerProtocol.XML, System.Domain)
m3u = fmt.Sprintf(`#EXTM3U url-tvg="%s" x-tvg-url="%s"`+"\n", xmltvURL, xmltvURL)
for _, channelNumber := range channelNumbers {
var channel = m3uChannels[channelNumber]
var parameter = fmt.Sprintf(`#EXTINF:0 channelID="%s" tvg-chno="%s" tvg-name="%s" tvg-id="%s" tvg-logo="%s" group-title="%s",%s`+"\n", channel.XEPG, channel.XChannelID, channel.XName, channel.XChannelID, getCacheImageURL(channel.TvgLogo), channel.XGroupTitle, channel.XName)
var stream, err = createStreamingURL("M3U", channel.FileM3UID, channel.XChannelID, channel.XName, channel.URL)
if err == nil {
m3u = m3u + parameter + stream + "\n"
}
}
if len(groups) == 0 {
var filename = System.Folder.Data + "xteve.m3u"
err = writeByteToFile(filename, []byte(m3u))
}
return
}