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