-
Notifications
You must be signed in to change notification settings - Fork 983
/
TheMovieDbService.groovy
198 lines (164 loc) · 5.44 KB
/
TheMovieDbService.groovy
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package streama
import groovy.json.JsonSlurper
import grails.transaction.Transactional
@Transactional
class TheMovieDbService {
def BASE_URL = "https://api.themoviedb.org/3"
def apiCacheData = [:]
def getAPI_PARAMS(){
return "api_key=$API_KEY&language=$API_LANGUAGE"
}
def getAPI_PARAMS_WITHOUT_LANG(){
return "api_key=$API_KEY"
}
def getAPI_KEY(){
return Settings.findBySettingsKey('TheMovieDB API key')?.value
}
def getAPI_LANGUAGE(){
return Settings.findBySettingsKey('TheMovieDB API language')?.value
}
def validateApiKey(apiKey){
def JsonContent = new URL(BASE_URL + '/configuration?api_key=' + apiKey).getText("UTF-8")
return new JsonSlurper().parseText(JsonContent)
}
def validateLanguage(language){
def locale = Locale.forLanguageTag(language)
return locale.toLanguageTag().equals(language)
}
def getSimilarMovies(movieId){
def JsonContentSimilarMovies = new URL(BASE_URL + "/movie/$movieId/similar?$API_PARAMS").getText("UTF-8")
def JsonSimilarMovies = new JsonSlurper().parseText(JsonContentSimilarMovies)
JsonSimilarMovies?.results?.each { SimilarMovie ->
def JsonContentTrailer = new URL(BASE_URL + "/movie/$SimilarMovie.id/videos?$API_PARAMS").getText("UTF-8")
def JsonTrailerData = new JsonSlurper().parseText(JsonContentTrailer)
SimilarMovie.mediatype = "Movie"
SimilarMovie.trailerKey = JsonTrailerData?.results[0]?.key
}
return JsonSimilarMovies
}
def getExternalLinks(showId){
def JsonContent = new URL(BASE_URL + "/tv/$showId/external_ids?$API_PARAMS").getText("UTF-8")
return new JsonSlurper().parseText(JsonContent)
}
def getMovieGenres(){
if(!API_KEY){
return []
}
try{
def JsonContent = new URL(BASE_URL + "/genre/movie/list?$API_PARAMS").getText("UTF-8")
def genres = new JsonSlurper().parseText(JsonContent).genres
genres?.each{ genre ->
genre["apiId"] = genre.id
genre.id = null
}
return genres
}catch (e){
log.warn("could not load genres this time, " + e.message)
return []
}
}
def getTvGenres(){
if(!API_KEY){
return []
}
try{
def JsonContent = new URL(BASE_URL + "/genre/tv/list?$API_PARAMS").getText("UTF-8")
def genres = new JsonSlurper().parseText(JsonContent).genres
genres?.each{ genre ->
genre["apiId"] = genre.id
genre.id = null
}
return genres
}catch (e){
log.warn("could not load genres this time, " + e.message)
return []
}
}
def getTrailerForMovie(movieId){
def JsonContent = new URL(BASE_URL + "/movie/$movieId/videos?$API_PARAMS").getText("UTF-8")
def videos = new JsonSlurper().parseText(JsonContent).results
def trailer = videos.findAll{it.type == "Trailer"}.max{it.size}
return trailer
}
def getFullMovieMeta(movieId){
try{
def JsonContent = new URL(BASE_URL + "/movie/$movieId?$API_PARAMS").getText("UTF-8")
return new JsonSlurper().parseText(JsonContent)
}catch (e){
log.warn("could not load fullMeta for Movie this time, " + e.message)
}
}
def getFullTvShowMeta(tvId){
try{
def JsonContent = new URL(BASE_URL + "/tv/$tvId?$API_PARAMS").getText("UTF-8")
return new JsonSlurper().parseText(JsonContent)
}catch (e){
log.warn("could not load fullMeta for TV SHOW this time, " + e.message)
}
}
def getEpisodeMeta(tvApiId, seasonNumber, episodeNumber){
def JsonContent = new URL(BASE_URL + "/tv/$tvApiId/season/$seasonNumber/episode/$episodeNumber?$API_PARAMS").getText("UTF-8")
return new JsonSlurper().parseText(JsonContent)
}
def searchForEntry(type, name) {
def cachedApiData = apiCacheData."$type:$name"
if(cachedApiData){
return cachedApiData
}
def query = URLEncoder.encode(name, "UTF-8")
def JsonContent = new URL(BASE_URL + '/search/' + type + '?query=' + query + '&api_key=' + API_KEY).getText("UTF-8")
def data = new JsonSlurper().parseText(JsonContent)
apiCacheData["$type:$name"] = data
return data
}
def getEntryById(String type, id, data = [:]){
if(type == 'movie'){
return getFullMovieMeta(id)
}
if(type == 'tv' || type == 'tvShow'){
return getFullTvShowMeta(id)
}
if(type == 'episode' && data){
def result = getEpisodeMeta(data.tvShowId, data.season, data.episodeNumber)
result.tv_id = data.tvShowId
result.season_number = data.season
result.episode_number = data.episodeNumber
return result
}
}
@Transactional
def createEntityFromApiId(type, id, data = [:]){
def apiData = getEntryById(type, id, data)
def entity
try{
entity = createEntityFromApiData(type, apiData)
}catch (e){
log.error("Error occured while trying to retrieve data from TheMovieDB. Please check your API-Key.")
}
return entity
}
def createEntityFromApiData(type, Map data){
def apiId = data.id
data.remove('id')
def entity
if(type == 'movie'){
entity = new Movie()
}
if(type == 'tv' || type == 'tvShow'){
entity = new TvShow()
}
if(type == 'episode'){
entity = new Episode()
TvShow tvShow = TvShow.findByApiId(data.tv_id)
if(!tvShow){
tvShow = createEntityFromApiId('tv', data.tv_id)
}
entity.show = tvShow
// log.debug("epiosde data")
}
entity.properties = data
entity.apiId = apiId
entity.save(flush:true, failOnError:true)
return entity
}
}