diff --git a/src/main.go b/src/main.go index 6fc25b3..92a2ff0 100644 --- a/src/main.go +++ b/src/main.go @@ -21,6 +21,7 @@ func main() { router.Route("/", func(r chi.Router) { router.Get("/", media.Index) router.Get("/fetch", media.FetchMedia) + router.Get("/api/download", media.FetchMediaApi) router.Get("/download", media.ServeMedia) }) fileServer(router, "/static", "static/") diff --git a/src/media/fetch.go b/src/media/fetch.go index 7fba887..bf25b4b 100644 --- a/src/media/fetch.go +++ b/src/media/fetch.go @@ -52,10 +52,37 @@ func Index(w http.ResponseWriter, _ *http.Request) { } func FetchMedia(w http.ResponseWriter, r *http.Request) { + response, err := getMediaResults(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + if err := fetchResponseTmpl.Execute(w, response); err != nil { + log.Error().Msgf("Error rendering template: %v", err) + http.Error(w, "Internal error", http.StatusInternalServerError) + } +} + +func FetchMediaApi(w http.ResponseWriter, r *http.Request) { + response, err := getMediaResults(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if len(response.Medias) == 0 { + http.Error(w, "Media not found", http.StatusBadRequest) + return + } + + // just take the first one + streamFileToClientById(w, response.Medias[0].Id) +} + +func getMediaResults(r *http.Request) (MediaResults, error) { url := r.URL.Query().Get("url") if url == "" { - http.Error(w, "Missing URL", http.StatusBadRequest) - return + return MediaResults{}, errors.New("Missing URL") } // NOTE: This system is for a simple use case, meant to run at home. This is not a great design for a robust system. @@ -67,30 +94,23 @@ func FetchMedia(w http.ResponseWriter, r *http.Request) { medias, err := getAllFilesForId(id) if len(medias) == 0 { // We don't, so go fetch it - id, err = fetch(url) + id, err = downloadMedia(url) if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return + return MediaResults{}, err } medias, err = getAllFilesForId(id) if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return + return MediaResults{}, err } } - response := MediaResults{ + return MediaResults{ Medias: medias, - } - - if err := fetchResponseTmpl.Execute(w, response); err != nil { - log.Error().Msgf("Error rendering template: %v", err) - http.Error(w, "Internal error", http.StatusInternalServerError) - } + }, nil } // returns the ID of the file -func fetch(url string) (string, error) { +func downloadMedia(url string) (string, error) { // The id will be used as the name of the parent directory of the output files id := GetMD5Hash(url) name := getMediaDirectory(id) + "%(title)s.%(ext)s" @@ -144,7 +164,7 @@ func fetch(url string) (string, error) { return id, nil } -// Returns the relative directory containing the media file, with a trailing slash +// Returns the relative directory containing the media file, with a trailing slash. // Id is expected to be pre validated func getMediaDirectory(id string) string { return downloadDir + id + "/" diff --git a/src/media/serve.go b/src/media/serve.go index b48cfa9..8a60de8 100644 --- a/src/media/serve.go +++ b/src/media/serve.go @@ -25,6 +25,10 @@ func ServeMedia(w http.ResponseWriter, r *http.Request) { return } + streamFileToClientById(w, id) +} + +func streamFileToClientById(w http.ResponseWriter, id string) { filename, err := getFileFromId(id) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) diff --git a/templates/media/response.html b/templates/media/response.html index cd363a1..dcff17a 100644 --- a/templates/media/response.html +++ b/templates/media/response.html @@ -18,7 +18,7 @@

Done!

{{range .Medias}} - {{.Name}} {{.HumanSize}} + {{.Name}} {{.HumanSize}} {{ end }}