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) if err != nil { return } 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 }