Phase 0: remove auto-updater, pin Go 1.27.1, fix vet warnings, tidy ignores
continuous-integration/drone/push Build encountered an error

- Delete BinaryUpdate, internal/up2date, GitHub/Update structs and the
  xteveAutoUpdate / update.url settings (UI rows, en.json, defaults).
  Settings-schema migrations kept and moved to src/migrate.go.
- Drop kardianos/osext dependency.
- xteve.go version 0200 -> 0201 to match changelog; Drone now fails on drift.
- go.mod go 1.27.1; Dockerfile and Drone golang images pinned to 1.27.1.
- Fix four go vet unreachable-code warnings.
- .gitignore: .gocache/, agent.md, skill.md. .dockerignore: build context
  no longer includes caches, ts/, tasks/ or markdown except the changelog.
- Drone: publish :latest only from master; other branches publish a
  branch-named tag so a feature push cannot replace the deployed image.
- Add tasks/improvement-plan.md and tasks/todo.md.
- Regenerate src/webUI.go.
This commit is contained in:
2026-09-26 12:38:02 +10:00
parent f558a855ae
commit 51c7830067
28 changed files with 504 additions and 887 deletions
-2
View File
@@ -730,8 +730,6 @@ func connectToStreamingServer(streamID int, playlistID string) {
}
defer resp.Body.Close()
}
defer resp.Body.Close()
+1 -7
View File
@@ -57,11 +57,6 @@ func Init() (err error) {
// Default Logeinträge, wird später von denen aus der settings.json überschrieben. Muss gemacht werden, damit die ersten Einträge auch im Log (webUI aangezeigt werden)
Settings.LogEntriesRAM = 500
// Variablen für den Update Prozess
//System.Update.Git = "https://github.com/xteve-project/xTeVe-Downloads/blob"
System.Update.Git = fmt.Sprintf("https://github.com/%s/%s/blob", System.GitHub.User, System.GitHub.Repo)
System.Update.Name = "xteve_2"
// Ordnerpfade festlegen
var tempFolder = os.TempDir() + string(os.PathSeparator) + System.AppName + string(os.PathSeparator)
tempFolder = getPlatformPath(strings.Replace(tempFolder, "//", "/", -1))
@@ -186,8 +181,7 @@ func Init() (err error) {
System.Branch = "master"
}
showInfo(fmt.Sprintf("GitHub:https://github.com/%s", System.GitHub.User))
showInfo(fmt.Sprintf("Git Branch:%s [%s]", System.Branch, System.GitHub.User))
showInfo(fmt.Sprintf("Branch:%s", System.Branch))
// Domainnamen setzten
setGlobalDomain(fmt.Sprintf("%s:%s", System.IPAddress, Settings.Port))
-2
View File
@@ -22,7 +22,6 @@ func ShowSystemInfo() {
fmt.Println(fmt.Sprintf("Version: %s %s.%s", System.Name, System.Version, System.Build))
fmt.Println(fmt.Sprintf("Branch: %s", System.Branch))
fmt.Println(fmt.Sprintf("GitHub: %s/%s | Git update = %t", System.GitHub.User, System.GitHub.Repo, System.GitHub.Update))
fmt.Println(fmt.Sprintf("Folder (config): %s", System.Folder.Config))
fmt.Println(fmt.Sprintf("Streams: %d / %d", len(Data.Streams.Active), len(Data.Streams.All)))
@@ -68,7 +67,6 @@ func ShowSystemInfo() {
println("---")
fmt.Println("Settings [General]")
fmt.Println(fmt.Sprintf("xTeVe Update: %t", Settings.XteveAutoUpdate))
fmt.Println(fmt.Sprintf("UUID: %s", Settings.UUID))
fmt.Println(fmt.Sprintf("Tuner (Plex / Emby): %d", Settings.Tuner))
fmt.Println(fmt.Sprintf("EPG Source: %s", Settings.EpgSource))
-129
View File
@@ -1,129 +0,0 @@
package up2date
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net"
"net/http"
"net/url"
"runtime"
"time"
)
// ClientInfo : Information about the key (NAME OS, ARCH, UUID, KEY)
type ClientInfo struct {
Arch string `json:"arch,required"`
Branch string `json:"branch,required"`
CMD string `json:"cmd,omitempty"`
Name string `json:"name,required"`
OS string `json:"os,required"`
URL string `json:"url,required"`
Response ServerResponse `json:"response"`
}
// ServerResponse : Response from server after client request
type ServerResponse struct {
Status bool `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
Version string `json:"version,omitempty"`
UpdateBIN string `json:"update.url.bin,omitempty"`
UpdateZIP string `json:"update.url.zip,omitempty"`
Filename string `json:"filename.bin,omitempty"`
}
// Updater : Client infos
var Updater ClientInfo
// UpdateURL : URL for the new binary
var UpdateURL string
// Init : Init
func Init() {
Updater.OS = runtime.GOOS
Updater.Arch = runtime.GOARCH
}
// GetVersion : Information about the latest version
func GetVersion() (err error) {
Updater.CMD = "getVersion"
err = serverRequest()
return
}
func serverRequest() (err error) {
var serverResponse ServerResponse
jsonByte, err := json.MarshalIndent(Updater, "", " ")
if err == nil {
// Serververbindung prüfen
u, err := url.Parse(Updater.URL)
if err != nil {
return err
}
var server = u.Host
timeout := time.Duration(1 * time.Second)
_, err = net.DialTimeout("tcp", server, timeout)
if err != nil {
return err
}
// Check redirect 301 <---> 308
redirect, err := http.NewRequest("POST", Updater.URL, nil)
client := &http.Client{}
client.CheckRedirect = func(redirect *http.Request, via []*http.Request) error {
return errors.New("Redirect")
}
resp, err := client.Do(redirect)
if err != nil {
// Redirect
if resp.StatusCode >= 301 && resp.StatusCode <= 308 { //status code 301 <---> 308
Updater.URL = resp.Header.Get("Location")
} else {
return err
}
}
// ---
req, err := http.NewRequest("POST", Updater.URL, bytes.NewBuffer(jsonByte))
req.Header.Set("Content-Type", "application/json")
client = &http.Client{}
resp, err = client.Do(req)
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
//fmt.Println(resp.StatusCode, Updater.URL, Updater.CMD)
err = fmt.Errorf("%d: %s (%s)", resp.StatusCode, http.StatusText(resp.StatusCode), Updater.URL)
return err
}
Updater.CMD = ""
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
err = json.Unmarshal(body, &serverResponse)
if err != nil {
return err
}
Updater.Response = serverResponse
}
return
}
-271
View File
@@ -1,271 +0,0 @@
package up2date
import (
"archive/zip"
"fmt"
"io"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
"syscall"
"github.com/kardianos/osext"
)
// DoUpdate : Update binary
func DoUpdate(fileType, filenameBIN string) (err error) {
var url string
switch fileType {
case "bin":
url = Updater.Response.UpdateBIN
case "zip":
url = Updater.Response.UpdateZIP
}
switch runtime.GOOS {
case "windows":
filenameBIN = filenameBIN + ".exe"
}
if len(url) > 0 {
log.Println("["+strings.ToUpper(fileType)+"]", "New version ("+Updater.Name+"):", Updater.Response.Version)
// Download new binary
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
log.Println("["+strings.ToUpper(fileType)+"]", "Download new version...")
if resp.StatusCode != http.StatusOK {
log.Println("["+strings.ToUpper(fileType)+"]", "Download new version...OK")
return fmt.Errorf("bad status: %s", resp.Status)
}
// Change binary filename to .filename
binary, err := osext.Executable()
var filename = getFilenameFromPath(binary)
var path = getPlatformPath(binary)
var oldBinary = path + "_old_" + filename
var newBinary = binary
// ZIP
var tmpFolder = path + "tmp"
var tmpFile = tmpFolder + string(os.PathSeparator) + filenameBIN
//fmt.Println(binary, path+"."+filename)
os.Rename(newBinary, oldBinary)
// Save the new binary with the old file name
out, err := os.Create(binary)
if err != nil {
restorOldBinary(oldBinary, newBinary)
return err
}
defer out.Close()
// Write the body to file
_, err = io.Copy(out, resp.Body)
if err != nil {
restorOldBinary(oldBinary, newBinary)
return err
}
// Update as a ZIP file
if fileType == "zip" {
log.Println("["+strings.ToUpper(fileType)+"]", "Update file:", filenameBIN)
log.Println("["+strings.ToUpper(fileType)+"]", "Unzip ZIP file...")
err = extractZIP(binary, tmpFolder)
binary = newBinary
if err != nil {
log.Println("["+strings.ToUpper(fileType)+"]", "Unzip ZIP file...ERROR")
restorOldBinary(oldBinary, newBinary)
return err
} else {
log.Println("["+strings.ToUpper(fileType)+"]", "Unzip ZIP file...OK")
log.Println("["+strings.ToUpper(fileType)+"]", "Copy binary file...")
err = copyFile(tmpFile, binary)
if err == nil {
log.Println("["+strings.ToUpper(fileType)+"]", "Copy binary file...OK")
} else {
log.Println("["+strings.ToUpper(fileType)+"]", "Copy binary file...ERROR")
restorOldBinary(oldBinary, newBinary)
return err
}
os.RemoveAll(tmpFolder)
}
}
// Set the permission
err = os.Chmod(binary, 0755)
// Close the new file !Windows
out.Close()
log.Println("["+strings.ToUpper(fileType)+"]", "Update Successful")
// Restart binary (Windows)
if runtime.GOOS == "windows" {
bin, err := os.Executable()
if err != nil {
restorOldBinary(oldBinary, newBinary)
return err
}
var pid = os.Getpid()
var process, _ = os.FindProcess(pid)
if proc, err := start(bin); err == nil {
os.RemoveAll(oldBinary)
process.Kill()
proc.Wait()
} else {
restorOldBinary(oldBinary, newBinary)
}
} else {
// Restart binary (Linux and UNIX)
file, _ := osext.Executable()
os.RemoveAll(oldBinary)
err = syscall.Exec(file, os.Args, os.Environ())
if err != nil {
restorOldBinary(oldBinary, newBinary)
log.Fatal(err)
return err
}
}
}
return
}
func start(args ...string) (p *os.Process, err error) {
if args[0], err = exec.LookPath(args[0]); err == nil {
//fmt.Println(args[0])
var procAttr os.ProcAttr
procAttr.Files = []*os.File{os.Stdin, os.Stdout, os.Stderr}
p, err := os.StartProcess(args[0], args, &procAttr)
if err == nil {
return p, nil
}
}
return nil, err
}
func restorOldBinary(oldBinary, newBinary string) {
os.RemoveAll(newBinary)
os.Rename(oldBinary, newBinary)
}
func getPlatformFile(filename string) string {
path, file := filepath.Split(filename)
var newPath = filepath.Dir(path)
var newFileName = newPath + string(os.PathSeparator) + file
return newFileName
}
func getFilenameFromPath(path string) string {
file := filepath.Base(path)
return file
}
func getPlatformPath(path string) string {
var newPath = filepath.Dir(path) + string(os.PathSeparator)
return newPath
}
func copyFile(src, dst string) (err error) {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
if err != nil {
return err
}
return out.Close()
}
func extractZIP(archive, target string) (err error) {
reader, err := zip.OpenReader(archive)
if err != nil {
return err
}
if err := os.MkdirAll(target, 0755); err != nil {
return err
}
for _, file := range reader.File {
path := filepath.Join(target, file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(path, file.Mode())
continue
}
fileReader, err := file.Open()
if err != nil {
return err
}
defer fileReader.Close()
targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
if err != nil {
return err
}
defer targetFile.Close()
if _, err := io.Copy(targetFile, fileReader); err != nil {
return err
}
}
return
}
-9
View File
@@ -1,7 +1,6 @@
package src
import (
"fmt"
"math/rand"
"time"
)
@@ -10,7 +9,6 @@ import (
func InitMaintenance() (err error) {
rand.Seed(time.Now().Unix())
System.TimeForAutoUpdate = fmt.Sprintf("0%d%d", randomTime(0, 2), randomTime(10, 59))
go maintenance()
@@ -64,18 +62,11 @@ func maintenance() {
}
// Update xTeVe (Binary)
if System.TimeForAutoUpdate == t.Format("1504") {
BinaryUpdate()
}
}
time.Sleep(60 * time.Second)
}
return
}
func randomTime(min, max int) int {
+156
View File
@@ -0,0 +1,156 @@
package src
import (
"errors"
"fmt"
"reflect"
)
// conditionalUpdateChanges : Settings-schema migrations applied at start-up.
// (Binary self-update was removed; the Docker image is the only distribution channel.)
func conditionalUpdateChanges() (err error) {
checkVersion:
settingsMap, err := loadJSONFileToMap(System.File.Settings)
if err != nil || len(settingsMap) == 0 {
return
}
if settingsVersion, ok := settingsMap["version"].(string); ok {
if settingsVersion > System.DBVersion {
showInfo("Settings DB Version:" + settingsVersion)
showInfo("System DB Version:" + System.DBVersion)
err = errors.New(getErrMsg(1031))
return
}
// Letzte Kompatible Version (1.4.4)
if settingsVersion < System.Compatibility {
err = errors.New(getErrMsg(1013))
return
}
switch settingsVersion {
case "1.4.4":
// UUID Wert in xepg.json setzen
err = setValueForUUID()
if err != nil {
return
}
// Neuer Filter (WebUI). Alte Filtereinstellungen werden konvertiert
if oldFilter, ok := settingsMap["filter"].([]any); ok {
var newFilterMap = convertToNewFilter(oldFilter)
settingsMap["filter"] = newFilterMap
settingsMap["version"] = "2.0.0"
err = saveMapToJSONFile(System.File.Settings, settingsMap)
if err != nil {
return
}
goto checkVersion
} else {
err = errors.New(getErrMsg(1030))
return
}
case "2.0.0":
if oldBuffer, ok := settingsMap["buffer"].(bool); ok {
var newBuffer string
switch oldBuffer {
case true:
newBuffer = "xteve"
case false:
newBuffer = "-"
}
settingsMap["buffer"] = newBuffer
settingsMap["version"] = "2.1.0"
err = saveMapToJSONFile(System.File.Settings, settingsMap)
if err != nil {
return
}
goto checkVersion
} else {
err = errors.New(getErrMsg(1030))
return
}
case "2.1.0":
// Falls es in einem späteren Update Änderungen an der Datenbank gibt, geht es hier weiter
break
}
} else {
// settings.json ist zu alt (älter als Version 1.4.4)
err = errors.New(getErrMsg(1013))
}
return
}
func convertToNewFilter(oldFilter []any) (newFilterMap map[int]any) {
newFilterMap = make(map[int]any)
switch reflect.TypeFor[[]any]().Kind() {
case reflect.Slice:
s := reflect.ValueOf(oldFilter)
for i := 0; i < s.Len(); i++ {
var newFilter FilterStruct
newFilter.Active = true
newFilter.Name = fmt.Sprintf("Custom filter %d", i+1)
newFilter.Filter = s.Index(i).Interface().(string)
newFilter.Type = "custom-filter"
newFilter.CaseSensitive = false
newFilterMap[i] = newFilter
}
}
return
}
func setValueForUUID() (err error) {
xepg, err := loadJSONFileToMap(System.File.XEPG)
for _, c := range xepg {
var xepgChannel = c.(map[string]any)
if uuidKey, ok := xepgChannel["_uuid.key"].(string); ok {
if value, ok := xepgChannel[uuidKey].(string); ok {
if len(value) > 0 {
xepgChannel["_uuid.value"] = value
}
}
}
}
err = saveMapToJSONFile(System.File.XEPG, xepg)
return
}
-21
View File
@@ -77,7 +77,6 @@ type SystemStruct struct {
Name string
OS string
ScanInProgress int
TimeForAutoUpdate string
Notification map[string]Notification
@@ -89,18 +88,6 @@ type SystemStruct struct {
XML string
}
GitHub struct {
Branch string
Repo string
Update bool
User string
}
Update struct {
Git string
Name string
}
URLBase string
UDPxy string
Version string
@@ -109,12 +96,6 @@ type SystemStruct struct {
}
}
// GitStruct : Updateinformationen von GitHub
type GitStruct struct {
Filename string `json:"filename"`
Version string `json:"version"`
}
// DataStruct : Alle Daten werden hier abgelegt. (Lineup, XMLTV)
type DataStruct struct {
Cache struct {
@@ -295,14 +276,12 @@ type SettingsStruct struct {
TempPath string `json:"temp.path"`
Tuner int `json:"tuner"`
Update []string `json:"update"`
UpdateURL string `json:"update.url,omitempty"`
UserAgent string `json:"user.agent"`
UUID string `json:"uuid"`
UDPxy string `json:"udpxy"`
Version string `json:"version"`
XepgMissingEPGMode string `json:"xepg.missing.epg.mode"`
XepgReplaceMissingImages bool `json:"xepg.replace.missing.images"`
XteveAutoUpdate bool `json:"xteveAutoUpdate"`
WizardCompleted bool `json:"wizard.completed"`
}
-1
View File
@@ -45,7 +45,6 @@ type RequestStruct struct {
UserAgent *string `json:"user.agent,omitempty"`
XepgMissingEPGMode *string `json:"xepg.missing.epg.mode,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"`
-1
View File
@@ -152,7 +152,6 @@ func loadSettings() (settings SettingsStruct, err error) {
defaults["uuid"] = createUUID()
defaults["udpxy"] = ""
defaults["version"] = System.DBVersion
defaults["xteveAutoUpdate"] = true
defaults["wizard.completed"] = !freshInstall
var defaultTempPath = System.Folder.Temp
if len(os.Getenv("XTEVE_CONFIG")) > 0 {
-307
View File
@@ -1,307 +0,0 @@
package src
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
up2date "xteve/src/internal/up2date/client"
"reflect"
)
// BinaryUpdate : Binary Update Prozess. Git Branch master und beta wird von GitHub geladen.
func BinaryUpdate() (err error) {
if System.GitHub.Update == false {
showWarning(2099)
return
}
var debug string
var updater = &up2date.Updater
updater.Name = System.Update.Name
updater.Branch = System.Branch
up2date.Init()
switch System.Branch {
// Update von GitHub
case "master", "beta":
var gitInfo = fmt.Sprintf("%s/%s/info.json?raw=true", System.Update.Git, System.Branch)
var zipFile = fmt.Sprintf("%s/%s/%s_%s_%s.zip?raw=true", System.Update.Git, System.Branch, System.AppName, System.OS, System.ARCH)
var body []byte
var git GitStruct
resp, err := http.Get(gitInfo)
if err != nil {
ShowError(err, 6003)
return nil
}
if resp.StatusCode != http.StatusOK {
if resp.StatusCode == 404 {
err = fmt.Errorf("Update Server: %s (%s)", http.StatusText(resp.StatusCode), gitInfo)
ShowError(err, 6003)
return nil
}
err = fmt.Errorf("%d: %s (%s)", resp.StatusCode, http.StatusText(resp.StatusCode), gitInfo)
return err
}
body, err = ioutil.ReadAll(resp.Body)
err = json.Unmarshal(body, &git)
if err != nil {
return err
}
updater.Response.Status = true
updater.Response.UpdateZIP = zipFile
updater.Response.Version = git.Version
updater.Response.Filename = git.Filename
// Update vom eigenen Server
default:
updater.URL = Settings.UpdateURL
if len(updater.URL) == 0 {
showInfo(fmt.Sprintf("Update URL:No server URL specified, update will not be performed. Branch: %s", System.Branch))
return
}
showInfo("Update URL:" + updater.URL)
fmt.Println("-----------------")
// Versionsinformationen vom Server laden
err = up2date.GetVersion()
if err != nil {
debug = err.Error()
showDebug(debug, 1)
return nil
}
if len(updater.Response.Reason) > 0 {
err = fmt.Errorf("Update Server: %s", updater.Response.Reason)
ShowError(err, 6002)
return nil
}
}
var currentVersion = System.Version + "." + System.Build
// Versionsnummer überprüfen
if updater.Response.Version > currentVersion && updater.Response.Status == true {
if Settings.XteveAutoUpdate == true {
// Update durchführen
var fileType, url string
showInfo(fmt.Sprintf("Update Available:Version: %s", updater.Response.Version))
switch System.Branch {
// Update von GitHub
case "master", "beta":
showInfo(fmt.Sprintf("Update Server:GitHub"))
// Update vom eigenen Server
default:
showInfo(fmt.Sprintf("Update Server:%s", Settings.UpdateURL))
}
showInfo(fmt.Sprintf("Start Update:Branch: %s", updater.Branch))
// Neue Version als BIN Datei herunterladen
if len(updater.Response.UpdateBIN) > 0 {
url = updater.Response.UpdateBIN
fileType = "bin"
}
// Neue Version als ZIP Datei herunterladen
if len(updater.Response.UpdateZIP) > 0 {
url = updater.Response.UpdateZIP
fileType = "zip"
}
if len(url) > 0 {
err = up2date.DoUpdate(fileType, updater.Response.Filename)
if err != nil {
ShowError(err, 6002)
}
}
} else {
// Hinweis ausgeben
showWarning(6004)
}
}
return nil
}
func conditionalUpdateChanges() (err error) {
checkVersion:
settingsMap, err := loadJSONFileToMap(System.File.Settings)
if err != nil || len(settingsMap) == 0 {
return
}
if settingsVersion, ok := settingsMap["version"].(string); ok {
if settingsVersion > System.DBVersion {
showInfo("Settings DB Version:" + settingsVersion)
showInfo("System DB Version:" + System.DBVersion)
err = errors.New(getErrMsg(1031))
return
}
// Letzte Kompatible Version (1.4.4)
if settingsVersion < System.Compatibility {
err = errors.New(getErrMsg(1013))
return
}
switch settingsVersion {
case "1.4.4":
// UUID Wert in xepg.json setzen
err = setValueForUUID()
if err != nil {
return
}
// Neuer Filter (WebUI). Alte Filtereinstellungen werden konvertiert
if oldFilter, ok := settingsMap["filter"].([]any); ok {
var newFilterMap = convertToNewFilter(oldFilter)
settingsMap["filter"] = newFilterMap
settingsMap["version"] = "2.0.0"
err = saveMapToJSONFile(System.File.Settings, settingsMap)
if err != nil {
return
}
goto checkVersion
} else {
err = errors.New(getErrMsg(1030))
return
}
case "2.0.0":
if oldBuffer, ok := settingsMap["buffer"].(bool); ok {
var newBuffer string
switch oldBuffer {
case true:
newBuffer = "xteve"
case false:
newBuffer = "-"
}
settingsMap["buffer"] = newBuffer
settingsMap["version"] = "2.1.0"
err = saveMapToJSONFile(System.File.Settings, settingsMap)
if err != nil {
return
}
goto checkVersion
} else {
err = errors.New(getErrMsg(1030))
return
}
case "2.1.0":
// Falls es in einem späteren Update Änderungen an der Datenbank gibt, geht es hier weiter
break
}
} else {
// settings.json ist zu alt (älter als Version 1.4.4)
err = errors.New(getErrMsg(1013))
}
return
}
func convertToNewFilter(oldFilter []any) (newFilterMap map[int]any) {
newFilterMap = make(map[int]any)
switch reflect.TypeFor[[]any]().Kind() {
case reflect.Slice:
s := reflect.ValueOf(oldFilter)
for i := 0; i < s.Len(); i++ {
var newFilter FilterStruct
newFilter.Active = true
newFilter.Name = fmt.Sprintf("Custom filter %d", i+1)
newFilter.Filter = s.Index(i).Interface().(string)
newFilter.Type = "custom-filter"
newFilter.CaseSensitive = false
newFilterMap[i] = newFilter
}
}
return
}
func setValueForUUID() (err error) {
xepg, err := loadJSONFileToMap(System.File.XEPG)
for _, c := range xepg {
var xepgChannel = c.(map[string]any)
if uuidKey, ok := xepgChannel["_uuid.key"].(string); ok {
if value, ok := xepgChannel[uuidKey].(string); ok {
if len(value) > 0 {
xepgChannel["_uuid.value"] = value
}
}
}
}
err = saveMapToJSONFile(System.File.XEPG, xepg)
return
}
+43 -42
View File
File diff suppressed because one or more lines are too long
-1
View File
@@ -410,7 +410,6 @@ func WS(w http.ResponseWriter, r *http.Request) {
ShowError(err, 1022)
} else {
return
break
}
return
-2
View File
@@ -352,8 +352,6 @@ func createXEPGDatabase() (err error) {
firstFreeNumber++
}
return
}
var generateHashForChannel = func(m3uID string, groupTitle string, tvgID string, tvgName string, uuidKey string, uuidValue string) string {