diff --git a/backend/.env b/backend/.env index c1ed77b..e33764f 100644 --- a/backend/.env +++ b/backend/.env @@ -1,2 +1,2 @@ -HTTPS_ENABLED=0 +HTTPS_ENABLED=1 AUTH_RP_ORIGINS=https://l14pbbk95100006.tegdssd.de:9999,https://l14pbbk95100006.tegdssd.de:5173,https://localhost:9999,https://127.0.0.1:9999,https://10.0.1.25:9999,http://localhost:5173,http://127.0.0.1:5173,http://10.0.1.25:5173 \ No newline at end of file diff --git a/backend/record_stream_mfc.go b/backend/record_stream_mfc.go index f546fa3..1dcd72d 100644 --- a/backend/record_stream_mfc.go +++ b/backend/record_stream_mfc.go @@ -51,14 +51,17 @@ func RecordStreamMFC( time.Sleep(5 * time.Second) } - if job != nil && strings.TrimSpace(mfc.AvatarURL) != "" { - jobsMu.Lock() - job.ModelImageURL = strings.TrimSpace(mfc.AvatarURL) - job.Avatar = strings.TrimSpace(mfc.AvatarURL) - job.PreviewState = "public" - jobsMu.Unlock() + if job != nil { + img := strings.TrimSpace(mfc.PreviewImageURL()) + if img != "" { + jobsMu.Lock() + job.ModelImageURL = img + job.Avatar = img + job.PreviewState = "public" + jobsMu.Unlock() - _ = publishJobSnapshot(job.ID) + _ = publishJobSnapshot(job.ID) + } } // ✅ erst jetzt die Video URL holen (weil public) @@ -82,9 +85,9 @@ func RecordStreamMFC( job.PreviewCookie = "" job.PreviewUA = hc.userAgent - if strings.TrimSpace(mfc.AvatarURL) != "" { - job.ModelImageURL = strings.TrimSpace(mfc.AvatarURL) - job.Avatar = strings.TrimSpace(mfc.AvatarURL) + if img := strings.TrimSpace(mfc.PreviewImageURL()); img != "" { + job.ModelImageURL = img + job.Avatar = img job.PreviewState = "public" } @@ -109,6 +112,9 @@ type MyFreeCams struct { ServerID string Phase string AvatarURL string + + RawUserID int + SnapURL string } type mfcUsernameLookupResp struct { @@ -121,11 +127,58 @@ type mfcUsernameLookupResp struct { Sessions []struct { ServerName string `json:"server_name"` Phase string `json:"phase"` + SnapURL string `json:"snap_url"` } `json:"sessions"` } `json:"user"` } `json:"result"` } +func normalizeMFCSnapURL(raw string) string { + raw = strings.TrimSpace(raw) + if raw == "" { + return "" + } + + if strings.HasPrefix(raw, "//") { + raw = "https:" + raw + } else if strings.HasPrefix(raw, "/") { + raw = "https://snap.mfcimg.com" + raw + } else if !strings.HasPrefix(raw, "http://") && !strings.HasPrefix(raw, "https://") { + raw = "https://snap.mfcimg.com/" + strings.TrimLeft(raw, "/") + } + + u, err := url.Parse(raw) + if err != nil || u.Scheme == "" || u.Host == "" { + return raw + } + + q := u.Query() + q.Set("no-cache", strconv.FormatInt(time.Now().UnixNano(), 10)) + u.RawQuery = q.Encode() + + return u.String() +} + +func buildMFCSnapimgURL(serverID string, rawUserID int) string { + serverID = strings.TrimSpace(serverID) + if serverID == "" || rawUserID <= 0 { + return "" + } + + return normalizeMFCSnapURL(fmt.Sprintf( + "https://snap.mfcimg.com/snapimg/%s/853x480/mfc_%d", + serverID, + rawUserID, + )) +} + +func (m *MyFreeCams) PreviewImageURL() string { + if s := strings.TrimSpace(m.SnapURL); s != "" { + return s + } + return strings.TrimSpace(m.AvatarURL) +} + func mfcDigitsOnly(s string) string { var b strings.Builder for _, r := range strings.TrimSpace(s) { @@ -320,6 +373,7 @@ func (m *MyFreeCams) GetStatus(ctx context.Context, userAgent string) (Status, e return StatusNotExist, nil } + m.RawUserID = data.Result.User.ID m.AvatarURL = strings.TrimSpace(data.Result.User.Avatar) if len(data.Result.User.Sessions) == 0 { @@ -333,6 +387,12 @@ func (m *MyFreeCams) GetStatus(ctx context.Context, userAgent string) (Status, e return StatusUnknown, appErrorf("mfc: server_name ohne server-id: %q", sess.ServerName) } + m.SnapURL = buildMFCSnapimgURL(serverID, data.Result.User.ID) + + if strings.TrimSpace(m.SnapURL) == "" && strings.TrimSpace(sess.SnapURL) != "" { + m.SnapURL = normalizeMFCSnapURL(sess.SnapURL) + } + modelID := data.Result.User.ID if modelID < 100000000 { modelID += 100000000