database.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "time"
  7. "github.com/HouzuoGuo/tiedot/db"
  8. "github.com/fatih/color"
  9. )
  10. // Trim files already downloaded and stored in database
  11. func trimDownloadedLinks(linkList map[string]string, channelID string) map[string]string {
  12. channelConfig := getChannelConfig(channelID)
  13. newList := make(map[string]string, 0)
  14. for link, filename := range linkList {
  15. downloadedFiles := dbFindDownloadByURL(link)
  16. alreadyDownloaded := false
  17. for _, downloadedFile := range downloadedFiles {
  18. if downloadedFile.ChannelID == channelID {
  19. alreadyDownloaded = true
  20. }
  21. }
  22. if !alreadyDownloaded || *channelConfig.SavePossibleDuplicates {
  23. newList[link] = filename
  24. } else if config.DebugOutput {
  25. log.Println(logPrefixFileSkip, color.GreenString("Found URL has already been downloaded for this channel: %s", link))
  26. }
  27. }
  28. return newList
  29. }
  30. func dbInsertDownload(download *download) error {
  31. _, err := myDB.Use("Downloads").Insert(map[string]interface{}{
  32. "URL": download.URL,
  33. "Time": download.Time.String(),
  34. "Destination": download.Destination,
  35. "Filename": download.Filename,
  36. "ChannelID": download.ChannelID,
  37. "UserID": download.UserID,
  38. })
  39. return err
  40. }
  41. func dbFindDownloadByID(id int) *download {
  42. downloads := myDB.Use("Downloads")
  43. readBack, err := downloads.Read(id)
  44. if err != nil {
  45. log.Println(color.HiRedString("Failed to read database:\t%s", err))
  46. }
  47. timeT, _ := time.Parse("2006-01-02 15:04:05.999999999 -0700 MST", readBack["Time"].(string))
  48. return &download{
  49. URL: readBack["URL"].(string),
  50. Time: timeT,
  51. Destination: readBack["Destination"].(string),
  52. Filename: readBack["Filename"].(string),
  53. ChannelID: readBack["ChannelID"].(string),
  54. UserID: readBack["UserID"].(string),
  55. }
  56. }
  57. func dbFindDownloadByURL(inputURL string) []*download {
  58. var query interface{}
  59. json.Unmarshal([]byte(fmt.Sprintf(`[{"eq": "%s", "in": ["URL"]}]`, inputURL)), &query)
  60. queryResult := make(map[int]struct{})
  61. db.EvalQuery(query, myDB.Use("Downloads"), &queryResult)
  62. downloadedImages := make([]*download, 0)
  63. for id := range queryResult {
  64. downloadedImages = append(downloadedImages, dbFindDownloadByID(id))
  65. }
  66. return downloadedImages
  67. }
  68. //#region Statistics
  69. func dbDownloadCount() int {
  70. i := 0
  71. myDB.Use("Downloads").ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
  72. i++
  73. return true
  74. })
  75. return i
  76. }
  77. func dbDownloadCountByChannel(channelID string) int {
  78. var query interface{}
  79. json.Unmarshal([]byte(fmt.Sprintf(`[{"eq": "%s", "in": ["ChannelID"]}]`, channelID)), &query)
  80. queryResult := make(map[int]struct{})
  81. db.EvalQuery(query, myDB.Use("Downloads"), &queryResult)
  82. downloadedImages := make([]*download, 0)
  83. for id := range queryResult {
  84. downloadedImages = append(downloadedImages, dbFindDownloadByID(id))
  85. }
  86. return len(downloadedImages)
  87. }
  88. func dbDownloadCountByUser(userID string) int {
  89. var query interface{}
  90. json.Unmarshal([]byte(fmt.Sprintf(`[{"eq": "%s", "in": ["UserID"]}]`, userID)), &query)
  91. queryResult := make(map[int]struct{})
  92. db.EvalQuery(query, myDB.Use("Downloads"), &queryResult)
  93. downloadedImages := make([]*download, 0)
  94. for id := range queryResult {
  95. downloadedImages = append(downloadedImages, dbFindDownloadByID(id))
  96. }
  97. return len(downloadedImages)
  98. }
  99. //#endregion