package utils import ( "bytes" "io/ioutil" "os" "path" "path/filepath" "strings" "github.com/mssola/user_agent" "github.com/yuin/goldmark" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/renderer/html" "mvdan.cc/xurls" ) //GetTemporaryPipePath gets the temporary path for the streampipe.flv file func GetTemporaryPipePath() string { return filepath.Join(os.TempDir(), "streampipe.flv") } //DoesFileExists checks if the file exists func DoesFileExists(name string) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { return false } } return true } //GetRelativePathFromAbsolutePath gets the relative path from the provided absolute path func GetRelativePathFromAbsolutePath(path string) string { pathComponents := strings.Split(path, "/") variant := pathComponents[len(pathComponents)-2] file := pathComponents[len(pathComponents)-1] return filepath.Join(variant, file) } func GetIndexFromFilePath(path string) string { pathComponents := strings.Split(path, "/") variant := pathComponents[len(pathComponents)-2] return variant } //Copy copies the file to destination func Copy(source, destination string) error { input, err := ioutil.ReadFile(source) if err != nil { return err } return ioutil.WriteFile(destination, input, 0644) } //Move moves the file to destination func Move(source, destination string) error { return os.Rename(source, destination) } // IsUserAgentABot returns if a web client user-agent is seen as a bot func IsUserAgentABot(userAgent string) bool { if userAgent == "" { return false } botStrings := []string{ "mastodon", "pleroma", "applebot", } for _, botString := range botStrings { if strings.Contains(strings.ToLower(userAgent), botString) { return true } } ua := user_agent.New(userAgent) return ua.Bot() } func RenderSimpleMarkdown(raw string) string { markdown := goldmark.New( goldmark.WithRendererOptions( html.WithUnsafe(), ), goldmark.WithExtensions( extension.NewLinkify( extension.WithLinkifyAllowedProtocols([][]byte{ []byte("http:"), []byte("https:"), }), extension.WithLinkifyURLRegexp( xurls.Strict, ), ), ), ) trimmed := strings.TrimSpace(raw) var buf bytes.Buffer if err := markdown.Convert([]byte(trimmed), &buf); err != nil { panic(err) } return buf.String() } // GetCacheDurationSecondsForPath will return the number of seconds to cache an item func GetCacheDurationSecondsForPath(filePath string) int { if path.Base(filePath) == "thumbnail.jpg" { // Thumbnails re-generate during live return 20 } else if path.Ext(filePath) == ".js" || path.Ext(filePath) == ".css" { // Cache javascript & CSS return 60 } else if path.Ext(filePath) == ".ts" { // Cache video segments as long as you want. They can't change. // This matters most for local hosting of segments for recordings // and not for live or 3rd party storage. return 31557600 } else if path.Ext(filePath) == ".m3u8" { return 0 } // Default cache length in seconds return 30 }