Compare commits
19 Commits
2.0.1.0010
...
2.0.3.0030
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11453c6053 | ||
|
|
81e8ae33d7 | ||
|
|
f3be0fca47 | ||
|
|
1c1c89cd74 | ||
|
|
3d73dba422 | ||
|
|
c6e74fe11c | ||
|
|
18dba46c02 | ||
|
|
efa55b39a9 | ||
|
|
717fa68b7e | ||
|
|
878531ff79 | ||
|
|
792fd9a373 | ||
|
|
a1ec0287ef | ||
|
|
a79e824ef8 | ||
|
|
c843f424fe | ||
|
|
5c6637c048 | ||
|
|
1062e072d6 | ||
|
|
d831a099f0 | ||
|
|
a06baef4d3 | ||
|
|
f9d1a45bbd |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
|
demo
|
||||||
compiler
|
compiler
|
||||||
files
|
files
|
||||||
update_xteve*.sh
|
update_xteve*.sh
|
||||||
|
|||||||
@@ -81,11 +81,6 @@ Including:
|
|||||||
- Crond: Daemon to execute scheduled commands
|
- Crond: Daemon to execute scheduled commands
|
||||||
- Perl: Programming language
|
- 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
|
### xTeVe Beta branch
|
||||||
|
|||||||
@@ -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
|
#### 2.0.1.0010-beta
|
||||||
```diff
|
```diff
|
||||||
+ Set timestamp to <episode-num system="original-air-date">
|
+ Set timestamp to <episode-num system="original-air-date">
|
||||||
|
|||||||
@@ -1288,6 +1288,9 @@ function openPopUp(dataType, element) {
|
|||||||
var input = content.createInput("text", dbKey, data[dbKey]);
|
var input = content.createInput("text", dbKey, data[dbKey]);
|
||||||
input.setAttribute("onchange", "javascript: this.className = 'changed'");
|
input.setAttribute("onchange", "javascript: this.className = 'changed'");
|
||||||
content.appendRow("{{.mapping.m3uGroupTitle.title}}", input);
|
content.appendRow("{{.mapping.m3uGroupTitle.title}}", input);
|
||||||
|
if (data["group-title"] != undefined) {
|
||||||
|
content.description(data["group-title"]);
|
||||||
|
}
|
||||||
// XMLTV Datei
|
// XMLTV Datei
|
||||||
var dbKey = "x-xmltv-file";
|
var dbKey = "x-xmltv-file";
|
||||||
var xmlFile = data[dbKey];
|
var xmlFile = data[dbKey];
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
@@ -790,7 +800,7 @@ InitBuffer:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Video Stream (TS)
|
// 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
|
var fileSize int
|
||||||
|
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
55
src/data.go
55
src/data.go
@@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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, "", " ")
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
74
src/webUI.go
74
src/webUI.go
File diff suppressed because one or more lines are too long
@@ -205,6 +205,7 @@ func xTeVe(w http.ResponseWriter, r *http.Request) {
|
|||||||
// XMLTV Datei
|
// XMLTV Datei
|
||||||
if strings.Contains(path, "xmltv/") {
|
if strings.Contains(path, "xmltv/") {
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/xml")
|
||||||
requestType = "xml"
|
requestType = "xml"
|
||||||
|
|
||||||
file = System.Folder.Data + getFilenameFromPath(path)
|
file = System.Folder.Data + getFilenameFromPath(path)
|
||||||
|
|||||||
21
src/xepg.go
21
src/xepg.go
@@ -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
|
||||||
@@ -828,7 +834,16 @@ func getEpisodeNum(program *Program, xmltvProgram *Program, xepgChannel XEPGChan
|
|||||||
if len(xepgChannel.XCategory) > 0 && xepgChannel.XCategory != "Movie" {
|
if len(xepgChannel.XCategory) > 0 && xepgChannel.XCategory != "Movie" {
|
||||||
|
|
||||||
if len(xmltvProgram.EpisodeNum) == 0 {
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1572,6 +1572,10 @@ function openPopUp(dataType, element) {
|
|||||||
input.setAttribute("onchange", "javascript: this.className = 'changed'")
|
input.setAttribute("onchange", "javascript: this.className = 'changed'")
|
||||||
content.appendRow("{{.mapping.m3uGroupTitle.title}}", input)
|
content.appendRow("{{.mapping.m3uGroupTitle.title}}", input)
|
||||||
|
|
||||||
|
if (data["group-title"] != undefined) {
|
||||||
|
content.description(data["group-title"])
|
||||||
|
}
|
||||||
|
|
||||||
// XMLTV Datei
|
// XMLTV Datei
|
||||||
var dbKey:string = "x-xmltv-file"
|
var dbKey:string = "x-xmltv-file"
|
||||||
var xmlFile = data[dbKey]
|
var xmlFile = data[dbKey]
|
||||||
|
|||||||
2
xteve.go
2
xteve.go
@@ -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.1.0010"
|
const Version = "2.0.3.0030"
|
||||||
|
|
||||||
// DBVersion : Datanbank Version
|
// DBVersion : Datanbank Version
|
||||||
const DBVersion = "2.0.0"
|
const DBVersion = "2.0.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user