ライブラリ・再生・削除を追加(Range 配信、パスの安全確認、共有ファイル名規則)
This commit is contained in:
+23
-20
@@ -21,6 +21,8 @@ type page struct {
|
||||
Newer *newerView
|
||||
Queue *queueView
|
||||
Subscriptions *subscriptionsView
|
||||
Library *libraryView
|
||||
Video *videoView
|
||||
}
|
||||
|
||||
type JobStore interface {
|
||||
@@ -36,20 +38,24 @@ type JobStore interface {
|
||||
ListSubscriptions(context.Context) ([]store.Subscription, error)
|
||||
SetSubscriptionEnabled(context.Context, string, bool) error
|
||||
DeleteSubscription(context.Context, string) (bool, error)
|
||||
ListSucceededJobs(context.Context, int) ([]store.Job, error)
|
||||
GetSucceededJob(context.Context, int64) (store.Job, error)
|
||||
DeleteSucceededJob(context.Context, int64) error
|
||||
}
|
||||
|
||||
type server struct {
|
||||
fetcher NewerFetcher
|
||||
jobs JobStore
|
||||
now func() time.Time
|
||||
logger *log.Logger
|
||||
zone *time.Location
|
||||
tmpl *template.Template
|
||||
cacheMu sync.Mutex
|
||||
cache map[string]cacheEntry
|
||||
fetcher NewerFetcher
|
||||
jobs JobStore
|
||||
videoDir string
|
||||
now func() time.Time
|
||||
logger *log.Logger
|
||||
zone *time.Location
|
||||
tmpl *template.Template
|
||||
cacheMu sync.Mutex
|
||||
cache map[string]cacheEntry
|
||||
}
|
||||
|
||||
func NewHandler(fetcher NewerFetcher, jobs JobStore, now func() time.Time, logger *log.Logger) http.Handler {
|
||||
func NewHandler(fetcher NewerFetcher, jobs JobStore, videoDir string, now func() time.Time, logger *log.Logger) http.Handler {
|
||||
tmpl := template.Must(template.ParseFS(assets, "templates/*.html"))
|
||||
staticFiles, err := fs.Sub(assets, "static")
|
||||
if err != nil {
|
||||
@@ -59,7 +65,10 @@ func NewHandler(fetcher NewerFetcher, jobs JobStore, now func() time.Time, logge
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
s := &server{fetcher: fetcher, jobs: jobs, now: now, logger: logger, zone: zone, tmpl: tmpl, cache: make(map[string]cacheEntry)}
|
||||
if videoDir == "" {
|
||||
videoDir = "/videos"
|
||||
}
|
||||
s := &server{fetcher: fetcher, jobs: jobs, videoDir: videoDir, now: now, logger: logger, zone: zone, tmpl: tmpl, cache: make(map[string]cacheEntry)}
|
||||
mux := http.NewServeMux()
|
||||
mux.Handle("GET /static/", http.StripPrefix("/static/", http.FileServerFS(staticFiles)))
|
||||
mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, _ *http.Request) {
|
||||
@@ -81,15 +90,9 @@ func NewHandler(fetcher NewerFetcher, jobs JobStore, now func() time.Time, logge
|
||||
mux.HandleFunc("POST /subscriptions/{id}/pause", s.pauseSubscription)
|
||||
mux.HandleFunc("POST /subscriptions/{id}/resume", s.resumeSubscription)
|
||||
mux.HandleFunc("POST /subscriptions/{id}/delete", s.deleteSubscription)
|
||||
for path, title := range map[string]string{
|
||||
"GET /library": "ライブラリ",
|
||||
} {
|
||||
mux.HandleFunc(path, func(w http.ResponseWriter, _ *http.Request) {
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
if err := s.tmpl.ExecuteTemplate(w, "layout", page{Title: title}); err != nil {
|
||||
http.Error(w, "template error", http.StatusInternalServerError)
|
||||
}
|
||||
})
|
||||
}
|
||||
mux.HandleFunc("GET /library", s.libraryPage)
|
||||
mux.HandleFunc("GET /library/{id}", s.videoPage)
|
||||
mux.HandleFunc("GET /videos/{id}", s.serveVideo)
|
||||
mux.HandleFunc("POST /library/{id}/delete", s.deleteVideo)
|
||||
return mux
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user