diff --git a/grails-app/assets/javascripts/streama/controllers.js b/grails-app/assets/javascripts/streama/controllers.js new file mode 100644 index 00000000..8bc8405f --- /dev/null +++ b/grails-app/assets/javascripts/streama/controllers.js @@ -0,0 +1,50 @@ +'use strict'; + +angular.module('streama').controller('MovieDetailCtrl', [ + '$scope', + '$state', + '$rootScope', + '$stateParams', + 'apiService', + function ($scope, $state, $rootScope, $stateParams, apiService) { + + $scope.currentMovie = null; + $scope.relatedActors = []; + $scope.loading = false; + + $scope.init = function () { + if ($stateParams.id) { + $scope.loading = true; + apiService.movie.getMovie($stateParams.id).then(function (response) { + $scope.currentMovie = response.data; + $scope.fetchRelatedActors($stateParams.id); + $scope.loading = false; + }, function (error) { + $scope.loading = false; + console.error('Error loading movie:', error); + }); + } + }; + + $scope.fetchRelatedActors = function (movieId) { + apiService.movie.getRelatedActors(movieId).then(function (response) { + $scope.relatedActors = response.data || []; + }, function (error) { + console.error('Error fetching related actors:', error); + $scope.relatedActors = []; + }); + }; + + $scope.playMovie = function (movie) { + $state.go('player', { videoId: movie.id }); + }; + + $scope.markWatched = function (movie) { + apiService.video.markWatched(movie.id).then(function () { + movie.watched = true; + }); + }; + + $scope.init(); + } +]); diff --git a/grails-app/controllers/streama/MovieShowController.groovy b/grails-app/controllers/streama/MovieShowController.groovy new file mode 100644 index 00000000..ac8bc17e --- /dev/null +++ b/grails-app/controllers/streama/MovieShowController.groovy @@ -0,0 +1,68 @@ +package streama + +import grails.converters.JSON +import grails.transaction.Transactional +import static org.springframework.http.HttpStatus.* + +@Transactional(readOnly = true) +class MovieShowController { + + def theMovieDbService + def taggingService + def videoService + static responseFormats = ['json', 'xml'] + + def show(MovieShow movieShowInstance) { + if(movieShowInstance == null){ + render status: NOT_FOUND + return + } + + def apiResponse = [ + id: movieShowInstance.id, + title: movieShowInstance.title, + original_title: movieShowInstance.originalTitle, + overview: movieShowInstance.overview, + tagline: movieShowInstance.tagline, + release_date: movieShowInstance.releaseDate, + backdrop_path: movieShowInstance.backdropPath, + poster_path: movieShowInstance.posterPath, + vote_average: movieShowInstance.voteAverage, + genre: movieShowInstance.genre, + type: movieShowInstance.type, + currentVolume: movieShowInstance.currentVolume, + apiId: movieShowInstance.apiId, + imdb_id: movieShowInstance.imdbId, + status: movieShowInstance.status, + percentage_complete: movieShowInstance.percentageComplete, + firstAired: movieShowInstance.firstAired, + language: movieShowInstance.language, + addedBy: movieShowInstance.addedBy, + apiBackdrop16x9: movieShowInstance.apiBackdrop16x9, + apiPosterThumb: movieShowInstance.apiPosterThumb, + ] + + def actorMapping = movieShowInstance.actorMappings + def actors = actorMapping.collect { actorMappingInstance -> + def actor = actorMappingInstance.actor + def character = actorMappingInstance.character + def profilePath = actor.profilePath + def tmdbId = actor.tmdbId + return [ + id: actor.id, + name: actor.name, + character: character, + profile_path: profilePath, + tmdb_id: tmdbId + ] + } + apiResponse.actors = actors + + if(params.get('flat') == 'true'){ + params.remove('flat') + render apiResponse as JSON + return + } + respond apiResponse + } +} diff --git a/grails-app/domain/streama/Actor.groovy b/grails-app/domain/streama/Actor.groovy new file mode 100644 index 00000000..9b892b72 --- /dev/null +++ b/grails-app/domain/streama/Actor.groovy @@ -0,0 +1,18 @@ +package streama + +class Actor { + + String name + String imdbId + String bio + Date dateCreated + Date lastUpdated + + static hasMany = [movies: ActorMapping] + + static constraints = { + name blank: false + imdbId nullable: true + bio nullable: true, maxSize: 2000 + } +} diff --git a/grails-app/domain/streama/Movie.groovy b/grails-app/domain/streama/Movie.groovy index 19eff755..5642d808 100644 --- a/grails-app/domain/streama/Movie.groovy +++ b/grails-app/domain/streama/Movie.groovy @@ -15,7 +15,7 @@ class Movie extends Video{ File backdrop_image - static hasMany = [tags: Tag, genre: Genre] + static hasMany = [tags: Tag, genre: Genre, actors: Actor] static constraints = { }