Compare commits
17 Commits
2.1.0.0100
...
2.1.1.0111
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66c01dd1fb | ||
|
|
03e1abbe90 | ||
|
|
469581e280 | ||
|
|
019c98996a | ||
|
|
36db927794 | ||
|
|
f0a49788cc | ||
|
|
72767d7dbd | ||
|
|
8eecbf2b78 | ||
|
|
1a1e37fe15 | ||
|
|
08f6fb60e3 | ||
|
|
eded490ac7 | ||
|
|
ed770b9dbc | ||
|
|
6129b4911a | ||
|
|
477c5f30c1 | ||
|
|
65ddc6f301 | ||
|
|
3ef95c1950 | ||
|
|
3a3798cd2d |
@@ -31,7 +31,7 @@ Documentation for setup and configuration is [here](https://github.com/xteve-pro
|
||||
* Merge external M3U files
|
||||
* Merge external XMLTV files
|
||||
* Automatic M3U and XMLTV update
|
||||
* M3U und XMLTV export
|
||||
* M3U and XMLTV export
|
||||
|
||||
#### Channel management
|
||||
* Filtering streams
|
||||
@@ -84,7 +84,7 @@ Including:
|
||||
---
|
||||
|
||||
### xTeVe Beta branch
|
||||
New features and bug fixes are only available in beta brunch. Only after successful testing, they are merged into the master branch.
|
||||
New features and bug fixes are only available in beta branch. Only after successful testing are they are merged into the master branch.
|
||||
|
||||
**It is not recommended to use the beta version in a production system.**
|
||||
|
||||
|
||||
@@ -1,3 +1,20 @@
|
||||
#### 2.1.0.0106-beta
|
||||
```diff
|
||||
+ User-Agent is now also used by VLC and FFmpeg.
|
||||
```
|
||||
|
||||
#### 2.1.0.0105-beta
|
||||
```diff
|
||||
+ Fixed wrong buffer value in log
|
||||
+ New setting: URL protocol for M3U and XML file
|
||||
+ Add xml tag premiere to xteve.xml
|
||||
```
|
||||
|
||||
#### 2.1.0.0101-beta
|
||||
```diff
|
||||
+ Reverse proxy fix
|
||||
```
|
||||
|
||||
#### 2.0.3.0042-beta
|
||||
**Version 2.0.3.0042 changes the settings.json.**
|
||||
Settings from the current beta can not be used for the current master version 2.0.3
|
||||
|
||||
@@ -18,7 +18,7 @@ menuItems.push(new MainMenuItem("log", "{{.mainMenu.item.log}}", "log.png", "{{.
|
||||
menuItems.push(new MainMenuItem("logout", "{{.mainMenu.item.logout}}", "logout.png", "{{.mainMenu.headline.logout}}"));
|
||||
// Kategorien für die Einstellungen
|
||||
var settingsCategory = new Array();
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.general}}", "xteveAutoUpdate,tuner,epgSource,api"));
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.general}}", "xteveAutoUpdate,tuner,epgSource,api,scheme.m3u,scheme.xml"));
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.files}}", "update,files.update,temp.path,cache.images,xepg.replace.missing.images"));
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.streaming}}", "buffer,buffer.size.kb,buffer.timeout,user.agent,ffmpeg.path,ffmpeg.options,vlc.path,vlc.options"));
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.backup}}", "backup.path,backup.keep"));
|
||||
|
||||
@@ -1253,6 +1253,12 @@ function openPopUp(dataType, element) {
|
||||
}
|
||||
content.appendRow("{{.mapping.channelName.title}}", input);
|
||||
content.description(data["name"]);
|
||||
// Beschreibung
|
||||
var dbKey = "x-description";
|
||||
var input = content.createInput("text", dbKey, data[dbKey]);
|
||||
input.setAttribute("placeholder", "{{.mapping.description.placeholder}}");
|
||||
input.setAttribute("onchange", "javascript: this.className = 'changed'");
|
||||
content.appendRow("{{.mapping.description.title}}", input);
|
||||
// Aktualisierung des Kanalnamens
|
||||
if (data.hasOwnProperty("_uuid.key")) {
|
||||
if (data["_uuid.key"] != "") {
|
||||
|
||||
@@ -305,6 +305,30 @@ var SettingsCategory = /** @class */ (function () {
|
||||
setting.appendChild(tdLeft);
|
||||
setting.appendChild(tdRight);
|
||||
break;
|
||||
case "scheme.m3u":
|
||||
var tdLeft = document.createElement("TD");
|
||||
tdLeft.innerHTML = "{{.settings.schemeM3U.title}}" + ":";
|
||||
var tdRight = document.createElement("TD");
|
||||
var text = ["HTTP", "HTTPS"];
|
||||
var values = ["HTTP", "HTTPS"];
|
||||
var select = content.createSelect(text, values, data, settingsKey);
|
||||
select.setAttribute("onchange", "javascript: this.className = 'changed'");
|
||||
tdRight.appendChild(select);
|
||||
setting.appendChild(tdLeft);
|
||||
setting.appendChild(tdRight);
|
||||
break;
|
||||
case "scheme.xml":
|
||||
var tdLeft = document.createElement("TD");
|
||||
tdLeft.innerHTML = "{{.settings.schemeXML.title}}" + ":";
|
||||
var tdRight = document.createElement("TD");
|
||||
var text = ["HTTP", "HTTPS"];
|
||||
var values = ["HTTP", "HTTPS"];
|
||||
var select = content.createSelect(text, values, data, settingsKey);
|
||||
select.setAttribute("onchange", "javascript: this.className = 'changed'");
|
||||
tdRight.appendChild(select);
|
||||
setting.appendChild(tdLeft);
|
||||
setting.appendChild(tdRight);
|
||||
break;
|
||||
}
|
||||
return setting;
|
||||
};
|
||||
@@ -386,6 +410,12 @@ var SettingsCategory = /** @class */ (function () {
|
||||
case "xepg.replace.missing.images":
|
||||
text = "{{.settings.replaceEmptyImages.description}}";
|
||||
break;
|
||||
case "scheme.m3u":
|
||||
text = "{{.settings.schemeM3U.description}}";
|
||||
break;
|
||||
case "scheme.xml":
|
||||
text = "{{.settings.schemeXML.description}}";
|
||||
break;
|
||||
default:
|
||||
text = "";
|
||||
break;
|
||||
|
||||
@@ -190,6 +190,11 @@
|
||||
"placeholder": "",
|
||||
"description": ""
|
||||
},
|
||||
"description": {
|
||||
"title": "Channel Description",
|
||||
"placeholder": "Used by the Dummy as an XML description",
|
||||
"description": ""
|
||||
},
|
||||
"updateChannelName": {
|
||||
"title": "Update Channel Name",
|
||||
"placeholder": "",
|
||||
@@ -302,6 +307,14 @@
|
||||
"title": "Number of Tuners",
|
||||
"description": "Number of parallel connections that can be established to the provider.<br>Available for: Plex, Emby (HDHR), M3U (with active buffer).<br>After a change, xTeVe must be delete in the Plex / Emby DVR settings and set up again."
|
||||
},
|
||||
"schemeM3U":{
|
||||
"title": "URL protocol for xteve.m3u",
|
||||
"description": "Determines which URL protocol is used for the xTeVe streaming URLs. If you using a reverse proxy over HTTPS, set this to HTTPS."
|
||||
},
|
||||
"schemeXML":{
|
||||
"title": "URL protocol for xteve.xml",
|
||||
"description": "Determines which URL protocol is used for the xTeVe image URLs. If you using a reverse proxy over HTTPS, set this to HTTPS."
|
||||
},
|
||||
"filesUpdate": {
|
||||
"title": "Updates all files at startup",
|
||||
"description": "Updates all playlists, tuner and XMLTV files at startup."
|
||||
@@ -358,7 +371,7 @@
|
||||
},
|
||||
"userAgent": {
|
||||
"title": "User Agent",
|
||||
"description": "User Agent for HTTP requests. Only used if xTeVe is selected as the buffer.",
|
||||
"description": "User Agent for HTTP requests. For every HTTP connection, this value is used for the user agent. Should only be changed if xTeVe is blocked.",
|
||||
"placeholder": "xTeVe"
|
||||
},
|
||||
"backupPath": {
|
||||
|
||||
@@ -228,7 +228,7 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
|
||||
|
||||
}
|
||||
|
||||
w.WriteHeader(200)
|
||||
//w.WriteHeader(200)
|
||||
|
||||
for { // Loop 1: Warten bis das erste Segment durch den Buffer heruntergeladen wurde
|
||||
|
||||
@@ -261,7 +261,9 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
|
||||
var oldSegments []string
|
||||
|
||||
for { // Loop 2: Temporäre Datein sind vorhanden, Daten können zum Client gesendet werden
|
||||
|
||||
// HTTP Clientverbindung überwachen
|
||||
|
||||
cn, ok := w.(http.CloseNotifier)
|
||||
if ok {
|
||||
|
||||
@@ -330,10 +332,10 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
|
||||
|
||||
if streaming == false {
|
||||
|
||||
contentType := http.DetectContentType(buffer)
|
||||
_ = contentType
|
||||
contentType := http.DetectContentType(buffer) + "; name=stream.ts"
|
||||
//_ = contentType
|
||||
//w.Header().Set("Content-type", "video/mpeg")
|
||||
w.Header().Set("Content-type", contentType)
|
||||
w.Header().Add("Content-type", contentType)
|
||||
w.Header().Set("Content-Length", "0")
|
||||
w.Header().Set("Connection", "close")
|
||||
|
||||
@@ -346,6 +348,7 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
|
||||
w.Header().Set("transferMode.dlna.org", "Streaming")
|
||||
*/
|
||||
|
||||
w.WriteHeader(200)
|
||||
_, err := w.Write(buffer)
|
||||
|
||||
if err != nil {
|
||||
@@ -449,6 +452,9 @@ func getTmpFiles(stream *ThisStream) (tmpFiles []string) {
|
||||
|
||||
func killClientConnection(streamID int, playlistID string, force bool) {
|
||||
|
||||
Lock.Lock()
|
||||
defer Lock.Unlock()
|
||||
|
||||
if p, ok := BufferInformation.Load(playlistID); ok {
|
||||
|
||||
var playlist = p.(Playlist)
|
||||
@@ -493,6 +499,8 @@ func killClientConnection(streamID int, playlistID string, force bool) {
|
||||
func clientConnection(stream ThisStream) (status bool) {
|
||||
|
||||
status = true
|
||||
Lock.Lock()
|
||||
defer Lock.Unlock()
|
||||
|
||||
if _, ok := BufferClients.Load(stream.PlaylistID + stream.MD5); !ok {
|
||||
|
||||
@@ -901,6 +909,8 @@ func connectToStreamingServer(streamID int, playlistID string) {
|
||||
// Buffer auf die Festplatte speichern
|
||||
if fileSize >= tmpFileSize/2 || n == 0 {
|
||||
|
||||
Lock.Lock()
|
||||
|
||||
bandwidth.Stop = time.Now()
|
||||
bandwidth.Size += fileSize
|
||||
|
||||
@@ -919,6 +929,7 @@ func connectToStreamingServer(streamID int, playlistID string) {
|
||||
stream.Status = true
|
||||
playlist.Streams[streamID] = stream
|
||||
BufferInformation.Store(playlistID, playlist)
|
||||
Lock.Unlock()
|
||||
|
||||
tmpSegment++
|
||||
|
||||
@@ -1408,8 +1419,37 @@ func thirdPartyBuffer(streamID int, playlistID string) {
|
||||
return
|
||||
}
|
||||
|
||||
var args = strings.Replace(options, "[URL]", url, -1)
|
||||
var cmd = exec.Command(path, strings.Split(args, " ")...)
|
||||
//args = strings.Replace(args, "[USER-AGENT]", Settings.UserAgent, -1)
|
||||
|
||||
// User-Agent setzen
|
||||
var args []string
|
||||
|
||||
for i, a := range strings.Split(options, " ") {
|
||||
|
||||
switch bufferType {
|
||||
case "FFMPEG":
|
||||
a = strings.Replace(a, "[URL]", url, -1)
|
||||
if i == 0 {
|
||||
args = []string{"-user-agent", Settings.UserAgent}
|
||||
}
|
||||
|
||||
args = append(args, a)
|
||||
|
||||
case "VLC":
|
||||
if a == "[URL]" {
|
||||
a = strings.Replace(a, "[URL]", url, -1)
|
||||
args = append(args, a)
|
||||
args = append(args, fmt.Sprintf(":http-user-agent=%s", Settings.UserAgent))
|
||||
|
||||
} else {
|
||||
args = append(args, a)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var cmd = exec.Command(path, args...)
|
||||
|
||||
debug = fmt.Sprintf("%s:%s %s", bufferType, path, args)
|
||||
showDebug(debug, 1)
|
||||
@@ -1551,9 +1591,11 @@ func thirdPartyBuffer(streamID int, playlistID string) {
|
||||
tmpSegment++
|
||||
|
||||
if stream.Status == false {
|
||||
Lock.Lock()
|
||||
stream.Status = true
|
||||
playlist.Streams[streamID] = stream
|
||||
BufferInformation.Store(playlistID, playlist)
|
||||
Lock.Unlock()
|
||||
}
|
||||
|
||||
tmpFile = fmt.Sprintf("%s%d.ts", tmpFolder, tmpSegment)
|
||||
|
||||
@@ -29,6 +29,9 @@ var BufferInformation sync.Map
|
||||
// BufferClients : Anzahl der Clients die einen Stream über den Buffer abspielen
|
||||
var BufferClients sync.Map
|
||||
|
||||
// Lock : Lock Map
|
||||
var Lock = sync.RWMutex{}
|
||||
|
||||
// Init : Systeminitialisierung
|
||||
func Init() (err error) {
|
||||
|
||||
@@ -220,6 +223,8 @@ func StartSystem(updateProviderFiles bool) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
setURLScheme()
|
||||
|
||||
// Systeminformationen in der Konsole ausgeben
|
||||
showInfo(fmt.Sprintf("UUID:%s", Settings.UUID))
|
||||
showInfo(fmt.Sprintf("Tuner (Plex / Emby):%d", Settings.Tuner))
|
||||
|
||||
10
src/data.go
10
src/data.go
@@ -107,6 +107,9 @@ func updateServerSettings(request RequestStruct) (settings SettingsStrcut, err e
|
||||
|
||||
}
|
||||
|
||||
case "scheme.m3u", "scheme.xml":
|
||||
createXEPGFiles = true
|
||||
|
||||
}
|
||||
|
||||
oldSettings[key] = value
|
||||
@@ -141,6 +144,8 @@ func updateServerSettings(request RequestStruct) (settings SettingsStrcut, err e
|
||||
return
|
||||
}
|
||||
|
||||
setURLScheme()
|
||||
|
||||
if Settings.AuthenticationWEB == false {
|
||||
|
||||
Settings.AuthenticationAPI = false
|
||||
@@ -505,7 +510,7 @@ func saveXEpgMapping(request RequestStruct) (err error) {
|
||||
|
||||
System.ScanInProgress = 1
|
||||
cleanupXEPG()
|
||||
//buildXEPG(true)
|
||||
buildXEPG(true)
|
||||
|
||||
go func() {
|
||||
|
||||
@@ -540,8 +545,7 @@ func saveXEpgMapping(request RequestStruct) (err error) {
|
||||
System.ScanInProgress = 1
|
||||
|
||||
cleanupXEPG()
|
||||
//buildXEPG(false)
|
||||
|
||||
buildXEPG(false)
|
||||
createXMLTVFile()
|
||||
createM3UFile()
|
||||
showInfo("XEPG:" + fmt.Sprintf("Ready to use"))
|
||||
|
||||
@@ -45,7 +45,7 @@ func getCacheImageURL(imageURL string) (cacheImageURL string) {
|
||||
|
||||
if indexOfString(urlMD5+fileExtension, Data.Cache.ImagesCache) != -1 {
|
||||
|
||||
cacheImageURL = fmt.Sprintf("%s://%s/images/%s%s", System.ServerProtocol.WEB, System.Domain, urlMD5, fileExtension)
|
||||
cacheImageURL = fmt.Sprintf("%s://%s/images/%s%s", System.ServerProtocol.XML, System.Domain, urlMD5, fileExtension)
|
||||
|
||||
} else {
|
||||
|
||||
@@ -163,7 +163,7 @@ func uploadLogo(input, filename string) (logoURL string, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
logoURL = fmt.Sprintf("%s://%s/data_images/%s", System.ServerProtocol.WEB, System.Domain, filename)
|
||||
logoURL = fmt.Sprintf("%s://%s/data_images/%s", System.ServerProtocol.XML, System.Domain, filename)
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -187,6 +187,7 @@ type XEPGChannelStruct struct {
|
||||
XName string `json:"x-name,required"`
|
||||
XUpdateChannelIcon bool `json:"x-update-channel-icon,required"`
|
||||
XUpdateChannelName bool `json:"x-update-channel-name,required"`
|
||||
XDescription string `json:"x-description,required"`
|
||||
}
|
||||
|
||||
// M3UChannelStructXEPG : M3U Struktur für XEPG
|
||||
@@ -279,6 +280,8 @@ type SettingsStrcut struct {
|
||||
MappingFirstChannel float64 `json:"mapping.first.channel"`
|
||||
Port string `json:"port"`
|
||||
SSDP bool `json:"ssdp"`
|
||||
SchemeM3U string `json:"scheme.m3u"`
|
||||
SchemeXML string `json:"scheme.xml"`
|
||||
TempPath string `json:"temp.path"`
|
||||
Tuner int `json:"tuner"`
|
||||
Update []string `json:"update"`
|
||||
|
||||
@@ -41,6 +41,8 @@ type RequestStruct struct {
|
||||
UserAgent *string `json:"user.agent,omitempty"`
|
||||
XepgReplaceMissingImages *bool `json:"xepg.replace.missing.images,omitempty"`
|
||||
XteveAutoUpdate *bool `json:"xteveAutoUpdate,omitempty"`
|
||||
SchemeM3U *string `json:"scheme.m3u,omitempty"`
|
||||
SchemeXML *string `json:"scheme.xml,omitempty"`
|
||||
} `json:"settings,omitempty"`
|
||||
|
||||
// Upload Logo
|
||||
|
||||
@@ -48,6 +48,7 @@ type Program struct {
|
||||
PreviouslyShown *PreviouslyShown `xml:"previously-shown"`
|
||||
New *New `xml:"new"`
|
||||
Live *Live `xml:"live"`
|
||||
Premiere *Live `xml:"premiere"`
|
||||
}
|
||||
|
||||
// Title : Programmtitel
|
||||
|
||||
@@ -138,6 +138,8 @@ func loadSettings() (settings SettingsStrcut, err error) {
|
||||
defaults["version"] = System.DBVersion
|
||||
defaults["xteveAutoUpdate"] = true
|
||||
defaults["temp.path"] = System.Folder.Temp
|
||||
defaults["scheme.M3U"] = "HTTP"
|
||||
defaults["scheme.XML"] = "HTTP"
|
||||
|
||||
// Default Werte setzen
|
||||
for key, value := range defaults {
|
||||
@@ -252,6 +254,14 @@ func setGlobalDomain(domain string) {
|
||||
return
|
||||
}
|
||||
|
||||
func setURLScheme() {
|
||||
|
||||
System.ServerProtocol.M3U = strings.ToLower(Settings.SchemeM3U)
|
||||
System.ServerProtocol.XML = strings.ToLower(Settings.SchemeXML)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// UUID generieren
|
||||
func createUUID() (uuid string) {
|
||||
uuid = time.Now().Format("2006-01") + "-" + randomString(4) + "-" + randomString(6)
|
||||
|
||||
73
src/webUI.go
73
src/webUI.go
File diff suppressed because one or more lines are too long
@@ -132,7 +132,7 @@ func Stream(w http.ResponseWriter, r *http.Request) {
|
||||
switch Settings.Buffer {
|
||||
|
||||
case "-":
|
||||
showInfo(fmt.Sprintf("Buffer:false", Settings.Buffer))
|
||||
showInfo(fmt.Sprintf("Buffer:false [%s]", Settings.Buffer))
|
||||
|
||||
case "xteve":
|
||||
if strings.Index(streamInfo.URL, "rtsp://") != -1 || strings.Index(streamInfo.URL, "rtp://") != -1 {
|
||||
@@ -316,10 +316,12 @@ func WS(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
var newToken string
|
||||
|
||||
if r.Header.Get("Origin") != "http://"+r.Host {
|
||||
httpStatusError(w, r, 403)
|
||||
return
|
||||
}
|
||||
/*
|
||||
if r.Header.Get("Origin") != "http://"+r.Host {
|
||||
httpStatusError(w, r, 403)
|
||||
return
|
||||
}
|
||||
*/
|
||||
|
||||
conn, err := websocket.Upgrade(w, r, w.Header(), 1024, 1024)
|
||||
if err != nil {
|
||||
|
||||
10
src/xepg.go
10
src/xepg.go
@@ -717,6 +717,9 @@ func getProgramData(xepgChannel XEPGChannelStruct) (xepgXML XMLTV, err error) {
|
||||
// Live
|
||||
program.Live = xmltvProgram.Live
|
||||
|
||||
// Premiere
|
||||
program.Premiere = xmltvProgram.Premiere
|
||||
|
||||
xepgXML.Program = append(xepgXML.Program, program)
|
||||
|
||||
}
|
||||
@@ -759,7 +762,12 @@ func createDummyProgram(xepgChannel XEPGChannelStruct) (dummyXMLTV XMLTV) {
|
||||
epg.Start = epgStartTime.Format("20060102150405") + offset
|
||||
epg.Stop = epgStopTime.Format("20060102150405") + offset
|
||||
epg.Title = append(epg.Title, &Title{Value: xepgChannel.XName + " (" + epgStartTime.Weekday().String()[0:2] + ". " + epgStartTime.Format("15:04") + " - " + epgStopTime.Format("15:04") + ")", Lang: "en"})
|
||||
epg.Desc = append(epg.Desc, &Desc{Value: "xTeVe: (" + strconv.Itoa(dummyLength) + " Minutes) " + epgStartTime.Weekday().String() + " " + epgStartTime.Format("15:04") + " - " + epgStopTime.Format("15:04"), Lang: "en"})
|
||||
|
||||
if len(xepgChannel.XDescription) == 0 {
|
||||
epg.Desc = append(epg.Desc, &Desc{Value: "xTeVe: (" + strconv.Itoa(dummyLength) + " Minutes) " + epgStartTime.Weekday().String() + " " + epgStartTime.Format("15:04") + " - " + epgStopTime.Format("15:04"), Lang: "en"})
|
||||
} else {
|
||||
epg.Desc = append(epg.Desc, &Desc{Value: xepgChannel.XDescription, Lang: "en"})
|
||||
}
|
||||
|
||||
if Settings.XepgReplaceMissingImages == true {
|
||||
poster.Src = getCacheImageURL(xepgChannel.TvgLogo)
|
||||
|
||||
@@ -21,7 +21,7 @@ menuItems.push(new MainMenuItem("logout", "{{.mainMenu.item.logout}}", "logout.p
|
||||
|
||||
// Kategorien für die Einstellungen
|
||||
var settingsCategory = new Array()
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.general}}", "xteveAutoUpdate,tuner,epgSource,api"))
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.general}}", "xteveAutoUpdate,tuner,epgSource,api,scheme.m3u,scheme.xml"))
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.files}}", "update,files.update,temp.path,cache.images,xepg.replace.missing.images"))
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.streaming}}", "buffer,buffer.size.kb,buffer.timeout,user.agent,ffmpeg.path,ffmpeg.options,vlc.path,vlc.options"))
|
||||
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.backup}}", "backup.path,backup.keep"))
|
||||
|
||||
@@ -1532,6 +1532,13 @@ function openPopUp(dataType, element) {
|
||||
|
||||
content.description(data["name"])
|
||||
|
||||
// Beschreibung
|
||||
var dbKey:string = "x-description"
|
||||
var input = content.createInput("text", dbKey, data[dbKey])
|
||||
input.setAttribute("placeholder", "{{.mapping.description.placeholder}}")
|
||||
input.setAttribute("onchange", "javascript: this.className = 'changed'")
|
||||
content.appendRow("{{.mapping.description.title}}", input)
|
||||
|
||||
// Aktualisierung des Kanalnamens
|
||||
if (data.hasOwnProperty("_uuid.key")) {
|
||||
if (data["_uuid.key"] != "") {
|
||||
|
||||
@@ -372,6 +372,38 @@ class SettingsCategory {
|
||||
setting.appendChild(tdRight)
|
||||
break
|
||||
|
||||
case "scheme.m3u":
|
||||
var tdLeft = document.createElement("TD")
|
||||
tdLeft.innerHTML = "{{.settings.schemeM3U.title}}" + ":"
|
||||
|
||||
var tdRight = document.createElement("TD")
|
||||
var text:any[] = ["HTTP", "HTTPS"]
|
||||
var values:any[] = ["HTTP", "HTTPS"]
|
||||
|
||||
var select = content.createSelect(text, values, data, settingsKey)
|
||||
select.setAttribute("onchange", "javascript: this.className = 'changed'")
|
||||
tdRight.appendChild(select)
|
||||
|
||||
setting.appendChild(tdLeft)
|
||||
setting.appendChild(tdRight)
|
||||
break
|
||||
|
||||
case "scheme.xml":
|
||||
var tdLeft = document.createElement("TD")
|
||||
tdLeft.innerHTML = "{{.settings.schemeXML.title}}" + ":"
|
||||
|
||||
var tdRight = document.createElement("TD")
|
||||
var text:any[] = ["HTTP", "HTTPS"]
|
||||
var values:any[] = ["HTTP", "HTTPS"]
|
||||
|
||||
var select = content.createSelect(text, values, data, settingsKey)
|
||||
select.setAttribute("onchange", "javascript: this.className = 'changed'")
|
||||
tdRight.appendChild(select)
|
||||
|
||||
setting.appendChild(tdLeft)
|
||||
setting.appendChild(tdRight)
|
||||
break
|
||||
|
||||
}
|
||||
|
||||
return setting
|
||||
@@ -483,6 +515,15 @@ class SettingsCategory {
|
||||
text = "{{.settings.replaceEmptyImages.description}}"
|
||||
break
|
||||
|
||||
case "scheme.m3u":
|
||||
text = "{{.settings.schemeM3U.description}}"
|
||||
break
|
||||
|
||||
case "scheme.xml":
|
||||
text = "{{.settings.schemeXML.description}}"
|
||||
break
|
||||
|
||||
|
||||
default:
|
||||
text = ""
|
||||
break
|
||||
|
||||
2
xteve.go
2
xteve.go
@@ -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.1.0.0100"
|
||||
const Version = "2.1.1.0111"
|
||||
|
||||
// DBVersion : Datanbank Version
|
||||
const DBVersion = "2.1.0"
|
||||
|
||||
Reference in New Issue
Block a user