package webcontroller import ( "fmt" "html" "io" "io/ioutil" "net/http" "net/url" "path/filepath" "strings" "fornaxian.com/pixeldrain-api/util" "fornaxian.com/pixeldrain-web/pixelapi" "github.com/Fornaxian/log" "github.com/microcosm-cc/bluemonday" "github.com/julienschmidt/httprouter" "github.com/timakin/gonvert" "gopkg.in/russross/blackfriday.v2" ) // ServeFilePreview controller for GET /u/:id/preview func (wc *WebController) 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 } apikey, _ := wc.getAPIKey(r) var api = pixelapi.New(wc.conf.APIURLInternal, apikey) api.RealIP = util.RemoteAddress(r) inf, err := api.GetFileInfo(p.ByName("id"), "?should_a_view_be_added=yes_gimme") // TODO: Error handling if err != nil { wc.serveNotFound(w, r) return } var fp = filePreview{ APIURL: wc.conf.APIURLExternal, PixelAPI: api, } io.WriteString(w, fp.run(inf)) } type filePreview struct { FileInfo *pixelapi.FileInfo FileURL string DownloadURL string APIURL string PixelAPI *pixelapi.PixelAPI } func (f filePreview) run(inf *pixelapi.FileInfo) string { f.FileInfo = inf f.FileURL = f.APIURL + "/file/" + f.FileInfo.ID f.DownloadURL = f.APIURL + "/file/" + f.FileInfo.ID + "?download" if strings.HasPrefix(f.FileInfo.MimeType, "image") { return f.image() } else if strings.HasPrefix(f.FileInfo.MimeType, "video") { return f.video() } else if strings.HasPrefix(f.FileInfo.MimeType, "audio") { return f.audio() } else if strings.HasPrefix(f.FileInfo.MimeType, "text") { if strings.HasSuffix(f.FileInfo.Name, ".md") || strings.HasSuffix(f.FileInfo.Name, ".markdown") { return f.markdown() } return f.text() } 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.Name) { 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(`
%s