utils.go 1.3 KB

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