fixed jellyfin refresh

This commit is contained in:
Brad Stein 2025-09-18 02:48:31 -05:00
parent f73bbc7b9f
commit 385a716516
3 changed files with 84 additions and 8 deletions

View File

@ -4,7 +4,7 @@ package internal
import (
"bytes"
"encoding/json"
"fmt"
"fmt" // <-- keep this; used by fmt.Errorf
"net/http"
"os"
"time"
@ -57,9 +57,3 @@ func (j *Jellyfin) AuthenticateByName(username, password string) (jfAuthResult,
}
return out, nil
}
func (j *Jellyfin) RefreshLibrary(token string) {
req, _ := http.NewRequest("GET", j.BaseURL+"/Library/Refresh", nil)
req.Header.Set("X-MediaBrowser-Token", token)
_, _ = j.Client.Do(req)
}

View File

@ -0,0 +1,82 @@
// backend/internal/refresh.go
package internal
import (
"io"
"log"
"net/http"
"os"
"strings"
"sync"
"time"
)
// Debounce refresh calls so a burst of uploads/renames/deletes only triggers one scan.
var (
refreshMu sync.Mutex
refreshTimer *time.Timer
)
// RefreshLibrary triggers a Jellyfin library scan.
// - Prefers JELLYFIN_API_KEY (admin key). Falls back to userToken if no key.
// - Debounced: calls within 2s are coalesced to a single scan.
func (j *Jellyfin) RefreshLibrary(userToken string) {
refreshMu.Lock()
defer refreshMu.Unlock()
if refreshTimer != nil {
// push the timer out a bit if more events arrive
refreshTimer.Reset(2 * time.Second)
return
}
refreshTimer = time.AfterFunc(2*time.Second, func() {
base := strings.TrimRight(os.Getenv("JELLYFIN_URL"), "/")
if base == "" {
log.Printf("jellyfin refresh: JELLYFIN_URL missing; skipping")
safeClearTimer()
return
}
token := os.Getenv("JELLYFIN_API_KEY")
if token == "" {
token = userToken // last resort (may fail if user is not admin)
}
if token == "" {
log.Printf("jellyfin refresh: no token; skipping")
safeClearTimer()
return
}
req, _ := http.NewRequest(http.MethodPost, base+"/Library/Refresh", nil)
// Jellyfin/Emby accept API key via header or query; header is cleanest.
// Either X-Emby-Token or X-MediaBrowser-Token are accepted; we use X-Emby-Token.
req.Header.Set("X-Emby-Token", token)
client := j.Client
if client == nil {
client = &http.Client{Timeout: 20 * time.Second}
}
resp, err := client.Do(req)
if err != nil {
log.Printf("jellyfin refresh: request error: %v", err)
safeClearTimer()
return
}
_, _ = io.Copy(io.Discard, resp.Body)
_ = resp.Body.Close()
if resp.StatusCode >= 300 {
log.Printf("jellyfin refresh: HTTP %s", resp.Status)
} else {
log.Printf("jellyfin refresh: triggered")
}
safeClearTimer()
})
}
func safeClearTimer() {
refreshMu.Lock()
defer refreshMu.Unlock()
refreshTimer = nil
}

View File

@ -100,7 +100,7 @@ func main() {
BasePath: "/tus/",
StoreComposer: composer,
NotifyCompleteUploads: true,
MaxSize: 4 * 1024 * 1024 * 1024, // 4GB per file
MaxSize: 8 * 1024 * 1024 * 1024, // 8GB per file
RespectForwardedHeaders: true, // <<< important for https behind Traefik
}
tusHandler, err := tusd.NewUnroutedHandler(config)