mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 02:32:57 +00:00
finally please
This commit is contained in:
@@ -542,9 +542,81 @@ func doPrefetchCycle(client *http.Client, baseURL string) {
|
||||
}
|
||||
}
|
||||
|
||||
// Alias: keep legacy/frontend callers happy expecting matches.json
|
||||
if b, err := os.ReadFile(filepath.Join(cacheDir, "events_upcoming.json")); err == nil {
|
||||
_ = os.WriteFile(filepath.Join(cacheDir, "matches.json"), b, 0o644)
|
||||
// Prepare matches.json from FACR data if available; fallback to events_upcoming.json
|
||||
createdMatches := false
|
||||
buildMatchesFromFACR := func(data []byte) bool {
|
||||
type facrMatch struct {
|
||||
DateTime string `json:"date_time"`
|
||||
Home string `json:"home"`
|
||||
Away string `json:"away"`
|
||||
Venue string `json:"venue"`
|
||||
HomeLogoURL string `json:"home_logo_url"`
|
||||
AwayLogoURL string `json:"away_logo_url"`
|
||||
MatchID string `json:"match_id"`
|
||||
}
|
||||
var facr struct {
|
||||
Competitions []struct {
|
||||
Name string `json:"name"`
|
||||
Code string `json:"code"`
|
||||
Matches []facrMatch `json:"matches"`
|
||||
} `json:"competitions"`
|
||||
}
|
||||
if err := json.Unmarshal(data, &facr); err != nil {
|
||||
return false
|
||||
}
|
||||
// Collect upcoming matches (next 30 days) in simplified format
|
||||
now := time.Now()
|
||||
max := now.Add(30 * 24 * time.Hour)
|
||||
var out []map[string]any
|
||||
for _, c := range facr.Competitions {
|
||||
compName := strings.TrimSpace(c.Name)
|
||||
if compName == "" {
|
||||
compName = strings.TrimSpace(c.Code)
|
||||
}
|
||||
for _, m := range c.Matches {
|
||||
dt := strings.TrimSpace(m.DateTime)
|
||||
if dt == "" {
|
||||
continue
|
||||
}
|
||||
// dt like "12.08.2023 18:00"
|
||||
parts := strings.SplitN(dt, " ", 2)
|
||||
d := parts[0]
|
||||
t := ""
|
||||
if len(parts) > 1 { t = parts[1] }
|
||||
// parse date dd.mm.yyyy
|
||||
dd := strings.Split(d, ".")
|
||||
if len(dd) < 3 { continue }
|
||||
day := dd[0]
|
||||
month := dd[1]
|
||||
year := dd[2]
|
||||
if len(month) == 1 { month = "0" + month }
|
||||
if len(day) == 1 { day = "0" + day }
|
||||
isoDate := year + "-" + month + "-" + day
|
||||
if len(t) >= 5 {
|
||||
t = t[:5]
|
||||
} else {
|
||||
t = "18:00"
|
||||
}
|
||||
// Build time.Time for filtering
|
||||
ts, err := time.ParseInLocation("2006-01-02 15:04", isoDate+" "+t, time.Local)
|
||||
if err != nil { continue }
|
||||
if ts.Before(now) || ts.After(max) { continue }
|
||||
out = append(out, map[string]any{
|
||||
"id": m.MatchID,
|
||||
"home": m.Home,
|
||||
"away": m.Away,
|
||||
"competition": compName,
|
||||
"date": isoDate,
|
||||
"time": t,
|
||||
"venue": m.Venue,
|
||||
"home_logo_url": m.HomeLogoURL,
|
||||
"away_logo_url": m.AwayLogoURL,
|
||||
})
|
||||
}
|
||||
}
|
||||
if len(out) == 0 { return false }
|
||||
_ = writeJSONAtomic(filepath.Join(cacheDir, "matches.json"), out)
|
||||
return true
|
||||
}
|
||||
|
||||
// 2) Dynamic FACR endpoints based on saved settings
|
||||
@@ -582,10 +654,34 @@ func doPrefetchCycle(client *http.Client, baseURL string) {
|
||||
statuses = append(statuses, epStatus{Path: path, File: file, Ok: true})
|
||||
}
|
||||
}
|
||||
// Try to build matches.json from freshly fetched FACR prefetch file
|
||||
if b, err := os.ReadFile(filepath.Join(cacheDir, "facr_club_info.json")); err == nil {
|
||||
if buildMatchesFromFACR(b) { createdMatches = true }
|
||||
}
|
||||
} else {
|
||||
log.Printf("[prefetch] WARNING: FACR skipped: missing club_id=%q or club_type=%q in settings", clubID, clubType)
|
||||
}
|
||||
|
||||
// If FACR prefetch not available, try internal FACR cache as fallback
|
||||
if !createdMatches && clubID != "" && clubType != "" {
|
||||
facrCachePath := filepath.Join("cache", "facr", fmt.Sprintf("%s_%s_info.json", clubType, clubID))
|
||||
if b, err := os.ReadFile(facrCachePath); err == nil {
|
||||
var cached struct{ Data []byte `json:"data"` }
|
||||
if jsonErr := json.Unmarshal(b, &cached); jsonErr == nil && len(cached.Data) > 0 {
|
||||
if buildMatchesFromFACR(cached.Data) { createdMatches = true }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Final fallback: copy events_upcoming.json or write empty list
|
||||
if !createdMatches {
|
||||
if b, err := os.ReadFile(filepath.Join(cacheDir, "events_upcoming.json")); err == nil {
|
||||
_ = os.WriteFile(filepath.Join(cacheDir, "matches.json"), b, 0o644)
|
||||
} else {
|
||||
_ = os.WriteFile(filepath.Join(cacheDir, "matches.json"), []byte("[]"), 0o644)
|
||||
}
|
||||
}
|
||||
|
||||
// Meta timestamp
|
||||
_ = os.WriteFile(filepath.Join(cacheDir, "meta.json"), []byte(fmt.Sprintf(`{"lastUpdated":"%s"}`, time.Now().Format(time.RFC3339))), 0o644)
|
||||
// Detailed status for admin/debugging
|
||||
|
||||
Reference in New Issue
Block a user