movies.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package movies
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "gogs.gildas.ch/gildas/movies/ffmpeg"
  8. )
  9. type Movie struct {
  10. Title string
  11. Director string
  12. Poster string
  13. Rating *Rating
  14. IMDBID string
  15. Country string
  16. Year string
  17. Runtime string
  18. Files []string
  19. MovieFile string
  20. MediaInfo string
  21. Subtitles string
  22. OMDB OMDBMovie
  23. }
  24. type Rating struct {
  25. Note float64
  26. Votes int64
  27. }
  28. type OMDBMovie struct {
  29. Title string
  30. Year string
  31. Rated string
  32. Released string
  33. Runtime string
  34. Genre string
  35. Director string
  36. Writer string
  37. Actors string
  38. Plot string
  39. Language string
  40. Country string
  41. Awards string
  42. Poster string
  43. Ratings []OMDBRating
  44. Metascore string
  45. IMDBRating string `json: "imdbRating"`
  46. IMDBVotes string `json: "imdbVotes"`
  47. IMDBID string `json: "imdbID"`
  48. Type string
  49. DVD string
  50. BoxOffice string
  51. Production string
  52. Website string
  53. Response string
  54. }
  55. type OMDBRating struct {
  56. Source, Value string
  57. }
  58. func Unmarshal(b []byte) (*Movie, error) {
  59. var m Movie
  60. if err := json.Unmarshal(b, &m); err != nil {
  61. return nil, err
  62. }
  63. if err := m.FillFromOMDB(); err != nil {
  64. return nil, err
  65. }
  66. return &m, nil
  67. }
  68. func UnmarshalFromOMDB(b []byte) (*Movie, error) {
  69. var omdb OMDBMovie
  70. if err := json.Unmarshal(b, &omdb); err != nil {
  71. return nil, err
  72. }
  73. m := &Movie{
  74. OMDB: omdb,
  75. }
  76. if err := m.FillFromOMDB(); err != nil {
  77. return nil, err
  78. }
  79. return m, nil
  80. }
  81. func (m *Movie) FillFromOMDB() error {
  82. if m.Title == "" {
  83. m.Title = m.OMDB.Title
  84. }
  85. if m.Director == "" {
  86. m.Director = m.OMDB.Director
  87. }
  88. if m.Poster == "" {
  89. m.Poster = m.OMDB.Poster
  90. }
  91. if m.IMDBID == "" {
  92. m.IMDBID = m.OMDB.IMDBID
  93. }
  94. if m.Country == "" {
  95. m.Country = m.OMDB.Country
  96. }
  97. if m.Year == "" {
  98. m.Year = m.OMDB.Year
  99. }
  100. if m.Runtime == "" {
  101. m.Runtime = m.OMDB.Runtime
  102. }
  103. if m.Rating == nil {
  104. m.Rating = &Rating{}
  105. if note, err := strconv.ParseFloat(m.OMDB.IMDBRating, 64); err == nil {
  106. m.Rating.Note = note
  107. }
  108. if votes, err := strconv.ParseInt(strings.ReplaceAll(m.OMDB.IMDBVotes, ",", ""), 10, 64); err == nil {
  109. m.Rating.Votes = votes
  110. }
  111. }
  112. return nil
  113. }
  114. func (m *Movie) GenerateMediaInfo() error {
  115. if m.MovieFile == "" {
  116. return fmt.Errorf("no movie file set")
  117. }
  118. mediaInfo, err := ffmpeg.MediaInfo(m.MovieFile)
  119. if err != nil {
  120. return fmt.Errorf("error generating media info from %q: %w", m.MovieFile, err)
  121. }
  122. m.MediaInfo = mediaInfo
  123. return nil
  124. }