10 Commits

Author SHA1 Message Date
marmei
11453c6053 v2.0.3.0030 2019-09-07 12:51:21 +02:00
marmei
81e8ae33d7 Merge branch 'Bugs_in_2.0.2' 2019-09-07 12:07:55 +02:00
marmei
f3be0fca47 Wrong warning (root) 2019-09-05 19:37:55 +02:00
marmei
1c1c89cd74 Update changelog-beta.md 2019-09-04 2019-09-04 21:16:04 +02:00
marmei
3d73dba422 Code removed #1 2019-09-04 20:16:11 +02:00
marmei
c6e74fe11c Interception of repeated save 2019-09-04 20:12:26 +02:00
marmei
18dba46c02 Bug #16 1 2019-09-01 00:24:06 +02:00
marmei
efa55b39a9 Bug #16 0 2019-08-31 20:39:39 +02:00
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
marmei
878531ff79 IPTV removed as a source 2019-08-28 16:49:41 +02:00
11 changed files with 560 additions and 455 deletions

View File

@@ -1,3 +1,14 @@
#### 2.0.2.0024-beta
```diff
+ Improved monitoring of the buffer process
+ Update the XEPG database a bit faster
```
##### Fixes
- Error message if filter rule is missing
- Channels are lost when saving again (Mapping)
- Plex log, invalid source: IPTV
#### 2.0.1.0012-beta #### 2.0.1.0012-beta
```diff ```diff
+ Add support for "video/m2ts" video streams (Pull request #14) + Add support for "video/m2ts" video streams (Pull request #14)

View File

@@ -205,7 +205,7 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
playlist.Streams[streamID] = stream playlist.Streams[streamID] = stream
BufferInformation.Store(playlistID, playlist) BufferInformation.Store(playlistID, playlist)
go connectToStreamingServer(streamID, playlist) go connectToStreamingServer(streamID, playlistID)
showInfo(fmt.Sprintf("Streaming Status:Playlist: %s - Tuner: %d / %d", playlist.PlaylistName, len(playlist.Streams), playlist.Tuner)) showInfo(fmt.Sprintf("Streaming Status:Playlist: %s - Tuner: %d / %d", playlist.PlaylistName, len(playlist.Streams), playlist.Tuner))
@@ -219,6 +219,10 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
for { // Loop 1: Warten bis das erste Segment durch den Buffer heruntergeladen wurde for { // Loop 1: Warten bis das erste Segment durch den Buffer heruntergeladen wurde
if p, ok := BufferInformation.Load(playlistID); ok {
var playlist = p.(Playlist)
if stream, ok := playlist.Streams[streamID]; ok { if stream, ok := playlist.Streams[streamID]; ok {
if stream.Status == false { if stream.Status == false {
@@ -377,6 +381,8 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
} }
} // Ende BufferInformation
} // Ende Loop 1 } // Ende Loop 1
} }
@@ -507,7 +513,11 @@ func clientConnection(stream ThisStream) (status bool) {
return return
} }
func connectToStreamingServer(streamID int, playlist Playlist) { func connectToStreamingServer(streamID int, playlistID string) {
if p, ok := BufferInformation.Load(playlistID); ok {
var playlist = p.(Playlist)
var timeOut = 0 var timeOut = 0
var debug string var debug string
@@ -548,11 +558,11 @@ func connectToStreamingServer(streamID int, playlist Playlist) {
var stream = playlist.Streams[streamID] var stream = playlist.Streams[streamID]
if c, ok := BufferClients.Load(stream.PlaylistID + stream.MD5); ok { if c, ok := BufferClients.Load(playlistID + stream.MD5); ok {
var clients = c.(ClientConnection) var clients = c.(ClientConnection)
clients.Error = err clients.Error = err
BufferClients.Store(stream.PlaylistID+stream.MD5, clients) BufferClients.Store(playlistID+stream.MD5, clients)
} }
@@ -568,7 +578,7 @@ func connectToStreamingServer(streamID int, playlist Playlist) {
} }
// M3U8 Segmente // M3U8 Segmente
InitBuffer: InitBuffer:
defaultSegment() defaultSegment()
if len(m3u8Segments) > 30 { if len(m3u8Segments) > 30 {
@@ -650,7 +660,7 @@ InitBuffer:
addErrorToStream(err) addErrorToStream(err)
killClientConnection(streamID, stream.PlaylistID, true) killClientConnection(streamID, playlistID, true)
clientConnection(stream) clientConnection(stream)
return return
@@ -722,7 +732,7 @@ InitBuffer:
BufferInformation.Store(playlist.PlaylistID, playlist) BufferInformation.Store(playlist.PlaylistID, playlist)
addErrorToStream(err) addErrorToStream(err)
killClientConnection(streamID, stream.PlaylistID, true) killClientConnection(streamID, playlistID, true)
clientConnection(stream) clientConnection(stream)
resp.Body.Close() resp.Body.Close()
@@ -891,6 +901,8 @@ InitBuffer:
stream.Status = true stream.Status = true
playlist.Streams[streamID] = stream playlist.Streams[streamID] = stream
BufferInformation.Store(playlistID, playlist)
tmpSegment++ tmpSegment++
tmpFile = fmt.Sprintf("%s%d.ts", tmpFolder, tmpSegment) tmpFile = fmt.Sprintf("%s%d.ts", tmpFolder, tmpSegment)
@@ -986,6 +998,8 @@ InitBuffer:
} // Ende for loop } // Ende for loop
} // Ende BufferInformation
} }
func parseM3U8(stream *ThisStream) (err error) { func parseM3U8(stream *ThisStream) (err error) {

View File

@@ -109,7 +109,7 @@ func Init() (err error) {
// Überprüfen ob xTeVe als root läuft // Überprüfen ob xTeVe als root läuft
if os.Geteuid() == 0 { if os.Geteuid() == 0 {
showWarning(2010) showWarning(2110)
} }
if System.Flag.Debug > 0 { if System.Flag.Debug > 0 {

View File

@@ -366,6 +366,7 @@ func saveFilter(request RequestStruct) (settings SettingsStrcut, err error) {
var filterMap = make(map[int64]interface{}) var filterMap = make(map[int64]interface{})
var newData = make(map[int64]interface{}) var newData = make(map[int64]interface{})
var defaultFilter FilterStruct var defaultFilter FilterStruct
var newFilter = false
defaultFilter.Active = true defaultFilter.Active = true
defaultFilter.CaseSensitive = false defaultFilter.CaseSensitive = false
@@ -389,6 +390,7 @@ func saveFilter(request RequestStruct) (settings SettingsStrcut, err error) {
if dataID == -1 { if dataID == -1 {
// Neuer Filter // Neuer Filter
newFilter = true
dataID = createNewID() dataID = createNewID()
filterMap[dataID] = jsonToMap(mapToJSON(defaultFilter)) filterMap[dataID] = jsonToMap(mapToJSON(defaultFilter))
@@ -397,15 +399,28 @@ func saveFilter(request RequestStruct) (settings SettingsStrcut, err error) {
// Filter aktualisieren / löschen // Filter aktualisieren / löschen
for key, value := range data.(map[string]interface{}) { for key, value := range data.(map[string]interface{}) {
var oldData = filterMap[dataID].(map[string]interface{})
oldData[key] = value
// Filter löschen // Filter löschen
if _, ok := data.(map[string]interface{})["delete"]; ok { if _, ok := data.(map[string]interface{})["delete"]; ok {
delete(filterMap, dataID) delete(filterMap, dataID)
break break
}
if filter, ok := data.(map[string]interface{})["filter"].(string); ok {
if len(filter) == 0 {
err = errors.New(getErrMsg(1014))
if newFilter == true {
delete(filterMap, dataID)
}
return
}
}
if oldData, ok := filterMap[dataID].(map[string]interface{}); ok {
oldData[key] = value
} }
} }
@@ -446,8 +461,39 @@ func saveXEpgMapping(request RequestStruct) (err error) {
Data.XEPG.Channels = request.EpgMapping Data.XEPG.Channels = request.EpgMapping
if System.ScanInProgress == 0 {
cleanupXEPG() cleanupXEPG()
buildXEPG(true) buildXEPG(true)
} else {
// Wenn während des erstellen der Datanbank das Mapping erneut gespeichert wird, wird die Datenbank erst später erneut aktualisiert.
go func() {
if System.BackgroundProcess == true {
return
}
System.BackgroundProcess = true
for {
time.Sleep(time.Duration(1) * time.Second)
if System.ScanInProgress == 0 {
break
}
}
cleanupXEPG()
buildXEPG(false)
System.BackgroundProcess = false
}()
}
return return
} }
@@ -612,6 +658,7 @@ func saveWizard(request RequestStruct) (nextStep int, err error) {
} }
buildXEPG(false) buildXEPG(false)
System.ScanInProgress = 0
} }

View File

@@ -95,7 +95,7 @@ func getLineupStatus() (jsonContent []byte, err error) {
lineupStatus.ScanInProgress = System.ScanInProgress lineupStatus.ScanInProgress = System.ScanInProgress
lineupStatus.ScanPossible = 0 lineupStatus.ScanPossible = 0
lineupStatus.Source = "Cable" lineupStatus.Source = "Cable"
lineupStatus.SourceList = []string{"IPTV", "Cable"} lineupStatus.SourceList = []string{"Cable"}
jsonContent, err = json.MarshalIndent(lineupStatus, "", " ") jsonContent, err = json.MarshalIndent(lineupStatus, "", " ")

View File

@@ -2,6 +2,8 @@ package m3u
import ( import (
"errors" "errors"
"fmt"
"log"
"net/url" "net/url"
"regexp" "regexp"
"strings" "strings"
@@ -12,6 +14,7 @@ func MakeInterfaceFromM3U(byteStream []byte) (allChannels []interface{}, err err
var content = string(byteStream) var content = string(byteStream)
var channelName string var channelName string
var uuids []string
var parseMetaData = func(channel string) (stream map[string]string) { var parseMetaData = func(channel string) (stream map[string]string) {
@@ -53,7 +56,7 @@ func MakeInterfaceFromM3U(byteStream []byte) (allChannels []interface{}, err err
line = strings.Replace(line, p, "", 1) line = strings.Replace(line, p, "", 1)
p = strings.Replace(p, `"`, "", -1) p = strings.Replace(p, `"`, "", -1)
var parameter = strings.Split(p, "=") var parameter = strings.SplitN(p, "=", 2)
if len(parameter) == 2 { if len(parameter) == 2 {
@@ -120,9 +123,15 @@ func MakeInterfaceFromM3U(byteStream []byte) (allChannels []interface{}, err err
if strings.Contains(strings.ToLower(key), "id") { if strings.Contains(strings.ToLower(key), "id") {
if indexOfString(value, uuids) != -1 {
log.Println(fmt.Sprintf("Channel: %s - %s = %s ", stream["name"], key, value))
break
}
uuids = append(uuids, value)
stream["_uuid.key"] = key stream["_uuid.key"] = key
stream["_uuid.value"] = value stream["_uuid.value"] = value
//os.Exit(0)
break break
} }
@@ -160,3 +169,14 @@ func MakeInterfaceFromM3U(byteStream []byte) (allChannels []interface{}, err err
return return
} }
func indexOfString(element string, data []string) int {
for k, v := range data {
if element == v {
return k
}
}
return -1
}

View File

@@ -43,6 +43,10 @@ func filterThisStream(s interface{}) (status bool) {
for _, filter := range Data.Filter { for _, filter := range Data.Filter {
if filter.Rule == "" {
continue
}
var group, name, search string var group, name, search string
var exclude, include string var exclude, include string
var match = false var match = false

View File

@@ -245,6 +245,8 @@ func getErrMsg(errCode int) (errMsg string) {
errMsg = fmt.Sprintf("Invalid formatting of the time") errMsg = fmt.Sprintf("Invalid formatting of the time")
case 1013: case 1013:
errMsg = fmt.Sprintf("Invalid settings file (settings.json), file must be at least version %s", System.Compatibility) errMsg = fmt.Sprintf("Invalid settings file (settings.json), file must be at least version %s", System.Compatibility)
case 1014:
errMsg = fmt.Sprintf("Invalid filter rule")
case 1020: case 1020:
errMsg = fmt.Sprintf("Data could not be saved, invalid keyword") errMsg = fmt.Sprintf("Data could not be saved, invalid keyword")

View File

@@ -11,6 +11,7 @@ type SystemStruct struct {
APIVersion string APIVersion string
AppName string AppName string
ARCH string ARCH string
BackgroundProcess bool
Branch string Branch string
Build string Build string
Compatibility string Compatibility string

View File

@@ -306,7 +306,6 @@ func createXEPGDatabase() (err error) {
} }
if len(xepgChannel.XChannelID) == 0 { if len(xepgChannel.XChannelID) == 0 {
fmt.Println(mapToJSON(xepgChannel))
delete(Data.XEPG.Channels, id) delete(Data.XEPG.Channels, id)
} }
@@ -316,6 +315,12 @@ func createXEPGDatabase() (err error) {
} }
var xepgChannels = make(map[string]interface{})
for k, v := range Data.XEPG.Channels {
xepgChannels[k] = v
}
for _, dsa := range Data.Streams.Active { for _, dsa := range Data.Streams.Active {
var channelExists = false // Entscheidet ob ein Kanal neu zu Datenbank hinzugefügt werden soll. var channelExists = false // Entscheidet ob ein Kanal neu zu Datenbank hinzugefügt werden soll.
@@ -331,7 +336,7 @@ func createXEPGDatabase() (err error) {
Data.Cache.Streams.Active = append(Data.Cache.Streams.Active, m3uChannel.Name) Data.Cache.Streams.Active = append(Data.Cache.Streams.Active, m3uChannel.Name)
// XEPG Datenbank durchlaufen um nach dem Kanal zu suchen. // XEPG Datenbank durchlaufen um nach dem Kanal zu suchen.
for xepg, dxc := range Data.XEPG.Channels { for xepg, dxc := range xepgChannels {
var xepgChannel XEPGChannelStruct var xepgChannel XEPGChannelStruct
err = json.Unmarshal([]byte(mapToJSON(dxc)), &xepgChannel) err = json.Unmarshal([]byte(mapToJSON(dxc)), &xepgChannel)
@@ -367,6 +372,7 @@ func createXEPGDatabase() (err error) {
//os.Exit(0) //os.Exit(0)
switch channelExists { switch channelExists {
case true: case true:
// Bereits vorhandener Kanal // Bereits vorhandener Kanal
var xepgChannel XEPGChannelStruct var xepgChannel XEPGChannelStruct

View File

@@ -39,7 +39,7 @@ var GitHub = GitHubStruct{Branch: "master", User: "xteve-project", Repo: "xTeVe-
const Name = "xTeVe" const Name = "xTeVe"
// Version : Version, die Build Nummer wird in der main func geparst. // Version : Version, die Build Nummer wird in der main func geparst.
const Version = "2.0.2.0020" const Version = "2.0.3.0030"
// DBVersion : Datanbank Version // DBVersion : Datanbank Version
const DBVersion = "2.0.0" const DBVersion = "2.0.0"