Skip to content

Commit 28dad49

Browse files
committed
v2.0.0.0009
2 parents 30ab13f + 1769b1e commit 28dad49

21 files changed

+438
-152
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ Including:
8181
- Crond: Daemon to execute scheduled commands
8282
- Perl: Programming language
8383

84+
## Beta version
85+
86+
New features are first available in the beta version and will be added to the master branch after successful testing
87+
If you prefer to use the beta version, you can always switch between master and beta branch.
88+
8489
---
8590

8691
### xTeVe Beta branch

changelog-beta.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
<<<<<<< HEAD
12
#### 2.0.0.0008-beta
23
##### Fixes
34
- Pull request #6 [Error in http/https detection] window.location.protocol return "https:", not "https://"
45

6+
=======
7+
>>>>>>> beta
58
#### 2.0.0.0007-beta
69
```diff
710
+ Buffer HLS: Add VOD tag from M3U8

html/css/screen.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ tbody {
299299

300300
#content_table input[type=text]{
301301
width: 80%;
302+
min-width: 35px;
303+
max-width: 60px;
302304
border: 0px;
303305
background-color: #333;
304306
margin-left: 5px;

html/css/screen2.css

Lines changed: 0 additions & 3 deletions
This file was deleted.

html/js/menu_ts.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ var ShowContent = /** @class */ (function (_super) {
583583
return;
584584
break;
585585
case "log":
586-
var input = this.createInput("button", menuKey, "{{.button.resetlogs}}");
586+
var input = this.createInput("button", menuKey, "{{.button.resetLogs}}");
587587
input.setAttribute("onclick", 'javascript: resetLogs();');
588588
interaction.appendChild(input);
589589
var wrapper = document.createElement("DIV");
@@ -1252,6 +1252,7 @@ function openPopUp(dataType, element) {
12521252
input.setAttribute("readonly", "true");
12531253
}
12541254
content.appendRow("{{.mapping.channelName.title}}", input);
1255+
content.description(data["name"]);
12551256
// Aktualisierung des Kanalnamens
12561257
if (data.hasOwnProperty("_uuid.key")) {
12571258
if (data["_uuid.key"] != "") {

html/lang/en.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
}
2424
},
2525
"confirm":{
26-
"restore": "All data will be replaced with those from the backup.Should the files be restored?"
26+
"restore": "All data will be replaced with those from the backup. Should the files be restored?"
2727
},
2828
"alert": {
2929
"fileLoadingError": "File couldn't be loaded",
@@ -45,7 +45,7 @@
4545
"search": "Search",
4646
"update": "Update",
4747
"craeteAccount": "Create Account",
48-
"resetlogs": "Reset Logs",
48+
"resetLogs": "Reset Logs",
4949
"uploadLogo": "Upload Logo"
5050
},
5151
"filter": {
@@ -243,7 +243,7 @@
243243
},
244244
"password": {
245245
"title": "Password",
246-
"placeholder": "Passoword",
246+
"placeholder": "Password",
247247
"description": ""
248248
},
249249
"confirm": {
@@ -320,7 +320,7 @@
320320
},
321321
"streamBuffering": {
322322
"title": "Stream Buffer",
323-
"description": "- The stream is passed from xTeVe to Plex / Emby / M3U Player<br>- Small jerking of the streams can be compensated<br>- HLS / M3U8 support"
323+
"description": "- The stream is passed from xTeVe to Plex / Emby / M3U Player<br>- Small jerking of the streams can be compensated<br>- HLS / M3U8 support<br>- Re-streaming<br>- Separate tuner limit for each playlist"
324324
},
325325
"bufferSize": {
326326
"title": "Buffer Size",

src/backup.go

Lines changed: 95 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package src
22

33
import (
44
b64 "encoding/base64"
5+
"errors"
56
"fmt"
67
"io/ioutil"
78
"os"
@@ -124,35 +125,44 @@ func xteveBackup() (archiv string, err error) {
124125
return
125126
}
126127

127-
func xteveRestore(input string) (newWebURL string, err error) {
128+
func xteveRestore(archive string) (newWebURL string, err error) {
128129

129-
var newPort, oldPort string
130+
var newPort, oldPort, backupVersion, tmpRestore string
130131

131-
// Base64 Json String in base64 umwandeln
132-
b64data := input[strings.IndexByte(input, ',')+1:]
133-
134-
// Base64 in bytes umwandeln und speichern
135-
sDec, err := b64.StdEncoding.DecodeString(b64data)
132+
tmpRestore = System.Folder.Temp + "restore" + string(os.PathSeparator)
136133

134+
err = checkFolder(tmpRestore)
137135
if err != nil {
138136
return
139137
}
140138

141-
var archive = System.Folder.Temp + "restore.zip"
139+
// Zip Archiv in tmp entpacken
140+
err = extractZIP(archive, tmpRestore)
141+
if err != nil {
142+
return
143+
}
142144

143-
err = writeByteToFile(archive, sDec)
145+
// Neue Config laden um den Port und die Version zu überprüfen
146+
newConfig, err := loadJSONFileToMap(tmpRestore + "settings.json")
144147
if err != nil {
148+
ShowError(err, 0)
149+
return
150+
}
151+
152+
backupVersion = newConfig["version"].(string)
153+
if backupVersion < System.Compatibility {
154+
err = errors.New(getErrMsg(1013))
145155
return
146156
}
147157

148-
// Zip Archiv entpacken
158+
// Zip Archiv in den Config Ordner entpacken
149159
err = extractZIP(archive, System.Folder.Config)
150160
if err != nil {
151161
return
152162
}
153163

154-
// Neue Config laden um den Port zu überprüfen
155-
newConfig, err := loadJSONFileToMap(System.Folder.Config + "settings.json")
164+
// Neue Config laden um den Port und die Version zu überprüfen
165+
newConfig, err = loadJSONFileToMap(System.Folder.Config + "settings.json")
156166
if err != nil {
157167
ShowError(err, 0)
158168
return
@@ -187,5 +197,78 @@ func xteveRestore(input string) (newWebURL string, err error) {
187197
var url = System.URLBase + "/web/"
188198
newWebURL = strings.Replace(url, ":"+oldPort, ":"+newPort, 1)
189199

200+
os.RemoveAll(tmpRestore)
201+
202+
return
203+
}
204+
205+
func xteveRestoreFromWeb(input string) (newWebURL string, err error) {
206+
207+
// Base64 Json String in base64 umwandeln
208+
b64data := input[strings.IndexByte(input, ',')+1:]
209+
210+
// Base64 in bytes umwandeln und speichern
211+
sDec, err := b64.StdEncoding.DecodeString(b64data)
212+
213+
if err != nil {
214+
return
215+
}
216+
217+
var archive = System.Folder.Temp + "restore.zip"
218+
219+
err = writeByteToFile(archive, sDec)
220+
if err != nil {
221+
return
222+
}
223+
224+
newWebURL, err = xteveRestore(archive)
225+
226+
return
227+
}
228+
229+
// XteveRestoreFromCLI : Wiederherstellung über die Kommandozeile
230+
func XteveRestoreFromCLI(archive string) (err error) {
231+
232+
var confirm string
233+
234+
println()
235+
showInfo(fmt.Sprintf("Version:%s Build: %s", System.Version, System.Build))
236+
showInfo(fmt.Sprintf("Backup File:%s", archive))
237+
showInfo(fmt.Sprintf("System Folder:%s", getPlatformPath(System.Folder.Config)))
238+
println()
239+
240+
fmt.Print("All data will be replaced with those from the backup. Should the files be restored? [yes|no]:")
241+
242+
fmt.Scanln(&confirm)
243+
244+
switch strings.ToLower(confirm) {
245+
246+
case "yes":
247+
break
248+
249+
case "no":
250+
return
251+
252+
default:
253+
fmt.Println("Invalid input")
254+
return
255+
256+
}
257+
258+
if len(System.Folder.Config) > 0 {
259+
260+
err = checkFilePermission(System.Folder.Config)
261+
if err != nil {
262+
return
263+
}
264+
265+
_, err = xteveRestore(archive)
266+
if err != nil {
267+
return
268+
}
269+
270+
showHighlight(fmt.Sprintf("Restor:Backup was successfully restored. %s can now be started normally", System.Name))
271+
272+
}
190273
return
191274
}

src/buffer.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ InitBuffer:
709709

710710
if resp.StatusCode != http.StatusOK {
711711

712-
showInfo("Content type:" + contentType)
712+
showInfo("Content Type:" + contentType)
713713
showInfo("Streaming Status:" + httpStatusInfo)
714714
showInfo("Error with this URL:" + currentURL)
715715

@@ -754,7 +754,7 @@ InitBuffer:
754754
showDebug(debug, 1)
755755

756756
showInfo("Streaming Status:" + "HTTP Response Status [" + strconv.Itoa(resp.StatusCode) + "] " + http.StatusText(resp.StatusCode))
757-
showInfo("Content type:" + contentType)
757+
showInfo("Content Type:" + contentType)
758758

759759
} else {
760760

@@ -790,7 +790,7 @@ InitBuffer:
790790
}
791791

792792
// Video Stream (TS)
793-
case "video/mpeg", "video/mp4", "video/mp2t", "application/octet-stream":
793+
case "video/mpeg", "video/mp4", "video/mp2t", "application/octet-stream", "binary/octet-stream", "application/mp2t":
794794

795795
var fileSize int
796796

@@ -931,7 +931,7 @@ InitBuffer:
931931

932932
// Umbekanntes Format
933933
default:
934-
showInfo("Content type:" + resp.Header.Get("Content-Type"))
934+
showInfo("Content Type:" + resp.Header.Get("Content-Type"))
935935
err = errors.New("Streaming error")
936936
ShowError(err, 4003)
937937

@@ -1027,7 +1027,7 @@ func parseM3U8(stream *ThisStream) (err error) {
10271027

10281028
line = strings.Trim(line, "\r\n")
10291029

1030-
var parameters = []string{"#EXT-X-VERSION:", "#EXT-X-MEDIA-SEQUENCE:", "#EXT-X-STREAM-INF:", "#EXTINF:"}
1030+
var parameters = []string{"#EXT-X-VERSION:", "#EXT-X-PLAYLIST-TYPE:", "#EXT-X-MEDIA-SEQUENCE:", "#EXT-X-STREAM-INF:", "#EXTINF:"}
10311031

10321032
for _, parameter := range parameters {
10331033

@@ -1043,6 +1043,9 @@ func parseM3U8(stream *ThisStream) (err error) {
10431043
segment.Version = version
10441044
}
10451045

1046+
case "#EXT-X-PLAYLIST-TYPE:":
1047+
segment.PlaylistType = value
1048+
10461049
case "#EXT-X-MEDIA-SEQUENCE:":
10471050
n, err := strconv.ParseInt(value, 10, 64)
10481051
if err == nil {
@@ -1194,6 +1197,11 @@ func parseM3U8(stream *ThisStream) (err error) {
11941197
noNewSegment = false
11951198
stream.LastSequence = segment.Sequence
11961199

1200+
// Stream ist vom Typ VOD. Es muss das erste Segment der M3U8 Playlist verwendet werden.
1201+
if strings.ToUpper(segment.PlaylistType) == "VOD" {
1202+
break
1203+
}
1204+
11971205
} else {
11981206

11991207
if segment.Sequence > stream.LastSequence {

src/config.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ func Init() (err error) {
8383
return
8484
}
8585

86+
if len(System.Flag.Restore) > 0 {
87+
// Einstellungen werden über CLI wiederhergestellt. Weitere Initialisierung ist nicht notwendig.
88+
return
89+
}
90+
8691
System.File.XML = getPlatformFile(fmt.Sprintf("%s%s.xml", System.Folder.Data, System.AppName))
8792
System.File.M3U = getPlatformFile(fmt.Sprintf("%s%s.m3u", System.Folder.Data, System.AppName))
8893

@@ -161,9 +166,6 @@ func Init() (err error) {
161166
return
162167
}
163168

164-
// DLNA Server starten
165-
go SSDP()
166-
167169
// Branch festlegen
168170
System.Branch = Settings.Branch
169171

@@ -194,6 +196,13 @@ func Init() (err error) {
194196

195197
}
196198

199+
// DLNA Server starten
200+
err = SSDP()
201+
if err != nil {
202+
return
203+
}
204+
205+
// HTML Datein laden
197206
loadHTMLMap()
198207

199208
return

0 commit comments

Comments
 (0)