From 6789afb6bddd585488c695ab96a149e8d953dc47 Mon Sep 17 00:00:00 2001 From: Luke Steward Date: Sun, 28 Feb 2021 16:46:30 +0000 Subject: [PATCH 1/7] Fixed button sizes and minor UI fixes Create generic video was using a different format to the buttons in TV Shows and Movies. I have also changed the 3 pages to use the same order of HTML so its easier to compare changes, this fixed a UI bug where the title for shows appears higher up the page --- .../streama/templates/admin-movies.tpl.htm | 9 ++++++-- .../streama/templates/admin-shows.tpl.htm | 3 +-- .../streama/templates/admin-videos.tpl.htm | 21 ++++++++++++------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm index 30b56c5a2..55d356d6e 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm @@ -5,8 +5,6 @@

-

@@ -17,6 +15,13 @@

+
+
+ +
+
+
diff --git a/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm index 95c775a98..bc1f345e2 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm @@ -4,8 +4,8 @@

Shows ({{tvShow.total}} items)

-
+

@@ -15,7 +15,6 @@

-
Create generic video +
+
+

+ Other Videos ({{videos.length}} items) + +

-

- Other Videos ({{videos.length}} items) - -

+
+
+
+
+ +
+
+
@@ -37,5 +46,3 @@

{{::video.title}}

- - From 22977a5117fc76c4f881fb8378f53b858eaa8aea Mon Sep 17 00:00:00 2001 From: dularion Date: Fri, 5 Mar 2021 21:48:37 +0100 Subject: [PATCH 2/7] allow adding of genre to custom movies & tvShows #1054 --- .../assets/javascripts/streama/templates/modal--movie.tpl.htm | 2 +- .../assets/javascripts/streama/templates/modal--tvShow.tpl.htm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm index 0ac3f5707..43dc34994 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm @@ -87,7 +87,7 @@
-
+
diff --git a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm index a704aab04..f3b59bd4a 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm @@ -78,7 +78,7 @@
-
+
From a6c425cb8dc70d8a952895f30aa799265caa5432 Mon Sep 17 00:00:00 2001 From: dularion Date: Fri, 5 Mar 2021 23:41:48 +0100 Subject: [PATCH 3/7] add certification Administration & import --- .../controllers/admin-certification-ctrl.js | 51 ++++++++++ .../streama/services/api-service.js | 18 ++++ .../assets/javascripts/streama/streama.js | 2 + .../javascripts/streama/streama.routes.js | 7 ++ .../templates/admin-certifications.tpl.htm | 51 ++++++++++ .../streama/templates/admin.tpl.htm | 3 + grails-app/conf/application.groovy | 1 + .../streama/CertificationController.groovy | 95 +++++++++++++++++++ .../streama/MovieController.groovy | 10 +- .../domain/streama/Certification.groovy | 17 ++++ grails-app/domain/streama/TvShow.groovy | 4 +- grails-app/domain/streama/Video.groovy | 1 + .../services/streama/TheMovieDbService.groovy | 12 ++- 13 files changed, 265 insertions(+), 7 deletions(-) create mode 100644 grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js create mode 100644 grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm create mode 100644 grails-app/controllers/streama/CertificationController.groovy create mode 100644 grails-app/domain/streama/Certification.groovy diff --git a/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js new file mode 100644 index 000000000..ec774d351 --- /dev/null +++ b/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js @@ -0,0 +1,51 @@ +//= wrapped + +angular.module('streama').controller('adminCertificationsCtrl', [ + 'apiService', '$state', '$rootScope', '$filter', function (apiService, $state, $rootScope, $filter) { + var vm = this; + + vm.addCertification = addCertification; + vm.importCertifications = importCertifications; + vm.deleteCertification = deleteCertification; + + apiService.certifications.list().then(function (response){ + vm.certifications = response.data; + }); + + + function addCertification(){ + alertify.set({ buttonReverse: true, labels: {ok: "Create", cancel : "Cancel"}}); + alertify.prompt('Add a new custom certification.', function (confirmed, name) { + if(confirmed){ + apiService.certifications.create(name).then(function (response) { + alertify.success('The Certification was created.'); + vm.certifications.push(response.data); + }); + } + }) + } + + function importCertifications(type){ + apiService.certifications.import(type).then(function (response) { + alertify.success(response.data.length + 'Certifications were imported.'); + $state.reload(); + // vm.certifications.push(response.data); + }); + } + + function deleteCertification(id){ + alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); + alertify.confirm("Are you sure, you want to delete this Certification?", function (confirmed) { + if(confirmed){ + apiService.certifications.delete(id).then(function () { + _.remove(vm.certifications, {id: id}); + }, function (){ + alertify.error('Certification is probably used in a video / tvShow or liked by a user. Delete all usages first, then try again.') + }); + } + }) + } + + }]); + + diff --git a/grails-app/assets/javascripts/streama/services/api-service.js b/grails-app/assets/javascripts/streama/services/api-service.js index 21abe3ef5..a2a0d3b5b 100644 --- a/grails-app/assets/javascripts/streama/services/api-service.js +++ b/grails-app/assets/javascripts/streama/services/api-service.js @@ -270,6 +270,24 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con } }, + certifications: { + get: function (id) { + return $http.get('certification/show.json', {params: {id: id}}); + }, + import: function (type) { + return $http.get('certification/importCertifications.json', {params: {type: type}}); + }, + list: function () { + return $http.get('certification.json'); + }, + create: function (name) { + return $http.post('certification/save', {name: name}); + }, + delete: function (id) { + return $http.delete('certification/delete', {params: {id: id}}); + } + }, + settings: { list: function () { return $http.get('settings.json'); diff --git a/grails-app/assets/javascripts/streama/streama.js b/grails-app/assets/javascripts/streama/streama.js index 63e31f5f1..26239cac9 100644 --- a/grails-app/assets/javascripts/streama/streama.js +++ b/grails-app/assets/javascripts/streama/streama.js @@ -14,6 +14,8 @@ //= require_tree filters //= require_tree templates +//= require_tree genre + //= require streama.run //= require streama.routes //= require streama.interceptor diff --git a/grails-app/assets/javascripts/streama/streama.routes.js b/grails-app/assets/javascripts/streama/streama.routes.js index fbba79269..c980fa2b4 100644 --- a/grails-app/assets/javascripts/streama/streama.routes.js +++ b/grails-app/assets/javascripts/streama/streama.routes.js @@ -118,6 +118,13 @@ angular.module('streama').config(function ($stateProvider) { controllerAs: "vm" }) + .state('admin.certifications', { + url: '/certifications', + templateUrl: '/streama/admin-certifications.htm', + controller: 'adminCertificationsCtrl', + controllerAs: "vm" + }) + //SETTINGS ROUTES diff --git a/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm new file mode 100644 index 000000000..ba7e17fe3 --- /dev/null +++ b/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm @@ -0,0 +1,51 @@ + +
+
+

Certification ({{vm.certifications.length}} items)

+

Here you can manage the certifications for Videos / TvShows.

+

Usually, Certification are automatically added alongside TMDb-videos & shows. But if TMDb isn't enabled or you want to add your own custom Certifications, you can do so here.

+
+
+
+
+ + + +
+
+
+ + +
+ + + + + + + + + + + + + + + + + + +
IDCertificationTypeDescription
+ {{certification.id}} + + {{certification.certification}} + + {{certification.type}} + + {{certification.description}} + + +
+ + +
diff --git a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm index 300833ccf..c27c083a9 100644 --- a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm @@ -25,6 +25,9 @@
  • Genres
  • +
  • + Certifications +
  • diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 196c850a6..7ebdf8e70 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -61,6 +61,7 @@ grails.plugin.springsecurity.controllerAnnotations.staticRules = [ [pattern:'/subtitles/getVideoSubtitles', access :['IS_AUTHENTICATED_REMEMBERED']], [pattern:'/genericVideo/**', access :['ROLE_CONTENT_MANAGER']], + [pattern:'/certification/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/genre/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/tvShow/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/video/**', access :['ROLE_CONTENT_MANAGER']], diff --git a/grails-app/controllers/streama/CertificationController.groovy b/grails-app/controllers/streama/CertificationController.groovy new file mode 100644 index 000000000..b83bfd620 --- /dev/null +++ b/grails-app/controllers/streama/CertificationController.groovy @@ -0,0 +1,95 @@ +package streama + + +import grails.transaction.Transactional + +import static org.springframework.http.HttpStatus.* + +@Transactional(readOnly = true) +class CertificationController { + + def theMovieDbService + + static responseFormats = ['json', 'xml'] + static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] + + def index(Integer max) { + params.max = 999 + respond Certification.list(params), [status: OK] + } + + @Transactional + def save() { + def data = request.JSON + Certification certificationInstance = data.id ? Certification.get(data.id) : new Certification() + + certificationInstance.properties = data + certificationInstance.validate() + if (certificationInstance.hasErrors()) { + render status: NOT_ACCEPTABLE + return + } + + certificationInstance.save flush:true + respond certificationInstance, [status: CREATED] + } + + @Transactional + def importCertifications() { + String type = params.type + def certifications = theMovieDbService.listCertifications(type) + List certificationResult = [] + + certifications.each{ certData -> + if(Certification.findByCertificationAndType(certData.certification, type)){ + return + } + Certification certification = new Certification() + certification.certification = certData.certification + certification.description = certData.meaning + certification.type = type + certification.save() + + certificationResult.add(certification) + } + + respond certificationResult + } + + @Transactional + def update(Certification certificationInstance) { + if (certificationInstance == null) { + render status: NOT_FOUND + return + } + + certificationInstance.validate() + if (certificationInstance.hasErrors()) { + render status: NOT_ACCEPTABLE + return + } + + certificationInstance.save flush:true + respond certificationInstance, [status: OK] + } + + @Transactional + def delete(Certification certificationInstance) { + + if (certificationInstance == null) { + render status: NOT_FOUND + return + } + if (certificationInstance.apiId) { + render status: PRECONDITION_FAILED + return + } + + certificationInstance.delete flush:true + render status: NO_CONTENT + } + + def show(Certification certificationInstance) { + respond certificationInstance, [status: OK] + } +} diff --git a/grails-app/controllers/streama/MovieController.groovy b/grails-app/controllers/streama/MovieController.groovy index 3ff1d753e..2ab6380f4 100644 --- a/grails-app/controllers/streama/MovieController.groovy +++ b/grails-app/controllers/streama/MovieController.groovy @@ -8,6 +8,7 @@ import grails.transaction.Transactional @Transactional(readOnly = true) class MovieController { def videoService + def theMovieDbService static responseFormats = ['json', 'xml'] static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] @@ -26,8 +27,10 @@ class MovieController { return } - if (!movieInstance.imdb_id && movieInstance.apiId) { - movieInstance.imdb_id = movieInstance.fullMovieMeta?.imdb_id + if(data.apiId){ + movieInstance = theMovieDbService.createEntityFromApiId('movie', data.apiId) + }else{ + movieInstance.properties = data } List tags = [] @@ -42,8 +45,7 @@ class MovieController { } data.tags = tags*.id - movieInstance.properties = data - movieInstance.properties.dateCreated = data + movieInstance.properties.dateCreated = new Date() movieInstance.validate() if (movieInstance.hasErrors()) { diff --git a/grails-app/domain/streama/Certification.groovy b/grails-app/domain/streama/Certification.groovy new file mode 100644 index 000000000..ca513380b --- /dev/null +++ b/grails-app/domain/streama/Certification.groovy @@ -0,0 +1,17 @@ +package streama + +class Certification { + + String certification + String type + String description + + static mapping = { + description type: 'text' + } + + static constraints = { + certification nullable: false + description nullable: true + } +} diff --git a/grails-app/domain/streama/TvShow.groovy b/grails-app/domain/streama/TvShow.groovy index d129bad95..ae85e0748 100644 --- a/grails-app/domain/streama/TvShow.groovy +++ b/grails-app/domain/streama/TvShow.groovy @@ -28,11 +28,13 @@ class TvShow implements SimpleInstance { Double vote_average Integer vote_count Double popularity - static hasMany = [episodes: Episode, genre: Genre] + String certification //PG-Rating, available values U,PG,13,15,18,No Restriction File poster_image File backdrop_image + static hasMany = [episodes: Episode, genre: Genre] + static mapping = { cache true episodes cache: true diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 865deda66..60e49b2e8 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -23,6 +23,7 @@ class Video implements SimpleInstance{ Integer reportCount Boolean deleted = false String imdb_id + String certification //PG-Rating, available values U,PG,13,15,18,No Restriction static hasMany = [files: File] static simpleInstanceFields = ['overview', 'poster_path:posterPath', 'title'] diff --git a/grails-app/services/streama/TheMovieDbService.groovy b/grails-app/services/streama/TheMovieDbService.groovy index 30096eda7..f3e392826 100644 --- a/grails-app/services/streama/TheMovieDbService.groovy +++ b/grails-app/services/streama/TheMovieDbService.groovy @@ -15,7 +15,7 @@ class TheMovieDbService { def uploadService def getAPI_PARAMS(){ - return "api_key=$API_KEY&language=$API_LANGUAGE" + return "api_key=$API_KEY&language=$API_LANGUAGE&append_to_response=release_dates" } def getAPI_PARAMS_WITHOUT_LANG(){ return "api_key=$API_KEY" @@ -199,7 +199,7 @@ class TheMovieDbService { } @Transactional - def createEntityFromApiId(type, id, data = [:]){ + def createEntityFromApiId(String type, id, Map data = [:]){ def apiData = getEntryById(type, id, data) def entity try{ @@ -232,6 +232,7 @@ class TheMovieDbService { // log.debug("epiosde data") } + data.certification = data.release_dates?.results?.find{it.iso_3166_1 == 'US'}?.release_dates[0]?.certification entity.properties = data if(data.genres){ entity.genre = parseGenres(data.genres*.id) @@ -329,4 +330,11 @@ class TheMovieDbService { } } + + def listCertifications(String type){ + def requestUrl = "${BASE_URL}/certification/${type}/list?${API_PARAMS_WITHOUT_LANG}" + def JsonContent = new URL(requestUrl).getText("UTF-8") + def json = new JsonSlurper().parseText(JsonContent) + return json.certifications['US'] + } } From 4ce36c05a58bacee765ae2aea791596150a0d5f0 Mon Sep 17 00:00:00 2001 From: Luke Steward Date: Fri, 5 Mar 2021 23:01:59 +0000 Subject: [PATCH 4/7] Revert "Merge branch 'v1.11'" This reverts commit 8fc43ca5ffbaa9170aba13e16e47ea40e18aa6da, reversing changes made to 31501c6df77200f03afaf294dc5208643062cbbf. --- .../controllers/admin-certification-ctrl.js | 51 ---------- .../streama/services/api-service.js | 18 ---- .../assets/javascripts/streama/streama.js | 2 - .../javascripts/streama/streama.routes.js | 7 -- .../templates/admin-certifications.tpl.htm | 51 ---------- .../streama/templates/admin.tpl.htm | 3 - .../streama/templates/modal--movie.tpl.htm | 2 +- .../streama/templates/modal--tvShow.tpl.htm | 2 +- grails-app/conf/application.groovy | 1 - .../streama/CertificationController.groovy | 95 ------------------- .../streama/MovieController.groovy | 10 +- .../domain/streama/Certification.groovy | 17 ---- grails-app/domain/streama/TvShow.groovy | 4 +- grails-app/domain/streama/Video.groovy | 1 - .../services/streama/TheMovieDbService.groovy | 12 +-- 15 files changed, 9 insertions(+), 267 deletions(-) delete mode 100644 grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js delete mode 100644 grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm delete mode 100644 grails-app/controllers/streama/CertificationController.groovy delete mode 100644 grails-app/domain/streama/Certification.groovy diff --git a/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js deleted file mode 100644 index ec774d351..000000000 --- a/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js +++ /dev/null @@ -1,51 +0,0 @@ -//= wrapped - -angular.module('streama').controller('adminCertificationsCtrl', [ - 'apiService', '$state', '$rootScope', '$filter', function (apiService, $state, $rootScope, $filter) { - var vm = this; - - vm.addCertification = addCertification; - vm.importCertifications = importCertifications; - vm.deleteCertification = deleteCertification; - - apiService.certifications.list().then(function (response){ - vm.certifications = response.data; - }); - - - function addCertification(){ - alertify.set({ buttonReverse: true, labels: {ok: "Create", cancel : "Cancel"}}); - alertify.prompt('Add a new custom certification.', function (confirmed, name) { - if(confirmed){ - apiService.certifications.create(name).then(function (response) { - alertify.success('The Certification was created.'); - vm.certifications.push(response.data); - }); - } - }) - } - - function importCertifications(type){ - apiService.certifications.import(type).then(function (response) { - alertify.success(response.data.length + 'Certifications were imported.'); - $state.reload(); - // vm.certifications.push(response.data); - }); - } - - function deleteCertification(id){ - alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); - alertify.confirm("Are you sure, you want to delete this Certification?", function (confirmed) { - if(confirmed){ - apiService.certifications.delete(id).then(function () { - _.remove(vm.certifications, {id: id}); - }, function (){ - alertify.error('Certification is probably used in a video / tvShow or liked by a user. Delete all usages first, then try again.') - }); - } - }) - } - - }]); - - diff --git a/grails-app/assets/javascripts/streama/services/api-service.js b/grails-app/assets/javascripts/streama/services/api-service.js index a2a0d3b5b..21abe3ef5 100644 --- a/grails-app/assets/javascripts/streama/services/api-service.js +++ b/grails-app/assets/javascripts/streama/services/api-service.js @@ -270,24 +270,6 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con } }, - certifications: { - get: function (id) { - return $http.get('certification/show.json', {params: {id: id}}); - }, - import: function (type) { - return $http.get('certification/importCertifications.json', {params: {type: type}}); - }, - list: function () { - return $http.get('certification.json'); - }, - create: function (name) { - return $http.post('certification/save', {name: name}); - }, - delete: function (id) { - return $http.delete('certification/delete', {params: {id: id}}); - } - }, - settings: { list: function () { return $http.get('settings.json'); diff --git a/grails-app/assets/javascripts/streama/streama.js b/grails-app/assets/javascripts/streama/streama.js index 26239cac9..63e31f5f1 100644 --- a/grails-app/assets/javascripts/streama/streama.js +++ b/grails-app/assets/javascripts/streama/streama.js @@ -14,8 +14,6 @@ //= require_tree filters //= require_tree templates -//= require_tree genre - //= require streama.run //= require streama.routes //= require streama.interceptor diff --git a/grails-app/assets/javascripts/streama/streama.routes.js b/grails-app/assets/javascripts/streama/streama.routes.js index c980fa2b4..fbba79269 100644 --- a/grails-app/assets/javascripts/streama/streama.routes.js +++ b/grails-app/assets/javascripts/streama/streama.routes.js @@ -118,13 +118,6 @@ angular.module('streama').config(function ($stateProvider) { controllerAs: "vm" }) - .state('admin.certifications', { - url: '/certifications', - templateUrl: '/streama/admin-certifications.htm', - controller: 'adminCertificationsCtrl', - controllerAs: "vm" - }) - //SETTINGS ROUTES diff --git a/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm deleted file mode 100644 index ba7e17fe3..000000000 --- a/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm +++ /dev/null @@ -1,51 +0,0 @@ - -
    -
    -

    Certification ({{vm.certifications.length}} items)

    -

    Here you can manage the certifications for Videos / TvShows.

    -

    Usually, Certification are automatically added alongside TMDb-videos & shows. But if TMDb isn't enabled or you want to add your own custom Certifications, you can do so here.

    -
    -
    -
    -
    - - - -
    -
    -
    - - -
    - - - - - - - - - - - - - - - - - - -
    IDCertificationTypeDescription
    - {{certification.id}} - - {{certification.certification}} - - {{certification.type}} - - {{certification.description}} - - -
    - - -
    diff --git a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm index c27c083a9..300833ccf 100644 --- a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm @@ -25,9 +25,6 @@
  • Genres
  • -
  • - Certifications -
  • diff --git a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm index 43dc34994..0ac3f5707 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm @@ -87,7 +87,7 @@
    -
    +
    diff --git a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm index f3b59bd4a..a704aab04 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm @@ -78,7 +78,7 @@
    -
    +
    diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 7ebdf8e70..196c850a6 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -61,7 +61,6 @@ grails.plugin.springsecurity.controllerAnnotations.staticRules = [ [pattern:'/subtitles/getVideoSubtitles', access :['IS_AUTHENTICATED_REMEMBERED']], [pattern:'/genericVideo/**', access :['ROLE_CONTENT_MANAGER']], - [pattern:'/certification/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/genre/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/tvShow/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/video/**', access :['ROLE_CONTENT_MANAGER']], diff --git a/grails-app/controllers/streama/CertificationController.groovy b/grails-app/controllers/streama/CertificationController.groovy deleted file mode 100644 index b83bfd620..000000000 --- a/grails-app/controllers/streama/CertificationController.groovy +++ /dev/null @@ -1,95 +0,0 @@ -package streama - - -import grails.transaction.Transactional - -import static org.springframework.http.HttpStatus.* - -@Transactional(readOnly = true) -class CertificationController { - - def theMovieDbService - - static responseFormats = ['json', 'xml'] - static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] - - def index(Integer max) { - params.max = 999 - respond Certification.list(params), [status: OK] - } - - @Transactional - def save() { - def data = request.JSON - Certification certificationInstance = data.id ? Certification.get(data.id) : new Certification() - - certificationInstance.properties = data - certificationInstance.validate() - if (certificationInstance.hasErrors()) { - render status: NOT_ACCEPTABLE - return - } - - certificationInstance.save flush:true - respond certificationInstance, [status: CREATED] - } - - @Transactional - def importCertifications() { - String type = params.type - def certifications = theMovieDbService.listCertifications(type) - List certificationResult = [] - - certifications.each{ certData -> - if(Certification.findByCertificationAndType(certData.certification, type)){ - return - } - Certification certification = new Certification() - certification.certification = certData.certification - certification.description = certData.meaning - certification.type = type - certification.save() - - certificationResult.add(certification) - } - - respond certificationResult - } - - @Transactional - def update(Certification certificationInstance) { - if (certificationInstance == null) { - render status: NOT_FOUND - return - } - - certificationInstance.validate() - if (certificationInstance.hasErrors()) { - render status: NOT_ACCEPTABLE - return - } - - certificationInstance.save flush:true - respond certificationInstance, [status: OK] - } - - @Transactional - def delete(Certification certificationInstance) { - - if (certificationInstance == null) { - render status: NOT_FOUND - return - } - if (certificationInstance.apiId) { - render status: PRECONDITION_FAILED - return - } - - certificationInstance.delete flush:true - render status: NO_CONTENT - } - - def show(Certification certificationInstance) { - respond certificationInstance, [status: OK] - } -} diff --git a/grails-app/controllers/streama/MovieController.groovy b/grails-app/controllers/streama/MovieController.groovy index 2ab6380f4..3ff1d753e 100644 --- a/grails-app/controllers/streama/MovieController.groovy +++ b/grails-app/controllers/streama/MovieController.groovy @@ -8,7 +8,6 @@ import grails.transaction.Transactional @Transactional(readOnly = true) class MovieController { def videoService - def theMovieDbService static responseFormats = ['json', 'xml'] static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] @@ -27,10 +26,8 @@ class MovieController { return } - if(data.apiId){ - movieInstance = theMovieDbService.createEntityFromApiId('movie', data.apiId) - }else{ - movieInstance.properties = data + if (!movieInstance.imdb_id && movieInstance.apiId) { + movieInstance.imdb_id = movieInstance.fullMovieMeta?.imdb_id } List tags = [] @@ -45,7 +42,8 @@ class MovieController { } data.tags = tags*.id - movieInstance.properties.dateCreated = new Date() + movieInstance.properties = data + movieInstance.properties.dateCreated = data movieInstance.validate() if (movieInstance.hasErrors()) { diff --git a/grails-app/domain/streama/Certification.groovy b/grails-app/domain/streama/Certification.groovy deleted file mode 100644 index ca513380b..000000000 --- a/grails-app/domain/streama/Certification.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package streama - -class Certification { - - String certification - String type - String description - - static mapping = { - description type: 'text' - } - - static constraints = { - certification nullable: false - description nullable: true - } -} diff --git a/grails-app/domain/streama/TvShow.groovy b/grails-app/domain/streama/TvShow.groovy index ae85e0748..d129bad95 100644 --- a/grails-app/domain/streama/TvShow.groovy +++ b/grails-app/domain/streama/TvShow.groovy @@ -28,13 +28,11 @@ class TvShow implements SimpleInstance { Double vote_average Integer vote_count Double popularity - String certification //PG-Rating, available values U,PG,13,15,18,No Restriction + static hasMany = [episodes: Episode, genre: Genre] File poster_image File backdrop_image - static hasMany = [episodes: Episode, genre: Genre] - static mapping = { cache true episodes cache: true diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 60e49b2e8..865deda66 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -23,7 +23,6 @@ class Video implements SimpleInstance{ Integer reportCount Boolean deleted = false String imdb_id - String certification //PG-Rating, available values U,PG,13,15,18,No Restriction static hasMany = [files: File] static simpleInstanceFields = ['overview', 'poster_path:posterPath', 'title'] diff --git a/grails-app/services/streama/TheMovieDbService.groovy b/grails-app/services/streama/TheMovieDbService.groovy index f3e392826..30096eda7 100644 --- a/grails-app/services/streama/TheMovieDbService.groovy +++ b/grails-app/services/streama/TheMovieDbService.groovy @@ -15,7 +15,7 @@ class TheMovieDbService { def uploadService def getAPI_PARAMS(){ - return "api_key=$API_KEY&language=$API_LANGUAGE&append_to_response=release_dates" + return "api_key=$API_KEY&language=$API_LANGUAGE" } def getAPI_PARAMS_WITHOUT_LANG(){ return "api_key=$API_KEY" @@ -199,7 +199,7 @@ class TheMovieDbService { } @Transactional - def createEntityFromApiId(String type, id, Map data = [:]){ + def createEntityFromApiId(type, id, data = [:]){ def apiData = getEntryById(type, id, data) def entity try{ @@ -232,7 +232,6 @@ class TheMovieDbService { // log.debug("epiosde data") } - data.certification = data.release_dates?.results?.find{it.iso_3166_1 == 'US'}?.release_dates[0]?.certification entity.properties = data if(data.genres){ entity.genre = parseGenres(data.genres*.id) @@ -330,11 +329,4 @@ class TheMovieDbService { } } - - def listCertifications(String type){ - def requestUrl = "${BASE_URL}/certification/${type}/list?${API_PARAMS_WITHOUT_LANG}" - def JsonContent = new URL(requestUrl).getText("UTF-8") - def json = new JsonSlurper().parseText(JsonContent) - return json.certifications['US'] - } } From 58682a9ee13673c5a0622d9f0065f9e13f58d0b5 Mon Sep 17 00:00:00 2001 From: dularion Date: Fri, 5 Mar 2021 21:48:37 +0100 Subject: [PATCH 5/7] allow adding of genre to custom movies & tvShows #1054 --- .../assets/javascripts/streama/templates/modal--movie.tpl.htm | 2 +- .../assets/javascripts/streama/templates/modal--tvShow.tpl.htm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm index 0ac3f5707..43dc34994 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm @@ -87,7 +87,7 @@
    -
    +
    diff --git a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm index a704aab04..f3b59bd4a 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm @@ -78,7 +78,7 @@
    -
    +
    From 8460a35fd7a280e47ee609e78bb4e994b4a292f7 Mon Sep 17 00:00:00 2001 From: dularion Date: Fri, 5 Mar 2021 23:41:48 +0100 Subject: [PATCH 6/7] add certification Administration & import --- .../controllers/admin-certification-ctrl.js | 51 ++++++++++ .../streama/services/api-service.js | 18 ++++ .../assets/javascripts/streama/streama.js | 2 + .../javascripts/streama/streama.routes.js | 7 ++ .../templates/admin-certifications.tpl.htm | 51 ++++++++++ .../streama/templates/admin.tpl.htm | 3 + grails-app/conf/application.groovy | 1 + .../streama/CertificationController.groovy | 95 +++++++++++++++++++ .../streama/MovieController.groovy | 10 +- .../domain/streama/Certification.groovy | 17 ++++ grails-app/domain/streama/TvShow.groovy | 4 +- grails-app/domain/streama/Video.groovy | 1 + .../services/streama/TheMovieDbService.groovy | 12 ++- 13 files changed, 265 insertions(+), 7 deletions(-) create mode 100644 grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js create mode 100644 grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm create mode 100644 grails-app/controllers/streama/CertificationController.groovy create mode 100644 grails-app/domain/streama/Certification.groovy diff --git a/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js new file mode 100644 index 000000000..ec774d351 --- /dev/null +++ b/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js @@ -0,0 +1,51 @@ +//= wrapped + +angular.module('streama').controller('adminCertificationsCtrl', [ + 'apiService', '$state', '$rootScope', '$filter', function (apiService, $state, $rootScope, $filter) { + var vm = this; + + vm.addCertification = addCertification; + vm.importCertifications = importCertifications; + vm.deleteCertification = deleteCertification; + + apiService.certifications.list().then(function (response){ + vm.certifications = response.data; + }); + + + function addCertification(){ + alertify.set({ buttonReverse: true, labels: {ok: "Create", cancel : "Cancel"}}); + alertify.prompt('Add a new custom certification.', function (confirmed, name) { + if(confirmed){ + apiService.certifications.create(name).then(function (response) { + alertify.success('The Certification was created.'); + vm.certifications.push(response.data); + }); + } + }) + } + + function importCertifications(type){ + apiService.certifications.import(type).then(function (response) { + alertify.success(response.data.length + 'Certifications were imported.'); + $state.reload(); + // vm.certifications.push(response.data); + }); + } + + function deleteCertification(id){ + alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); + alertify.confirm("Are you sure, you want to delete this Certification?", function (confirmed) { + if(confirmed){ + apiService.certifications.delete(id).then(function () { + _.remove(vm.certifications, {id: id}); + }, function (){ + alertify.error('Certification is probably used in a video / tvShow or liked by a user. Delete all usages first, then try again.') + }); + } + }) + } + + }]); + + diff --git a/grails-app/assets/javascripts/streama/services/api-service.js b/grails-app/assets/javascripts/streama/services/api-service.js index 21abe3ef5..a2a0d3b5b 100644 --- a/grails-app/assets/javascripts/streama/services/api-service.js +++ b/grails-app/assets/javascripts/streama/services/api-service.js @@ -270,6 +270,24 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con } }, + certifications: { + get: function (id) { + return $http.get('certification/show.json', {params: {id: id}}); + }, + import: function (type) { + return $http.get('certification/importCertifications.json', {params: {type: type}}); + }, + list: function () { + return $http.get('certification.json'); + }, + create: function (name) { + return $http.post('certification/save', {name: name}); + }, + delete: function (id) { + return $http.delete('certification/delete', {params: {id: id}}); + } + }, + settings: { list: function () { return $http.get('settings.json'); diff --git a/grails-app/assets/javascripts/streama/streama.js b/grails-app/assets/javascripts/streama/streama.js index 63e31f5f1..26239cac9 100644 --- a/grails-app/assets/javascripts/streama/streama.js +++ b/grails-app/assets/javascripts/streama/streama.js @@ -14,6 +14,8 @@ //= require_tree filters //= require_tree templates +//= require_tree genre + //= require streama.run //= require streama.routes //= require streama.interceptor diff --git a/grails-app/assets/javascripts/streama/streama.routes.js b/grails-app/assets/javascripts/streama/streama.routes.js index fbba79269..c980fa2b4 100644 --- a/grails-app/assets/javascripts/streama/streama.routes.js +++ b/grails-app/assets/javascripts/streama/streama.routes.js @@ -118,6 +118,13 @@ angular.module('streama').config(function ($stateProvider) { controllerAs: "vm" }) + .state('admin.certifications', { + url: '/certifications', + templateUrl: '/streama/admin-certifications.htm', + controller: 'adminCertificationsCtrl', + controllerAs: "vm" + }) + //SETTINGS ROUTES diff --git a/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm new file mode 100644 index 000000000..ba7e17fe3 --- /dev/null +++ b/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm @@ -0,0 +1,51 @@ + +
    +
    +

    Certification ({{vm.certifications.length}} items)

    +

    Here you can manage the certifications for Videos / TvShows.

    +

    Usually, Certification are automatically added alongside TMDb-videos & shows. But if TMDb isn't enabled or you want to add your own custom Certifications, you can do so here.

    +
    +
    +
    +
    + + + +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + +
    IDCertificationTypeDescription
    + {{certification.id}} + + {{certification.certification}} + + {{certification.type}} + + {{certification.description}} + + +
    + + +
    diff --git a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm index 300833ccf..c27c083a9 100644 --- a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm @@ -25,6 +25,9 @@
  • Genres
  • +
  • + Certifications +
  • diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 196c850a6..7ebdf8e70 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -61,6 +61,7 @@ grails.plugin.springsecurity.controllerAnnotations.staticRules = [ [pattern:'/subtitles/getVideoSubtitles', access :['IS_AUTHENTICATED_REMEMBERED']], [pattern:'/genericVideo/**', access :['ROLE_CONTENT_MANAGER']], + [pattern:'/certification/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/genre/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/tvShow/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/video/**', access :['ROLE_CONTENT_MANAGER']], diff --git a/grails-app/controllers/streama/CertificationController.groovy b/grails-app/controllers/streama/CertificationController.groovy new file mode 100644 index 000000000..b83bfd620 --- /dev/null +++ b/grails-app/controllers/streama/CertificationController.groovy @@ -0,0 +1,95 @@ +package streama + + +import grails.transaction.Transactional + +import static org.springframework.http.HttpStatus.* + +@Transactional(readOnly = true) +class CertificationController { + + def theMovieDbService + + static responseFormats = ['json', 'xml'] + static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] + + def index(Integer max) { + params.max = 999 + respond Certification.list(params), [status: OK] + } + + @Transactional + def save() { + def data = request.JSON + Certification certificationInstance = data.id ? Certification.get(data.id) : new Certification() + + certificationInstance.properties = data + certificationInstance.validate() + if (certificationInstance.hasErrors()) { + render status: NOT_ACCEPTABLE + return + } + + certificationInstance.save flush:true + respond certificationInstance, [status: CREATED] + } + + @Transactional + def importCertifications() { + String type = params.type + def certifications = theMovieDbService.listCertifications(type) + List certificationResult = [] + + certifications.each{ certData -> + if(Certification.findByCertificationAndType(certData.certification, type)){ + return + } + Certification certification = new Certification() + certification.certification = certData.certification + certification.description = certData.meaning + certification.type = type + certification.save() + + certificationResult.add(certification) + } + + respond certificationResult + } + + @Transactional + def update(Certification certificationInstance) { + if (certificationInstance == null) { + render status: NOT_FOUND + return + } + + certificationInstance.validate() + if (certificationInstance.hasErrors()) { + render status: NOT_ACCEPTABLE + return + } + + certificationInstance.save flush:true + respond certificationInstance, [status: OK] + } + + @Transactional + def delete(Certification certificationInstance) { + + if (certificationInstance == null) { + render status: NOT_FOUND + return + } + if (certificationInstance.apiId) { + render status: PRECONDITION_FAILED + return + } + + certificationInstance.delete flush:true + render status: NO_CONTENT + } + + def show(Certification certificationInstance) { + respond certificationInstance, [status: OK] + } +} diff --git a/grails-app/controllers/streama/MovieController.groovy b/grails-app/controllers/streama/MovieController.groovy index 3ff1d753e..2ab6380f4 100644 --- a/grails-app/controllers/streama/MovieController.groovy +++ b/grails-app/controllers/streama/MovieController.groovy @@ -8,6 +8,7 @@ import grails.transaction.Transactional @Transactional(readOnly = true) class MovieController { def videoService + def theMovieDbService static responseFormats = ['json', 'xml'] static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] @@ -26,8 +27,10 @@ class MovieController { return } - if (!movieInstance.imdb_id && movieInstance.apiId) { - movieInstance.imdb_id = movieInstance.fullMovieMeta?.imdb_id + if(data.apiId){ + movieInstance = theMovieDbService.createEntityFromApiId('movie', data.apiId) + }else{ + movieInstance.properties = data } List tags = [] @@ -42,8 +45,7 @@ class MovieController { } data.tags = tags*.id - movieInstance.properties = data - movieInstance.properties.dateCreated = data + movieInstance.properties.dateCreated = new Date() movieInstance.validate() if (movieInstance.hasErrors()) { diff --git a/grails-app/domain/streama/Certification.groovy b/grails-app/domain/streama/Certification.groovy new file mode 100644 index 000000000..ca513380b --- /dev/null +++ b/grails-app/domain/streama/Certification.groovy @@ -0,0 +1,17 @@ +package streama + +class Certification { + + String certification + String type + String description + + static mapping = { + description type: 'text' + } + + static constraints = { + certification nullable: false + description nullable: true + } +} diff --git a/grails-app/domain/streama/TvShow.groovy b/grails-app/domain/streama/TvShow.groovy index d129bad95..ae85e0748 100644 --- a/grails-app/domain/streama/TvShow.groovy +++ b/grails-app/domain/streama/TvShow.groovy @@ -28,11 +28,13 @@ class TvShow implements SimpleInstance { Double vote_average Integer vote_count Double popularity - static hasMany = [episodes: Episode, genre: Genre] + String certification //PG-Rating, available values U,PG,13,15,18,No Restriction File poster_image File backdrop_image + static hasMany = [episodes: Episode, genre: Genre] + static mapping = { cache true episodes cache: true diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 865deda66..60e49b2e8 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -23,6 +23,7 @@ class Video implements SimpleInstance{ Integer reportCount Boolean deleted = false String imdb_id + String certification //PG-Rating, available values U,PG,13,15,18,No Restriction static hasMany = [files: File] static simpleInstanceFields = ['overview', 'poster_path:posterPath', 'title'] diff --git a/grails-app/services/streama/TheMovieDbService.groovy b/grails-app/services/streama/TheMovieDbService.groovy index 30096eda7..f3e392826 100644 --- a/grails-app/services/streama/TheMovieDbService.groovy +++ b/grails-app/services/streama/TheMovieDbService.groovy @@ -15,7 +15,7 @@ class TheMovieDbService { def uploadService def getAPI_PARAMS(){ - return "api_key=$API_KEY&language=$API_LANGUAGE" + return "api_key=$API_KEY&language=$API_LANGUAGE&append_to_response=release_dates" } def getAPI_PARAMS_WITHOUT_LANG(){ return "api_key=$API_KEY" @@ -199,7 +199,7 @@ class TheMovieDbService { } @Transactional - def createEntityFromApiId(type, id, data = [:]){ + def createEntityFromApiId(String type, id, Map data = [:]){ def apiData = getEntryById(type, id, data) def entity try{ @@ -232,6 +232,7 @@ class TheMovieDbService { // log.debug("epiosde data") } + data.certification = data.release_dates?.results?.find{it.iso_3166_1 == 'US'}?.release_dates[0]?.certification entity.properties = data if(data.genres){ entity.genre = parseGenres(data.genres*.id) @@ -329,4 +330,11 @@ class TheMovieDbService { } } + + def listCertifications(String type){ + def requestUrl = "${BASE_URL}/certification/${type}/list?${API_PARAMS_WITHOUT_LANG}" + def JsonContent = new URL(requestUrl).getText("UTF-8") + def json = new JsonSlurper().parseText(JsonContent) + return json.certifications['US'] + } } From 2c76e9e82ecef1fa8410c57de7900038742490ad Mon Sep 17 00:00:00 2001 From: Luke Steward Date: Fri, 5 Mar 2021 23:01:59 +0000 Subject: [PATCH 7/7] Revert "Merge branch 'v1.11'" This reverts commit 8fc43ca5ffbaa9170aba13e16e47ea40e18aa6da, reversing changes made to 31501c6df77200f03afaf294dc5208643062cbbf. --- .../controllers/admin-certification-ctrl.js | 51 ---------- .../streama/services/api-service.js | 18 ---- .../assets/javascripts/streama/streama.js | 2 - .../javascripts/streama/streama.routes.js | 7 -- .../templates/admin-certifications.tpl.htm | 51 ---------- .../streama/templates/admin.tpl.htm | 3 - .../streama/templates/modal--movie.tpl.htm | 2 +- .../streama/templates/modal--tvShow.tpl.htm | 2 +- grails-app/conf/application.groovy | 1 - .../streama/CertificationController.groovy | 95 ------------------- .../streama/MovieController.groovy | 10 +- .../domain/streama/Certification.groovy | 17 ---- grails-app/domain/streama/TvShow.groovy | 4 +- grails-app/domain/streama/Video.groovy | 1 - .../services/streama/TheMovieDbService.groovy | 12 +-- 15 files changed, 9 insertions(+), 267 deletions(-) delete mode 100644 grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js delete mode 100644 grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm delete mode 100644 grails-app/controllers/streama/CertificationController.groovy delete mode 100644 grails-app/domain/streama/Certification.groovy diff --git a/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js deleted file mode 100644 index ec774d351..000000000 --- a/grails-app/assets/javascripts/streama/controllers/admin-certification-ctrl.js +++ /dev/null @@ -1,51 +0,0 @@ -//= wrapped - -angular.module('streama').controller('adminCertificationsCtrl', [ - 'apiService', '$state', '$rootScope', '$filter', function (apiService, $state, $rootScope, $filter) { - var vm = this; - - vm.addCertification = addCertification; - vm.importCertifications = importCertifications; - vm.deleteCertification = deleteCertification; - - apiService.certifications.list().then(function (response){ - vm.certifications = response.data; - }); - - - function addCertification(){ - alertify.set({ buttonReverse: true, labels: {ok: "Create", cancel : "Cancel"}}); - alertify.prompt('Add a new custom certification.', function (confirmed, name) { - if(confirmed){ - apiService.certifications.create(name).then(function (response) { - alertify.success('The Certification was created.'); - vm.certifications.push(response.data); - }); - } - }) - } - - function importCertifications(type){ - apiService.certifications.import(type).then(function (response) { - alertify.success(response.data.length + 'Certifications were imported.'); - $state.reload(); - // vm.certifications.push(response.data); - }); - } - - function deleteCertification(id){ - alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); - alertify.confirm("Are you sure, you want to delete this Certification?", function (confirmed) { - if(confirmed){ - apiService.certifications.delete(id).then(function () { - _.remove(vm.certifications, {id: id}); - }, function (){ - alertify.error('Certification is probably used in a video / tvShow or liked by a user. Delete all usages first, then try again.') - }); - } - }) - } - - }]); - - diff --git a/grails-app/assets/javascripts/streama/services/api-service.js b/grails-app/assets/javascripts/streama/services/api-service.js index a2a0d3b5b..21abe3ef5 100644 --- a/grails-app/assets/javascripts/streama/services/api-service.js +++ b/grails-app/assets/javascripts/streama/services/api-service.js @@ -270,24 +270,6 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con } }, - certifications: { - get: function (id) { - return $http.get('certification/show.json', {params: {id: id}}); - }, - import: function (type) { - return $http.get('certification/importCertifications.json', {params: {type: type}}); - }, - list: function () { - return $http.get('certification.json'); - }, - create: function (name) { - return $http.post('certification/save', {name: name}); - }, - delete: function (id) { - return $http.delete('certification/delete', {params: {id: id}}); - } - }, - settings: { list: function () { return $http.get('settings.json'); diff --git a/grails-app/assets/javascripts/streama/streama.js b/grails-app/assets/javascripts/streama/streama.js index 26239cac9..63e31f5f1 100644 --- a/grails-app/assets/javascripts/streama/streama.js +++ b/grails-app/assets/javascripts/streama/streama.js @@ -14,8 +14,6 @@ //= require_tree filters //= require_tree templates -//= require_tree genre - //= require streama.run //= require streama.routes //= require streama.interceptor diff --git a/grails-app/assets/javascripts/streama/streama.routes.js b/grails-app/assets/javascripts/streama/streama.routes.js index c980fa2b4..fbba79269 100644 --- a/grails-app/assets/javascripts/streama/streama.routes.js +++ b/grails-app/assets/javascripts/streama/streama.routes.js @@ -118,13 +118,6 @@ angular.module('streama').config(function ($stateProvider) { controllerAs: "vm" }) - .state('admin.certifications', { - url: '/certifications', - templateUrl: '/streama/admin-certifications.htm', - controller: 'adminCertificationsCtrl', - controllerAs: "vm" - }) - //SETTINGS ROUTES diff --git a/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm deleted file mode 100644 index ba7e17fe3..000000000 --- a/grails-app/assets/javascripts/streama/templates/admin-certifications.tpl.htm +++ /dev/null @@ -1,51 +0,0 @@ - -
    -
    -

    Certification ({{vm.certifications.length}} items)

    -

    Here you can manage the certifications for Videos / TvShows.

    -

    Usually, Certification are automatically added alongside TMDb-videos & shows. But if TMDb isn't enabled or you want to add your own custom Certifications, you can do so here.

    -
    -
    -
    -
    - - - -
    -
    -
    - - -
    - - - - - - - - - - - - - - - - - - -
    IDCertificationTypeDescription
    - {{certification.id}} - - {{certification.certification}} - - {{certification.type}} - - {{certification.description}} - - -
    - - -
    diff --git a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm index c27c083a9..300833ccf 100644 --- a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm @@ -25,9 +25,6 @@
  • Genres
  • -
  • - Certifications -
  • diff --git a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm index 43dc34994..0ac3f5707 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm @@ -87,7 +87,7 @@
    -
    +
    diff --git a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm index f3b59bd4a..a704aab04 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm @@ -78,7 +78,7 @@
    -
    +
    diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 7ebdf8e70..196c850a6 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -61,7 +61,6 @@ grails.plugin.springsecurity.controllerAnnotations.staticRules = [ [pattern:'/subtitles/getVideoSubtitles', access :['IS_AUTHENTICATED_REMEMBERED']], [pattern:'/genericVideo/**', access :['ROLE_CONTENT_MANAGER']], - [pattern:'/certification/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/genre/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/tvShow/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/video/**', access :['ROLE_CONTENT_MANAGER']], diff --git a/grails-app/controllers/streama/CertificationController.groovy b/grails-app/controllers/streama/CertificationController.groovy deleted file mode 100644 index b83bfd620..000000000 --- a/grails-app/controllers/streama/CertificationController.groovy +++ /dev/null @@ -1,95 +0,0 @@ -package streama - - -import grails.transaction.Transactional - -import static org.springframework.http.HttpStatus.* - -@Transactional(readOnly = true) -class CertificationController { - - def theMovieDbService - - static responseFormats = ['json', 'xml'] - static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] - - def index(Integer max) { - params.max = 999 - respond Certification.list(params), [status: OK] - } - - @Transactional - def save() { - def data = request.JSON - Certification certificationInstance = data.id ? Certification.get(data.id) : new Certification() - - certificationInstance.properties = data - certificationInstance.validate() - if (certificationInstance.hasErrors()) { - render status: NOT_ACCEPTABLE - return - } - - certificationInstance.save flush:true - respond certificationInstance, [status: CREATED] - } - - @Transactional - def importCertifications() { - String type = params.type - def certifications = theMovieDbService.listCertifications(type) - List certificationResult = [] - - certifications.each{ certData -> - if(Certification.findByCertificationAndType(certData.certification, type)){ - return - } - Certification certification = new Certification() - certification.certification = certData.certification - certification.description = certData.meaning - certification.type = type - certification.save() - - certificationResult.add(certification) - } - - respond certificationResult - } - - @Transactional - def update(Certification certificationInstance) { - if (certificationInstance == null) { - render status: NOT_FOUND - return - } - - certificationInstance.validate() - if (certificationInstance.hasErrors()) { - render status: NOT_ACCEPTABLE - return - } - - certificationInstance.save flush:true - respond certificationInstance, [status: OK] - } - - @Transactional - def delete(Certification certificationInstance) { - - if (certificationInstance == null) { - render status: NOT_FOUND - return - } - if (certificationInstance.apiId) { - render status: PRECONDITION_FAILED - return - } - - certificationInstance.delete flush:true - render status: NO_CONTENT - } - - def show(Certification certificationInstance) { - respond certificationInstance, [status: OK] - } -} diff --git a/grails-app/controllers/streama/MovieController.groovy b/grails-app/controllers/streama/MovieController.groovy index 2ab6380f4..3ff1d753e 100644 --- a/grails-app/controllers/streama/MovieController.groovy +++ b/grails-app/controllers/streama/MovieController.groovy @@ -8,7 +8,6 @@ import grails.transaction.Transactional @Transactional(readOnly = true) class MovieController { def videoService - def theMovieDbService static responseFormats = ['json', 'xml'] static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] @@ -27,10 +26,8 @@ class MovieController { return } - if(data.apiId){ - movieInstance = theMovieDbService.createEntityFromApiId('movie', data.apiId) - }else{ - movieInstance.properties = data + if (!movieInstance.imdb_id && movieInstance.apiId) { + movieInstance.imdb_id = movieInstance.fullMovieMeta?.imdb_id } List tags = [] @@ -45,7 +42,8 @@ class MovieController { } data.tags = tags*.id - movieInstance.properties.dateCreated = new Date() + movieInstance.properties = data + movieInstance.properties.dateCreated = data movieInstance.validate() if (movieInstance.hasErrors()) { diff --git a/grails-app/domain/streama/Certification.groovy b/grails-app/domain/streama/Certification.groovy deleted file mode 100644 index ca513380b..000000000 --- a/grails-app/domain/streama/Certification.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package streama - -class Certification { - - String certification - String type - String description - - static mapping = { - description type: 'text' - } - - static constraints = { - certification nullable: false - description nullable: true - } -} diff --git a/grails-app/domain/streama/TvShow.groovy b/grails-app/domain/streama/TvShow.groovy index ae85e0748..d129bad95 100644 --- a/grails-app/domain/streama/TvShow.groovy +++ b/grails-app/domain/streama/TvShow.groovy @@ -28,13 +28,11 @@ class TvShow implements SimpleInstance { Double vote_average Integer vote_count Double popularity - String certification //PG-Rating, available values U,PG,13,15,18,No Restriction + static hasMany = [episodes: Episode, genre: Genre] File poster_image File backdrop_image - static hasMany = [episodes: Episode, genre: Genre] - static mapping = { cache true episodes cache: true diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 60e49b2e8..865deda66 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -23,7 +23,6 @@ class Video implements SimpleInstance{ Integer reportCount Boolean deleted = false String imdb_id - String certification //PG-Rating, available values U,PG,13,15,18,No Restriction static hasMany = [files: File] static simpleInstanceFields = ['overview', 'poster_path:posterPath', 'title'] diff --git a/grails-app/services/streama/TheMovieDbService.groovy b/grails-app/services/streama/TheMovieDbService.groovy index f3e392826..30096eda7 100644 --- a/grails-app/services/streama/TheMovieDbService.groovy +++ b/grails-app/services/streama/TheMovieDbService.groovy @@ -15,7 +15,7 @@ class TheMovieDbService { def uploadService def getAPI_PARAMS(){ - return "api_key=$API_KEY&language=$API_LANGUAGE&append_to_response=release_dates" + return "api_key=$API_KEY&language=$API_LANGUAGE" } def getAPI_PARAMS_WITHOUT_LANG(){ return "api_key=$API_KEY" @@ -199,7 +199,7 @@ class TheMovieDbService { } @Transactional - def createEntityFromApiId(String type, id, Map data = [:]){ + def createEntityFromApiId(type, id, data = [:]){ def apiData = getEntryById(type, id, data) def entity try{ @@ -232,7 +232,6 @@ class TheMovieDbService { // log.debug("epiosde data") } - data.certification = data.release_dates?.results?.find{it.iso_3166_1 == 'US'}?.release_dates[0]?.certification entity.properties = data if(data.genres){ entity.genre = parseGenres(data.genres*.id) @@ -330,11 +329,4 @@ class TheMovieDbService { } } - - def listCertifications(String type){ - def requestUrl = "${BASE_URL}/certification/${type}/list?${API_PARAMS_WITHOUT_LANG}" - def JsonContent = new URL(requestUrl).getText("UTF-8") - def json = new JsonSlurper().parseText(JsonContent) - return json.certifications['US'] - } }