fixed jellyfin refresh
This commit is contained in:
parent
f73bbc7b9f
commit
385a716516
@ -4,7 +4,7 @@ package internal
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt" // <-- keep this; used by fmt.Errorf
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
@ -57,9 +57,3 @@ func (j *Jellyfin) AuthenticateByName(username, password string) (jfAuthResult,
|
|||||||
}
|
}
|
||||||
return out, nil
|
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)
|
|
||||||
}
|
|
||||||
|
|||||||
82
backend/internal/refresh.go
Normal file
82
backend/internal/refresh.go
Normal 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
|
||||||
|
}
|
||||||
@ -100,7 +100,7 @@ func main() {
|
|||||||
BasePath: "/tus/",
|
BasePath: "/tus/",
|
||||||
StoreComposer: composer,
|
StoreComposer: composer,
|
||||||
NotifyCompleteUploads: true,
|
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
|
RespectForwardedHeaders: true, // <<< important for https behind Traefik
|
||||||
}
|
}
|
||||||
tusHandler, err := tusd.NewUnroutedHandler(config)
|
tusHandler, err := tusd.NewUnroutedHandler(config)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user