Skip to content

Commit ad78849

Browse files
author
dularion
committed
TV Series browsing #101
1 parent 9f9e3e5 commit ad78849

File tree

9 files changed

+167
-53
lines changed

9 files changed

+167
-53
lines changed

grails-app/assets/javascripts/controllers/admin-show-ctrl.js

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ streamaApp.controller('adminShowCtrl', ['$scope', 'apiService', '$stateParams',
1111
apiService.tvShow.adminEpisodesForTvShow($stateParams.showId).success(function (data) {
1212
if(data.length){
1313
$scope.seasons = _.groupBy(data, 'season_number');
14+
$scope.currentSeason = _.min(data, 'season_number').season_number;
1415
}
1516
$scope.showLoading = false;
1617
});
@@ -62,6 +63,10 @@ streamaApp.controller('adminShowCtrl', ['$scope', 'apiService', '$stateParams',
6263
}
6364
};
6465

66+
$scope.setCurrentSeason = function (index) {
67+
$scope.currentSeason = index;
68+
};
69+
6570
var seasonForShow = function (season) {
6671
apiService.theMovieDb.seasonForShow({apiId: $scope.show.apiId, showId: $stateParams.showId, season: season})
6772
.success(function (data) {

grails-app/assets/javascripts/controllers/modal-media-detail-ctrl.js

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
11
'use strict';
22

33
streamaApp.controller('modalMediaDetailCtrl', [
4-
'$scope', '$modalInstance', '$rootScope', 'media', '$state',
5-
function ($scope, $modalInstance, $rootScope, media, $state) {
4+
'$scope', '$modalInstance', '$rootScope', 'media', '$state', 'apiService',
5+
function ($scope, $modalInstance, $rootScope, media, $state, apiService) {
66
$scope.media = media;
7+
$scope.currentSeason = 0;
78

89
$scope.cancel = function () {
910
$modalInstance.dismiss('cancel');
1011
};
1112

13+
if(media.name){
14+
apiService.tvShow.episodesForTvShow($scope.media.id).success(function (data) {
15+
if(data.length){
16+
$scope.seasons = _.groupBy(data, 'season_number');
17+
$scope.currentSeason = _.min(data, 'season_number').season_number;
18+
}
19+
});
20+
}
21+
22+
$scope.setCurrentSeason = function (index) {
23+
$scope.currentSeason = index;
24+
};
25+
1226
$scope.editMedia = function (media) {
1327
if($rootScope.currentUser.isContentManager){
1428
if(media.title){
@@ -20,4 +34,8 @@ streamaApp.controller('modalMediaDetailCtrl', [
2034
$modalInstance.dismiss('cancel');
2135
}
2236
};
37+
38+
$scope.$on('$stateChangeStart', function () {
39+
$modalInstance.dismiss('cancel');
40+
})
2341
}]);

grails-app/assets/javascripts/streama-app/templates/admin-show.tpl.htm

+15-12
Original file line numberDiff line numberDiff line change
@@ -89,21 +89,24 @@ <h1 class="pull-left">
8989

9090
<div ng-if="!seasons" class="no-episodes-yet">No Episodes yet</div>
9191

92-
<div ng-repeat="(season, episodes) in seasons | orderBy:'season'" ng-if="!episode.deleted" class="season-wrapper">
93-
<h3 class="season-fold-out-heading uppercase">
94-
<span class="season-fold-out-inner" ng-click="openSeason($index)">
95-
<i class="season-fold-out" ng-class="{'ion-arrow-right-b': seasonOpened != $index, 'ion-arrow-down-b': seasonOpened == $index}"></i>
96-
Season {{season}}
92+
<div ng-if="seasons">
93+
<hr>
94+
95+
<div class="season-picker-list">
96+
<span class="season-picker-item" ng-class="{'active': currentSeason == season}" ng-click="setCurrentSeason(season)"
97+
ng-repeat="(season, episodes) in seasons | orderBy:'season'">
98+
Season {{season}}
9799
</span>
100+
</div>
98101

99-
<div class="btn-group pull-right" ng-if="seasonOpened == $index">
100-
<button ng-click="refetchSeason(season)" class="btn btn-xs">Re-fetch Season</button>
101-
<button ng-click="deleteSeason(season)" class="btn btn-danger btn-xs">Delete Season</button>
102+
<div class="season-wrapper">
103+
<div class="btn-group">
104+
<button ng-click="refetchSeason(currentSeason)" class="btn btn-xs">Re-fetch Season</button>
105+
<button ng-click="deleteSeason(currentSeason)" class="btn btn-danger btn-xs">Delete Season</button>
106+
</div>
107+
<div class="media-list">
108+
<admin-episode episode="episode" ng-repeat="episode in seasons[currentSeason] | orderBy:'episode_number'" ></admin-episode>
102109
</div>
103-
</h3>
104-
105-
<div class="media-list" ng-if="seasonOpened == $index">
106-
<admin-episode episode="episode" ng-repeat="episode in episodes | orderBy:'episode_number'" ></admin-episode>
107110
</div>
108111
</div>
109112
</div>

grails-app/assets/javascripts/streama-app/templates/modal--media-detail.tpl.htm

+29-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<div class="col-sm-8">
1818
<ul class="info-list">
1919
<li><strong>Released: </strong> {{media.release_date.substring(0,4) || media.first_air_date.substring(0,4)}}</li>
20-
<li><strong>IMDB: </strong> <a href="http://www.imdb.com/title/{{media.imdb_id}}">{{media.name || media.title}}</a></li>
20+
<li><strong>IMDB: </strong> <a target="_blank" href="http://www.imdb.com/title/{{media.imdb_id}}">{{media.name || media.title}}</a></li>
2121
<li><strong>Rating: </strong> {{media.vote_average}} ({{media.vote_count}} votes)</li>
2222
</ul>
2323

@@ -29,4 +29,32 @@ <h4>Overview</h4>
2929
<img ng-src="https://image.tmdb.org/t/p/w300/{{media.poster_path}}"/>
3030
</div>
3131
</div>
32+
33+
<hr>
34+
35+
<div class="season-picker-list">
36+
<span class="season-picker-item" ng-class="{'active': currentSeason == season}" ng-click="setCurrentSeason(season)"
37+
ng-repeat="(season, episodes) in seasons | orderBy:'season'">
38+
Season {{season}}
39+
</span>
40+
</div>
41+
42+
<div class="media-list">
43+
<div class="media-list-item episode-wrapper" ng-repeat="episode in seasons[currentSeason] | orderBy:'episode_number'"
44+
ng-class="{'no-files': !episode.hasFile}">
45+
<h3 class="media-episode-string">
46+
<span ng-show="episode.episodeString">{{episode.episodeString}}</span>
47+
<span ng-show="!episode.episodeString">s{{episode.season_number | padnumber:2}}e{{episode.episode_number | padnumber:2}}</span>
48+
</h3>
49+
<h3 class="media-title">{{episode.name}}</h3>
50+
<div class="media-item" >
51+
<img ng-if="episode.still_path" ng-src="https://image.tmdb.org/t/p/w300/{{episode.still_path}}"/>
52+
<div ng-if="!episode.still_path" class="fallback-image"></div>
53+
<a ng-show="episode.hasFile" ui-sref="player({videoId: episode.id})" class="play-icon ion-ios-play"></a>
54+
</div>
55+
</div>
56+
57+
</div>
58+
59+
3260
</div>

grails-app/assets/stylesheets/_admin.scss

+15
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,18 @@
7575
.admin-movie-item{
7676
min-height: 260px;
7777
}
78+
79+
.season-picker-list{
80+
margin-bottom: 14px;
81+
82+
.season-picker-item{
83+
padding: 3px 10px;
84+
border: 1px solid transparent;
85+
border-radius: 25px;
86+
87+
&.active{
88+
border: 1px solid white;
89+
}
90+
91+
}
92+
}

grails-app/assets/stylesheets/_dash.scss

+7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
}
1010

1111
.modal-media-detail{
12+
max-height:inherit !important;
13+
1214
.info-list{
1315
margin: 0;
1416
padding: 0;
@@ -27,4 +29,9 @@
2729
.overview-text{
2830
font-size: 14px;
2931
}
32+
33+
.media-list-item.episode-wrapper{
34+
margin-bottom: 0px;
35+
margin-right: 9px;
36+
}
3037
}

grails-app/assets/stylesheets/_media-display.scss

+13
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,18 @@
118118
@include vendor-property('transform', 'scale(1.2)');
119119
}
120120
}
121+
122+
123+
}
124+
125+
.media-list-item{
126+
&.no-files{
127+
.media-item:hover{
128+
img{
129+
@include vendor-property('transform', 'inherit');
130+
}
131+
}
132+
}
121133
}
122134

123135
.media-episode-string{
@@ -244,6 +256,7 @@
244256
}
245257

246258
.season-wrapper{
259+
clear: both;
247260

248261
.season-fold-out-heading{
249262
border-bottom: 1px solid rgba(255, 255, 255, 0.08);

grails-app/assets/stylesheets/style.css

+61-38
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,13 @@ hr {
541541
-ms-transform: scale(1.2);
542542
transform: scale(1.2); }
543543

544+
.media-list-item.no-files .media-item:hover img {
545+
-moz-transform: inherit;
546+
-webkit-transform: inherit;
547+
-o-transform: inherit;
548+
-ms-transform: inherit;
549+
transform: inherit; }
550+
544551
.media-episode-string {
545552
font-size: 14px;
546553
font-weight: 100;
@@ -648,33 +655,35 @@ hr {
648655
.button-wrapper {
649656
margin-top: 12px; }
650657

651-
.season-wrapper .season-fold-out-heading {
652-
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
653-
font-weight: 300;
654-
margin: 0;
655-
padding: 8px;
656-
background: rgba(255, 255, 255, 0.05);
657-
margin-top: 8px;
658-
font-size: 20px;
659-
border-top: 1px solid rgba(255, 255, 255, 0.08);
660-
display: -webkit-box;
661-
display: -moz-box;
662-
display: -ms-flexbox;
663-
display: -webkit-flex;
664-
display: flex; }
665-
.season-wrapper .season-fold-out-heading .season-fold-out {
666-
margin-right: 8px;
667-
font-size: 14px;
668-
position: relative;
669-
top: -2px; }
670-
.season-wrapper .season-fold-out-inner {
671-
-webkit-box-flex: 1;
672-
-moz-box-flex: 1;
673-
-webkit-flex: 1;
674-
-ms-flex: 1;
675-
flex: 1;
676-
margin: -8px 0 -8px -8px;
677-
padding: 8px 12px; }
658+
.season-wrapper {
659+
clear: both; }
660+
.season-wrapper .season-fold-out-heading {
661+
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
662+
font-weight: 300;
663+
margin: 0;
664+
padding: 8px;
665+
background: rgba(255, 255, 255, 0.05);
666+
margin-top: 8px;
667+
font-size: 20px;
668+
border-top: 1px solid rgba(255, 255, 255, 0.08);
669+
display: -webkit-box;
670+
display: -moz-box;
671+
display: -ms-flexbox;
672+
display: -webkit-flex;
673+
display: flex; }
674+
.season-wrapper .season-fold-out-heading .season-fold-out {
675+
margin-right: 8px;
676+
font-size: 14px;
677+
position: relative;
678+
top: -2px; }
679+
.season-wrapper .season-fold-out-inner {
680+
-webkit-box-flex: 1;
681+
-moz-box-flex: 1;
682+
-webkit-flex: 1;
683+
-ms-flex: 1;
684+
flex: 1;
685+
margin: -8px 0 -8px -8px;
686+
padding: 8px 12px; }
678687

679688
.files-wrapper h4 {
680689
font-size: 14px;
@@ -736,17 +745,22 @@ hr {
736745
font-size: 16px;
737746
text-transform: uppercase; }
738747

739-
.modal-media-detail .info-list {
740-
margin: 0;
741-
padding: 0; }
742-
.modal-media-detail .info-list li {
743-
list-style: none; }
744-
.modal-media-detail .info-list li strong {
745-
margin-right: 6px;
746-
min-width: 86px;
747-
display: inline-block; }
748-
.modal-media-detail .overview-text {
749-
font-size: 14px; }
748+
.modal-media-detail {
749+
max-height: inherit !important; }
750+
.modal-media-detail .info-list {
751+
margin: 0;
752+
padding: 0; }
753+
.modal-media-detail .info-list li {
754+
list-style: none; }
755+
.modal-media-detail .info-list li strong {
756+
margin-right: 6px;
757+
min-width: 86px;
758+
display: inline-block; }
759+
.modal-media-detail .overview-text {
760+
font-size: 14px; }
761+
.modal-media-detail .media-list-item.episode-wrapper {
762+
margin-bottom: 0px;
763+
margin-right: 9px; }
750764

751765
#login {
752766
margin: 15px 0px;
@@ -852,6 +866,15 @@ hr {
852866
.admin-movie-item {
853867
min-height: 260px; }
854868

869+
.season-picker-list {
870+
margin-bottom: 14px; }
871+
.season-picker-list .season-picker-item {
872+
padding: 3px 10px;
873+
border: 1px solid transparent;
874+
border-radius: 25px; }
875+
.season-picker-list .season-picker-item.active {
876+
border: 1px solid white; }
877+
855878
.spinner {
856879
width: 38px;
857880
text-align: center;

grails-app/services/streama/MarshallerService.groovy

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class MarshallerService {
8080
returnArray['vote_average'] = movie.vote_average
8181
returnArray['vote_count'] = movie.vote_count
8282
returnArray['popularity'] = movie.popularity
83+
returnArray['imdb_id'] = movie.imdb_id
8384

8485
returnArray['files'] = movie.files.findAll{it.extension != '.srt' && it.extension != '.vtt'}
8586
returnArray['subtitles'] = movie.files.findAll{it.extension == '.srt' || it.extension == '.vtt'}
@@ -102,6 +103,7 @@ class MarshallerService {
102103
returnArray['name'] = tvShow.name
103104
returnArray['overview'] = tvShow.overview
104105
returnArray['apiId'] = tvShow.apiId
106+
returnArray['imdb_id'] = tvShow.imdb_id
105107
returnArray['original_language'] = tvShow.original_language
106108
returnArray['vote_average'] = tvShow.vote_average
107109
returnArray['vote_count'] = tvShow.vote_count

0 commit comments

Comments
 (0)