/
media_files.go
134 lines (116 loc) · 4.47 KB
/
media_files.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package features
import (
"errors"
objectStorage "github.com/bingemate/media-go-pkg/object-storage"
repository2 "github.com/bingemate/media-go-pkg/repository"
"github.com/bingemate/media-service/internal/repository"
"gorm.io/gorm"
"path"
"strconv"
"syscall"
)
type MediaFile struct {
moviePath string
tvPath string
mediaRepository *repository.MediaRepository
objectStorage objectStorage.ObjectStorage // Object storage object to upload the media files.
}
func NewMediaFile(moviePath string, tvPath string, mediaRepository *repository.MediaRepository, objectStorage objectStorage.ObjectStorage) *MediaFile {
return &MediaFile{
moviePath: moviePath,
tvPath: tvPath,
mediaRepository: mediaRepository,
objectStorage: objectStorage,
}
}
// GetMovieFileInfo returns a movie file info given the movieID (TMDB ID)
func (m *MediaFile) GetMovieFileInfo(movieID int) (*repository2.MediaFile, error) {
file, err := m.mediaRepository.GetMovieFileInfo(movieID)
if (err != nil && errors.Is(err, gorm.ErrRecordNotFound)) || file == nil {
return nil, ErrMediaNotFound
}
return file, err
}
// GetEpisodeFileInfo returns a episode file info given the episodeID (TMDB ID)
func (m *MediaFile) GetEpisodeFileInfo(episodeID int) (*repository2.MediaFile, error) {
file, err := m.mediaRepository.GetEpisodeFileInfo(episodeID)
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) || file == nil {
return nil, ErrMediaNotFound
}
return file, err
}
// GetAvailableEpisode returns all available episodes id for a given tv show
func (m *MediaFile) GetAvailableEpisode(tvShowID int) (*[]int, error) {
episodes, err := m.mediaRepository.AvailableEpisodes(tvShowID)
if err != nil {
return nil, err
}
return episodes, nil
}
// SearchEpisodeFiles returns all episodes that match the query
func (m *MediaFile) SearchEpisodeFiles(query string, page, limit int) ([]*repository2.Episode, int, error) {
return m.mediaRepository.SearchEpisodeFiles(query, page, limit)
}
// SearchMovieFiles returns all movies that match the query
func (m *MediaFile) SearchMovieFiles(query string, page, limit int) ([]*repository2.Movie, int, error) {
return m.mediaRepository.SearchMovieFiles(query, page, limit)
}
// DeleteMediaFile deletes a media file given the fileID
func (m *MediaFile) DeleteMediaFile(fileID string) error {
// Check if the file is present in movie or tv show folder
// If it is, delete it
episode, err := m.mediaRepository.GetEpisodeByFileID(fileID)
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
if episode != nil {
tvPath := path.Join("tv-shows", strconv.Itoa(episode.ID))
go m.objectStorage.DeleteMediaFiles(tvPath)
}
movie, err := m.mediaRepository.GetMovieByFileID(fileID)
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
if movie != nil {
moviePath := path.Join("movies", strconv.Itoa(movie.ID))
go m.objectStorage.DeleteMediaFiles(moviePath)
}
return m.mediaRepository.DeleteMediaFile(fileID)
}
// MediaFilesTotalSize returns the total size of all media files
func (m *MediaFile) MediaFilesTotalSize() (int64, error) {
return m.mediaRepository.MediaFilesTotalSize()
}
// MediaFilesCount returns the total number of media files
func (m *MediaFile) MediaFilesCount() (int64, error) {
return m.mediaRepository.MediaFilesCount()
}
// CountAvailableMovies returns the total number of available movies
func (m *MediaFile) CountAvailableMovies() (int64, error) {
return m.mediaRepository.CountAvailableMovies()
}
// CountAvailableEpisodes returns the total number of available episodes
func (m *MediaFile) CountAvailableEpisodes() (int64, error) {
return m.mediaRepository.CountAvailableEpisodes()
}
// CountAvailableTvShows returns the total number of available tv shows
func (m *MediaFile) CountAvailableTvShows() (int64, error) {
return m.mediaRepository.CountAvailableTvShows()
}
// CountMoviesTotalDuration returns the total duration of all movies
func (m *MediaFile) CountMoviesTotalDuration() (int64, error) {
return m.mediaRepository.CountMoviesTotalDuration()
}
// CountEpisodesTotalDuration returns the total duration of all episodes
func (m *MediaFile) CountEpisodesTotalDuration() (int64, error) {
return m.mediaRepository.CountEpisodesTotalDuration()
}
// AvailableSpace returns the available space in the media folder
func (m *MediaFile) AvailableSpace() (uint64, error) {
fs := syscall.Statfs_t{}
err := syscall.Statfs(m.moviePath, &fs)
if err != nil {
return 0, err
}
return fs.Bavail * uint64(fs.Bsize), nil
}