diff --git a/.gitignore b/.gitignore index b74decb0d189c69cf09617b4065fe9aa5bfbe532..cd07471f9afa049f8f63f30ebe75500d7510163d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ /config.php +/logo/*.png +/fanart/*.jpg +/poster/*.jpg diff --git a/api.php b/api.php index 96e9d4f6524dd9a5e5e2e558f02e6a909884898f..c17cb0575efff901c7dda50769e7ecd82c62121d 100644 --- a/api.php +++ b/api.php @@ -45,7 +45,7 @@ if ($_GET['get'] == 'poster' && !empty($_GET['show'])) { $img = new Imagick(); $img->setOption('jpeg:size', '800x532'); $img->readImage($source); - $img->thumbnailImage(150, 0); + $img->thumbnailImage(0, 220); $img->setImageCompression(Imagick::COMPRESSION_JPEG); $img->setImageCompressionQuality(80); $img->writeImage($poster); @@ -68,12 +68,12 @@ if ($_GET['get'] == 'fanart' && !empty($_GET['show'])) { $source = $showsPath.'/'.$_GET['show'].'/fanart.jpg'; if(file_exists($source)) { $img = new Imagick(); - $img->setOption('jpeg:size', '1280x720'); + $img->setOption('jpeg:size', '1024x576'); $img->readImage($source); - $img->thumbnailImage(1280, 720); + $img->thumbnailImage(1024, 0); $overlay = new Imagick(); - $overlay->newImage(1280, 720, new ImagickPixel('black')); - $overlay->setOption('jpeg:size', '1280x720'); + $overlay->newImage(1024, 576, new ImagickPixel('black')); + $overlay->setOption('jpeg:size', '1024x576'); $overlay->setImageOpacity(0.80); $img->compositeImage($overlay, imagick::COMPOSITE_OVER, 0, 0); $img->setImageCompression(Imagick::COMPRESSION_JPEG); diff --git a/css/mediarack.css b/css/mediarack.css index 01888ed319ed048619b8bb9a33cbf8c4f81c6539..d9831c4acd5de3543d985855d7c5647e036e7469 100644 --- a/css/mediarack.css +++ b/css/mediarack.css @@ -6,8 +6,9 @@ body { margin-bottom: 50px; } -.showName { - +.showName.panel-heading { + min-height: 71px; + height: 71px; } .showLogo { @@ -20,8 +21,13 @@ body { } -.showPoster { - +.thumbnail { + min-height: 230px; + height: 230px; +} +.thumbnail img.showPoster { + min-height: 220px; + height: 220px; } .episodes { @@ -30,4 +36,9 @@ body { .panel-title { font-weight: bold; +} + +div.panel-body.lazy { + background: repeat-y top center; + background-size: 100% auto; } \ No newline at end of file diff --git a/img/no_fanart.jpg b/img/no_fanart.jpg index 2f02c443088745c7970e03cb3af4203bec59d3e0..9208b47307dee29262f3955d02158715f7da47d9 100644 Binary files a/img/no_fanart.jpg and b/img/no_fanart.jpg differ diff --git a/img/no_poster.jpg b/img/no_poster.jpg index 64d2dfacb07918321c1cc1b97c0d3de10d381a3e..6468107a8ceb14e782398ffc4f25363a2bacbc1e 100644 Binary files a/img/no_poster.jpg and b/img/no_poster.jpg differ diff --git a/index.php b/index.php index 0632f6d615a0f3ea710835104b27119f49923009..e06371f86714ab84463982a8fb29c8d893cb813b 100644 --- a/index.php +++ b/index.php @@ -72,6 +72,8 @@ <!-- Placed at the end of the document so the pages load faster --> <script src="js/jquery-1.10.2.min.js"></script> <script src="js/bootstrap.min.js"></script> + <script src="js/jquery.lazyload.min.js"></script> + <script src="js/jquery.scrollstop.js"></script> <script src="js/mediarack.js"></script> </body> </html> diff --git a/js/jquery.lazyload.min.js b/js/jquery.lazyload.min.js new file mode 100644 index 0000000000000000000000000000000000000000..b94a83ae538629aa6b98fddb9b50eed6dc411bfa --- /dev/null +++ b/js/jquery.lazyload.min.js @@ -0,0 +1,2 @@ +/*! Lazy Load 1.9.1 - MIT license - Copyright 2010-2013 Mika Tuupola */ +!function(a,b,c,d){var e=a(b);a.fn.lazyload=function(f){function g(){var b=0;i.each(function(){var c=a(this);if(!j.skip_invisible||c.is(":visible"))if(a.abovethetop(this,j)||a.leftofbegin(this,j));else if(a.belowthefold(this,j)||a.rightoffold(this,j)){if(++b>j.failure_limit)return!1}else c.trigger("appear"),b=0})}var h,i=this,j={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:b,data_attribute:"original",skip_invisible:!0,appear:null,load:null,placeholder:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"};return f&&(d!==f.failurelimit&&(f.failure_limit=f.failurelimit,delete f.failurelimit),d!==f.effectspeed&&(f.effect_speed=f.effectspeed,delete f.effectspeed),a.extend(j,f)),h=j.container===d||j.container===b?e:a(j.container),0===j.event.indexOf("scroll")&&h.bind(j.event,function(){return g()}),this.each(function(){var b=this,c=a(b);b.loaded=!1,(c.attr("src")===d||c.attr("src")===!1)&&c.is("img")&&c.attr("src",j.placeholder),c.one("appear",function(){if(!this.loaded){if(j.appear){var d=i.length;j.appear.call(b,d,j)}a("<img />").bind("load",function(){var d=c.attr("data-"+j.data_attribute);c.hide(),c.is("img")?c.attr("src",d):c.css("background-image","url('"+d+"')"),c[j.effect](j.effect_speed),b.loaded=!0;var e=a.grep(i,function(a){return!a.loaded});if(i=a(e),j.load){var f=i.length;j.load.call(b,f,j)}}).attr("src",c.attr("data-"+j.data_attribute))}}),0!==j.event.indexOf("scroll")&&c.bind(j.event,function(){b.loaded||c.trigger("appear")})}),e.bind("resize",function(){g()}),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion)&&e.bind("pageshow",function(b){b.originalEvent&&b.originalEvent.persisted&&i.each(function(){a(this).trigger("appear")})}),a(c).ready(function(){g()}),this},a.belowthefold=function(c,f){var g;return g=f.container===d||f.container===b?(b.innerHeight?b.innerHeight:e.height())+e.scrollTop():a(f.container).offset().top+a(f.container).height(),g<=a(c).offset().top-f.threshold},a.rightoffold=function(c,f){var g;return g=f.container===d||f.container===b?e.width()+e.scrollLeft():a(f.container).offset().left+a(f.container).width(),g<=a(c).offset().left-f.threshold},a.abovethetop=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollTop():a(f.container).offset().top,g>=a(c).offset().top+f.threshold+a(c).height()},a.leftofbegin=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollLeft():a(f.container).offset().left,g>=a(c).offset().left+f.threshold+a(c).width()},a.inviewport=function(b,c){return!(a.rightoffold(b,c)||a.leftofbegin(b,c)||a.belowthefold(b,c)||a.abovethetop(b,c))},a.extend(a.expr[":"],{"below-the-fold":function(b){return a.belowthefold(b,{threshold:0})},"above-the-top":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-screen":function(b){return a.rightoffold(b,{threshold:0})},"left-of-screen":function(b){return!a.rightoffold(b,{threshold:0})},"in-viewport":function(b){return a.inviewport(b,{threshold:0})},"above-the-fold":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-fold":function(b){return a.rightoffold(b,{threshold:0})},"left-of-fold":function(b){return!a.rightoffold(b,{threshold:0})}})}(jQuery,window,document); \ No newline at end of file diff --git a/js/jquery.scrollstop.js b/js/jquery.scrollstop.js new file mode 100644 index 0000000000000000000000000000000000000000..a0bb6371002f36c275d90ef0a78f4e951c1b36a4 --- /dev/null +++ b/js/jquery.scrollstop.js @@ -0,0 +1,72 @@ +/* http://james.padolsey.com/javascript/special-scroll-events-for-jquery/ */ + +(function(){ + + var special = jQuery.event.special, + uid1 = "D" + (+new Date()), + uid2 = "D" + (+new Date() + 1); + + special.scrollstart = { + setup: function() { + + var timer, + handler = function(evt) { + + var _self = this, + _args = arguments; + + if (timer) { + clearTimeout(timer); + } else { + evt.type = "scrollstart"; + jQuery.event.dispatch.apply(_self, _args); + } + + timer = setTimeout( function(){ + timer = null; + }, special.scrollstop.latency); + + }; + + jQuery(this).bind("scroll", handler).data(uid1, handler); + + }, + teardown: function(){ + jQuery(this).unbind( "scroll", jQuery(this).data(uid1) ); + } + }; + + special.scrollstop = { + latency: 300, + setup: function() { + + var timer, + handler = function(evt) { + + var _self = this, + _args = arguments; + + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout( function(){ + + timer = null; + evt.type = "scrollstop"; + jQuery.event.dispatch.apply(_self, _args); + + + }, special.scrollstop.latency); + + }; + + jQuery(this).bind("scroll", handler).data(uid2, handler); + + }, + teardown: function() { + jQuery(this).unbind( "scroll", jQuery(this).data(uid2) ); + } + }; + +})(); \ No newline at end of file diff --git a/js/mediarack.js b/js/mediarack.js index 65dd0a2d2217b78ce9fbc72d84edd8ac9ebd8047..733fac26b9cebc13cc672bc6e4e9732d7ca765b9 100644 --- a/js/mediarack.js +++ b/js/mediarack.js @@ -12,10 +12,10 @@ function getShows() { divShows.empty(); $.each(data, function (key, show) { var divShowContainer = $('<div class="show panel panel-default" data-showid="'+show.id+'" id="show_'+show.id+'"></div>'); - var divShowHeader = $('<div class="showName panel-heading"><h2 class="panel-title text-center"><img class="showLogo" alt="'+show.name+'" src="api.php?get=logo&show='+escape(show.folder)+'" /></h2></div>'); - var divShowBody = $('<div class="panel-body" ></div>'); + var divShowHeader = $('<div class="showName panel-heading"><h2 class="panel-title text-center"><img class="showLogo lazy" style="min-height: 50px; height: 50px;" alt="'+show.name+'" data-original="api.php?get=logo&show='+escape(show.folder)+'" src="" /></h2></div>'); + var divShowBody = $('<div class="panel-body lazy" data-original="api.php?get=fanart&show='+escape(show.folder)+'"></div>'); var divShowFooter =$('<div class="panel-footer">Seasons: , Episodes: </div>'); - var divShowPoster = $('<div class="showPoster col-md-2 text-center"><a href="#" class="thumbnail"><img id="poster_'+show.id+'" src="api.php?get=poster&show='+escape(show.folder)+'" /></a></div>'); + var divShowPoster = $('<div class="col-md-2 text-center"><a href="#" class="thumbnail"><img id="poster_'+show.id+'" class="showPoster lazy" data-original="api.php?get=poster&show='+escape(show.folder)+'" src="img/no_poster.jpg" /></a></div>'); var ulSeasons = $('<ul class="seasons col-md-10 list-group"></ul>'); $.each(show.seasons, function(key, season) { var liSeason = $('<li class="season list-group-item" data-season="'+season.season+'"><strong>Season '+season.season+'</strong><span class="badge">'+season.count+'</span></li>'); @@ -32,8 +32,23 @@ function getShows() { divShowContainer.append(divShowHeader); divShowBody.append(divShowPoster); divShowBody.append(ulSeasons); - divShowBody.css('background', 'url(api.php?get=fanart&show='+escape(show.folder)+') repeat-y top center'); + //divShowBody.css('background', 'url(api.php?get=fanart&show='+escape(show.folder)+') repeat-y top center'); //divShowHeader.append('<img class="showLogo" alt="'+show.name+'" src="api.php?get=logo&show='+escape(show.folder)+'" />'); + $("img.showLogo.lazy").lazyload({ + event: "scrollstop", + effect: "fadeIn", + threshold: 800 + }); + divShowBody.lazyload({ + event: "scrollstop", + effect: "fadeIn", + threshold: 1600 + }); + $("img.showPoster.lazy").lazyload({ + event: "scrollstop", + effect: "fadeIn", + threshold: 800 + }); divShowContainer.append(divShowBody); divShowContainer.append(divShowFooter); divShows.append(divShowContainer);