19 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
xteve-project
792fd9a373 Merge pull request #14 from Coledunsby/master
Add support for "video/m2ts" video streams
2019-08-24 13:12:26 +02:00
marmei
a1ec0287ef v2.0.2.0020 2019-08-24 13:10:08 +02:00
marmei
a79e824ef8 Merge branch 'Coledunsby-master' 2019-08-24 13:04:48 +02:00
marmei
c843f424fe update changelog-beta.md 2019-08-23 23:34:25 +02:00
marmei
5c6637c048 Add support for "video/m2ts" video streams 2019-08-23 23:21:41 +02:00
marmei
1062e072d6 update readme.md 2019-08-23 23:17:40 +02:00
Cole Dunsby
d831a099f0 Add support for "video/m2ts" video streams 2019-08-19 22:14:53 -04:00
marmei
a06baef4d3 Bug #9 - Fixed, incorrect original-air-date 2019-08-18 11:19:03 +02:00
marmei
f9d1a45bbd Add original group-title to mapping editor 2019-08-17 08:57:06 +02:00
17 changed files with 627 additions and 498 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
.DS_Store
demo
compiler
files
update_xteve*.sh

View File

@@ -81,11 +81,6 @@ Including:
- Crond: Daemon to execute scheduled commands
- Perl: Programming language
## Beta version
New features are first available in the beta version and will be added to the master branch after successful testing
If you prefer to use the beta version, you can always switch between master and beta branch.
---
### xTeVe Beta branch

View File

@@ -1,3 +1,25 @@
#### 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
```diff
+ Add support for "video/m2ts" video streams (Pull request #14)
```
#### 2.0.1.0011-beta
```diff
+ Original group title is shown in the Mapping Editor
```
##### Fixes
- incorrect original-air-date
#### 2.0.1.0010-beta
```diff
+ Set timestamp to <episode-num system="original-air-date">

View File

@@ -1288,6 +1288,9 @@ function openPopUp(dataType, element) {
var input = content.createInput("text", dbKey, data[dbKey]);
input.setAttribute("onchange", "javascript: this.className = 'changed'");
content.appendRow("{{.mapping.m3uGroupTitle.title}}", input);
if (data["group-title"] != undefined) {
content.description(data["group-title"]);
}
// XMLTV Datei
var dbKey = "x-xmltv-file";
var xmlFile = data[dbKey];

View File

@@ -205,7 +205,7 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
playlist.Streams[streamID] = stream
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))
@@ -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
if p, ok := BufferInformation.Load(playlistID); ok {
var playlist = p.(Playlist)
if stream, ok := playlist.Streams[streamID]; ok {
if stream.Status == false {
@@ -377,6 +381,8 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
}
} // Ende BufferInformation
} // Ende Loop 1
}
@@ -507,7 +513,11 @@ func clientConnection(stream ThisStream) (status bool) {
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 debug string
@@ -548,11 +558,11 @@ func connectToStreamingServer(streamID int, playlist Playlist) {
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)
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
InitBuffer:
InitBuffer:
defaultSegment()
if len(m3u8Segments) > 30 {
@@ -650,7 +660,7 @@ InitBuffer:
addErrorToStream(err)
killClientConnection(streamID, stream.PlaylistID, true)
killClientConnection(streamID, playlistID, true)
clientConnection(stream)
return
@@ -722,7 +732,7 @@ InitBuffer:
BufferInformation.Store(playlist.PlaylistID, playlist)
addErrorToStream(err)
killClientConnection(streamID, stream.PlaylistID, true)
killClientConnection(streamID, playlistID, true)
clientConnection(stream)
resp.Body.Close()
@@ -790,7 +800,7 @@ InitBuffer:
}
// Video Stream (TS)
case "video/mpeg", "video/mp4", "video/mp2t", "application/octet-stream", "binary/octet-stream", "application/mp2t":
case "video/mpeg", "video/mp4", "video/mp2t", "video/m2ts", "application/octet-stream", "binary/octet-stream", "application/mp2t":
var fileSize int
@@ -891,6 +901,8 @@ InitBuffer:
stream.Status = true
playlist.Streams[streamID] = stream
BufferInformation.Store(playlistID, playlist)
tmpSegment++
tmpFile = fmt.Sprintf("%s%d.ts", tmpFolder, tmpSegment)
@@ -986,6 +998,8 @@ InitBuffer:
} // Ende for loop
} // Ende BufferInformation
}
func parseM3U8(stream *ThisStream) (err error) {

View File

@@ -109,7 +109,7 @@ func Init() (err error) {
// Überprüfen ob xTeVe als root läuft
if os.Geteuid() == 0 {
showWarning(2010)
showWarning(2110)
}
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 newData = make(map[int64]interface{})
var defaultFilter FilterStruct
var newFilter = false
defaultFilter.Active = true
defaultFilter.CaseSensitive = false
@@ -389,6 +390,7 @@ func saveFilter(request RequestStruct) (settings SettingsStrcut, err error) {
if dataID == -1 {
// Neuer Filter
newFilter = true
dataID = createNewID()
filterMap[dataID] = jsonToMap(mapToJSON(defaultFilter))
@@ -397,15 +399,28 @@ func saveFilter(request RequestStruct) (settings SettingsStrcut, err error) {
// Filter aktualisieren / löschen
for key, value := range data.(map[string]interface{}) {
var oldData = filterMap[dataID].(map[string]interface{})
oldData[key] = value
// Filter löschen
if _, ok := data.(map[string]interface{})["delete"]; ok {
delete(filterMap, dataID)
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
if System.ScanInProgress == 0 {
cleanupXEPG()
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
}
@@ -612,6 +658,7 @@ func saveWizard(request RequestStruct) (nextStep int, err error) {
}
buildXEPG(false)
System.ScanInProgress = 0
}

View File

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

View File

@@ -2,6 +2,8 @@ package m3u
import (
"errors"
"fmt"
"log"
"net/url"
"regexp"
"strings"
@@ -12,6 +14,7 @@ func MakeInterfaceFromM3U(byteStream []byte) (allChannels []interface{}, err err
var content = string(byteStream)
var channelName string
var uuids []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)
p = strings.Replace(p, `"`, "", -1)
var parameter = strings.Split(p, "=")
var parameter = strings.SplitN(p, "=", 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 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.value"] = value
//os.Exit(0)
break
}
@@ -160,3 +169,14 @@ func MakeInterfaceFromM3U(byteStream []byte) (allChannels []interface{}, err err
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 {
if filter.Rule == "" {
continue
}
var group, name, search string
var exclude, include string
var match = false

View File

@@ -245,6 +245,8 @@ func getErrMsg(errCode int) (errMsg string) {
errMsg = fmt.Sprintf("Invalid formatting of the time")
case 1013:
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:
errMsg = fmt.Sprintf("Data could not be saved, invalid keyword")

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -205,6 +205,7 @@ func xTeVe(w http.ResponseWriter, r *http.Request) {
// XMLTV Datei
if strings.Contains(path, "xmltv/") {
w.Header().Set("Content-Type", "application/xml")
requestType = "xml"
file = System.Folder.Data + getFilenameFromPath(path)

View File

@@ -306,7 +306,6 @@ func createXEPGDatabase() (err error) {
}
if len(xepgChannel.XChannelID) == 0 {
fmt.Println(mapToJSON(xepgChannel))
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 {
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)
// XEPG Datenbank durchlaufen um nach dem Kanal zu suchen.
for xepg, dxc := range Data.XEPG.Channels {
for xepg, dxc := range xepgChannels {
var xepgChannel XEPGChannelStruct
err = json.Unmarshal([]byte(mapToJSON(dxc)), &xepgChannel)
@@ -367,6 +372,7 @@ func createXEPGDatabase() (err error) {
//os.Exit(0)
switch channelExists {
case true:
// Bereits vorhandener Kanal
var xepgChannel XEPGChannelStruct
@@ -828,7 +834,16 @@ func getEpisodeNum(program *Program, xmltvProgram *Program, xepgChannel XEPGChan
if len(xepgChannel.XCategory) > 0 && xepgChannel.XCategory != "Movie" {
if len(xmltvProgram.EpisodeNum) == 0 {
program.EpisodeNum = append(program.EpisodeNum, &EpisodeNum{Value: time.Now().Format("2006-01-02 15:04:05"), System: "original-air-date"})
var timeLayout = "20060102150405"
t, err := time.Parse(timeLayout, strings.Split(xmltvProgram.Start, " ")[0])
if err == nil {
program.EpisodeNum = append(program.EpisodeNum, &EpisodeNum{Value: t.Format("2006-01-02 15:04:05"), System: "original-air-date"})
} else {
ShowError(err, 0)
}
}
}

View File

@@ -1572,6 +1572,10 @@ function openPopUp(dataType, element) {
input.setAttribute("onchange", "javascript: this.className = 'changed'")
content.appendRow("{{.mapping.m3uGroupTitle.title}}", input)
if (data["group-title"] != undefined) {
content.description(data["group-title"])
}
// XMLTV Datei
var dbKey:string = "x-xmltv-file"
var xmlFile = data[dbKey]

View File

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