Merge pull request #123 from JackDandy/feature/EpisodeView

Feature/Episode View
This commit is contained in:
JackDandy 2015-01-08 16:59:46 +00:00
commit 9d4122247e
16 changed files with 1311 additions and 1070 deletions

View file

@ -1,4 +1,4 @@
### 0.x.x (2014-12-xx xx:xx:xx UTC)
### 0.x.x (2015-01-xx xx:xx:xx UTC)
* Add network logos BBC Canada, Crackle, El Rey Network, SKY Atlantic, and Watch
* Change Yahoo! screen network logo
@ -20,6 +20,19 @@
* Fix anime searches on BTN provider
* Change replace "Daily-Search" with "Recent-Search"
* Add daily search to recent search renaming to config migration code
* Change Coming Episodes calendar view to a fluid layout, change episode layout design, and add day and month in column headers
* Add isotope plug-in to Coming Episodes calendar view to enable sort columns by Date, Network, and Show name
* Add imagesLoaded plug-in to prevent layout breakage by calling isotope to update content after a page auto-refresh
* Change Coming Episodes to "Episodes" page (API endpoint is not renamed)
* Add coming episodes to episode view renaming to config migration code
* Change Layout term "Calender" to "Day by Day" on Episodes page
* Fix saving of sort modes to config file on Episodes page
* Add qTip episode plots to "Day by Day" on Episodes page
* Add article sorting to networks on Episodes page
* Add toggle sort direction and multidimensional sort to isotope on Episodes page
* Add text "[paused]" where appropriate to shows on layout Day by Day on Episodes page
* Change Epsiodes page auto refresh from 10 to 30 mins
* Add UI tweaks
[develop changelog]

View file

@ -149,10 +149,6 @@ inc_top.tmpl
margin-bottom: -15px;
}
#contentWrapper {
/* background: url("../images/bg.png") repeat 0 0 transparent; */
}
[class^="icon-"],
[class*=" icon-"] {
background-image: url("../images/glyphicons-halflings.png");
@ -301,18 +297,18 @@ inc_top.tmpl
}
.ui-tabs {
padding: 0px;
padding: 0;
background: none;
border-width: 0px;
border-width: 0;
}
.ui-tabs .ui-tabs-nav {
padding-left: 0px;
padding-left: 0;
background: transparent;
border-width: 0px 0px 0px 0px;
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
border-width: 0 0 0 0;
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
}
.ui-tabs .ui-tabs-panel {
@ -331,15 +327,6 @@ inc_top.tmpl
border-top-right-radius: 5px;
}
#content {
width: 95%;
min-width: 875px;
padding: 15px;
margin-left: auto;
margin-right: auto;
clear: both;
}
#SubMenu {
padding-right: 20px;
clear: both;
@ -353,7 +340,7 @@ inc_top.tmpl
margin-left: auto;
margin-right: auto;
margin-top: 50px;
margin-bottom: 0px;
margin-bottom: 0;
}
[class^="menu-icon-"], [class*=" menu-icon-"] {
@ -379,83 +366,83 @@ inc_top.tmpl
}
.menu-icon-addshow {
background-position: 0px 0px;
background-position: 0 0;
}
.menu-icon-anime {
background-position: -21px 0px;
background-position: -21px 0;
}
.menu-icon-backlog-view {
background-position: -42px 0px;
background-position: -42px 0;
}
.menu-icon-backlog {
background-position: -63px 0px;
background-position: -63px 0;
}
.menu-icon-bittorrent {
background-position: -84px 0px;
background-position: -84px 0;
}
.menu-icon-config-index {
background-position: -105px 0px;
background-position: -105px 0;
}
.menu-icon-config {
background-position: -126px 0px;
background-position: -126px 0;
}
.menu-icon-failed-download {
background-position: -147px 0px;
background-position: -147px 0;
}
.menu-icon-home {
background-position: -168px 0px;
background-position: -168px 0;
}
.menu-icon-manage {
background-position: -189px 0px;
background-position: -189px 0;
}
.menu-icon-manage-searches {
background-position: -210px 0px;
background-position: -210px 0;
}
.menu-icon-poster {
background-position: -231px 0px;
background-position: -231px 0;
}
.menu-icon-postprocess {
background-position: -252px 0px;
background-position: -252px 0;
}
.menu-icon-restart {
background-position: -273px 0px;
background-position: -273px 0;
}
.menu-icon-shutdown {
background-position: -294px 0px;
background-position: -294px 0;
}
.menu-icon-update {
background-position: -315px 0px;
background-position: -315px 0;
}
.menu-icon-viewlog-errors {
background-position: -336px 0px;
background-position: -336px 0;
}
.menu-icon-viewlog {
background-position: -357px 0px;
background-position: -357px 0;
}
.menu-icon-xbmc {
background-position: -378px 0px;
background-position: -378px 0;
}
.menu-icon-help {
background-position: -399px 0px;
background-position: -399px 0;
}
[class^="submenu-icon-"], [class*=" submenu-icon-"] {
@ -465,27 +452,27 @@ inc_top.tmpl
}
.submenu-icon-anime {
background-position: -21px 0px;
background-position: -21px 0;
}
.submenu-icon-bittorrent {
background-position: -84px 0px;
background-position: -84px 0;
}
.submenu-icon-failed-download {
background-position: -147px 0px;
background-position: -147px 0;
}
.submenu-icon-restart {
background-position: -273px 0px;
background-position: -273px 0;
}
.submenu-icon-shutdown {
background-position: -294px 0px;
background-position: -294px 0;
}
.submenu-icon-xbmc {
background-position: -378px 0px;
background-position: -378px 0;
}
/* =======================================================================
@ -622,42 +609,42 @@ home.tmpl
}
.show .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br {
border-bottom-right-radius: 0px;
border-bottom-right-radius: 0;
}
.show .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl {
border-bottom-left-radius: 0px;
border-bottom-left-radius: 0;
}
.show .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr {
border-top-right-radius: 0px;
border-top-right-radius: 0;
}
.show .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl {
border-top-left-radius: 0px;
border-top-left-radius: 0;
}
.show .ui-widget-content {
border-top: 1px solid #111;
border-bottom: 1px solid #111;
border-left: 0px;
border-right: 0px;
border-left: 0;
border-right: 0;
}
.show .progress-80 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-60 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-40 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-20 {
border-radius: 0px;
border-radius: 0;
}
.show-title {
@ -665,7 +652,7 @@ home.tmpl
overflow: hidden;
white-space: nowrap;
font-size: 11px;
margin: 4px 4px 0px 4px;
margin: 4px 4px 0 4px;
}
.show-title:after {
@ -688,7 +675,7 @@ home.tmpl
overflow: hidden;
white-space: nowrap;
font-size: 11px;
margin: 0px 4px 4px 4px;
margin: 0 4px 4px 4px;
}
.show-date:after {
@ -828,7 +815,7 @@ home_trendingShows.tmpl
white-space: nowrap;
font-size: 12px;
overflow: hidden;
/* text-shadow: 1px 1px 0px #000;*/
/* text-shadow: 1px 1px 0 #000;*/
padding-left: 4px;
margin: 0;
}
@ -928,7 +915,7 @@ ul.tags li {
border: 1px solid #111;
color: #FFF;
font: 14px/18px "Open Sans", "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
text-shadow: 0px 1px rgba(0, 0, 0, 0.8);
text-shadow: 0 1px rgba(0, 0, 0, 0.8);
float: left;
}
@ -1168,7 +1155,7 @@ td.col-search {
}
/* =======================================================================
comingEpisodes.tmpl
episodeView.tmpl
========================================================================== */
.sort_data {
@ -1227,7 +1214,7 @@ h2.day, h2.network {
letter-spacing: 1px;
color: #FFF;
text-align: center;
text-shadow: -1px -1px 0px rgba(0, 0, 0, 0.3);
text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);
background-color: #15528F;
}
@ -1236,7 +1223,7 @@ h2.day, h2.network {
clear: both;
border: 1px solid #ccc;
margin: auto;
padding: 0px;
padding: 0;
text-align: left;
width: 750px;
border-radius: 5px;
@ -1325,17 +1312,42 @@ h2.day, h2.network {
color: #09A2FF;
}
table.cal-odd {
.day-of-week .day-number {
background-color: #15528F;
color: #fff;
}
.today .day-number .number, .today .day-number .month, .today .day-number .day {
color: #8dbeee;
}
.odd .daybyday-show {
background-color: #333;
}
table.cal-even {
.even .daybyday-show {
background-color: #3d3d3d;
}
.calendarShow .text .airtime {
color:#fff
.daybyday-show .episode-blank {
background-color: rgba(0,0,0,.1);
border-radius: 3px;
}
.calendarShow .text .episode-title {
color:#aaa
.day-of-week .poster img {
border-color: #111;
}
.day-of-week .text .airtime,
.day-of-week .text .episode,
.day-of-week .text .episode .name {
color: #fff;
}
.day-of-week .text .episode .season,
.day-of-week .text .episode .number {
color: rgb(9, 162, 255);
}
.day-of-week .text .episode {
color: rgb(141, 190, 238);
}
/* =======================================================================
@ -1372,7 +1384,7 @@ config*.tmpl
}
#config div.field-pair {
padding: 12px 0px;
padding: 12px 0;
}
#config .nocheck, #config div #customQuality, .metadataDiv {
@ -1557,7 +1569,7 @@ td.tableright {
text-align: left;
vertical-align: middle;
width: 225px;
padding: 6px 0px;
padding: 6px 0;
}
.optionWrapper div.selectChoices {
@ -1591,7 +1603,6 @@ Global
========================================================================== */
span.path {
padding: 3px 6px;
color: #09A2FF;
background-color: #333;
}
@ -1609,7 +1620,7 @@ span.quality {
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.08),rgba(255, 255, 255, 0) 50%,rgba(0, 0, 0, 0) 50%,rgba(0, 0, 0, 0.25));
-webkit-box-shadow:inset 0 1px rgba(255, 255, 255, 0.1),inset 0 -1px 3px rgba(0, 0, 0, 0.3),inset 0 0 0 1px rgba(255, 255, 255, 0.08),0 1px 2px rgba(0, 0, 0, 0.15);
box-shadow:inset 0 1px rgba(255, 255, 255, 0.1),inset 0 -1px 3px rgba(0, 0, 0, 0.3),inset 0 0 0 1px rgba(255, 255, 255, 0.08),0 1px 2px rgba(0, 0, 0, 0.15);
text-shadow: 0px 1px rgba(0, 0, 0, 0.8);
text-shadow: 0 1px rgba(0, 0, 0, 0.8);
color: #FFFFFF;
display: inline-block;
padding: 2px 4px;
@ -1729,7 +1740,7 @@ div.blackwhitelist span {
}
div.blackwhitelist.anidb, div.blackwhitelist.manual {
margin: 7px 0px;
margin: 7px 0;
}
@ -1746,7 +1757,7 @@ body {
}
input[type="radio"] {
margin: 2px 0px 0px;
margin: 2px 0 0;
line-height: normal;
}
@ -1761,7 +1772,7 @@ input, textarea, select, .uneditable-input {
}
.navbar-brand {
padding: 0px;
padding: 0;
}
/* navbar styling */
@ -1901,7 +1912,7 @@ fieldset[disabled] .navbar-default .btn-link:focus {
.dropdown-menu {
background-color: #333;
border: 1px solid rgba(0, 0, 0, 0.15);
box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.176);
}
.form-control {
@ -2379,10 +2390,10 @@ pnotify.css
background-image: -o-linear-gradient(#333, #3d3d3d) !important;
filter: progid:dximagetransform.microsoft.gradient(startColorstr=#333, endColorstr=#3d3d3d) !important;
-ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#333, endColorstr=#3d3d3d) !important;
-moz-box-shadow: 0px 0px 2px #000;
-webkit-box-shadow: 0px 0px 2px #000;
-o-box-shadow: 0px 0px 2px #000;
box-shadow: 0px 0px 2px #000;
-moz-box-shadow: 0 0 2px #000;
-webkit-box-shadow: 0 0 2px #000;
-o-box-shadow: 0 0 2px #000;
box-shadow: 0 0 2px #000;
}
.ui-pnotify-title {
@ -2643,10 +2654,19 @@ span.token-input-delete-token {
background-color: rgb(40, 40, 40);
}
/*.episodeview-daybyday .time .time-min,*/
.episodeview-daybyday .time .time-hr-min,
.episodeview-daybyday .time .time-am-pm,
#addRootDirTable td label .filepath,
.grey-text {
color:#999
}
/*.episodeview-daybyday .time .time-hr-min{
display:none
}
.episodeview-daybyday .time .time-min{
font-size: 11px;
}*/
#newShowPortal #displayText .show-name,
#newShowPortal #displayText .show-dest,
@ -2682,7 +2702,7 @@ jquery.confirm.css
top: 50%;
margin: -130px 0 0 -230px;
border: 1px solid #111;
box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.175);
box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);
}
#confirmBox h1,
@ -2696,13 +2716,13 @@ jquery.confirm.css
color: #fff;
margin: 0;
font-size: 22px;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
}
#confirmBox p {
padding-top: 20px;
color: #fff;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
}
#confirmButtons {
@ -2717,7 +2737,7 @@ jquery.confirm.css
display: inline-block;
color: #fff;
text-align:center;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
background-clip: padding-box;
border: 1px solid #111;
border-radius: 3px;

View file

@ -149,10 +149,6 @@ inc_top.tmpl
margin-bottom: -15px;
}
#contentWrapper {
/* background: url("../images/bg.png") repeat 0 0 transparent; */
}
[class^="icon-"],
[class*=" icon-"] {
background-image: url("../images/glyphicons-halflings.png");
@ -289,18 +285,18 @@ inc_top.tmpl
}
.ui-tabs {
padding: 0px;
padding: 0;
background: none;
border-width: 0px;
border-width: 0;
}
.ui-tabs .ui-tabs-nav {
padding-left: 0px;
padding-left: 0;
background: transparent;
border-width: 0px 0px 0px 0px;
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
border-width: 0 0 0 0;
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
}
.ui-tabs .ui-tabs-panel {
@ -318,15 +314,6 @@ inc_top.tmpl
border-top-right-radius: 5px;
}
#content {
width: 95%;
min-width: 875px;
padding: 15px;
margin-left: auto;
margin-right: auto;
clear: both;
}
#SubMenu {
padding-right: 20px;
clear: both;
@ -340,7 +327,7 @@ inc_top.tmpl
margin-left: auto;
margin-right: auto;
margin-top: 50px;
margin-bottom: 0px;
margin-bottom: 0;
}
[class^="menu-icon-"], [class*=" menu-icon-"] {
@ -366,83 +353,83 @@ inc_top.tmpl
}
.menu-icon-addshow {
background-position: 0px 0px;
background-position: 0 0;
}
.menu-icon-anime {
background-position: -21px 0px;
background-position: -21px 0;
}
.menu-icon-backlog-view {
background-position: -42px 0px;
background-position: -42px 0;
}
.menu-icon-backlog {
background-position: -63px 0px;
background-position: -63px 0;
}
.menu-icon-bittorrent {
background-position: -84px 0px;
background-position: -84px 0;
}
.menu-icon-config-index {
background-position: -105px 0px;
background-position: -105px 0;
}
.menu-icon-config {
background-position: -126px 0px;
background-position: -126px 0;
}
.menu-icon-failed-download {
background-position: -147px 0px;
background-position: -147px 0;
}
.menu-icon-home {
background-position: -168px 0px;
background-position: -168px 0;
}
.menu-icon-manage {
background-position: -189px 0px;
background-position: -189px 0;
}
.menu-icon-manage-searches {
background-position: -210px 0px;
background-position: -210px 0;
}
.menu-icon-poster {
background-position: -231px 0px;
background-position: -231px 0;
}
.menu-icon-postprocess {
background-position: -252px 0px;
background-position: -252px 0;
}
.menu-icon-restart {
background-position: -273px 0px;
background-position: -273px 0;
}
.menu-icon-shutdown {
background-position: -294px 0px;
background-position: -294px 0;
}
.menu-icon-update {
background-position: -315px 0px;
background-position: -315px 0;
}
.menu-icon-viewlog-errors {
background-position: -336px 0px;
background-position: -336px 0;
}
.menu-icon-viewlog {
background-position: -357px 0px;
background-position: -357px 0;
}
.menu-icon-xbmc {
background-position: -378px 0px;
background-position: -378px 0;
}
.menu-icon-help {
background-position: -399px 0px;
background-position: -399px 0;
}
[class^="submenu-icon-"], [class*=" submenu-icon-"] {
@ -452,27 +439,27 @@ inc_top.tmpl
}
.submenu-icon-anime {
background-position: -21px 0px;
background-position: -21px 0;
}
.submenu-icon-bittorrent {
background-position: -84px 0px;
background-position: -84px 0;
}
.submenu-icon-failed-download {
background-position: -147px 0px;
background-position: -147px 0;
}
.submenu-icon-restart {
background-position: -273px 0px;
background-position: -273px 0;
}
.submenu-icon-shutdown {
background-position: -294px 0px;
background-position: -294px 0;
}
.submenu-icon-xbmc {
background-position: -378px 0px;
background-position: -378px 0;
}
/* =======================================================================
@ -609,42 +596,42 @@ home.tmpl
}
.show .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br {
border-bottom-right-radius: 0px;
border-bottom-right-radius: 0;
}
.show .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl {
border-bottom-left-radius: 0px;
border-bottom-left-radius: 0;
}
.show .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr {
border-top-right-radius: 0px;
border-top-right-radius: 0;
}
.show .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl {
border-top-left-radius: 0px;
border-top-left-radius: 0;
}
.show .ui-widget-content {
border-top: 1px solid #111;
border-bottom: 1px solid #111;
border-left: 0px;
border-right: 0px;
border-left: 0;
border-right: 0;
}
.show .progress-80 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-60 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-40 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-20 {
border-radius: 0px;
border-radius: 0;
}
.show-title {
@ -652,7 +639,7 @@ home.tmpl
overflow: hidden;
white-space: nowrap;
font-size: 11px;
margin: 4px 4px 0px 4px;
margin: 4px 4px 0 4px;
}
.show-title:after {
@ -675,7 +662,7 @@ home.tmpl
overflow: hidden;
white-space: nowrap;
font-size: 11px;
margin: 0px 4px 4px 4px;
margin: 0 4px 4px 4px;
}
.show-date:after {
@ -815,7 +802,7 @@ home_trendingShows.tmpl
white-space: nowrap;
font-size: 12px;
overflow: hidden;
/* text-shadow: 1px 1px 0px #000;*/
/* text-shadow: 1px 1px 0 #000;*/
padding-left: 4px;
margin: 0;
}
@ -917,7 +904,7 @@ ul.tags li {
border: 1px solid #111;
color: #FFF;
font: 14px/18px "Open Sans", "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
text-shadow: 0px 1px rgba(0, 0, 0, 0.8);
text-shadow: 0 1px rgba(0, 0, 0, 0.8);
float: left;
}
@ -1074,7 +1061,7 @@ tr.seasonheader {
padding-top: 10px;
text-align: left;
border: none;
color: #fff;
color: #000;
}
th.col-checkbox,
@ -1157,7 +1144,7 @@ td.col-search {
}
/* =======================================================================
comingEpisodes.tmpl
episodeView.tmpl
========================================================================== */
.sort_data {
@ -1219,7 +1206,7 @@ h2.day, h2.network {
letter-spacing: 1px;
color: #FFF;
text-align: center;
text-shadow: -1px -1px 0px rgba(0, 0, 0, 0.3);
text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);
background-color: #333;
}
@ -1228,7 +1215,7 @@ h2.day, h2.network {
clear: both;
border: 1px solid #ccc;
margin: auto;
padding: 0px;
padding: 0;
text-align: left;
width: 750px;
border-radius: 5px;
@ -1307,17 +1294,39 @@ h2.day, h2.network {
vertical-align: middle;
}
table.cal-odd {
background-color: #ddd;
.day-of-week .day-number {
background-color: #333;
color: #fff;
}
table.cal-even {
background-color: #d2d2d2;
.today .day-number .number, .today .day-number .month, .today .day-number .day {
color: #c7db40;
}
.calendarShow .text .airtime {
color:#000
.odd .daybyday-show {
background-color: #F5F1E4;
}
.calendarShow .text .episode-title {
color:#888
.even .daybyday-show {
background-color: #DFDACF;
}
.day-of-week .poster img {
border-color: #CCC;
}
.day-of-week .text .airtime,
.day-of-week .text .episode,
.day-of-week .text .episode .name {
color: #000;
}
.day-of-week .text .episode .season,
.day-of-week .text .episode .number {
color: rgb(9, 133, 225);
/*color: #3d3d3d;*/
}
.day-of-week .text .episode {
color: #888;
}
/* =======================================================================
@ -1355,7 +1364,7 @@ config*.tmpl
}
#config div.field-pair {
padding: 12px 0px;
padding: 12px 0;
}
#config .nocheck, #config div #customQuality, .metadataDiv {
@ -1533,7 +1542,7 @@ td.tableright {
text-align: left;
vertical-align: middle;
width: 225px;
padding: 6px 0px;
padding: 6px 0;
}
.optionWrapper div.selectChoices {
@ -1567,7 +1576,6 @@ Global
========================================================================== */
span.path {
padding: 3px 6px;
color: #8b0000;
background-color: #f5f1e4;
}
@ -1589,7 +1597,7 @@ span.quality {
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.08),rgba(255, 255, 255, 0) 50%,rgba(0, 0, 0, 0) 50%,rgba(0, 0, 0, 0.25));
-webkit-box-shadow:inset 0 1px rgba(255, 255, 255, 0.1),inset 0 -1px 3px rgba(0, 0, 0, 0.3),inset 0 0 0 1px rgba(255, 255, 255, 0.08),0 1px 2px rgba(0, 0, 0, 0.15);
box-shadow:inset 0 1px rgba(255, 255, 255, 0.1),inset 0 -1px 3px rgba(0, 0, 0, 0.3),inset 0 0 0 1px rgba(255, 255, 255, 0.08),0 1px 2px rgba(0, 0, 0, 0.15);
text-shadow: 0px 1px rgba(0, 0, 0, 0.8);
text-shadow: 0 1px rgba(0, 0, 0, 0.8);
color: #FFFFFF;
display: inline-block;
padding: 2px 4px;
@ -1709,7 +1717,7 @@ div.blackwhitelist span {
}
div.blackwhitelist.anidb, div.blackwhitelist.manual {
margin: 7px 0px;
margin: 7px 0;
}
@ -1725,7 +1733,7 @@ body {
}
input[type="radio"] {
margin: 2px 0px 0px;
margin: 2px 0 0;
line-height: normal;
}
@ -1740,7 +1748,7 @@ input, textarea, select, .uneditable-input {
}
.navbar-brand {
padding: 0px;
padding: 0;
}
/* navbar styling */
@ -1879,7 +1887,7 @@ fieldset[disabled] .navbar-default .btn-link:focus {
.dropdown-menu {
background-color: #F5F1E4;
border: 1px solid rgba(0, 0, 0, 0.15);
box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.176);
}
.form-control {
@ -2591,6 +2599,8 @@ span.token-input-delete-token {
background-color: rgb(245, 245, 245);
}
.episodeview-daybyday .time .time-min,
.episodeview-daybyday .time .time-am-pm,
#addRootDirTable td label .filepath,
.grey-text {
color:#666
@ -2630,7 +2640,7 @@ jquery.confirm.css
top: 50%;
margin: -130px 0 0 -230px;
border: 1px solid #111;
box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.175);
box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);
}
#confirmBox h1,
@ -2644,13 +2654,13 @@ jquery.confirm.css
color: #fff;
margin: 0;
font-size: 22px;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
}
#confirmBox p {
padding-top: 20px;
color: #000;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.75);
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
}
#confirmButtons {
@ -2665,7 +2675,7 @@ jquery.confirm.css
display: inline-block;
color: #fff;
text-align:center;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
background-clip: padding-box;
border: 1px solid #111;
border-radius: 3px;

View file

@ -149,8 +149,11 @@ inc_top.tmpl
margin-bottom: -15px;
}
#contentWrapper {
/* background: url("../images/bg.png") repeat 0 0 transparent; */
#contentWrapper .episodeview-banner,
#contentWrapper .episodeview-daybyday,
#contentWrapper .episodeview-list,
#contentWrapper .episodeview-poster{
padding-top:45px;
}
[class^="icon-"],
@ -285,18 +288,18 @@ inc_top.tmpl
}
.ui-tabs {
padding: 0px;
padding: 0;
background: none;
border-width: 0px;
border-width: 0;
}
.ui-tabs .ui-tabs-nav {
padding-left: 0px;
padding-left: 0;
background: transparent;
border-width: 0px 0px 0px 0px;
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
border-width: 0 0 0 0;
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
}
.ui-tabs .ui-tabs-panel {
@ -336,7 +339,7 @@ inc_top.tmpl
margin-left: auto;
margin-right: auto;
margin-top: 50px;
margin-bottom: 0px;
margin-bottom: 0;
}
[class^="menu-icon-"], [class*=" menu-icon-"] {
@ -362,83 +365,83 @@ inc_top.tmpl
}
.menu-icon-addshow {
background-position: 0px 0px;
background-position: 0 0;
}
.menu-icon-anime {
background-position: -21px 0px;
background-position: -21px 0;
}
.menu-icon-backlog-view {
background-position: -42px 0px;
background-position: -42px 0;
}
.menu-icon-backlog {
background-position: -63px 0px;
background-position: -63px 0;
}
.menu-icon-bittorrent {
background-position: -84px 0px;
background-position: -84px 0;
}
.menu-icon-config-index {
background-position: -105px 0px;
background-position: -105px 0;
}
.menu-icon-config {
background-position: -126px 0px;
background-position: -126px 0;
}
.menu-icon-failed-download {
background-position: -147px 0px;
background-position: -147px 0;
}
.menu-icon-home {
background-position: -168px 0px;
background-position: -168px 0;
}
.menu-icon-manage {
background-position: -189px 0px;
background-position: -189px 0;
}
.menu-icon-manage-searches {
background-position: -210px 0px;
background-position: -210px 0;
}
.menu-icon-poster {
background-position: -231px 0px;
background-position: -231px 0;
}
.menu-icon-postprocess {
background-position: -252px 0px;
background-position: -252px 0;
}
.menu-icon-restart {
background-position: -273px 0px;
background-position: -273px 0;
}
.menu-icon-shutdown {
background-position: -294px 0px;
background-position: -294px 0;
}
.menu-icon-update {
background-position: -315px 0px;
background-position: -315px 0;
}
.menu-icon-viewlog-errors {
background-position: -336px 0px;
background-position: -336px 0;
}
.menu-icon-viewlog {
background-position: -357px 0px;
background-position: -357px 0;
}
.menu-icon-xbmc {
background-position: -378px 0px;
background-position: -378px 0;
}
.menu-icon-help {
background-position: -399px 0px;
background-position: -399px 0;
}
[class^="submenu-icon-"], [class*=" submenu-icon-"] {
@ -448,27 +451,27 @@ inc_top.tmpl
}
.submenu-icon-anime {
background-position: -21px 0px;
background-position: -21px 0;
}
.submenu-icon-bittorrent {
background-position: -84px 0px;
background-position: -84px 0;
}
.submenu-icon-failed-download {
background-position: -147px 0px;
background-position: -147px 0;
}
.submenu-icon-restart {
background-position: -273px 0px;
background-position: -273px 0;
}
.submenu-icon-shutdown {
background-position: -294px 0px;
background-position: -294px 0;
}
.submenu-icon-xbmc {
background-position: -378px 0px;
background-position: -378px 0;
}
/* =======================================================================
@ -626,26 +629,26 @@ home.tmpl
}
.show .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br {
border-bottom-right-radius: 0px;
border-bottom-right-radius: 0;
}
.show .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl {
border-bottom-left-radius: 0px;
border-bottom-left-radius: 0;
}
.show .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr {
border-top-right-radius: 0px;
border-top-right-radius: 0;
}
.show .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl {
border-top-left-radius: 0px;
border-top-left-radius: 0;
}
.show .ui-widget-content {
border-top: 1px solid #111;
border-bottom: 1px solid #111;
border-left: 0px;
border-right: 0px;
border-left: 0;
border-right: 0;
}
.ui-progressbar .ui-progressbar-value {
height:20px
@ -661,19 +664,19 @@ home.tmpl
}
.show .progress-80 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-60 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-40 {
border-radius: 0px;
border-radius: 0;
}
.show .progress-20 {
border-radius: 0px;
border-radius: 0;
}
.show-title {
@ -681,7 +684,7 @@ home.tmpl
overflow: hidden;
white-space: nowrap;
font-size: 11px;
margin: 4px 4px 0px 4px;
margin: 4px 4px 0 4px;
}
.show-title:after {
@ -704,7 +707,7 @@ home.tmpl
overflow: hidden;
white-space: nowrap;
font-size: 11px;
margin: 0px 4px 4px 4px;
margin: 0 4px 4px 4px;
}
.show-date:after {
@ -791,34 +794,27 @@ home_addShows.tmpl
========================================================================== */
#addShowPortal {
width: 750px;
width: 748px;
padding: 10px 0;
margin-right: auto;
margin-left: auto;
}
#addShowPortal a {
/* padding: 10px;*/
padding: 0px 20px;
padding: 0 20px;
width: 360px;
float: left;
margin: 0 15px 15px 0;
margin: 0 7px 14px;
}
div.button {
display: table-cell;
vertical-align: middle;
/* padding-left: 10px;*/
}
div.buttontext {
display: table-cell;
/*
padding-left: 20px;
padding: 10px 15px;
*/
padding: 10px 0px 10px 15px;
padding: 10px 0 10px 15px;
text-align: left;
white-space: normal;
}
@ -826,7 +822,7 @@ div.buttontext p {
margin: 0
}
div.buttontext h3 {
margin-top: 0px;
margin-top: 0;
}
div.buttontext p {
@ -970,7 +966,6 @@ home_trendingShows.tmpl
white-space: nowrap;
font-size: 12px;
overflow: hidden;
/* text-shadow: 1px 1px 0px #000;*/
padding-left: 4px;
margin: 0;
}
@ -1104,7 +1099,7 @@ ul.tags li {
border: 1px solid #111;
color: #FFF;
font: 14px/18px "Open Sans", "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
text-shadow: 0px 1px rgba(0, 0, 0, 0.8);
text-shadow: 0 1px rgba(0, 0, 0, 0.8);
float: left;
}
@ -1347,7 +1342,7 @@ td.col-search {
}
/* =======================================================================
comingEpisodes.tmpl
episodeView.tmpl
========================================================================== */
.sort_data {
@ -1409,7 +1404,7 @@ h2.day, h2.network {
letter-spacing: 1px;
color: #FFF;
text-align: center;
text-shadow: -1px -1px 0px rgba(0, 0, 0, 0.3);
text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);
background-color: #333;
}
@ -1418,7 +1413,7 @@ h2.day, h2.network {
clear: both;
border: 1px solid #ccc;
margin: auto;
padding: 0px;
padding: 0;
text-align: left;
width: 750px;
border-radius: 5px;
@ -1497,46 +1492,87 @@ h2.day, h2.network {
vertical-align: middle;
}
.calendarWrapper {
width:1000px;
.daybydayWrapper {
max-width: 1400px;
margin: 0 auto;
padding:0 3px
padding: 0 /*3px*/
}
.calendarTable {
.day-of-week {
float: left;
width:142px !important;
white-space:nowrap;
table-layout:fixed !important;
width: 14.28%;
padding: 0 2px;
}
.calendarShow {
padding:0 !important
.day-of-week .day-number {
position: relative;
height: 40px;
}
.calendarShow .poster {
padding-bottom:2px
}
.calendarShow .poster img {
width:142px;
height:auto
.day-of-week .day-number .number {
position: absolute;
right: 5px;
font-weight: bold;
font-size: 32px;
line-height: 38px;
}
.calendarShow .text {
padding:0 5px 10px 5px
.day-of-week .day-number .day {
position: absolute;
left: 5px;
top: 3px;
text-transform: uppercase;
font-weight: bold;
}
.calendarShow .text .airtime,
.calendarShow .text .episode-title {
.day-of-week .day-number .month {
position: absolute;
left: 5px;
bottom: 3px;
text-transform: uppercase;
}
.daybyday-show {
margin-top: 4px;
padding: 4px;
width: 100%
}
.day-of-week .poster img {
border: 1px solid;
border-radius: 5px;
margin-bottom: 2px;
display: block;
margin-left: auto;
margin-right: auto;
}
.day-of-week .text .airtime,
.day-of-week .text .episode {
overflow: hidden;
text-overflow: ellipsis;
display: block;
font-size:11px
font-size: 12px;
}
.calendarShow .show-status {
padding:5px 10px 10px;
text-align:center
.day-of-week .text .episode .season,
.day-of-week .text .episode .number {
font-weight: 900;
}
.day-of-week .text .episode .season {
margin-right: 2px;
}
.day-of-week .text .episode .number {
margin-left: 2px;
}
.day-of-week .episode-blank {
width: 250px;
height: 32px;
text-align: center;
font-style: italic;
display: table-cell;
vertical-align: middle;
font-size: 12px;
}
/* =======================================================================
@ -1873,7 +1909,7 @@ div.metadata_example label {
line-height: 21px;
display: block;
padding: 3px;
margin: 0px;
margin: 0;
}
div.metadata_options input {
margin-right: 3px;
@ -1886,7 +1922,7 @@ div.metadataDiv .disabled {
.notifier-icon {
float: left;
margin: 6px 4px 0px 0px;
margin: 6px 4px 0 0;
}
/* =======================================================================
@ -1918,7 +1954,7 @@ td.tableright {
text-align: left;
vertical-align: middle;
width: 225px;
padding: 6px 0px;
padding: 6px 0;
}
.optionWrapper div.selectChoices {
@ -1952,9 +1988,8 @@ Global
========================================================================== */
span.path {
padding: 3px 6px;
color: #8b0000;
background-color: #f5f1e4;
padding: 3px;
margin-left: 3px;
}
.align-left {
@ -1974,7 +2009,7 @@ span.quality {
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.08),rgba(255, 255, 255, 0) 50%,rgba(0, 0, 0, 0) 50%,rgba(0, 0, 0, 0.25));
-webkit-box-shadow:inset 0 1px rgba(255, 255, 255, 0.1),inset 0 -1px 3px rgba(0, 0, 0, 0.3),inset 0 0 0 1px rgba(255, 255, 255, 0.08),0 1px 2px rgba(0, 0, 0, 0.15);
box-shadow:inset 0 1px rgba(255, 255, 255, 0.1),inset 0 -1px 3px rgba(0, 0, 0, 0.3),inset 0 0 0 1px rgba(255, 255, 255, 0.08),0 1px 2px rgba(0, 0, 0, 0.15);
text-shadow: 0px 1px rgba(0, 0, 0, 0.8);
text-shadow: 0 1px rgba(0, 0, 0, 0.8);
color: #FFFFFF;
display: inline-block;
padding: 2px 4px;
@ -2094,7 +2129,7 @@ div.blackwhitelist span {
}
div.blackwhitelist.anidb, div.blackwhitelist.manual {
margin: 7px 0px;
margin: 7px 0;
}
@ -2114,12 +2149,12 @@ html * {
}
input[type="checkbox"] {
margin: 2px 0px 0px;
margin: 2px 0 0;
line-height: normal;
}
input[type="radio"] {
margin: 2px 0px 0px;
margin: 2px 0 0;
line-height: normal;
}
@ -2134,7 +2169,7 @@ input, textarea, select, .uneditable-input {
}
.navbar-brand {
padding: 0px;
padding: 0;
}
/* navbar styling */
@ -2261,7 +2296,7 @@ fieldset[disabled] .navbar-default .btn-link:focus {
.dropdown-menu {
background-color: #F5F1E4;
border: 1px solid rgba(0, 0, 0, 0.15);
box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.176);
}
.form-control {
@ -2818,7 +2853,7 @@ div.formpaginate .prev, div.formpaginate .next {
.stepDiv.parent-folder {
padding: 15px 0 0;
width: 430px;
margin: 0px auto;
margin: 0 auto;
}
.stepDiv .nocheck {
@ -3160,6 +3195,10 @@ span.token-input-delete-token {
.time-am-pm {
margin-left: 2px;
}
#content.episodeview-banner .time-am-pm,
#content.episodeview-poster .time-am-pm {
margin-left: 0;
}
/* =======================================================================
jquery.confirm.css
@ -3185,7 +3224,7 @@ jquery.confirm.css
top: 50%;
margin: -130px 0 0 -230px;
border: 1px solid #111;
box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.175);
box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.175);
}
#confirmBox h1,
@ -3220,7 +3259,7 @@ jquery.confirm.css
display: inline-block;
color: #fff;
text-align:center;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75);
background-clip: padding-box;
border: 1px solid #111;
border-radius: 3px;

View file

@ -90,8 +90,8 @@ addOption("postprocess", "process_method", "&process_method=copy");
addOption("postprocess", "type", "&type=manual")
addOption("sb.setdefaults", "Optional Param", "", 1);
addList("sb.setdefaults", "Exclude Paused Shows on ComingEps", "&future_show_paused=0", "sb.setdefaults-status");
addList("sb.setdefaults", "Include Paused Shows on ComingEps", "&future_show_paused=1", "sb.setdefaults-status");
addList("sb.setdefaults", "Exclude Paused Shows on EpisodeView", "&future_show_paused=0", "sb.setdefaults-status");
addList("sb.setdefaults", "Include Paused Shows on EpisodeView", "&future_show_paused=1", "sb.setdefaults-status");
addOption("sb.setdefaults-status", "Optional Param", "", 1);
addList("sb.setdefaults-status", "Wanted", "&status=wanted", "sb.setdefaults-opt");

View file

@ -1,549 +0,0 @@
#import sickbeard
#import datetime
#from sickbeard.common import *
#from sickbeard import sbdatetime
#from sickbeard.helpers import anon_url
#set global $title = 'Coming Episodes'
#set global $header = 'Coming Episodes'
#set global $sbPath = '..'
#set global $topmenu = 'comingEpisodes'
#import os.path
#include $os.path.join($sickbeard.PROG_DIR, 'gui/slick/interfaces/default/inc_top.tmpl')
#set $sort = $sickbeard.COMING_EPS_SORT
<script type="text/javascript" src="$sbRoot/js/ajaxEpSearch.js?$sbPID"></script>
#if $varExists('header')
<h1 class="header">$header</h1>
#else
<h1 class="title">$title</h1>
#end if
<style type="text/css">
#SubMenu {display:none}
#contentWrapper {padding-top:30px}
</style>
<div class="h2footer pull-right">
<span>Layout:
<select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
<option value="$sbRoot/setComingEpsLayout/?layout=poster" #if 'poster' == $sickbeard.COMING_EPS_LAYOUT then 'selected="selected"' else ''#>Poster</option>
<option value="$sbRoot/setComingEpsLayout/?layout=calendar" #if 'calendar' == $sickbeard.COMING_EPS_LAYOUT then 'selected="selected"' else ''#>Calendar</option>
<option value="$sbRoot/setComingEpsLayout/?layout=banner" #if 'banner' == $sickbeard.COMING_EPS_LAYOUT then 'selected="selected"' else ''#>Banner</option>
<option value="$sbRoot/setComingEpsLayout/?layout=list" #if 'list' == $sickbeard.COMING_EPS_LAYOUT then 'selected="selected"' else ''#>List</option>
</select>
</span>
&nbsp;
<span>Sort By:
<select name="sort" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
<option value="$sbRoot/setComingEpsSort/?sort=date" #if 'date' == $sickbeard.COMING_EPS_SORT then 'selected="selected"' else ''#>Date</option>
<option value="$sbRoot/setComingEpsSort/?sort=network" #if 'network' == $sickbeard.COMING_EPS_SORT then 'selected="selected"' else ''#>Network</option>
<option value="$sbRoot/setComingEpsSort/?sort=show" #if 'show' == $sickbeard.COMING_EPS_SORT then 'selected="selected"' else ''#>Show</option>
</select>
</span>
&nbsp;
<span>View Paused:
<select name="viewpaused" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
<option value="$sbRoot/toggleComingEpsDisplayPaused"<%= (' selected="selected"', '')[True == sickbeard.COMING_EPS_DISPLAY_PAUSED] %>>Hidden</option>
<option value="$sbRoot/toggleComingEpsDisplayPaused"<%= ('', ' selected="selected"')[True == sickbeard.COMING_EPS_DISPLAY_PAUSED] %>>Shown</option>
</select>
</span>
</div>
<div class="key pull-right">
#if 'calendar' != $layout:
<b>Key:</b>
<span class="listing-key listing-overdue">Missed</span>
<span class="listing-key listing-current">Current</span>
<span class="listing-key listing-default">Future</span>
<span class="listing-key listing-toofar">Distant</span>
#end if
<a class="btn btn-inline forceBacklog" href="webcal://$sbHost:$sbHttpPort/calendar">
<i class="icon-calendar icon-white"></i>Subscribe</a>
</div>
<br>
#if 'list' == $layout:
<!-- start list view //-->
<script type="text/javascript" src="$sbRoot/js/plotTooltip.js?$sbPID"></script>
<script type="text/javascript" charset="utf-8">
<!--
\$.tablesorter.addParser({
id: 'loadingNames',
is: function(s) {
return false
},
format: function(s) {
if (0 == s.indexOf('Loading...'))
return s.replace('Loading...', '000')
#if not $sickbeard.SORT_ARTICLE:
return (s || '').replace(/^(?:(?:A(?!\s+to)n?)|The)\s(\w)/i, '$1')
#else:
return (s || '')
#end if
},
type: 'text'
});
\$.tablesorter.addParser({
id: 'quality',
is: function(s) {
return false
},
format: function(s) {
return s.replace('hd1080p', 5).replace('hd720p', 4).replace('hd', 3).replace('sd', 2).replace('any', 1).replace('best', 0).replace('custom', 7)
},
type: 'numeric'
});
\$.tablesorter.addParser({
id: 'cDate',
is: function(s) {
return false
},
format: function(s) {
return s
},
type: 'numeric'
});
\$(document).ready(function(){
#set $sort_codes = {'date': 0, 'show': 1, 'network': 4}
#if $sort not in $sort_codes:
$sort = 'date'
#end if
sortList = [[$sort_codes[$sort], 0]];
\$('#showListTable:has(tbody tr)').tablesorter({
widgets: ['stickyHeaders'],
sortList: sortList,
textExtraction: {
0: function(node) { return \$(node).find('span').text().toLowerCase() },
4: function(node) { return \$(node).find('img').attr('alt') },
5: function(node) { return \$(node).find('span').text().toLowerCase() }
},
headers: {
0: { sorter: 'cDate' },
1: { sorter: 'loadingNames' },
2: { sorter: false },
3: { sorter: false },
4: { sorter: 'loadingNames' },
5: { sorter: 'quality' },
6: { sorter: false },
7: { sorter: false },
8: { sorter: false }
}
});
\$('#sbRoot').ajaxEpSearch();
#set $fuzzydate = 'airdate'
#if $sickbeard.FUZZY_DATING:
fuzzyMoment({
containerClass : '.${fuzzydate}',
dateHasTime : true,
dateFormat : '${sickbeard.DATE_PRESET}',
timeFormat : '${sickbeard.TIME_PRESET}',
trimZero : #if $sickbeard.TRIM_ZERO then 'true' else 'false'#
});
#end if
});
//-->
</script>
#set $show_div = 'listing-default'
<input type="hidden" id="sbRoot" value="$sbRoot" />
<table id="showListTable" class="sickbeardTable tablesorter seasonstyle" cellspacing="1" border="0" cellpadding="0">
<thead>
<tr>
<th>Airdate</th>
<th>Show</th>
<th class="nowrap">Next Ep</th>
<th>Next Ep Name</th>
<th>Network</th>
<th>Quality</th>
<th>Indexers</th>
<th>Search</th>
</tr>
</thead>
<tbody style="text-shadow:none;">
#for $cur_result in $sql_results:
#set $cur_indexer = int($cur_result['indexer'])
#set $runtime = $cur_result['runtime']
#if int($cur_result['paused']) and not $sickbeard.COMING_EPS_DISPLAY_PAUSED:
#continue
#end if
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'listing-overdue'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'listing-toofar'
#elif $cur_ep_airdate >= $today.date() and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'listing-current'
#else:
#set $show_div = 'listing-default'
#end if
#end if
#end if
<!-- start $cur_result['show_name'] //-->
<tr class="$show_div">
## forced to use a div to wrap airdate, the column sort went crazy with a span
<td align="center" class="nowrap">
<div class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($cur_result['localtime']).decode($sickbeard.SYS_ENCODING)</div><span class="sort_data">$time.mktime($cur_result['localtime'].timetuple())</span>
</td>
<td class="tvShow"><a href="$sbRoot/home/displayShow?show=${cur_result['showid']}">$cur_result['show_name']</a>
#if int($cur_result['paused']):
<span class="pause">[paused]</span>
#end if
</td>
<td class="nowrap" align="center">
<%= 'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode'])) %>
</td>
<td>
#if $cur_result['description']:
<img alt='' src='$sbRoot/images/info32.png' height='16' width='16' class='plotInfo' id="plot_info_<%= '%s_%s_%s' % (str(cur_result['showid']), str(cur_result['season']), str(cur_result['episode'])) %>" />
#else:
<img alt="" src="$sbRoot/images/info32.png" width="16" height="16" class="plotInfoNone" />
#end if
$cur_result['name']
</td>
<td align="center">
$cur_result['network']
</td>
<td align="center">
#if int($cur_result['quality']) in $qualityPresets:
<span class="quality $qualityPresetStrings[int($cur_result['quality'])]">$qualityPresetStrings[int($cur_result['quality'])]</span>
#else:
<span class="quality Custom">Custom</span>
#end if
</td>
<td align="center" style="vertical-align: middle;">
#if $cur_result['imdb_id']:
<a href="<%= anon_url('http://www.imdb.com/title/', cur_result['imdb_id']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="$sbRoot/images/imdb.png" />
#end if
<a href="<%= anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="$sickbeard.indexerApi($cur_indexer).config['show_url']${cur_result['showid']}"><img alt="$sickbeard.indexerApi($cur_indexer).name" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi($cur_indexer).config['icon']" /></a>
</td>
<td align="center">
<a href="$sbRoot/home/searchEpisode?show=${cur_result['showid']}&amp;season=$cur_result['season']&amp;episode=$cur_result['episode']" title="Manual Search" id="forceUpdate-${cur_result['showid']}" class="forceUpdate epSearch"><img alt="[search]" height="16" width="16" src="$sbRoot/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a>
</td>
</tr>
<!-- end $cur_result['show_name'] //-->
#end for
</tbody>
<tfoot>
<tr>
<th rowspan="1" colspan="10" align="center">&nbsp</th>
</tr>
</tfoot>
</table>
<!-- end list view //-->
#else if $layout in ['banner', 'poster']:
<!-- start non list view //-->
<script type="text/javascript" charset="utf-8">
<!--
\$(document).ready(function(){
\$('#sbRoot').ajaxEpSearch({'size': 16, 'loadingImage': 'loading16' + themeSpinner + '.gif'});
\$('.ep_summary').hide();
\$('.ep_summaryTrigger').click(function() {
\$(this).next('.ep_summary').slideToggle('normal', function() {
\$(this).prev('.ep_summaryTrigger').attr('src', function(i, src) {
return \$(this).next('.ep_summary').is(':visible') ? src.replace('plus','minus') : src.replace('minus','plus')
});
});
});
#set $fuzzydate = 'airdate'
#if $sickbeard.FUZZY_DATING:
fuzzyMoment({
dtInline : true,
dtGlue : ' at ',
containerClass : '.${fuzzydate}',
dateHasTime : true,
dateFormat : '${sickbeard.DATE_PRESET}',
timeFormat : '${sickbeard.TIME_PRESET}',
trimZero : #if $sickbeard.TRIM_ZERO then 'true' else 'false'#
});
#end if
});
//-->
</script>
#set $cur_segment = None
#set $too_late_header = False
#set $missed_header = False
#set $today_header = False
#set $show_div = 'ep_listing listing-default'
#if 'show' == $sort:
<br /><br />
#end if
#for $cur_result in $sql_results:
#set $cur_indexer = int($cur_result['indexer'])
<!-- start $cur_result['show_name'] //-->
#if int($cur_result['paused']) and not $sickbeard.COMING_EPS_DISPLAY_PAUSED:
#continue
#end if
#set $runtime = $cur_result['runtime']
#if 'network' == $sort:
#set $show_network = $cur_result['network'] if $cur_result['network'] else 'no network'
#if $cur_segment != $show_network:
<div class="comingepheader">
<br><h2 class="network">$show_network</h2>
#set $cur_segment = $cur_result['network']
#end if
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'ep_listing listing-overdue'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'ep_listing listing-toofar'
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'ep_listing listing-current'
#else:
#set $show_div = 'ep_listing listing-default'
#end if
#end if
#end if
#elif 'date' == $sort:
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $cur_segment != $cur_ep_airdate:
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today and $cur_ep_airdate != $today.date() and not $missed_header:
<br /><h2 class="day">Missed</h2>
#set $missed_header = True
#elif $cur_ep_airdate >= $next_week.date() and not $too_late_header:
<br /><h2 class="day">Later</h2>
#set $too_late_header = True
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
<br /><h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize() <span style="font-size: 14px; vertical-align: top;">[Today]</span></h2>
#set $today_header = True
#else:
<br /><h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize()</h2>
#end if
#end if
#end if
#set $cur_segment = $cur_ep_airdate
#end if
#if $cur_ep_airdate == $today.date() and not $today_header:
<div class="comingepheader">
<br /><h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize() <span style="font-size: 14px; vertical-align: top;">[Today]</span></h2>
#set $today_header = True
#end if
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'ep_listing listing-overdue'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'ep_listing listing-toofar'
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'ep_listing listing-current'
#else:
#set $show_div = 'ep_listing listing-default'
#end if
#end if
#end if
#elif 'show' == $sort:
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'ep_listing listing-overdue listingradius'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'ep_listing listing-toofar listingradius'
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'ep_listing listing-current listingradius'
#else:
#set $show_div = 'ep_listing listing-default listingradius'
#end if
#end if
#end if
#end if
<div class="$show_div" id="listing-${cur_result['showid']}">
<div class="tvshowDiv">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<th #if 'banner' == $layout then 'class="nobg"' else 'rowspan="2"'# valign="top">
<a href="$sbRoot/home/displayShow?show=${cur_result['showid']}"><img alt="" class="#if 'banner' == $layout then 'bannerThumb' else 'posterThumb'#" src="$sbRoot/showPoster/?show=${cur_result['showid']}&amp;which=#if 'poster' == $layout then 'poster_thumb' else $layout#" /></a>
</th>
#if 'banner' == $layout:
</tr>
<tr>
#end if
<td class="next_episode">
<div class="clearfix">
<span class="tvshowTitle">
<a href="$sbRoot/home/displayShow?show=${cur_result['showid']}">$cur_result['show_name']
#if int($cur_result['paused']):
<span class="pause">[paused]</span>
#end if
</a></span>
<span class="tvshowTitleIcons">
#if $cur_result['imdb_id']:
<a href="<%= anon_url('http://www.imdb.com/title/', cur_result['imdb_id']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="$sbRoot/images/imdb.png" />
#end if
<a href="<%= anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="$sickbeard.indexerApi($cur_indexer).config['show_url']${cur_result['showid']}"><img alt="$sickbeard.indexerApi($cur_indexer).name" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi($cur_indexer).config['icon']" /></a>
<span><a href="$sbRoot/home/searchEpisode?show=${cur_result['showid']}&amp;season=$cur_result['season']&amp;episode=$cur_result['episode']" title="Manual Search" id="forceUpdate-${cur_result['showid']}" class="epSearch forceUpdate"><img alt="[search]" height="16" width="16" src="$sbRoot/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a></span>
</span>
</div>
<span class="title">Next Episode:</span> <span><%= 'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode'])) %> - $cur_result['name']</span>
<div class="clearfix">
<span class="title">Airs: </span><span class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($cur_result['localtime']).decode($sickbeard.SYS_ENCODING)</span><%= ('', '<span> on %s</span>' % str(cur_result['network']))[None is not cur_result['network']] %>
</div>
<div class="clearfix">
<span class="title">Quality:</span>
#if int($cur_result['quality']) in $qualityPresets:
<span class="quality $qualityPresetStrings[int($cur_result['quality'])]">$qualityPresetStrings[int($cur_result['quality'])]</span>
#else:
<span class="quality Custom">Custom</span>
#end if
</div>
</td>
</tr>
<tr>
<td style="vertical-align: top;">
<div>
#if $cur_result['description']:
<span class="title" style="vertical-align:middle;">Plot:</span>
<img class="ep_summaryTrigger" src="$sbRoot/images/plus.png" height="16" width="16" alt="" title="Toggle Summary" /><div class="ep_summary">$cur_result['description']</div>
#else:
<span class="title ep_summaryTriggerNone" style="vertical-align:middle;">Plot:</span>
<img class="ep_summaryTriggerNone" src="$sbRoot/images/plus.png" height="16" width="16" alt="" />
#end if
</div>
</td>
</tr>
</table>
</div>
</div>
<!-- end $cur_result['show_name'] //-->
#end for
<!-- end non list view //-->
#end if
#if 'calendar' == $layout:
#set $today = datetime.date.today()
#set $dates = [$today + datetime.timedelta(days = $i) for $i in range(7)]
#set $tbl_day = 0
<br>
<br>
<div class="calendarWrapper">
<input type="hidden" id="sbRoot" value="$sbRoot" />
#for $day in $dates
#set $tbl_day += 1
<table class="sickbeardTable tablesorter calendarTable <%= 'cal-%s' % (('even', 'odd')[1 == tbl_day % 2]) %>" cellspacing="0" border="0" cellpadding="0">
<thead><tr><th>$sbdatetime.sbdatetime.sbfdate($day, '%A').decode($sickbeard.SYS_ENCODING).capitalize()</th></tr></thead>
<tbody>
#set $day_has_show = False
#for $cur_result in $sql_results:
#if int($cur_result['paused']) and not $sickbeard.COMING_EPS_DISPLAY_PAUSED:
#continue
#end if
#set $cur_indexer = int($cur_result['indexer'])
#set $runtime = $cur_result['runtime']
#set $airday = $cur_result['localtime'].date()
#if $airday == $day:
#set $day_has_show = True
#set $airtime = $sbdatetime.sbdatetime.sbftime($cur_result['localtime']).decode($sickbeard.SYS_ENCODING)
#if $sickbeard.TRIM_ZERO:
#set $airtime = re.sub(r'0(\d:\d\d)', r'\1', $airtime, 0, re.IGNORECASE | re.MULTILINE)
#end if
<tr>
<td class="calendarShow">
<div class="poster">
<a title="${cur_result['show_name']}" href="$sbRoot/home/displayShow?show=${cur_result['showid']}"><img alt="" src="$sbRoot/showPoster/?show=${cur_result['showid']}&amp;which=poster_thumb" /></a>
</div>
<div class="text">
<span class="airtime">
${airtime} on $cur_result["network"]
</span>
<span class="episode-title" title="$cur_result['name']">
<%= 'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode'])) %> - $cur_result['name']
</span>
</div>
</td> <!-- end $cur_result['show_name'] -->
</tr>
#end if
#end for
#if not $day_has_show:
<tr><td class="calendarShow"><span class="show-status">No shows for this day</span></td></tr>
#end if
</tbody>
</table>
#end for
<!-- end calender view //-->
</div>
#end if
<div class="clearfix"></div>
<script type="text/javascript" charset="utf-8">
<!--
window.setInterval('location.reload(true)', 600000); // Refresh every 10 minutes
//-->
</script>
#include $os.path.join($sickbeard.PROG_DIR, 'gui/slick/interfaces/default/inc_bottom.tmpl')

View file

@ -570,7 +570,7 @@
</div><!-- /component-group3 //-->
<br/>
<h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">$sickbeard.DATA_DIR</span></b> </h6>
<h6 class="pull-right"><b class="boldest">All non-absolute folder locations are relative to <span class="path">$sickbeard.DATA_DIR</span></b></h6>
<input type="submit" class="btn pull-left config_submitter button" value="Save Changes" />
</div><!-- /config-components -->

View file

@ -0,0 +1,695 @@
#import sickbeard
#import datetime
#from sickbeard.common import *
#from sickbeard import sbdatetime
#from sickbeard.helpers import anon_url
#set global $title = 'Episode View'
#set global $header = 'Episode View'
#set global $sbPath = '..'
#set global $topmenu = 'episodeView'
#import os.path
#include $os.path.join($sickbeard.PROG_DIR, 'gui/slick/interfaces/default/inc_top.tmpl')
#set $sort = $sickbeard.EPISODE_VIEW_SORT
#set $table_sort_header_codes = {'time': 0, 'show': 1, 'network': 4}
#if $sort not in $table_sort_header_codes:
#set $sort = 'time'
#end if
#if 'daybyday' != $layout:
<script type="text/javascript" src="$sbRoot/js/ajaxEpSearch.js?$sbPID"></script>
#end if
#if $varExists('header')
<h1 class="header">$header</h1>
#else
<h1 class="title">$title</h1>
#end if
#if 'daybyday' == $layout:
<script type="text/javascript" src="$sbRoot/js/plotTooltip.js?$sbPID"></script>
<script type="text/javascript" charset="utf-8">
<!--
\$(document).ready(function(){
var \$container = [];
\$.each(\$('[id^=day]'), function(){\$container.push(\$('#' + \$(this).attr('id')))});
jQuery.each(\$container, function(j) {
this.isotope({
itemSelector: '.daybyday-show',
sortBy : '$sort',
layoutMode: 'vertical',
transitionDuration: 0,
getSortData: {
network: function(itemElem) {
return \$(itemElem).attr('data-network') || '';
},
showname: function(itemElem) {
return \$(itemElem).attr('data-name') || '';
},
season: function(itemElem) {
var season = \$(itemElem).attr('data-season') || '0';
return season.length && parseInt(season, 10);
},
episode: function(itemElem) {
var episode = \$(itemElem).attr('data-episode') || '0';
return episode.length && parseInt(episode, 10);
},
time: function(itemElem) {
var time = \$(itemElem).attr('data-time') || '0';
return time.length && parseInt(time, 10);
}
}
});
});
imagesLoaded('.daybyday-show', function() {
jQuery.each(\$container, function(j) {
this.isotope('layout');
});
});
var uiSortBy = (function(sortBy) {
var sortCriteria;
switch (sortBy) {
case 'network':
sortCriteria = ['network', 'time', 'showname', 'season', 'episode'];
break;
case 'show':
sortCriteria = ['showname', 'time', 'season', 'episode'];
break;
case 'time':
default:
sortCriteria = ['time', 'showname', 'season', 'episode'];
break;
}
jQuery.each(\$container, function(j) {
this.isotope({
sortBy: sortCriteria,
sortAscending: 'asc' == \$('#sort-dir').attr('data-sort-dir')
});
});
});
\$('#sort').on('change', function() {
uiSortBy(this.value);
\$.get(this.options[this.selectedIndex].getAttribute('data-sort'));
});
\$('#sort-dir').on('click', function() {
var sortdir = \$(this).attr('data-sort-dir'),
newdir = ('asc' == sortdir ? 'desc' : 'asc');
\$(this).attr('data-sort-dir', newdir);
\$(this).attr('title', 'Click to sort ' + sortdir + 'ending');
\$(this).removeClass(sortdir).addClass(newdir);
uiSortBy(\$('#sort').val());
});
});
//-->
</script>
#end if
<style type="text/css">
#SubMenu {display:none}
#if 'daybyday' == $layout:
.caret {
cursor: pointer;
vertical-align: middle;
margin-right: 2px;
}
.asc {
border-top: 0;
border-bottom: 8px solid;
}
.desc {
border-top: 8px solid;
border-bottom: 0;
}
#end if
</style>
<div class="h2footer pull-right">
<span>Layout:
<select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
<option value="$sbRoot/setEpisodeViewLayout/?layout=banner" #if 'banner' == $sickbeard.EPISODE_VIEW_LAYOUT then 'selected="selected"' else ''#>Banner</option>
<option value="$sbRoot/setEpisodeViewLayout/?layout=daybyday" #if 'daybyday' == $sickbeard.EPISODE_VIEW_LAYOUT then 'selected="selected"' else ''#>Day by Day</option>
<option value="$sbRoot/setEpisodeViewLayout/?layout=list" #if 'list' == $sickbeard.EPISODE_VIEW_LAYOUT then 'selected="selected"' else ''#>List</option>
<option value="$sbRoot/setEpisodeViewLayout/?layout=poster" #if 'poster' == $sickbeard.EPISODE_VIEW_LAYOUT then 'selected="selected"' else ''#>Poster</option>
</select>
</span>
&nbsp;
<span>Sort
#if 'daybyday' == $layout:
<span id="sort-dir" data-sort-dir="asc" class="caret asc" title="Click to sort descending">&nbsp;</span>
#end if
By
#if 'daybyday' == $layout:
<select name="sort" id="sort" class="form-control form-control-inline input-sm">
<option value="network" data-sort="$sbRoot/setEpisodeViewSort/?sort=network&redir=0" #if 'network' == $sort then 'selected="selected"' else ''#>Network</option>
<option value="show" data-sort="$sbRoot/setEpisodeViewSort/?sort=show&redir=0" #if 'show' == $sort then 'selected="selected"' else ''#>Show</option>
<option value="time" data-sort="$sbRoot/setEpisodeViewSort/?sort=time&redir=0" #if 'time' == $sort then 'selected="selected"' else ''#>Time</option>
#else
<select name="sort" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
<option value="$sbRoot/setEpisodeViewSort/?sort=time" #if 'time' == $sort then 'selected="selected"' else ''#>Date/Time</option>
<option value="$sbRoot/setEpisodeViewSort/?sort=network" #if 'network' == $sort then 'selected="selected"' else ''#>Network</option>
<option value="$sbRoot/setEpisodeViewSort/?sort=show" #if 'show' == $sort then 'selected="selected"' else ''#>Show</option>
#end if
</select>
</span>
&nbsp;
<span>View Paused:
<select name="viewpaused" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
<option value="$sbRoot/toggleEpisodeViewDisplayPaused"<%= (' selected="selected"', '')[True == sickbeard.EPISODE_VIEW_DISPLAY_PAUSED] %>>Hidden</option>
<option value="$sbRoot/toggleEpisodeViewDisplayPaused"<%= ('', ' selected="selected"')[True == sickbeard.EPISODE_VIEW_DISPLAY_PAUSED] %>>Shown</option>
</select>
</span>
</div>
<div class="key pull-right">
#if 'daybyday' != $layout:
<b>Key:</b>
<span class="listing-key listing-overdue">Missed</span>
<span class="listing-key listing-current">Current</span>
<span class="listing-key listing-default">Future</span>
<span class="listing-key listing-toofar">Distant</span>
#end if
<a class="btn btn-inline forceBacklog" href="webcal://$sbHost:$sbHttpPort/calendar">
<i class="icon-calendar icon-white"></i>Subscribe</a>
</div>
<br>
#if 'list' == $layout:
<!-- start list view //-->
<script type="text/javascript" src="$sbRoot/js/plotTooltip.js?$sbPID"></script>
<script type="text/javascript" charset="utf-8">
<!--
\$.tablesorter.addParser({
id: 'loadingNames',
is: function(s) {
return false
},
format: function(s) {
if(0 == s.indexOf('Loading...'))
return s.replace('Loading...', '000')
return (s || '')
},
type: 'text'
});
\$.tablesorter.addParser({
id: 'quality',
is: function(s) {
return false
},
format: function(s) {
return s.replace('hd1080p', 5).replace('hd720p', 4).replace('hd', 3).replace('sd', 2).replace('any', 1).replace('best', 0).replace('custom', 7)
},
type: 'numeric'
});
\$.tablesorter.addParser({
id: 'cDate',
is: function(s) {
return false
},
format: function(s) {
return s
},
type: 'numeric'
});
\$(document).ready(function(){
sortList = [[$table_sort_header_codes[$sort], 0]];
\$('#showListTable:has(tbody tr)').tablesorter({
widgets: ['stickyHeaders'],
sortList: sortList,
textExtraction: {
0: function(node) {return \$(node).find('span').text().toLowerCase() || ''},
1: function(node) {return \$(node).find('a').attr('data-name') || ''},
4: function(node) {return \$(node).find('span').attr('data-network') || ''},
5: function(node) {return \$(node).find('span').text().toLowerCase() || ''}
},
headers: {
0: {sorter: 'cDate'},
1: {sorter: 'loadingNames'},
2: {sorter: false},
3: {sorter: false},
4: {sorter: 'loadingNames'},
5: {sorter: 'quality'},
6: {sorter: false},
7: {sorter: false},
8: {sorter: false}
}
});
\$('#sbRoot').ajaxEpSearch();
#set $fuzzydate = 'airdate'
#if $sickbeard.FUZZY_DATING:
fuzzyMoment({
containerClass : '.${fuzzydate}',
dateHasTime : true,
dateFormat : '${sickbeard.DATE_PRESET}',
timeFormat : '${sickbeard.TIME_PRESET}',
trimZero : #if $sickbeard.TRIM_ZERO then 'true' else 'false'#
});
#end if
});
//-->
</script>
#set $show_div = 'listing-default'
<input type="hidden" id="sbRoot" value="$sbRoot" />
<table id="showListTable" class="sickbeardTable tablesorter seasonstyle" cellspacing="1" border="0" cellpadding="0">
<thead>
<tr>
<th>Airdate</th>
<th>Show</th>
<th class="nowrap">Next Ep</th>
<th>Next Ep Name</th>
<th>Network</th>
<th>Quality</th>
<th>Indexers</th>
<th>Search</th>
</tr>
</thead>
<tbody style="text-shadow:none;">
#for $cur_result in $sql_results:
#set $cur_indexer = int($cur_result['indexer'])
#set $runtime = $cur_result['runtime']
#if int($cur_result['paused']) and not $sickbeard.EPISODE_VIEW_DISPLAY_PAUSED:
#continue
#end if
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'listing-overdue'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'listing-toofar'
#elif $cur_ep_airdate >= $today.date() and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'listing-current'
#else:
#set $show_div = 'listing-default'
#end if
#end if
#end if
<!-- start $cur_result['show_name'] //-->
<tr class="$show_div">
## forced to use a div to wrap airdate, the column sort went crazy with a span
<td align="center" class="nowrap">
<div class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($cur_result['localtime']).decode($sickbeard.SYS_ENCODING)</div><span class="sort_data">$time.mktime($cur_result['localtime'].timetuple())</span>
</td>
<td class="tvShow"><a href="$sbRoot/home/displayShow?show=${cur_result['showid']}" data-name="$cur_result['data_show_name']">$cur_result['show_name']</a>
#if int($cur_result['paused']):
<span class="pause">[paused]</span>
#end if
</td>
<td class="nowrap" align="center">
<%= 'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode'])) %>
</td>
<td>
#if $cur_result['description']:
<img alt="" src="$sbRoot/images/info32.png" height="16" width="16" class="plotInfo" id="plot_info_<%= '%s_%s_%s' % (str(cur_result['showid']), str(cur_result['season']), str(cur_result['episode'])) %>" />
#else:
<img alt="" src="$sbRoot/images/info32.png" width="16" height="16" class="plotInfoNone" />
#end if
$cur_result['name']
</td>
<td align="center">
<span data-network="$cur_result['data_network']">$cur_result['network']</span>
</td>
<td align="center">
#if int($cur_result['quality']) in $qualityPresets:
<span class="quality $qualityPresetStrings[int($cur_result['quality'])]">$qualityPresetStrings[int($cur_result['quality'])]</span>
#else:
<span class="quality Custom">Custom</span>
#end if
</td>
<td align="center" style="vertical-align: middle;">
#if $cur_result['imdb_id']:
<a href="<%= anon_url('http://www.imdb.com/title/', cur_result['imdb_id']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="$sbRoot/images/imdb.png" />
#end if
<a href="<%= anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="$sickbeard.indexerApi($cur_indexer).config['show_url']${cur_result['showid']}"><img alt="$sickbeard.indexerApi($cur_indexer).name" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi($cur_indexer).config['icon']" /></a>
</td>
<td align="center">
<a href="$sbRoot/home/searchEpisode?show=${cur_result['showid']}&amp;season=$cur_result['season']&amp;episode=$cur_result['episode']" title="Manual Search" id="forceUpdate-${cur_result['showid']}" class="forceUpdate epSearch"><img alt="[search]" height="16" width="16" src="$sbRoot/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a>
</td>
</tr>
<!-- end $cur_result['show_name'] //-->
#end for
</tbody>
<tfoot>
<tr>
<th rowspan="1" colspan="10" align="center">&nbsp</th>
</tr>
</tfoot>
</table>
<!-- end list view //-->
#else if $layout in ['banner', 'poster']:
<!-- start non list view //-->
<script type="text/javascript" charset="utf-8">
<!--
\$(document).ready(function(){
\$('#sbRoot').ajaxEpSearch({'size': 16, 'loadingImage': 'loading16' + themeSpinner + '.gif'});
\$('.ep_summary').hide();
\$('.ep_summaryTrigger').click(function() {
\$(this).next('.ep_summary').slideToggle('normal', function() {
\$(this).prev('.ep_summaryTrigger').attr('src', function(i, src) {
return \$(this).next('.ep_summary').is(':visible') ? src.replace('plus','minus') : src.replace('minus','plus')
});
});
});
#set $fuzzydate = 'airdate'
#if $sickbeard.FUZZY_DATING:
fuzzyMoment({
dtInline : true,
dtGlue : ' at ',
containerClass : '.${fuzzydate}',
dateHasTime : true,
dateFormat : '${sickbeard.DATE_PRESET}',
timeFormat : '${sickbeard.TIME_PRESET}',
trimZero : #if $sickbeard.TRIM_ZERO then 'true' else 'false'#
});
#end if
});
//-->
</script>
#set $cur_segment = None
#set $too_late_header = False
#set $missed_header = False
#set $today_header = False
#set $show_div = 'ep_listing listing-default'
#if 'show' == $sort:
<br /><br />
#end if
#for $cur_result in $sql_results:
#set $cur_indexer = int($cur_result['indexer'])
#if int($cur_result['paused']) and not $sickbeard.EPISODE_VIEW_DISPLAY_PAUSED:
#continue
#end if
#set $runtime = $cur_result['runtime']
#if 'network' == $sort:
#set $show_network = $cur_result['network'] if $cur_result['network'] else 'no network'
#if $cur_segment != $show_network:
<div class="episode-view-header">
<br><h2 class="network">$show_network</h2>
#set $cur_segment = $cur_result['network']
#end if
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'ep_listing listing-overdue'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'ep_listing listing-toofar'
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'ep_listing listing-current'
#else:
#set $show_div = 'ep_listing listing-default'
#end if
#end if
#end if
#elif 'time' == $sort:
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $cur_segment != $cur_ep_airdate:
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today and $cur_ep_airdate != $today.date() and not $missed_header:
<br /><h2 class="day">Missed</h2>
#set $missed_header = True
#elif $cur_ep_airdate >= $next_week.date() and not $too_late_header:
<br /><h2 class="day">Later</h2>
#set $too_late_header = True
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
<br /><h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize() <span style="font-size: 14px; vertical-align: top;">[Today]</span></h2>
#set $today_header = True
#else:
<br /><h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize()</h2>
#end if
#end if
#end if
#set $cur_segment = $cur_ep_airdate
#end if
#if $cur_ep_airdate == $today.date() and not $today_header:
<div class="episode-view-header">
<br /><h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize() <span style="font-size: 14px; vertical-align: top;">[Today]</span></h2>
#set $today_header = True
#end if
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'ep_listing listing-overdue'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'ep_listing listing-toofar'
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'ep_listing listing-current'
#else:
#set $show_div = 'ep_listing listing-default'
#end if
#end if
#end if
#elif 'show' == $sort:
#set $cur_ep_airdate = $cur_result['localtime'].date()
#if $runtime:
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
#if $cur_ep_enddate < $today:
#set $show_div = 'ep_listing listing-overdue listingradius'
#elif $cur_ep_airdate >= $next_week.date():
#set $show_div = 'ep_listing listing-toofar listingradius'
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date():
#if $cur_ep_airdate == $today.date():
#set $show_div = 'ep_listing listing-current listingradius'
#else:
#set $show_div = 'ep_listing listing-default listingradius'
#end if
#end if
#end if
#end if
<!-- start $cur_result['show_name'] //-->
<div class="$show_div" id="listing-${cur_result['showid']}">
<div class="tvshowDiv">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<th #if 'banner' == $layout then 'class="nobg"' else 'rowspan="2"'# valign="top">
<a href="$sbRoot/home/displayShow?show=${cur_result['showid']}"><img alt="" class="#if 'banner' == $layout then 'bannerThumb' else 'posterThumb'#" src="$sbRoot/showPoster/?show=${cur_result['showid']}&amp;which=#if 'poster' == $layout then 'poster_thumb' else $layout#" /></a>
</th>
#if 'banner' == $layout:
</tr>
<tr>
#end if
<td class="next_episode">
<div class="clearfix">
<span class="tvshowTitle">
<a href="$sbRoot/home/displayShow?show=${cur_result['showid']}" data-name="$cur_result['data_show_name']">$cur_result['show_name']
#if int($cur_result['paused']):
<span class="pause">[paused]</span>
#end if
</a></span>
<span class="tvshowTitleIcons">
#if $cur_result['imdb_id']:
<a href="<%= anon_url('http://www.imdb.com/title/', cur_result['imdb_id']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[imdb]" height="16" width="16" src="$sbRoot/images/imdb.png" />
#end if
<a href="<%= anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="$sickbeard.indexerApi($cur_indexer).config['show_url']${cur_result['showid']}"><img alt="$sickbeard.indexerApi($cur_indexer).name" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi($cur_indexer).config['icon']" /></a>
<span><a href="$sbRoot/home/searchEpisode?show=${cur_result['showid']}&amp;season=$cur_result['season']&amp;episode=$cur_result['episode']" title="Manual Search" id="forceUpdate-${cur_result['showid']}" class="epSearch forceUpdate"><img alt="[search]" height="16" width="16" src="$sbRoot/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a></span>
</span>
</div>
<span class="title">Next Episode:</span> <span><%= 'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode'])) %> - $cur_result['name']</span>
<div class="clearfix">
<span class="title">Airdate: </span><span class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($cur_result['localtime']).decode($sickbeard.SYS_ENCODING)</span><%= ('', '<span> on %s</span>' % str(cur_result['network']))[None is not cur_result['network']] %>
</div>
<div class="clearfix">
<span class="title">Quality:</span>
#if int($cur_result['quality']) in $qualityPresets:
<span class="quality $qualityPresetStrings[int($cur_result['quality'])]">$qualityPresetStrings[int($cur_result['quality'])]</span>
#else:
<span class="quality Custom">Custom</span>
#end if
</div>
</td>
</tr>
<tr>
<td style="vertical-align: top;">
<div>
#if $cur_result['description']:
<span class="title" style="vertical-align:middle;">Plot:</span>
<img class="ep_summaryTrigger" src="$sbRoot/images/plus.png" height="16" width="16" alt="" title="Toggle Summary" /><div class="ep_summary">$cur_result['description']</div>
#else:
<span class="title ep_summaryTriggerNone" style="vertical-align:middle;">Plot:</span>
<img class="ep_summaryTriggerNone" src="$sbRoot/images/plus.png" height="16" width="16" alt="" />
#end if
</div>
</td>
</tr>
</table>
</div>
</div>
<!-- end $cur_result['show_name'] //-->
#end for
<!-- end non list view //-->
#end if
#if 'daybyday' == $layout:
#set $today = datetime.date.today()
#set $dates = [$today + datetime.timedelta(days = $i) for $i in range(7)]
#set $tbl_day = 0
<input type="hidden" id="sbRoot" value="$sbRoot" />
<br>
<br>
<div class="daybydayWrapper"> <!-- style="width:1600px" -->
#for $day in $dates
#set $tbl_day += 1
#set $col_class = ''
#if 1 == $tbl_day
#set $col_class = 'today'
#end if
#set $col_class = '%s %s' % ($col_class, ('even', 'odd')[1 == tbl_day % 2])
<div class="day-of-week $col_class">
<div class="day-number">
<div class="number">$sbdatetime.sbdatetime.sbfdate($day, ' %d').decode($sickbeard.SYS_ENCODING).replace(' 0', ' ')</div>
<div class="day">
<span class="visible-lg">$sbdatetime.sbdatetime.sbfdate($day, '%A').decode($sickbeard.SYS_ENCODING).capitalize()</span>
<span class="hidden-lg">$sbdatetime.sbdatetime.sbfdate($day, '%a').decode($sickbeard.SYS_ENCODING).capitalize()</span>
</div>
<div class="month">
<span class="visible-lg">$sbdatetime.sbdatetime.sbfdate($day, '%B').decode($sickbeard.SYS_ENCODING).capitalize()</span>
<span class="hidden-lg">$sbdatetime.sbdatetime.sbfdate($day, '%b').decode($sickbeard.SYS_ENCODING).capitalize()</span>
</div>
</div>
<div id="$sbdatetime.sbdatetime.sbfdate($day, 'day%w')">
#set $day_has_show = False
#for $cur_result in $sql_results:
#if int($cur_result['paused']) and not $sickbeard.EPISODE_VIEW_DISPLAY_PAUSED:
#continue
#end if
#set $cur_indexer = int($cur_result['indexer'])
#set $runtime = $cur_result['runtime']
#set $airday = $cur_result['localtime'].date()
#if $airday == $day:
#set $day_has_show = True
#set $airtime = $sbdatetime.sbdatetime.sbftime($cur_result['localtime'], markup=True).decode($sickbeard.SYS_ENCODING)
#set $img_tag = '<img'
#set $plot_class = 'class="img-responsive'
#set $title_text = ''
#if $cur_result['description']:
#set $img_tag += ' id="plot_info_%s_%s_%s"' % (str($cur_result['showid']), str($cur_result['season']), str($cur_result['episode']))
#set $plot_class += ' plot-daybyday'
#else
#set $title_text = $cur_result['show_name']
#end if
<div id="show-$cur_result['showid']" class="daybyday-show" data-name="$cur_result['data_show_name']" data-season="$cur_result['season']" data-episode="$cur_result['episode']" data-network="$cur_result['data_network']" data-time="$time.mktime($cur_result['localtime'].timetuple())">
<div class="poster">
<a title="${title_text}" href="$sbRoot/home/displayShow?show=${cur_result['showid']}">
${img_tag} ${plot_class}" alt="" src="$sbRoot/showPoster/?show=${cur_result['showid']}&amp;which=poster_thumb" /></a>
</div>
<div class="text">
<div class="airtime">
<span class="time">${airtime}</span> <span class="network pull-right grey-text">$cur_result['network']</span>
</div>
<div class="episode" title="$cur_result['name']">
<span class="season"><%= '%i' % int(cur_result['season']) %></span>x<span class="number"><%= '%02i' % int(cur_result['episode']) %></span>
<span class="name">$cur_result['name']</span>
#if int($cur_result['paused']):
<span class="pause">[paused]</span>
#end if
</div>
</div>
</div><!-- end show-$cur_result['showid'] //-->
#end if
#end for
#if not $day_has_show:
<div class="daybyday-show">
<span class="episode-blank">No shows for this day</span>
</div>
#end if
</div>
</div>
#end for
</div>
<!-- end calender view //-->
#end if
<div class="clearfix"></div>
<script type="text/javascript" charset="utf-8">
<!--
window.setInterval('location.reload(true)', 30*60000); // Refresh every xx minutes
//-->
</script>
#include $os.path.join($sickbeard.PROG_DIR, 'gui/slick/interfaces/default/inc_bottom.tmpl')

View file

@ -11,7 +11,7 @@
#set global $sbPath='..'
#set global $topmenu='comingEpisodes'
#set global $topmenu='episodeView'
#import os.path
#include $os.path.join($sickbeard.PROG_DIR, 'gui/slick/interfaces/default/inc_top.tmpl')

View file

@ -57,6 +57,7 @@
<script type="text/javascript" src="$sbRoot/js/lib/jquery.form-3.35.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.ui.touch-punch-0.2.2.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/isotope.pkgd.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/imagesloaded.pkgd.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.confirm.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/script.js?$sbPID"></script>
@ -149,8 +150,8 @@
</ul>
</li>
<li id="NAVcomingEpisodes">
<a href="$sbRoot/comingEpisodes/" tabindex="$tab#set $tab += 1#">Coming Episodes</a>
<li id="NAVepisodeView">
<a href="$sbRoot/episodeView/" tabindex="$tab#set $tab += 1#">Episodes</a>
</li>
<li id="NAVhistory">
@ -261,6 +262,6 @@
#except (NameError, NotFound):
#pass
#end try
#set $page_class = ('', ' class="%s"' % '_'.join($items).lower().replace(' ', '-'))[0 < len($items)]
#set $page_class = ('', ' class="%s"' % '_'.join($items).lower().replace(' ', '-').replace('_', '-'))[0 < len($items)]
<div id="contentWrapper">
<div id="content"$page_class>

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
$(function () {
$('.plotInfo').each(function () {
$('.plotInfo, .plot-daybyday').each(function () {
var match = $(this).attr('id').match(/^plot_info_(\d+)_(\d+)_(\d+)$/);
$(this).qtip({
content: {

View file

@ -58,7 +58,7 @@ CFG = None
CONFIG_FILE = None
# This is the version of the config we EXPECT to find
CONFIG_VERSION = 6
CONFIG_VERSION = 7
# Default encryption version (0 for None)
ENCRYPTION_VERSION = 0
@ -419,10 +419,10 @@ GUI_NAME = None
HOME_LAYOUT = None
HISTORY_LAYOUT = None
DISPLAY_SHOW_SPECIALS = False
COMING_EPS_LAYOUT = None
COMING_EPS_DISPLAY_PAUSED = False
COMING_EPS_SORT = None
COMING_EPS_MISSED_RANGE = None
EPISODE_VIEW_LAYOUT = None
EPISODE_VIEW_SORT = None
EPISODE_VIEW_DISPLAY_PAUSED = False
EPISODE_VIEW_MISSED_RANGE = None
FUZZY_DATING = False
TRIM_ZERO = False
DATE_PRESET = None
@ -499,7 +499,7 @@ def initialize(consoleLogging=True):
USE_EMAIL, EMAIL_HOST, EMAIL_PORT, EMAIL_TLS, EMAIL_USER, EMAIL_PASSWORD, EMAIL_FROM, EMAIL_NOTIFY_ONSNATCH, EMAIL_NOTIFY_ONDOWNLOAD, EMAIL_NOTIFY_ONSUBTITLEDOWNLOAD, EMAIL_LIST, \
USE_LISTVIEW, METADATA_XBMC, METADATA_XBMC_12PLUS, METADATA_MEDIABROWSER, METADATA_PS3, metadata_provider_dict, \
NEWZBIN, NEWZBIN_USERNAME, NEWZBIN_PASSWORD, GIT_PATH, MOVE_ASSOCIATED_FILES, POSTPONE_IF_SYNC_FILES, recentSearchScheduler, NFO_RENAME, \
GUI_NAME, HOME_LAYOUT, HISTORY_LAYOUT, DISPLAY_SHOW_SPECIALS, COMING_EPS_LAYOUT, COMING_EPS_SORT, COMING_EPS_DISPLAY_PAUSED, COMING_EPS_MISSED_RANGE, FUZZY_DATING, TRIM_ZERO, DATE_PRESET, TIME_PRESET, TIME_PRESET_W_SECONDS, THEME_NAME, \
GUI_NAME, HOME_LAYOUT, HISTORY_LAYOUT, DISPLAY_SHOW_SPECIALS, EPISODE_VIEW_LAYOUT, EPISODE_VIEW_SORT, EPISODE_VIEW_DISPLAY_PAUSED, EPISODE_VIEW_MISSED_RANGE, FUZZY_DATING, TRIM_ZERO, DATE_PRESET, TIME_PRESET, TIME_PRESET_W_SECONDS, THEME_NAME, \
POSTER_SORTBY, POSTER_SORTDIR, \
METADATA_WDTV, METADATA_TIVO, METADATA_MEDE8ER, IGNORE_WORDS, REQUIRE_WORDS, CALENDAR_UNPROTECTED, CREATE_MISSING_SHOW_DIRS, \
ADD_SHOWS_WO_DIR, USE_SUBTITLES, SUBTITLES_LANGUAGES, SUBTITLES_DIR, SUBTITLES_SERVICES_LIST, SUBTITLES_SERVICES_ENABLED, SUBTITLES_HISTORY, SUBTITLES_FINDER_FREQUENCY, subtitlesFinderScheduler, \
@ -944,10 +944,10 @@ def initialize(consoleLogging=True):
HOME_LAYOUT = check_setting_str(CFG, 'GUI', 'home_layout', 'poster')
HISTORY_LAYOUT = check_setting_str(CFG, 'GUI', 'history_layout', 'detailed')
DISPLAY_SHOW_SPECIALS = bool(check_setting_int(CFG, 'GUI', 'display_show_specials', 1))
COMING_EPS_LAYOUT = check_setting_str(CFG, 'GUI', 'coming_eps_layout', 'banner')
COMING_EPS_DISPLAY_PAUSED = bool(check_setting_int(CFG, 'GUI', 'coming_eps_display_paused', 0))
COMING_EPS_SORT = check_setting_str(CFG, 'GUI', 'coming_eps_sort', 'date')
COMING_EPS_MISSED_RANGE = check_setting_int(CFG, 'GUI', 'coming_eps_missed_range', 7)
EPISODE_VIEW_LAYOUT = check_setting_str(CFG, 'GUI', 'episode_view_layout', 'banner')
EPISODE_VIEW_SORT = check_setting_str(CFG, 'GUI', 'episode_view_sort', 'time')
EPISODE_VIEW_DISPLAY_PAUSED = bool(check_setting_int(CFG, 'GUI', 'episode_view_display_paused', 0))
EPISODE_VIEW_MISSED_RANGE = check_setting_int(CFG, 'GUI', 'episode_view_missed_range', 7)
FUZZY_DATING = bool(check_setting_int(CFG, 'GUI', 'fuzzy_dating', 0))
TRIM_ZERO = bool(check_setting_int(CFG, 'GUI', 'trim_zero', 0))
DATE_PRESET = check_setting_str(CFG, 'GUI', 'date_preset', '%x')
@ -1763,10 +1763,10 @@ def save_config():
new_config['GUI']['home_layout'] = HOME_LAYOUT
new_config['GUI']['history_layout'] = HISTORY_LAYOUT
new_config['GUI']['display_show_specials'] = int(DISPLAY_SHOW_SPECIALS)
new_config['GUI']['coming_eps_layout'] = COMING_EPS_LAYOUT
new_config['GUI']['coming_eps_display_paused'] = int(COMING_EPS_DISPLAY_PAUSED)
new_config['GUI']['coming_eps_sort'] = COMING_EPS_SORT
new_config['GUI']['coming_eps_missed_range'] = int(COMING_EPS_MISSED_RANGE)
new_config['GUI']['episode_view_layout'] = EPISODE_VIEW_LAYOUT
new_config['GUI']['episode_view_display_paused'] = int(EPISODE_VIEW_DISPLAY_PAUSED)
new_config['GUI']['episode_view_sort'] = EPISODE_VIEW_SORT
new_config['GUI']['episode_view_missed_range'] = int(EPISODE_VIEW_MISSED_RANGE)
new_config['GUI']['fuzzy_dating'] = int(FUZZY_DATING)
new_config['GUI']['trim_zero'] = int(TRIM_ZERO)
new_config['GUI']['date_preset'] = DATE_PRESET

View file

@ -448,7 +448,8 @@ class ConfigMigrator():
3: 'Rename omgwtfnzb variables',
4: 'Add newznab catIDs',
5: 'Metadata update',
6: 'Rename daily search to recent search'
6: 'Rename daily search to recent search',
7: 'Rename coming episodes to episode view'
}
def migrate_config(self):
@ -730,3 +731,12 @@ class ConfigMigrator():
if hasattr(curProvider, 'enable_recentsearch'):
curProvider.enable_recentsearch = bool(check_setting_int(self.config_obj, curProvider.getID().upper(),
curProvider.getID() + '_enable_dailysearch', 1))
def _migrate_v7(self):
sickbeard.EPISODE_VIEW_LAYOUT = check_setting_str(self.config_obj, 'GUI', 'coming_eps_layout', 'banner')
sickbeard.EPISODE_VIEW_SORT = check_setting_str(self.config_obj, 'GUI', 'coming_eps_sort', 'time')
if 'date' == sickbeard.EPISODE_VIEW_SORT:
sickbeard.EPISODE_VIEW_SORT = 'time'
sickbeard.EPISODE_VIEW_DISPLAY_PAUSED = bool(check_setting_int(self.config_obj, 'GUI', 'coming_eps_display_paused', 0))
sickbeard.EPISODE_VIEW_MISSED_RANGE = check_setting_int(self.config_obj, 'GUI', 'coming_eps_missed_range', 7)

View file

@ -711,7 +711,7 @@ class CMD_ComingEpisodes(ApiCall):
self.sort, args = self.check_params(args, kwargs, "sort", "date", False, "string", ["date", "show", "network"])
self.type, args = self.check_params(args, kwargs, "type", "today|missed|soon|later", False, "list",
["missed", "later", "today", "soon"])
self.paused, args = self.check_params(args, kwargs, "paused", sickbeard.COMING_EPS_DISPLAY_PAUSED, False, "int",
self.paused, args = self.check_params(args, kwargs, "paused", sickbeard.EPISODE_VIEW_DISPLAY_PAUSED, False, "int",
[0, 1])
# super, missing, help
ApiCall.__init__(self, handler, args, kwargs)
@ -725,7 +725,7 @@ class CMD_ComingEpisodes(ApiCall):
tomorrow = (datetime.date.today() + datetime.timedelta(days=1)).toordinal()
next_week_dt = (datetime.date.today() + datetime.timedelta(days=7))
next_week = (next_week_dt + datetime.timedelta(days=1)).toordinal()
recently = (yesterday_dt - datetime.timedelta(days=sickbeard.COMING_EPS_MISSED_RANGE)).toordinal()
recently = (yesterday_dt - datetime.timedelta(days=sickbeard.EPISODE_VIEW_MISSED_RANGE)).toordinal()
done_show_list = []
qualList = Quality.DOWNLOADED + Quality.SNATCHED + [ARCHIVED, IGNORED]
@ -758,31 +758,27 @@ class CMD_ComingEpisodes(ApiCall):
# multi dimension sort
sorts = {
'date': (lambda a, b: cmp(
(a['parsed_datetime'],
(a['show_name'], remove_article(a['show_name']))[not sickbeard.SORT_ARTICLE],
a['season'], a['episode']),
(b['parsed_datetime'],
(b['show_name'], remove_article(b['show_name']))[not sickbeard.SORT_ARTICLE],
b['season'], b['episode']))),
'show': (lambda a, b: cmp(
((a['show_name'], remove_article(a['show_name']))[not sickbeard.SORT_ARTICLE],
a['parsed_datetime'], a['season'], a['episode']),
((b['show_name'], remove_article(b['show_name']))[not sickbeard.SORT_ARTICLE],
b['parsed_datetime'], b['season'], b['episode']))),
(a['parsed_datetime'], a['data_show_name'], a['season'], a['episode']),
(b['parsed_datetime'], b['data_show_name'], b['season'], b['episode']))),
'network': (lambda a, b: cmp(
(a['network'], a['parsed_datetime'],
(a['show_name'], remove_article(a['show_name']))[not sickbeard.SORT_ARTICLE],
a['season'], a['episode']),
(b['network'], b['parsed_datetime'],
(b['show_name'], remove_article(b['show_name']))[not sickbeard.SORT_ARTICLE],
b['season'], b['episode'])))
(a['data_network'], a['parsed_datetime'], a['data_show_name'], a['season'], a['episode']),
(b['data_network'], b['parsed_datetime'], b['data_show_name'], b['season'], b['episode']))),
'show': (lambda a, b: cmp(
(a['data_show_name'], a['parsed_datetime'], a['season'], a['episode']),
(b['data_show_name'], b['parsed_datetime'], b['season'], b['episode'])))
}
def value_maybe_article(value=''):
return (remove_article(value.lower()), value.lower())[sickbeard.SORT_ARTICLE]
# add parsed_datetime to the dict
for index, item in enumerate(sql_results):
sql_results[index]['parsed_datetime'] = network_timezones.parse_date_time(item['airdate'], item['airs'], item['network'])
sql_results[index]['data_show_name'] = value_maybe_article(item['show_name'])
sql_results[index]['data_network'] = value_maybe_article(item['network'])
sql_results.sort(sorts[self.sort])
finalEpResults = {}
# add all requested types or all
@ -1507,7 +1503,7 @@ class CMD_SickBeardGetDefaults(ApiCall):
data = {"status": statusStrings[sickbeard.STATUS_DEFAULT].lower(),
"flatten_folders": int(sickbeard.FLATTEN_FOLDERS_DEFAULT), "initial": anyQualities,
"archive": bestQualities, "future_show_paused": int(sickbeard.COMING_EPS_DISPLAY_PAUSED)}
"archive": bestQualities, "future_show_paused": int(sickbeard.EPISODE_VIEW_DISPLAY_PAUSED)}
return _responds(RESULT_SUCCESS, data)
@ -1756,7 +1752,7 @@ class CMD_SickBeardSetDefaults(ApiCall):
sickbeard.FLATTEN_FOLDERS_DEFAULT = int(self.flatten_folders)
if self.future_show_paused != None:
sickbeard.COMING_EPS_DISPLAY_PAUSED = int(self.future_show_paused)
sickbeard.EPISODE_VIEW_DISPLAY_PAUSED = int(self.future_show_paused)
return _responds(RESULT_SUCCESS, msg="Saved defaults")

View file

@ -67,7 +67,7 @@ from lib.dateutil import tz
from lib.unrar2 import RarFile
from lib import subliminal
from trakt import TraktCall
from lib.trakt import TraktCall
try:
import json
@ -300,7 +300,7 @@ class MainHandler(RequestHandler):
def setPosterSortBy(self, sort):
if sort not in ('name', 'date', 'network', 'progress'):
if sort not in ('name', 'time', 'network', 'progress'):
sort = 'name'
sickbeard.POSTER_SORTBY = sort
@ -326,36 +326,40 @@ class MainHandler(RequestHandler):
redirect("/home/displayShow?show=" + show)
def setComingEpsLayout(self, layout):
if layout not in ('poster', 'banner', 'list', 'calendar'):
def setEpisodeViewLayout(self, layout):
if layout not in ('poster', 'banner', 'list', 'daybyday'):
layout = 'banner'
if layout == 'calendar':
sickbeard.COMING_EPS_SORT = 'date'
if 'daybyday' == layout:
sickbeard.EPISODE_VIEW_SORT = 'time'
sickbeard.COMING_EPS_LAYOUT = layout
sickbeard.EPISODE_VIEW_LAYOUT = layout
redirect("/comingEpisodes/")
sickbeard.save_config()
def toggleComingEpsDisplayPaused(self, *args, **kwargs):
redirect("/episodeView/")
sickbeard.COMING_EPS_DISPLAY_PAUSED = not sickbeard.COMING_EPS_DISPLAY_PAUSED
def toggleEpisodeViewDisplayPaused(self, *args, **kwargs):
redirect("/comingEpisodes/")
sickbeard.EPISODE_VIEW_DISPLAY_PAUSED = not sickbeard.EPISODE_VIEW_DISPLAY_PAUSED
def setComingEpsSort(self, sort):
if sort not in ('date', 'network', 'show'):
sort = 'date'
sickbeard.save_config()
if sickbeard.COMING_EPS_LAYOUT == 'calendar':
sort = 'date'
redirect("/episodeView/")
sickbeard.COMING_EPS_SORT = sort
def setEpisodeViewSort(self, sort, redir=1):
if sort not in ('time', 'network', 'show'):
sort = 'time'
redirect("/comingEpisodes/")
sickbeard.EPISODE_VIEW_SORT = sort
def comingEpisodes(self, layout="None"):
""" display the coming episodes """
sickbeard.save_config()
if int(redir):
redirect("/episodeView/")
def episodeView(self, layout="None"):
""" display the episodes """
today_dt = datetime.date.today()
#today = today_dt.toordinal()
yesterday_dt = today_dt - datetime.timedelta(days=1)
@ -363,8 +367,8 @@ class MainHandler(RequestHandler):
tomorrow = (datetime.date.today() + datetime.timedelta(days=1)).toordinal()
next_week_dt = (datetime.date.today() + datetime.timedelta(days=7))
next_week = (next_week_dt + datetime.timedelta(days=1)).toordinal()
if not (layout and layout in ('calendar')) and not (sickbeard.COMING_EPS_LAYOUT and sickbeard.COMING_EPS_LAYOUT in ('calendar')):
recently = (yesterday_dt - datetime.timedelta(days=sickbeard.COMING_EPS_MISSED_RANGE)).toordinal()
if not (layout and layout in 'daybyday') and not (sickbeard.EPISODE_VIEW_LAYOUT and sickbeard.EPISODE_VIEW_LAYOUT in 'daybyday'):
recently = (yesterday_dt - datetime.timedelta(days=sickbeard.EPISODE_VIEW_MISSED_RANGE)).toordinal()
else:
recently = yesterday
@ -379,7 +383,7 @@ class MainHandler(RequestHandler):
for cur_result in sql_results:
done_show_list.append(int(cur_result["showid"]))
if not (layout and layout in ('calendar')) and not (sickbeard.COMING_EPS_LAYOUT and sickbeard.COMING_EPS_LAYOUT in ('calendar')):
if not (layout and layout in 'daybyday') and not (sickbeard.EPISODE_VIEW_LAYOUT and sickbeard.EPISODE_VIEW_LAYOUT in 'daybyday'):
more_sql_results = myDB.select(
"SELECT *, tv_shows.status as show_status FROM tv_episodes outer_eps, tv_shows WHERE season != 0 AND showid NOT IN (" + ','.join(
['?'] * len(
@ -395,49 +399,44 @@ class MainHandler(RequestHandler):
sql_results = list(set(sql_results))
# multi dimension sort
sorts = {
'date': (lambda a, b: cmp(
(a['localtime'],
(a['show_name'], remove_article(a['show_name']))[not sickbeard.SORT_ARTICLE],
a['season'], a['episode']),
(b['localtime'],
(b['show_name'], remove_article(b['show_name']))[not sickbeard.SORT_ARTICLE],
b['season'], b['episode']))),
'show': (lambda a, b: cmp(
((a['show_name'], remove_article(a['show_name']))[not sickbeard.SORT_ARTICLE],
a['localtime'], a['season'], a['episode']),
((b['show_name'], remove_article(b['show_name']))[not sickbeard.SORT_ARTICLE],
b['localtime'], b['season'], b['episode']))),
'network': (lambda a, b: cmp(
(a['network'], a['localtime'],
(a['show_name'], remove_article(a['show_name']))[not sickbeard.SORT_ARTICLE],
a['season'], a['episode']),
(b['network'], b['localtime'],
(b['show_name'], remove_article(b['show_name']))[not sickbeard.SORT_ARTICLE],
b['season'], b['episode'])))
}
# make a dict out of the sql results
sql_results = [dict(row) for row in sql_results]
# multi dimension sort
sorts = {
'network': (lambda a, b: cmp(
(a['data_network'], a['localtime'], a['data_show_name'], a['season'], a['episode']),
(b['data_network'], b['localtime'], b['data_show_name'], b['season'], b['episode']))),
'show': (lambda a, b: cmp(
(a['data_show_name'], a['localtime'], a['season'], a['episode']),
(b['data_show_name'], b['localtime'], b['season'], b['episode']))),
'time': (lambda a, b: cmp(
(a['localtime'], a['data_show_name'], a['season'], a['episode']),
(b['localtime'], b['data_show_name'], b['season'], b['episode'])))
}
def value_maybe_article(value=''):
return (remove_article(value.lower()), value.lower())[sickbeard.SORT_ARTICLE]
# add localtime to the dict
for index, item in enumerate(sql_results):
sql_results[index]['localtime'] = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(item['airdate'],
item['airs'], item['network']))
sql_results[index]['data_show_name'] = value_maybe_article(item['show_name'])
sql_results[index]['data_network'] = value_maybe_article(item['network'])
sql_results.sort(sorts[sickbeard.COMING_EPS_SORT])
sql_results.sort(sorts[sickbeard.EPISODE_VIEW_SORT])
t = PageTemplate(headers=self.request.headers, file="comingEpisodes.tmpl")
t = PageTemplate(headers=self.request.headers, file="episodeView.tmpl")
t.next_week = datetime.datetime.combine(next_week_dt, datetime.time(tzinfo=network_timezones.sb_timezone))
t.today = datetime.datetime.now(network_timezones.sb_timezone)
t.sql_results = sql_results
# Allow local overriding of layout parameter
if layout and layout in ('poster', 'banner', 'list','calendar'):
if layout and layout in ('banner', 'daybyday', 'list', 'poster'):
t.layout = layout
else:
t.layout = sickbeard.COMING_EPS_LAYOUT
t.layout = sickbeard.EPISODE_VIEW_LAYOUT
return _munge(t)
@ -549,7 +548,7 @@ class PageTemplate(Template):
self.sbPID = str(sickbeard.PID)
self.menu = [
{'title': 'Home', 'key': 'home'},
{'title': 'Coming Episodes', 'key': 'comingEpisodes'},
{'title': 'Episodes', 'key': 'episodeView'},
{'title': 'History', 'key': 'history'},
{'title': 'Manage', 'key': 'manage'},
{'title': 'Config', 'key': 'config'},