diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index ca1c245579f54bddc152564e7b58c2d32cb36d23..41e1ee15bd5bc87ddcc27ddadcd422aba636744d 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 Binary files a/gui/slick/js/core.min.js and b/gui/slick/js/core.min.js differ diff --git a/gui/slick/views/addShows.mako b/gui/slick/views/addShows.mako index 8a71497e428b34ca9b03919428f631b2c91c78d2..4a3e118ed88741baf25717600395156812709d20 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 97c530e7b65a12d884ef4fe8654319ee27f6989e..0000000000000000000000000000000000000000 --- 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 6027ffbba3e18122e5c81bff2c4bdca9263db8ac..408a3c86dfc12d6ff3bbd4d9925b1d16ebc5edb5 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 02ecd3a378e8f36c69db1881667d5573ffeddbbe..8dadb403549420755e3232896c02c12cae399377 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 951f39a824ae329acde417757fd2ecd2097dcb79..06918228040034c16eb55557380824567dc2b431 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 b8ffe3c10e0bf5fd19305fe81ea76caa2742d648..6f1b4de05360f1d05bf07dd1ce7fb1eb70def17a 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]