package webcontroller import ( "fmt" "io" "net/http" "net/url" "path/filepath" "strings" "fornaxian.com/pixeldrain-web/conf" "fornaxian.com/pixeldrain-web/pixelapi" "github.com/julienschmidt/httprouter" ) // ServeFilePreview controller for GET /u/:id/preview func ServeFilePreview(w http.ResponseWriter, r *http.Request, p httprouter.Params) { if p.ByName("id") == "demo" { ServeFilePreviewDemo(w) // Required for a-ads.com quality check return } inf := pixelapi.GetFileInfo(p.ByName("id")) // TODO: Error handling if inf == nil { ServeNotFound(w, r) return } var fp FilePreview io.WriteString(w, fp.Run(inf)) } type FilePreview struct { FileInfo *pixelapi.FileInfo FileURL string DownloadURL string } func (f FilePreview) Run(inf *pixelapi.FileInfo) string { f.FileInfo = inf f.FileURL = conf.ApiURL() + "/file/" + f.FileInfo.ID f.DownloadURL = conf.ApiURL() + "/file/" + f.FileInfo.ID + "/download" if strings.HasPrefix(f.FileInfo.MimeType, "image") { return f.image() } if strings.HasPrefix(f.FileInfo.MimeType, "video") { return f.video() } if strings.HasPrefix(f.FileInfo.MimeType, "audio") { return f.audio() } switch f.FileInfo.MimeType { case "application/ogg": return f.audio() case "application/matroska", "application/x-matroska": return f.video() case "application/pdf", "application/x-pdf": return f.pdf() case "application/octet-stream": // Fallback for when mime type not recognized switch filepath.Ext(f.FileInfo.FileName) { case ".mp3": return f.audio() case ".mp4": return f.video() } } // none of the mime type checks triggered, so we return the default page return f.def() } func (f FilePreview) image() string { return fmt.Sprintf(`