From de5c3bb29d429af82ba34d27a0b6f5e4d36d7c0d Mon Sep 17 00:00:00 2001 From: Thraxis <slthraxis@gmail.com> Date: Thu, 3 Dec 2015 23:03:32 -0800 Subject: [PATCH] merge recommendedShow and trendingShow templates and add more trakt lists support * remove addShows_recommendedShows.mako * remove recommendedShows code from webserve.py * add traktList option to trendingShows functions in webserve.py * allow for any of the 7 trakt lists to be called and displayed * modify trendingShows.mako to display trakt placeholder image for shows without a poster Lists supported: Trending - Returns all shows being watched right now. Popular - Returns the most popular shows. Played - Most played shows in the past week Watched - Most watched shows in the past week Collected - Most collected shows in the past week Anticipated - Most anticipated show based on the number of lists it appears in Recommended - Personalized show recommendations for a user. --- gui/slick/js/core.js | 8 +- gui/slick/js/core.min.js | Bin 67962 -> 68130 bytes gui/slick/views/addShows.mako | 22 +-- .../views/addShows_recommendedShows.mako | 48 ------- gui/slick/views/addShows_trendingShows.mako | 23 ++- gui/slick/views/trendingShows.mako | 13 +- lib/libtrakt/trakt.py | 16 +-- sickbeard/webserve.py | 133 +++++++++--------- 8 files changed, 115 insertions(+), 148 deletions(-) delete mode 100644 gui/slick/views/addShows_recommendedShows.mako diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index ca1c24557..41e1ee15b 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -2794,6 +2794,10 @@ var SICKRAGE = { }); }); + $('#traktlistselection').on('change', function() { + window.location.href = srRoot + '/addShows/trendingShows/?traktList=' + this.value; + }); + $('#container').imagesLoaded(function() { $('#container').isotope({ sortBy: 'original-order', @@ -3135,8 +3139,10 @@ var SICKRAGE = { ); }, trendingShows: function(){ + var traktList = $('#traktList').val(); + $('#trendingShows').loadRemoteShows( - '/addShows/getTrendingShows/', + '/addShows/getTrendingShows/?traktList=' + traktList, 'Loading trending shows...', 'Trakt timed out, refresh page to try again' ); diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js index 01fceaea955eaee788560d372e33a918b79d996f..f63475a1031f0e714e1529808b520c024362f554 100644 GIT binary patch delta 137 zcmex0iDl6gmJKa$c}j{BvrBR^i%W`Ab0*twQJ9?T%08L<viS6FW=2lclA_eSl+3*J z;Eeq8VtsqCVxP?75?dwhl8nq^y|Tod($vkhZ=XualqD7^B-*NIC@I5LDQSWfXlPnb TPhw|u;6u@#xP37@<8?*=X)H2k delta 27 jcmZ29h2_^ImJKa$H#5JxCprBuJEH@m(spkS#_Nm#xQYvD diff --git a/gui/slick/views/addShows.mako b/gui/slick/views/addShows.mako index 8a71497e4..4a3e118ed 100644 --- a/gui/slick/views/addShows.mako +++ b/gui/slick/views/addShows.mako @@ -19,32 +19,22 @@ <p>For shows that you haven't downloaded yet, this option finds a show on theTVDB.com, creates a directory for it's episodes, and adds it to SickRage.</p> </div> </a> -% if sickbeard.USE_TRAKT is True: + <br><br> - <a href="${srRoot}/addShows/trendingShows/" id="btnNewShow" class="btn btn-large"> + <a href="${srRoot}/addShows/trendingShows/?traktList=anticipated" id="btnNewShow" class="btn btn-large"> <div class="button"><div class="icon-addtrendingshow"></div></div> <div class="buttontext"> - <h3>Add Trending Show</h3> - <p>For shows that you haven't downloaded yet, this option lets you choose from a list of current trending shows with ratings to add, creates a directory for its episodes, and adds it to SickRage.</p> + <h3>Add From Trakt Lists</h3> + <p>For shows that you haven't downloaded yet, this option lets you choose from a show from one of the Trakt lists to add to SickRage .</p> </div> </a> <br><br> - <a href="${srRoot}/addShows/recommendedShows/" id="btnNewShow" class="btn btn-large"> - <div class="button"><div class="icon-addrecommendedshow"></div></div> - <div class="buttontext"> - <h3>Add Recommended Shows</h3> - <p>For shows that you haven't downloaded yet, this option recommends shows to add based on your Trakt.tv show library, creates a directory for its episodes, and adds it to SickRage.</p> - </div> - </a> -% endif - <br><br> - <a href="${srRoot}/addShows/popularShows/" id="btnNewShow" class="btn btn-large"> - <div class="button"><div class="icon-addtrendingshow"></div></div> + <div class="button"><div class="icon-addrecommendedshow"></div></div> <div class="buttontext"> - <h3>View Popular Shows</h3> + <h3>Add From IMDB's Popular Shows</h3> <p>View IMDB's list of the most popular shows. This feature uses IMDB's MOVIEMeter algorithm to identify popular TV Series.</p> </div> </a> diff --git a/gui/slick/views/addShows_recommendedShows.mako b/gui/slick/views/addShows_recommendedShows.mako deleted file mode 100644 index 97c530e7b..000000000 --- a/gui/slick/views/addShows_recommendedShows.mako +++ /dev/null @@ -1,48 +0,0 @@ -<%inherit file="/layouts/main.mako"/> -<%! - import sickbeard -%> -<%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> -</%block> -<%block name="content"> -% if not header is UNDEFINED: - <h1 class="header">${header}</h1> -% else: - <h1 class="title">${title}</h1> -% endif - -<div id="tabs"> - <ul> - <li><a href="#tabs-1">Manage Directories</a></li> - <li><a href="#tabs-2">Customize Options</a></li> - </ul> - <div id="tabs-1" class="existingtabs"> - <%include file="/inc_rootDirs.mako"/> - </div> - <div id="tabs-2" class="existingtabs"> - <%include file="/inc_addShowOptions.mako"/> - </div> - <br> - - <span>Sort By:</span> - <select id="showsort" class="form-control form-control-inline input-sm"> - <option value="name">Name</option> - <option value="original" selected="selected">Original</option> - <option value="votes">Votes</option> - <option value="rating">% Rating</option> - <option value="rating_votes">% Rating > Votes</option> - </select> - - <span style="margin-left:12px">Sort Order:</span> - <select id="showsortdirection" class="form-control form-control-inline input-sm"> - <option value="asc" selected="selected">Asc</option> - <option value="desc">Desc</option> - </select> -</div> - -<br> -<div id="recommendedShows"></div> -<br> -</%block> diff --git a/gui/slick/views/addShows_trendingShows.mako b/gui/slick/views/addShows_trendingShows.mako index 6027ffbba..408a3c86d 100644 --- a/gui/slick/views/addShows_trendingShows.mako +++ b/gui/slick/views/addShows_trendingShows.mako @@ -1,12 +1,6 @@ <%inherit file="/layouts/main.mako"/> <%! import sickbeard - import datetime - import re - from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED - from sickbeard.common import Quality, qualityPresets, qualityPresetStrings - from sickbeard import sbdatetime - from sickbeard.helpers import anon_url %> <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> @@ -46,9 +40,26 @@ <option value="asc" selected="selected">Asc</option> <option value="desc">Desc</option> </select> + + <span style="margin-left:12px">Select Trakt List:</span> + <select id="traktlistselection" class="form-control form-control-inline input-sm"> + <option value="anticipated" ${' selected="selected"' if traktList == "anticipated" else ''}>Most Anticipated</option> + <option value="trending" ${' selected="selected"' if traktList == "trending" else ''}>Trending</option> + <option value="popular" ${' selected="selected"' if traktList == "popular" else ''}>Popular</option> + <option value="watched" ${' selected="selected"' if traktList == "watched" else '' }>Most Watched</option> + <option value="played" ${' selected="selected"' if traktList == "played" else '' }>Most Played</option> + <option value="collected" ${' selected="selected"' if traktList == "collected" else ''}>Most Collected</option> +% if sickbeard.TRAKT_ACCESS_TOKEN: + <option value="recommended" ${' selected="selected"' if traktList == "recommended" else ''}>Recommended</option> +% endif + </select> </div> <br> <div id="trendingShows"></div> <br> + +% if traktList: + <input type="hidden" name="traktList" id="traktList" value="${traktList}" /> +% endif </%block> diff --git a/gui/slick/views/trendingShows.mako b/gui/slick/views/trendingShows.mako index 02ecd3a37..8dadb4035 100644 --- a/gui/slick/views/trendingShows.mako +++ b/gui/slick/views/trendingShows.mako @@ -1,11 +1,6 @@ <%inherit file="/layouts/main.mako"/> <%! import sickbeard - import datetime - import re - from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED - from sickbeard.common import Quality, qualityPresets, qualityPresetStrings - from sickbeard import sbdatetime from sickbeard.helpers import anon_url %> <%block name="metas"> @@ -24,10 +19,16 @@ % for cur_show in trending_shows: <% show_url = 'http://www.trakt.tv/shows/%s' % cur_show['show']['ids']['slug'] %> +% if 'poster' in cur_show['show']['images'] and cur_show['show']['images']['poster']['thumb']: + <% poster_url = cur_show['show']['images']['poster']['thumb'] %> +% else: + <% poster_url = 'http://www.trakt.tv/assets/placeholders/thumb/poster-2d5709c1b640929ca1ab60137044b152.png' %> +% endif + <div class="trakt_show" data-name="${cur_show['show']['title']}" data-rating="${cur_show['show']['rating']}" data-votes="${cur_show['show']['votes']}"> <div class="traktContainer"> <div class="trakt-image"> - <a class="trakt-image" href="${anon_url(show_url)}" target="_blank"><img alt="" class="trakt-image" src="${cur_show['show']['images']['poster']['thumb']}" /></a> + <a class="trakt-image" href="${anon_url(show_url)}" target="_blank"><img alt="" class="trakt-image" src="${poster_url}" /></a> </div> <div class="show-title"> diff --git a/lib/libtrakt/trakt.py b/lib/libtrakt/trakt.py index 951f39a82..069182280 100644 --- a/lib/libtrakt/trakt.py +++ b/lib/libtrakt/trakt.py @@ -7,7 +7,8 @@ from sickbeard import logger from exceptions import traktException, traktAuthException, traktServerBusy -class TraktAPI(): + +class TraktAPI: def __init__(self, ssl_verify=True, timeout=30): self.session = requests.Session() self.verify = certifi.where() if ssl_verify else False @@ -28,8 +29,6 @@ class TraktAPI(): elif count > 0: time.sleep(2) - - data = { 'client_id': sickbeard.TRAKT_API_KEY, 'client_secret': sickbeard.TRAKT_API_SECRET, @@ -66,19 +65,20 @@ class TraktAPI(): return False def traktRequest(self, path, data=None, headers=None, url=None, method='GET', count=0): - if None == url: + if url is None: url = self.api_url count = count + 1 - if None == headers: + if headers is None: headers = self.headers - if None == sickbeard.TRAKT_ACCESS_TOKEN: + if sickbeard.TRAKT_ACCESS_TOKEN == '' and count >= 2: logger.log(u'You must get a Trakt TOKEN. Check your Trakt settings', logger.WARNING) return {} - headers['Authorization'] = 'Bearer ' + sickbeard.TRAKT_ACCESS_TOKEN + if sickbeard.TRAKT_ACCESS_TOKEN != '': + headers['Authorization'] = 'Bearer ' + sickbeard.TRAKT_ACCESS_TOKEN try: resp = self.session.request(method, url + path, headers=headers, timeout=self.timeout, @@ -108,7 +108,7 @@ class TraktAPI(): else: logger.log(u'Unauthorized. Please check your Trakt settings', logger.WARNING) elif code in (500,501,503,504,520,521,522): - #http://docs.trakt.apiary.io/#introduction/status-codes + # http://docs.trakt.apiary.io/#introduction/status-codes logger.log(u'Trakt may have some issues and it\'s unavailable. Try again later please', logger.DEBUG) elif code == 404: logger.log(u'Trakt error (404) the resource does not exist: %s' % url + path, logger.ERROR) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index b8ffe3c10..6f1b4de05 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -2455,74 +2455,64 @@ class HomeAddShows(Home): controller="addShows", action="newShow" ) - def recommendedShows(self): + def trendingShows(self, traktList=None): """ Display the new show page which collects a tvdb id, folder, and extra options and posts them to addNewShow """ - t = PageTemplate(rh=self, filename="addShows_recommendedShows.mako") - return t.render(title="Recommended Shows", header="Recommended Shows", - enable_anime_options=False, - controller="addShows", action="recommendedShows") - - def getRecommendedShows(self): - t = PageTemplate(rh=self, filename="trendingShows.mako") - - trending_shows = [] - - trakt_api = TraktAPI(sickbeard.SSL_VERIFY, sickbeard.TRAKT_TIMEOUT) - - try: - not_liked_show = "" - if sickbeard.TRAKT_BLACKLIST_NAME is not None and sickbeard.TRAKT_BLACKLIST_NAME: - not_liked_show = trakt_api.traktRequest("users/" + sickbeard.TRAKT_USERNAME + "/lists/" + sickbeard.TRAKT_BLACKLIST_NAME + "/items") or [] - else: - logger.log(u"trending blacklist name is empty", logger.DEBUG) - - shows = trakt_api.traktRequest("recommendations/shows?extended=full,images") or [] - - library_shows = trakt_api.traktRequest("sync/collection/shows?extended=full") or [] - - for show_detail in shows: - show = {'show': show_detail} - try: - if not Show.find(sickbeard.showList, [int(show['show']['ids']['tvdb'])]): - if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows): - if not_liked_show: - if show['show']['ids']['tvdb'] not in (show['show']['ids']['tvdb'] for show in not_liked_show if show['type'] == 'show'): - trending_shows += [show] - else: - trending_shows += [show] - - except MultipleShowObjectsException: - continue - - if sickbeard.TRAKT_BLACKLIST_NAME != '': - blacklist = True - else: - blacklist = False - - except traktException as e: - logger.log(u"Could not connect to Trakt service: %s" % ex(e), logger.WARNING) - - return t.render(title="Trending Shows", header="Trending Shows", trending_shows=trending_shows, blacklist=blacklist) + if traktList is None: + traktList = "" + + traktList = traktList.lower() + + if traktList == "trending": + page_title = "Trending Shows" + elif traktList == "popular": + page_title = "Popular Shows" + elif traktList == "anticipated": + page_title = "Most Anticipated Shows" + elif traktList == "collected": + page_title = "Most Collected Shows" + elif traktList == "watched": + page_title = "Most Watched Shows" + elif traktList == "played": + page_title = "Most Played Shows" + elif traktList == "recommended": + page_title = "Recommended Shows" + else: + page_title = "Most Anticipated Shows" - def trendingShows(self): - """ - Display the new show page which collects a tvdb id, folder, and extra options and - posts them to addNewShow - """ t = PageTemplate(rh=self, filename="addShows_trendingShows.mako") - return t.render(title="Trending Shows", header="Trending Shows", - enable_anime_options=False, - controller="addShows", action="trendingShows") + return t.render(title=page_title, header=page_title, enable_anime_options=False, + traktList=traktList, controller="addShows", action="trendingShows") - def getTrendingShows(self): + def getTrendingShows(self, traktList=None): """ Display the new show page which collects a tvdb id, folder, and extra options and posts them to addNewShow """ t = PageTemplate(rh=self, filename="trendingShows.mako") + if traktList is None: + traktList = "" + + traktList = traktList.lower() + + if traktList == "trending": + page_url = "shows/trending" + elif traktList == "popular": + page_url = "shows/popular" + elif traktList == "anticipated": + page_url = "shows/anticipated" + elif traktList == "collected": + page_url = "shows/collected" + elif traktList == "watched": + page_url = "shows/watched" + elif traktList == "played": + page_url = "shows/played" + elif traktList == "recommended": + page_url = "recommendations/shows" + else: + page_url = "shows/anticipated" trending_shows = [] @@ -2530,20 +2520,37 @@ class HomeAddShows(Home): try: not_liked_show = "" - if sickbeard.TRAKT_BLACKLIST_NAME is not None and sickbeard.TRAKT_BLACKLIST_NAME: - not_liked_show = trakt_api.traktRequest("users/" + sickbeard.TRAKT_USERNAME + "/lists/" + sickbeard.TRAKT_BLACKLIST_NAME + "/items") or [] + if sickbeard.TRAKT_ACCESS_TOKEN != '': + library_shows = trakt_api.traktRequest("sync/collection/shows?extended=full") or [] + if sickbeard.TRAKT_BLACKLIST_NAME is not None and sickbeard.TRAKT_BLACKLIST_NAME: + not_liked_show = trakt_api.traktRequest("users/" + sickbeard.TRAKT_USERNAME + "/lists/" + sickbeard.TRAKT_BLACKLIST_NAME + "/items") or [] + else: + logger.log(u"Trakt blacklist name is empty", logger.DEBUG) + + if traktList != "recommended": + limit_show = "?limit=" + str(50 + len(not_liked_show)) + "&" else: - logger.log(u"trending blacklist name is empty", logger.DEBUG) + limit_show = "?" - limit_show = 50 + len(not_liked_show) + shows = trakt_api.traktRequest(page_url + limit_show + "extended=full,images") or [] - shows = trakt_api.traktRequest("shows/trending?limit=" + str(limit_show) + "&extended=full,images") or [] + if sickbeard.TRAKT_ACCESS_TOKEN != '': + library_shows = trakt_api.traktRequest("sync/collection/shows?extended=full") or [] - library_shows = trakt_api.traktRequest("sync/collection/shows?extended=full") or [] for show in shows: try: + if 'show' not in show: + show['show'] = show + if not Show.find(sickbeard.showList, [int(show['show']['ids']['tvdb'])]): - if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows): + if sickbeard.TRAKT_ACCESS_TOKEN != '': + if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows): + if not_liked_show: + if show['show']['ids']['tvdb'] not in (show['show']['ids']['tvdb'] for show in not_liked_show if show['type'] == 'show'): + trending_shows += [show] + else: + trending_shows += [show] + else: if not_liked_show: if show['show']['ids']['tvdb'] not in (show['show']['ids']['tvdb'] for show in not_liked_show if show['type'] == 'show'): trending_shows += [show] -- GitLab