From 6b014d2fd1bcb151a75c8effea77d68428c985ab Mon Sep 17 00:00:00 2001 From: dularion Date: Wed, 15 Jul 2020 22:06:09 +0200 Subject: [PATCH 01/11] update icomoon: add checkmark --- .../stylesheets/icomoon/demo-files/demo.css | 6 +- .../assets/stylesheets/icomoon/demo.html | 190 +++++++++++------- .../stylesheets/icomoon/fonts/icomoon.eot | Bin 18088 -> 18268 bytes .../stylesheets/icomoon/fonts/icomoon.svg | 3 + .../stylesheets/icomoon/fonts/icomoon.ttf | Bin 17924 -> 18104 bytes .../stylesheets/icomoon/fonts/icomoon.woff | Bin 18000 -> 18180 bytes .../stylesheets/icomoon/fonts/icomoon.woff2 | Bin 8236 -> 8328 bytes .../assets/stylesheets/icomoon/selection.json | 2 +- .../assets/stylesheets/icomoon/style.css | 41 ++-- 9 files changed, 148 insertions(+), 94 deletions(-) diff --git a/grails-app/assets/stylesheets/icomoon/demo-files/demo.css b/grails-app/assets/stylesheets/icomoon/demo-files/demo.css index 99d24d707..93e335a30 100644 --- a/grails-app/assets/stylesheets/icomoon/demo-files/demo.css +++ b/grails-app/assets/stylesheets/icomoon/demo-files/demo.css @@ -147,12 +147,12 @@ p { font-size: 16px; } .fs1 { - font-size: 24px; + font-size: 32px; } .fs2 { - font-size: 32px; + font-size: 20px; } .fs3 { - font-size: 20px; + font-size: 24px; } diff --git a/grails-app/assets/stylesheets/icomoon/demo.html b/grails-app/assets/stylesheets/icomoon/demo.html index eb3fe79f5..2627044f2 100644 --- a/grails-app/assets/stylesheets/icomoon/demo.html +++ b/grails-app/assets/stylesheets/icomoon/demo.html @@ -9,70 +9,53 @@
-

Font Name: icomoon (Glyphs: 45)

+

Font Name: icomoon (Glyphs: 48)

-

Grid Size: 24

+

Grid Size: 16

- - icon-replay + + icon-checkmark
- - + +
liga: - +
- - icon-replay_10 + + icon-checkmark2
- - + +
liga: - +
- - icon-replay_30 + + icon-checkmark3
- - + +
liga: - +
-
- - icon-cast -
-
- - -
-
- liga: - -
-
-
-
-

Grid Size: 16

-
icon-clapboard-play @@ -86,7 +69,7 @@

Grid Size: 16

-
+
icon-movie @@ -100,7 +83,7 @@

Grid Size: 16

-
+
icon-folder-search2 @@ -114,7 +97,7 @@

Grid Size: 16

-
+
icon-tv @@ -128,7 +111,7 @@

Grid Size: 16

-
+
icon-rotate-ccw3 @@ -142,7 +125,7 @@

Grid Size: 16

-
+
icon-rotate-cw3 @@ -156,7 +139,7 @@

Grid Size: 16

-
+
icon-equalizer4 @@ -170,7 +153,7 @@

Grid Size: 16

-
+
icon-equalizer2 @@ -184,7 +167,7 @@

Grid Size: 16

-
+
icon-equalizer3 @@ -198,7 +181,7 @@

Grid Size: 16

-
+
icon-cog4 @@ -212,7 +195,7 @@

Grid Size: 16

-
+
icon-cogs @@ -226,7 +209,7 @@

Grid Size: 16

-
+
icon-cog3 @@ -240,7 +223,7 @@

Grid Size: 16

-
+
icon-magic-wand2 @@ -254,7 +237,7 @@

Grid Size: 16

-
+
icon-cloud-upload3 @@ -268,7 +251,7 @@

Grid Size: 16

-
+
icon-cloud-upload2 @@ -282,7 +265,7 @@

Grid Size: 16

-
+
icon-stack-plus @@ -299,7 +282,7 @@

Grid Size: 16

Grid Size: 20

-
+
icon-magic-wand @@ -313,7 +296,7 @@

Grid Size: 20

-
+
icon-cloud-upload @@ -327,7 +310,7 @@

Grid Size: 20

-
+
icon-cog @@ -341,7 +324,7 @@

Grid Size: 20

-
+
icon-cog2 @@ -355,7 +338,7 @@

Grid Size: 20

-
+
icon-file-add @@ -369,7 +352,7 @@

Grid Size: 20

-
+
icon-files @@ -383,7 +366,7 @@

Grid Size: 20

-
+
icon-compare @@ -397,7 +380,7 @@

Grid Size: 20

-
+
icon-folder-search @@ -411,7 +394,7 @@

Grid Size: 20

-
+
icon-repeat @@ -425,7 +408,7 @@

Grid Size: 20

-
+
icon-equalizer @@ -439,7 +422,7 @@

Grid Size: 20

-
+
icon-presentation @@ -453,7 +436,7 @@

Grid Size: 20

-
+
icon-users2 @@ -467,7 +450,7 @@

Grid Size: 20

-
+
icon-baby2 @@ -481,7 +464,7 @@

Grid Size: 20

-
+
icon-dna @@ -495,7 +478,7 @@

Grid Size: 20

-
+
icon-brain @@ -509,7 +492,7 @@

Grid Size: 20

-
+
icon-icons @@ -523,7 +506,7 @@

Grid Size: 20

-
+
icon-icons2 @@ -537,7 +520,7 @@

Grid Size: 20

-
+
icon-site-map @@ -551,7 +534,7 @@

Grid Size: 20

-
+
icon-hourglass @@ -565,7 +548,7 @@

Grid Size: 20

-
+
icon-sync @@ -579,7 +562,7 @@

Grid Size: 20

-
+
icon-clock3 @@ -593,7 +576,7 @@

Grid Size: 20

-
+
icon-watch @@ -607,7 +590,7 @@

Grid Size: 20

-
+
icon-timer2 @@ -621,7 +604,7 @@

Grid Size: 20

-
+
icon-code @@ -635,7 +618,7 @@

Grid Size: 20

-
+
icon-share2 @@ -650,6 +633,65 @@

Grid Size: 20

+
+

Grid Size: 24

+
+
+ + icon-replay +
+
+ + +
+
+ liga: + +
+
+
+
+ + icon-replay_10 +
+
+ + +
+
+ liga: + +
+
+
+
+ + icon-replay_30 +
+
+ + +
+
+ liga: + +
+
+
+
+ + icon-cast +
+
+ + +
+
+ liga: + +
+
+
diff --git a/grails-app/assets/stylesheets/icomoon/fonts/icomoon.eot b/grails-app/assets/stylesheets/icomoon/fonts/icomoon.eot index d9a80b87d877bd3dddb5f9c167365edc59a22531..5faaa5485ee9391779851f069458f9ee3a704340 100644 GIT binary patch delta 500 zcmYLGJxH5T6g~I7L=&`B{6UdYUcn+bxcC#nfFDhaV#Ps1n}A?Gl4y|pK@=?rW+=tM zi1G$?bEvda7dvE-Qrf0kC&xmi4RjL(9h@YO-cJfXxZHEj{W%xj`x2dRl6z(hC~v!c zuC`Fludjox+u`_{25`g?i)ZZoj{@_3z$&Mb zcB0cW_ZSF7xIUO-!Sl?u#C(f+S1Pl(a*VnW<{z1#rE_unXUp*?Ao!a3LdIUnW2~2! zS-4_BW$jFIZ^C;EjIt@c$>$1-kX%8?IY2?mTb-a0%Idc?+z?|e3=3|w>I<3@msvd| z!s0TmH^j7PuIS(5Yjy6e3pV@6f?sVIula*$yJ!P|Pc?*;1c0C-Bi zc4{ZD=;jeBnL_1+K2&NY^M{^@`ly*ciT2R?mkPc6THB#@^OsD-M88Kse5WO=Qr-Iv z$zrWqjgiHM%0cEc8xkAx^XEcsvk(0@XmH)}Ujt324sfzA27J`7%Yko=PVs*zy&6n( bs4g|GW>|Ih^wScWIrG=(YteEjM-S*9w6cNb delta 307 zcmcc9$GD=Gk#&U|0|U!MR&$n}%dfCbbSSTnWnf^~1H=i*xrqg(hNdA542&{BT#}wx zTmTdoU|?XH0Hit6b1KugN_T7q@@FtGI4ESKCZV_*bI7;c{BdWaDKyc + + + \ No newline at end of file diff --git a/grails-app/assets/stylesheets/icomoon/fonts/icomoon.ttf b/grails-app/assets/stylesheets/icomoon/fonts/icomoon.ttf index 792eae99fb87539967d3ab13aad651c094c32c50..90ee0645ee8c60928a50727870a10104e7e0e850 100644 GIT binary patch delta 500 zcmYLEOGsN$5Iu8mj7dXLqQz25xq>2yP!WGn!KbmYs8rD)2?*xlFGzk6r4|ZiA;pCO z?G>y$H^rSBUAQPBYW#HNQmA0SjT@mGSCUKTxp82aIp?04Gk0l)_H(od0^may5{-i+ z@0-f}FElg1IinK^J3VmS9|Gtt=eHRZr42HRmL^3#N5Ie+?|Z~7+=Oy6J7RI#n}PSv&6(~!d^(Dm%cFm$5)JrmIRAGyX99wMU9mgf^NaoiBMN^D delta 313 zcmdnd%h=MxSkJ)7z`(%G(7?dVVBjCDZ^SRe6$=#E1H=i*xrqg(hNdA542&{BT#}wx zTmTdoU|?XH0Hit6b1KugN_T7q@@FtGI4ESKCZ>v% zWbzxvpvewQ;hSeN={NwbWnjIsd}lnr%~u9)79fv-;nt43IWT&1jk7tU;p8pOM<%zp aqzHfm#*nd;K?tmpX>uTw@MdAxrHlYo^h>e; diff --git a/grails-app/assets/stylesheets/icomoon/fonts/icomoon.woff b/grails-app/assets/stylesheets/icomoon/fonts/icomoon.woff index 36a7de9d0c6b960f6604492b43dc15f1bf5119b7..aa517599e94a1cf9228df389d98726e1f5358aec 100644 GIT binary patch delta 533 zcmYL_OGsNm6o${4xsAER7d}wBC{u_i!DW0v1G$)M6b%Xz#DLIT;vs*hZ}@mjx9s=&~+dNe0gZu>&9TpP&EEe`l^Yacvu0md2w|K%g~b zfKTtyW4XiHce}}05DCgYGSve@p-2}9($yu_l?H+%*q^j{{XCG%?SP}q-UKO zfXENZ^lCnO=RT#$B=44Hzs5UYd{1W=mjP@V;aYP6o^U3gqTHCRjc=O2%@-$GXPJrz zLo|yjL%5W4va{q()6cDI_D9T@g?wR=Zt?h@bZUTd zli-0mfDY_y!!|ToCw+ojs!+bfpXJJyy2sC~CZQ%S69L>fE92p>${ud02UJrkaXtk| z_p`Xm#s9v3UaGim5-lneTB%biL@J~e%12wjHiVwRXH@5#p2jOJ^e($1eHfI<$ZsiZ aLt{`#NWVQ(FZ^Oy(9>1V2_9|RXZQ*-=7cQ( delta 360 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 So33TF3^;|ncV9Gs+yMY}?Fu~r literal 8236 zcmV+{Ak*J>Pew8T0RR9103a*?3jhEB07diw03Y1|0000000000000000000000000 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 Date: Wed, 15 Jul 2020 22:06:26 +0200 Subject: [PATCH 02/11] add status to video --- grails-app/domain/streama/Video.groovy | 12 ++++++++++++ .../streama/marshallers/MarshallerService.groovy | 3 +++ grails-app/views/movie/_movie.gson | 1 + src/main/groovy/streama/VideoStatics.groovy | 7 +++++++ 4 files changed, 23 insertions(+) create mode 100644 src/main/groovy/streama/VideoStatics.groovy diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 0b6b9cc9f..85c385c14 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -51,6 +51,18 @@ class Video implements SimpleInstance{ ViewingStatus.findByVideoAndUser(this, springSecurityService.currentUser) } + String getStatus(){ + ViewingStatus viewingStatus = getViewingStatus() + if(viewingStatus?.completed){ + return VideoStatus.COMPLETED + } + else if(viewingStatus){ + return VideoStatus.COMPLETED + } + return VideoStatus.UNVIEWED + } + + def getNextEpisode(){ if(!(this instanceof Episode)){ return diff --git a/grails-app/services/streama/marshallers/MarshallerService.groovy b/grails-app/services/streama/marshallers/MarshallerService.groovy index 27234ea69..a31132ba9 100644 --- a/grails-app/services/streama/marshallers/MarshallerService.groovy +++ b/grails-app/services/streama/marshallers/MarshallerService.groovy @@ -306,6 +306,7 @@ class MarshallerService { returnArray['episodeString'] = episode.episodeString returnArray['air_date'] = episode.air_date returnArray['still_path'] = episode.still_path + returnArray['status'] = episode.getStatus() return returnArray; } @@ -355,6 +356,8 @@ class MarshallerService { returnArray['tags'] = movie.tags returnArray['genre'] = movie.genre returnArray['poster_image_src'] = movie.poster_image?.src + returnArray['status'] = movie.getStatus() + returnArray['inWatchlist'] = movie.inWatchlist() return returnArray; diff --git a/grails-app/views/movie/_movie.gson b/grails-app/views/movie/_movie.gson index f67f970d0..69818056b 100644 --- a/grails-app/views/movie/_movie.gson +++ b/grails-app/views/movie/_movie.gson @@ -12,4 +12,5 @@ json g.render(movie, [deep:true, excludes: ['poster_image']]){ subtitles movie.getSubtitles()*.getSimpleInstance() poster_image_src movie.poster_image?.src inWatchlist movie.inWatchlist() + status movie.getStatus() } diff --git a/src/main/groovy/streama/VideoStatics.groovy b/src/main/groovy/streama/VideoStatics.groovy new file mode 100644 index 000000000..0885b312b --- /dev/null +++ b/src/main/groovy/streama/VideoStatics.groovy @@ -0,0 +1,7 @@ +package streama + +class VideoStatus { + static public String COMPLETED = 'completed' + static public String VIEWING = 'viewing' + static public String UNVIEWED = 'unviewed' +} From fd3195967c001a00c78d8365f7a79de9d8a586a5 Mon Sep 17 00:00:00 2001 From: dularion Date: Wed, 15 Jul 2020 22:06:58 +0200 Subject: [PATCH 03/11] "1.9.2" --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b5cb90f88..0356fd830 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } } -version "1.9.1" +version "1.9.2" group "streama" From 4889e9aa97fd860a3cae8986729ef5d610b3613c Mon Sep 17 00:00:00 2001 From: dularion Date: Wed, 15 Jul 2020 22:40:50 +0200 Subject: [PATCH 04/11] add markAsUnviewed action --- .../streama/controllers/dash-ctrl.js | 6 ++--- .../controllers/modal-media-detail-ctrl.js | 8 ++++++ .../streama/services/api-service.js | 3 +++ .../streama/templates/dash.tpl.htm | 3 ++- .../templates/modal--media-detail.tpl.htm | 5 ++++ .../javascripts/streama/translations/CN_zh.js | 6 +++++ .../javascripts/streama/translations/DE_de.js | 6 +++++ .../javascripts/streama/translations/DK_da.js | 6 +++++ .../javascripts/streama/translations/EN_us.js | 6 +++++ .../javascripts/streama/translations/ES_es.js | 6 +++++ .../javascripts/streama/translations/FR_fr.js | 6 +++++ .../javascripts/streama/translations/HU_hu.js | 6 +++++ .../javascripts/streama/translations/IQ_ar.js | 6 +++++ .../javascripts/streama/translations/IT_it.js | 6 +++++ .../javascripts/streama/translations/JA_ja.js | 6 +++++ .../javascripts/streama/translations/KR_ko.js | 6 +++++ .../javascripts/streama/translations/NL_nl.js | 6 +++++ .../javascripts/streama/translations/PT_br.js | 6 +++++ .../javascripts/streama/translations/Ru_ru.js | 6 +++++ .../assets/stylesheets/_media-display.scss | 25 +++++++++++++++++++ .../streama/VideoController.groovy | 10 ++++++++ 21 files changed, 140 insertions(+), 4 deletions(-) diff --git a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js index 88721c248..e75f2d4d1 100644 --- a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js @@ -154,7 +154,7 @@ angular.module('streama').controller('dashCtrl', modalService.mediaDetailModal({mediaId: media.tvShowId, mediaType: 'tvShow', isApiMovie: false}); }else{ modalService.mediaDetailModal({mediaId: media.id, mediaType: media.mediaType, isApiMovie: false}, function (response) { - updateWatchlist(response.action, vm.watchlistEntry.list, media, response.watchlistEntry); + updateWatchlist(response.action, _.get(vm.watchlistEntry, 'list'), media, response.watchlistEntry); }); } } @@ -173,7 +173,7 @@ angular.module('streama').controller('dashCtrl', function addToWatchlist(item) { apiService.watchlistEntry.create(item).then(function (response) { vm.watchlistEntry.list = vm.watchlistEntry.list ? vm.watchlistEntry.list : []; - updateWatchlist("added", vm.watchlistEntry.list, item, response.data); + updateWatchlist("added", _.get(vm.watchlistEntry, 'list'), item, response.data); }); } @@ -182,7 +182,7 @@ angular.module('streama').controller('dashCtrl', alertify.confirm("Are you sure you want to remove this video from your watchlist?", function (confirmed) { if (confirmed) { apiService.watchlistEntry.delete(item).then(function (response) { - updateWatchlist("removed", vm.watchlistEntry.list, item); + updateWatchlist("removed", _.get(vm.watchlistEntry, 'list'), item); }); } }); diff --git a/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js b/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js index caf530dd0..84a528ec5 100644 --- a/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js @@ -12,6 +12,7 @@ angular.module('streama').controller('modalMediaDetailCtrl', [ $scope.listEpisodesForSeason = listEpisodesForSeason; $scope.addToWatchlist = addToWatchlist; $scope.removeFromWatchlist = removeFromWatchlist; + $scope.markAsUnviewed = markAsUnviewed; if(config.mediaObject) { $scope.media = config.mediaObject; @@ -101,4 +102,11 @@ angular.module('streama').controller('modalMediaDetailCtrl', [ } }) } + + function markAsUnviewed() { + apiService.video.markAsUnviewed({id: $scope.media.id}).then(function () { + $scope.media.status = 'unviewed'; + $rootScope.$broadcast('video.markAsUnviewed', {id: $scope.media.id}); + }); + } }]); diff --git a/grails-app/assets/javascripts/streama/services/api-service.js b/grails-app/assets/javascripts/streama/services/api-service.js index 56af518fd..9884f7e26 100644 --- a/grails-app/assets/javascripts/streama/services/api-service.js +++ b/grails-app/assets/javascripts/streama/services/api-service.js @@ -120,6 +120,9 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con }, addLocalFile: function (params) { return $http.get('video/addLocalFile.json', {params: params}); + }, + markAsUnviewed: function (params) { + return $http.get('video/markAsUnviewed.json', {params: params}); } }, diff --git a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm index 3fb7465a7..b78a3908f 100644 --- a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm @@ -285,7 +285,7 @@

-
+
@@ -300,6 +300,7 @@

+
diff --git a/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm index 8a85a9e03..0437f9b5a 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm @@ -58,6 +58,11 @@
  • {{'VIDEO.RATING' | translate}}: {{media.vote_average}}/10 ({{media.vote_count}} {{'VIDEO.VOTES' | translate}})
  • +
  • + {{'VIDEO.STATUS' | translate}}: + {{'VIDEO.STATUS_VALUE.' + media.status | translate}} + Mark as unviewed +

  • diff --git a/grails-app/assets/javascripts/streama/translations/CN_zh.js b/grails-app/assets/javascripts/streama/translations/CN_zh.js index ad0b5b76b..3d6b38f37 100644 --- a/grails-app/assets/javascripts/streama/translations/CN_zh.js +++ b/grails-app/assets/javascripts/streama/translations/CN_zh.js @@ -40,6 +40,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: '发布于', IMDB: 'IMDB', RATING: '评分', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: '投票', OVERVIEW: '简介', GENRE: '类型', diff --git a/grails-app/assets/javascripts/streama/translations/DE_de.js b/grails-app/assets/javascripts/streama/translations/DE_de.js index 6be8df8e6..ce36a6470 100644 --- a/grails-app/assets/javascripts/streama/translations/DE_de.js +++ b/grails-app/assets/javascripts/streama/translations/DE_de.js @@ -40,6 +40,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Veröffentlichung', IMDB: 'IMDB', RATING: 'Bewertungen', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Stimmen', OVERVIEW: 'Zusammenfassung', GENRE: 'Genre', diff --git a/grails-app/assets/javascripts/streama/translations/DK_da.js b/grails-app/assets/javascripts/streama/translations/DK_da.js index 71624aa57..45e42bbc6 100644 --- a/grails-app/assets/javascripts/streama/translations/DK_da.js +++ b/grails-app/assets/javascripts/streama/translations/DK_da.js @@ -39,6 +39,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Udgivet', IMDB: 'IMDB', RATING: 'Bedømmelse', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Stemmer', OVERVIEW: 'Oversigt', GENRE: 'Genre', diff --git a/grails-app/assets/javascripts/streama/translations/EN_us.js b/grails-app/assets/javascripts/streama/translations/EN_us.js index b2387dbff..07a3dd77e 100644 --- a/grails-app/assets/javascripts/streama/translations/EN_us.js +++ b/grails-app/assets/javascripts/streama/translations/EN_us.js @@ -40,6 +40,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Released', IMDB: 'IMDB', RATING: 'Rating', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Votes', OVERVIEW: 'Overview', GENRE: 'Genre', diff --git a/grails-app/assets/javascripts/streama/translations/ES_es.js b/grails-app/assets/javascripts/streama/translations/ES_es.js index b795078ff..133dedc0b 100644 --- a/grails-app/assets/javascripts/streama/translations/ES_es.js +++ b/grails-app/assets/javascripts/streama/translations/ES_es.js @@ -39,6 +39,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Publicado', IMDB: 'IMDB', RATING: 'Puntuación', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Votos', OVERVIEW: 'Sinopsis', GENRE: 'Género', diff --git a/grails-app/assets/javascripts/streama/translations/FR_fr.js b/grails-app/assets/javascripts/streama/translations/FR_fr.js index c1ba68c45..b20f81d2c 100644 --- a/grails-app/assets/javascripts/streama/translations/FR_fr.js +++ b/grails-app/assets/javascripts/streama/translations/FR_fr.js @@ -35,6 +35,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Sorti', IMDB: 'IMDB', RATING: 'Note', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Votes', OVERVIEW: 'Résumé', GENRE: 'Genre', diff --git a/grails-app/assets/javascripts/streama/translations/HU_hu.js b/grails-app/assets/javascripts/streama/translations/HU_hu.js index 58715cdce..e5e5fb490 100644 --- a/grails-app/assets/javascripts/streama/translations/HU_hu.js +++ b/grails-app/assets/javascripts/streama/translations/HU_hu.js @@ -36,6 +36,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Megjelent', IMDB: 'IMDB', RATING: 'Értékelés', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Szavazatok', OVERVIEW: 'Összefoglalás', GENRE: 'Műfaj', diff --git a/grails-app/assets/javascripts/streama/translations/IQ_ar.js b/grails-app/assets/javascripts/streama/translations/IQ_ar.js index 8f1e236f8..f9d2c9614 100644 --- a/grails-app/assets/javascripts/streama/translations/IQ_ar.js +++ b/grails-app/assets/javascripts/streama/translations/IQ_ar.js @@ -39,6 +39,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'الاصدار', IMDB: 'IMDB', RATING: 'التقييم', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'التصويت', OVERVIEW: 'نظرة عامة', GENRE: 'الصنف', diff --git a/grails-app/assets/javascripts/streama/translations/IT_it.js b/grails-app/assets/javascripts/streama/translations/IT_it.js index 32f8fc878..2770a2e6d 100644 --- a/grails-app/assets/javascripts/streama/translations/IT_it.js +++ b/grails-app/assets/javascripts/streama/translations/IT_it.js @@ -39,6 +39,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Rilasciato', IMDB: 'IMDB', RATING: 'Voto', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Voti', OVERVIEW: 'Panoramica', GENRE: 'Genere', diff --git a/grails-app/assets/javascripts/streama/translations/JA_ja.js b/grails-app/assets/javascripts/streama/translations/JA_ja.js index 8e5e4033a..3322a36cf 100644 --- a/grails-app/assets/javascripts/streama/translations/JA_ja.js +++ b/grails-app/assets/javascripts/streama/translations/JA_ja.js @@ -38,6 +38,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'リリース', IMDB: 'IMDB', RATING: '評価', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: '投票', OVERVIEW: '概要', GENRE: 'ジャンル', diff --git a/grails-app/assets/javascripts/streama/translations/KR_ko.js b/grails-app/assets/javascripts/streama/translations/KR_ko.js index e2da7b733..d9ea361f4 100644 --- a/grails-app/assets/javascripts/streama/translations/KR_ko.js +++ b/grails-app/assets/javascripts/streama/translations/KR_ko.js @@ -38,6 +38,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: '출시', IMDB: 'IMDB', RATING: '평점', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: '투표', OVERVIEW: '줄거리', GENRE: '장르', diff --git a/grails-app/assets/javascripts/streama/translations/NL_nl.js b/grails-app/assets/javascripts/streama/translations/NL_nl.js index 399e4122c..c0082098b 100644 --- a/grails-app/assets/javascripts/streama/translations/NL_nl.js +++ b/grails-app/assets/javascripts/streama/translations/NL_nl.js @@ -39,6 +39,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Uitgebracht op', IMDB: 'IMDB', RATING: 'Waardering', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Completed', + 'viewing': 'Viewing', + 'unviewed': 'Unviewed' + }, VOTES: 'Aantal stemmen', OVERVIEW: 'Overzicht', GENRE: 'Genre', diff --git a/grails-app/assets/javascripts/streama/translations/PT_br.js b/grails-app/assets/javascripts/streama/translations/PT_br.js index 691fb7587..f78919077 100644 --- a/grails-app/assets/javascripts/streama/translations/PT_br.js +++ b/grails-app/assets/javascripts/streama/translations/PT_br.js @@ -42,6 +42,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Lançamento', IMDB: 'IMDB', RATING: 'Classificação', + STATUS: 'Status', + STATUS_VALUE: { + 'completed': 'Concluído', + 'viewing': 'Ativo', + 'unviewed': 'não visto' + }, VOTES: 'Votos', OVERVIEW: 'Sinopse', GENRE: 'Gênero', diff --git a/grails-app/assets/javascripts/streama/translations/Ru_ru.js b/grails-app/assets/javascripts/streama/translations/Ru_ru.js index ef141822f..e0907144b 100644 --- a/grails-app/assets/javascripts/streama/translations/Ru_ru.js +++ b/grails-app/assets/javascripts/streama/translations/Ru_ru.js @@ -39,6 +39,12 @@ angular.module('streama.translations').config(function ($translateProvider) { RELEASED: 'Дата выхода', IMDB: 'IMDB', RATING: 'Рейтинг', + STATUS: 'положение дел', + STATUS_VALUE: { + 'completed': 'Завершенный', + 'viewing': 'просмотр', + 'unviewed': 'непросмотренный' + }, VOTES: 'Голосов', OVERVIEW: 'Описание', GENRE: 'Жанр', diff --git a/grails-app/assets/stylesheets/_media-display.scss b/grails-app/assets/stylesheets/_media-display.scss index 14208986d..a5c4846f9 100644 --- a/grails-app/assets/stylesheets/_media-display.scss +++ b/grails-app/assets/stylesheets/_media-display.scss @@ -141,6 +141,31 @@ } + .status-icon{ + position: absolute; + bottom: 0px; + left: 0px; + height: 1px; + width: 1px; + border-right: 40px solid transparent; + border-bottom: 40px solid darken($primary, 15%); + filter: drop-shadow(0px -1px 11px rgba(0,0,0, 0.5)); + + &:after{ + @include icomoon; + position: absolute; + top: 19px; + left: 4px; + font-size: 13px; + } + + &.status-completed{ + &:after{ + content: '\ed6c'; + } + } + } + } .media-list-item{ diff --git a/grails-app/controllers/streama/VideoController.groovy b/grails-app/controllers/streama/VideoController.groovy index f816226b6..d0f4f81bf 100644 --- a/grails-app/controllers/streama/VideoController.groovy +++ b/grails-app/controllers/streama/VideoController.groovy @@ -217,4 +217,14 @@ class VideoController { respond result } + @Transactional + def markAsUnviewed(Video videoInstance){ + ViewingStatus viewingStatus = videoInstance.getViewingStatus() + if(!viewingStatus){ + return + } + viewingStatus.delete() + render status: 200 + } + } From 0572e8346cd209c4c9b1c172d4a460c5f5860db5 Mon Sep 17 00:00:00 2001 From: dularion Date: Wed, 15 Jul 2020 23:30:50 +0200 Subject: [PATCH 05/11] fix getStatus - copy-paste mistake --- grails-app/domain/streama/Video.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 85c385c14..720b1c378 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -57,7 +57,7 @@ class Video implements SimpleInstance{ return VideoStatus.COMPLETED } else if(viewingStatus){ - return VideoStatus.COMPLETED + return VideoStatus.VIEWING } return VideoStatus.UNVIEWED } From d0462cade72e5b1f9d2bed45bb78a1af70e10db2 Mon Sep 17 00:00:00 2001 From: dularion Date: Wed, 15 Jul 2020 23:35:41 +0200 Subject: [PATCH 06/11] extract dash-media-item as directive --- .../streama/controllers/dash-ctrl.js | 26 +--- .../directives/streama-dash-media-item.js | 77 +++++++++++ .../streama/services/api-service.js | 5 +- .../streama/templates/dash.tpl.htm | 122 +----------------- ...directive--streama-dash-media-item.tpl.htm | 24 ++++ .../streama/VideoController.groovy | 11 ++ grails-app/views/dash/_viewingStatus.gson | 1 + 7 files changed, 129 insertions(+), 137 deletions(-) create mode 100644 grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js create mode 100644 grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm diff --git a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js index e75f2d4d1..c1abe84a5 100644 --- a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js @@ -5,17 +5,14 @@ angular.module('streama').controller('dashCtrl', var vm = this; var LIST_MAX = 30; - vm.fetchFirstEpisodeAndPlay = fetchFirstEpisodeAndPlay; vm.showDetails = showDetails; vm.handleWatchlistUpdate = handleWatchlistUpdate; - vm.addToWatchlist = addToWatchlist; - vm.removeFromWatchlist = removeFromWatchlist; - vm.markCompleted = markCompleted; vm.loadingRecommendations = true; vm.isDashSectionHidden = isDashSectionHidden; vm.isDashType = isDashType; $scope.$on('changedGenre', onChangedGenre); + $scope.$on('video.updateWatchlist', onVideoUpdateWatchlist); init(); @@ -143,12 +140,6 @@ angular.module('streama').controller('dashCtrl', vm.tvShow.setFilter(); } - function fetchFirstEpisodeAndPlay(tvShow) { - apiService.dash.firstEpisodeForShow(tvShow.id).then(function (response) { - $state.go('player', {videoId: response.data.id}); - }); - } - function showDetails(media) { if(media.mediaType === 'episode'){ modalService.mediaDetailModal({mediaId: media.tvShowId, mediaType: 'tvShow', isApiMovie: false}); @@ -254,17 +245,6 @@ angular.module('streama').controller('dashCtrl', return (showItemArray.indexOf(false) < 0); } - function markCompleted(viewingStatus) { - alertify.set({buttonReverse: true, labels: {ok: "Yes", cancel: "Cancel"}}); - alertify.confirm("Are you sure you want to mark this video as completed?", function (confirmed) { - if (confirmed) { - apiService.viewingStatus.delete(viewingStatus.id).then(function (data) { - _.remove(vm.continueWatching, {'id': viewingStatus.id}); - }); - } - }) - } - function isDashSectionHidden(sectionName) { var hiddenDashSectionSetting = _.find($scope.settings, {name: 'hidden_dash_sections'}); if(_.get(hiddenDashSectionSetting, 'parsedValue')){ @@ -273,4 +253,8 @@ angular.module('streama').controller('dashCtrl', } } + function onVideoUpdateWatchlist(e, data) { + updateWatchlist(data.action, _.get(vm.watchlistEntry, 'list'), data.media, _.get(data.response, 'data')); + } + }); diff --git a/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js b/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js new file mode 100644 index 000000000..008480bc7 --- /dev/null +++ b/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js @@ -0,0 +1,77 @@ +//= wrapped + +angular.module('streama').directive('streamaDashMediaItem', function () { + return { + restrict: 'E', + templateUrl: '/streama/directive--streama-dash-media-item.htm', + scope: { + entity: '=' + }, + bindToController: true, + controllerAs: 'vm', + controller: controller + } +}); + +function controller(apiService, modalService, $rootScope, $state) { + var vm = this; + vm.fetchFirstEpisodeAndPlay = fetchFirstEpisodeAndPlay; + vm.showDetails = showDetails; + vm.handleWatchlistUpdate = handleWatchlistUpdate; + vm.markCompleted = markCompleted; + + function fetchFirstEpisodeAndPlay(tvShow) { + apiService.dash.firstEpisodeForShow(tvShow.id).then(function (response) { + $state.go('player', {videoId: response.data.id}); + }); + } + + function showDetails(media) { + if(media.mediaType === 'episode'){ + modalService.mediaDetailModal({mediaId: media.tvShowId, mediaType: 'tvShow', isApiMovie: false}); + }else{ + modalService.mediaDetailModal({mediaId: media.id, mediaType: media.mediaType, isApiMovie: false}, function (response) { + $rootScope.$broadcast('video.updateWatchlist', {response: response, media: media}); + }); + } + } + + function handleWatchlistUpdate(action, item){ + switch (action) { + case "added": + addToWatchlist(item); + break; + case "removed": + removeFromWatchlist(item); + break; + } + } + + function addToWatchlist(item) { + apiService.watchlistEntry.create(item).then(function (response) { + $rootScope.$broadcast('video.updateWatchlist', {action: 'added', response: response, media: item}); + }); + } + + function removeFromWatchlist(item) { + alertify.set({buttonReverse: true, labels: {ok: "Yes", cancel: "Cancel"}}); + alertify.confirm("Are you sure you want to remove this video from your watchlist?", function (confirmed) { + if (confirmed) { + apiService.watchlistEntry.delete(item).then(function (response) { + $rootScope.$broadcast('video.updateWatchlist', {action: 'removed', media: item}); + }); + } + }); + } + + function markCompleted() { + alertify.set({buttonReverse: true, labels: {ok: "Yes", cancel: "Cancel"}}); + alertify.confirm("Are you sure you want to mark this video as completed?", function (confirmed) { + if (confirmed) { + apiService.video.markCompleted({id: vm.entity.id}).then(function (data) { + vm.entity.deleted = true; + }); + } + }) + } +} diff --git a/grails-app/assets/javascripts/streama/services/api-service.js b/grails-app/assets/javascripts/streama/services/api-service.js index 9884f7e26..818f4f477 100644 --- a/grails-app/assets/javascripts/streama/services/api-service.js +++ b/grails-app/assets/javascripts/streama/services/api-service.js @@ -123,7 +123,10 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con }, markAsUnviewed: function (params) { return $http.get('video/markAsUnviewed.json', {params: params}); - } + }, + markCompleted: function (params) { + return $http.get('video/markCompleted.json', {params: params}); + }, }, report: { diff --git a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm index b78a3908f..4e9be8f97 100644 --- a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm @@ -45,25 +45,9 @@

    {{'DASHBOARD.LOOKING_AT_GE

    {{'DASHBOARD.CONTINUE_WATCHING' | translate}}

    -
    -
    +
    - - -
    -

    Continue ""

    - -

    -
    - - - - - - - -
    +
    @@ -93,22 +77,8 @@

    {{'DASHBOARD.RECOMMENDATIONS' | translate}}

    -
    - - - -
    -

    -

    -
    -
    - -
    - - -
    +
    @@ -129,38 +99,7 @@

    {{'DASHBOARD.WATCHLIST' | translate}}

    -
    - - - -
    -

    -
    - -
    - -
    - - - -
    -
    - - - -
    -

    -

    -
    -
    - -
    - - - -
    +
    @@ -215,21 +154,7 @@

    -
    - - -
    -

    -
    - -
    - -
    - - - -
    +
    @@ -285,23 +210,7 @@

    -
    - - - -
    -

    -

    -
    -
    - -
    - - - - -
    +
    @@ -342,24 +251,7 @@

    - -
    - - - - -
    -

    -

    -
    -
    - -
    - - - -
    +

    diff --git a/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm b/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm new file mode 100644 index 000000000..803c3e402 --- /dev/null +++ b/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm @@ -0,0 +1,24 @@ +
    + + +
    +

    + Continue: + +

    + +

    +
    + +
    + +
    + + + + + +
    diff --git a/grails-app/controllers/streama/VideoController.groovy b/grails-app/controllers/streama/VideoController.groovy index d0f4f81bf..42e627ab8 100644 --- a/grails-app/controllers/streama/VideoController.groovy +++ b/grails-app/controllers/streama/VideoController.groovy @@ -227,4 +227,15 @@ class VideoController { render status: 200 } + @Transactional + def markCompleted(Video videoInstance){ + ViewingStatus viewingStatus = videoInstance.getViewingStatus() + if(!viewingStatus){ + return + } + viewingStatus.completed = true + viewingStatus.save flush:true + respond viewingStatus, [status: OK] + } + } diff --git a/grails-app/views/dash/_viewingStatus.gson b/grails-app/views/dash/_viewingStatus.gson index fbb9e1cbe..6ae0071e2 100644 --- a/grails-app/views/dash/_viewingStatus.gson +++ b/grails-app/views/dash/_viewingStatus.gson @@ -21,6 +21,7 @@ json g.render(viewingStatus, [includes: ['id', 'dateCreated', 'lastUpdated', 'cu popularity viewingStatus.video.popularity original_language viewingStatus.video.original_language title viewingStatus.video.getTitle() + status viewingStatus.video.getStatus() if (viewingStatus.video instanceof Movie) { Movie movie = viewingStatus.video as Movie From 56f8fc8dd88910ea4e56a2cad383d3441682ac65 Mon Sep 17 00:00:00 2001 From: dularion Date: Thu, 16 Jul 2020 08:32:23 +0200 Subject: [PATCH 07/11] fix completed display for media-items & check on hasVideoEnded --- .../templates/directive--streama-dash-media-item.tpl.htm | 6 +++--- grails-app/domain/streama/Video.groovy | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm b/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm index 803c3e402..e90b1493f 100644 --- a/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm @@ -18,7 +18,7 @@

    - - - + + +
    diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 720b1c378..928139947 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -53,7 +53,7 @@ class Video implements SimpleInstance{ String getStatus(){ ViewingStatus viewingStatus = getViewingStatus() - if(viewingStatus?.completed){ + if(viewingStatus?.completed || viewingStatus?.hasVideoEnded()){ return VideoStatus.COMPLETED } else if(viewingStatus){ From cfa52f3cc0c0724b5a73ec785ddbea09a7ec7e78 Mon Sep 17 00:00:00 2001 From: dularion Date: Thu, 16 Jul 2020 08:38:24 +0200 Subject: [PATCH 08/11] add handler for markAsUnviewed in mediaitem component --- .../streama/directives/streama-dash-media-item.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js b/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js index 008480bc7..e9d7bd322 100644 --- a/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js +++ b/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js @@ -13,13 +13,15 @@ angular.module('streama').directive('streamaDashMediaItem', function () { } }); -function controller(apiService, modalService, $rootScope, $state) { +function controller(apiService, modalService, $rootScope, $state, $scope) { var vm = this; vm.fetchFirstEpisodeAndPlay = fetchFirstEpisodeAndPlay; vm.showDetails = showDetails; vm.handleWatchlistUpdate = handleWatchlistUpdate; vm.markCompleted = markCompleted; + $scope.$on('video.markAsUnviewed', onVideoMarkAsUnviewed); + function fetchFirstEpisodeAndPlay(tvShow) { apiService.dash.firstEpisodeForShow(tvShow.id).then(function (response) { $state.go('player', {videoId: response.data.id}); @@ -74,4 +76,10 @@ function controller(apiService, modalService, $rootScope, $state) { } }) } + + function onVideoMarkAsUnviewed(e, data) { + if(data.id === vm.entity.id){ + vm.entity.status = 'unviewed'; + } + } } From 54a12b98756f2327116cbb41368c1ac4ad9dbbfe Mon Sep 17 00:00:00 2001 From: dularion Date: Sat, 6 Feb 2021 00:54:47 +0100 Subject: [PATCH 09/11] WIP watchlist fixes --- .../streama/controllers/dash-ctrl.js | 2 ++ grails-app/domain/streama/Video.groovy | 20 +++++++++++++++++++ .../marshallers/MarshallerService.groovy | 9 ++++++++- .../views/watchlistEntry/_watchlistEntry.gson | 8 ++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js index c1abe84a5..8b2c0908f 100644 --- a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js @@ -169,6 +169,7 @@ angular.module('streama').controller('dashCtrl', } function removeFromWatchlist(item) { + vm.watchlistEntry.list = vm.watchlistEntry.list ? vm.watchlistEntry.list : []; alertify.set({buttonReverse: true, labels: {ok: "Yes", cancel: "Cancel"}}); alertify.confirm("Are you sure you want to remove this video from your watchlist?", function (confirmed) { if (confirmed) { @@ -254,6 +255,7 @@ angular.module('streama').controller('dashCtrl', } function onVideoUpdateWatchlist(e, data) { + vm.watchlistEntry.list = vm.watchlistEntry.list ? vm.watchlistEntry.list : []; updateWatchlist(data.action, _.get(vm.watchlistEntry, 'list'), data.media, _.get(data.response, 'data')); } diff --git a/grails-app/domain/streama/Video.groovy b/grails-app/domain/streama/Video.groovy index 928139947..c908acfed 100644 --- a/grails-app/domain/streama/Video.groovy +++ b/grails-app/domain/streama/Video.groovy @@ -179,6 +179,26 @@ class Video implements SimpleInstance{ return videoFiles.find{it.isDefault} ?: videoFiles[0] } + String getType(){ + if(this instanceof Movie){ + return 'movie' + } + if(this instanceof GenericVideo){ + return 'genericVideo' + } + if(this instanceof Episode){ + return 'episode' + } + } + + def getReleaseDate(){ + if(this instanceof Episode){ + return air_date + }else{ + return release_date + } + } + def inWatchlist(){ User currentUser = springSecurityService.currentUser Profile profile = currentUser.getProfileFromRequest() diff --git a/grails-app/services/streama/marshallers/MarshallerService.groovy b/grails-app/services/streama/marshallers/MarshallerService.groovy index a31132ba9..7ebe4b91c 100644 --- a/grails-app/services/streama/marshallers/MarshallerService.groovy +++ b/grails-app/services/streama/marshallers/MarshallerService.groovy @@ -433,7 +433,14 @@ class MarshallerService { response['lastUpdated'] = watchlistEntry.lastUpdated response['tvShow'] = watchlistEntry.tvShow - response['video'] = watchlistEntry.video + response['video'] = [ + id: watchlistEntry.video.id, + mediaType: watchlistEntry.video.getType(), + poster_path: watchlistEntry.video.getPosterPath(), + inWatchlist: watchlistEntry.video.inWatchlist(), + release_date: watchlistEntry.video.getReleaseDate() + ] + return response; } diff --git a/grails-app/views/watchlistEntry/_watchlistEntry.gson b/grails-app/views/watchlistEntry/_watchlistEntry.gson index b1db7ab32..aefbf9a4e 100644 --- a/grails-app/views/watchlistEntry/_watchlistEntry.gson +++ b/grails-app/views/watchlistEntry/_watchlistEntry.gson @@ -1,5 +1,6 @@ package watchlistEntry +import streama.Episode import streama.GenericVideo import streama.Movie import streama.TvShow @@ -33,6 +34,13 @@ json g.render(watchlistEntry, [deep:true, includes: ['id', 'dateCreated', 'lastU poster_image_src genericVideo.poster_image?.src inWatchlist genericVideo.inWatchlist() } + if (watchlistEntry.video instanceof Episode) { + Episode episode = watchlistEntry.video as Episode + + mediaType 'episode' + poster_image_src episode.getPosterPath() + inWatchlist episode.inWatchlist() + } } } if(watchlistEntry.tvShow){ From 5b1954b0e254bc7aa37699f77d6b9c98f4a7b31a Mon Sep 17 00:00:00 2001 From: dularion Date: Sat, 6 Feb 2021 00:55:57 +0100 Subject: [PATCH 10/11] fix watchlist filter --- grails-app/assets/javascripts/streama/templates/dash.tpl.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm index 4e9be8f97..2d7ab4856 100644 --- a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm @@ -85,7 +85,7 @@

    {{'DASHBOARD.RECOMMENDATIONS' | translate}}

    -
    +

    {{'DASHBOARD.WATCHLIST' | translate}}

    From 8d2fbf2f023896bdd2b96403a6b8f3245e641163 Mon Sep 17 00:00:00 2001 From: dularion Date: Sat, 6 Feb 2021 00:58:34 +0100 Subject: [PATCH 11/11] 1.9.3 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0356fd830..9338574d6 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } } -version "1.9.2" +version "1.9.3" group "streama"