utils.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package main
  2. import (
  3. "time"
  4. "fmt"
  5. "math"
  6. "os"
  7. "io"
  8. "bytes"
  9. "compress/gzip"
  10. "archive/tar"
  11. )
  12. type Item struct {
  13. Name string
  14. Size int64
  15. URL string
  16. Date time.Time
  17. Directory bool
  18. Valid bool
  19. }
  20. func (i Item) FDate() string {
  21. if i.Date.IsZero() {
  22. return "-"
  23. }
  24. return i.Date.Format(time.RFC822)
  25. }
  26. func (i Item) FSize() string {
  27. if i.Size == 0 {
  28. return "-"
  29. }
  30. if i.Size < 1024 {
  31. return fmt.Sprintf("%d B", i.Size)
  32. }
  33. exp := int(math.Log(float64(i.Size)) / math.Log(1024))
  34. pre := string("KMGTPE"[(exp-1)])
  35. fsize := float64(i.Size) / math.Pow(1024, float64(exp))
  36. return fmt.Sprintf("%.1f %siB", fsize, pre)
  37. }
  38. type Page struct {
  39. Title string
  40. Items []Item
  41. Error int
  42. }
  43. type Config struct {
  44. Directories map[string]Directory `json:"data"`
  45. Address string `json:"address"`
  46. }
  47. type Directory struct {
  48. Path string `json:"path"`
  49. Extension string `json:"ext"`
  50. }
  51. func compress(file *os.File, buf *bytes.Buffer) error {
  52. gw := gzip.NewWriter(buf)
  53. defer gw.Close()
  54. tw := tar.NewWriter(gw)
  55. defer tw.Close()
  56. if stat, err := file.Stat(); err == nil {
  57. header := new(tar.Header)
  58. header.Name = file.Name()
  59. header.Size = stat.Size()
  60. header.Mode = int64(stat.Mode())
  61. header.ModTime = stat.ModTime()
  62. if err := tw.WriteHeader(header); err != nil {
  63. return err
  64. }
  65. if _, err := io.Copy(tw, file); err != nil {
  66. return err
  67. }
  68. }
  69. return nil
  70. }