Browse Source

Change overhaul and add API functions

Change API version... start with 10
Change set application response header to 'SickGear' + add API version
Change return timezone (of network) in API
Add indexer to calls
Add SickGear Command tip for old SickBeard commands
Add warning old sickbeard API calls only support tvdb shows
Add "tvdbid" fallback only for sickbeard calls
Add listcommands
Add list of all commands (old + new) in listcommand page at the beginning
Change hide 'listcommands' command from commands list, since it needs the API builder CSS + is html not json
Add missing help in webapi
Add episode info: absolute_number, scene_season, scene_episode, scene_absolute_number
Add fork to SB command
Add sg
Add sg.activatescenenumbering
Add sg.addrootdir
Add sg.checkscheduler
Add sg.deleterootdir
Add sg.episode
Add sg.episode.search
Add sg.episode.setstatus
Add sg.episode.subtitlesearch
Add sg.exceptions
Add sg.forcesearch
Add sg.future
Add sg.getdefaults
Add sg.getindexericon
Add sg.getindexers to list all indexers
Add sg.getmessages
Add sg.getnetworkicon
Add sg.getrootdirs
Add sg.getqualities
Add sg.getqualitystrings
Add sg.history
Add sg.history.clear
Add sg.history.trim
Add sg.listtraktaccounts
Add sg.listignorewords
Add sg.listrequiedwords
Add sg.logs
Add sg.pausebacklog
Add sg.postprocess
Add sg.ping
Add sg.restart
Add sg.searchqueue
Add sg.searchtv to search all indexers
Add sg.setexceptions
Add sg.setignorewords
Add sg.setrequiredwords
Add sg.setscenenumber
Add sg.show
Add sg.show.addexisting
Add sg.show.addnew
Add sg.show.cache
Add sg.show.delete
Add sg.show.getbanner
Add sg.show.getfanart
Add sg.show.getposter
Add sg.show.getquality
Add sg.show.listfanart
Add sg.show.ratefanart
Add sg.show.seasonlist
Add sg.show.seasons
Add sg.show.setquality
Add sg.show.stats
Add sg.show.refresh
Add sg.show.pause
Add sg.show.update
Add sg.shows
Add sg.shows.browsetrakt
Add sg.shows.forceupdate
Add sg.shows.queue
Add sg.shows.stats

Change sickbeard to sickgear
Change sickbeard_call to property
Change sg.episode.setstatus allow setting of quality
Change sg.history, history command output
Change sg.searchtv to list of indexers
Add uhd4kweb to qualities
Add upgrade_once to add existing shows
Add upgrade_once to add new show
Add upgrade_once to show quality settings (get/set)
Add 'ids' to Show + Shows
Add ids to coming eps + get tvdb id from ids
Add 'status_str' to coming eps
Add 'local_datetime' to comming eps + runtime
Add X-Filename response header to getbanner, getposter
Add X-Fanartname response header for sg.show.getfanart

Add missing fields to sb.show
Add missing fields to sb.shows
Change sb.seasons
Change overview optional
Change make overview optional in shows
Add setscenenumber to API builder
Change move set_scene_numbering_helper into scnene_numbering for use in web interface and API
Change use quality_map instead of fixed list
Add eigthlevel for API/builder page
Change limit indexer param to valid values
Fix wrong parameter in existing apiBuilder.tmpl that prevents javascript from continuing + add console error message for it
Fixed: filter missed shows correctly
Add @gen.coroutine
pull/1053/head
Prinz23 9 years ago
committed by JackDandy
parent
commit
fe1aabca00
  1. 97
      CHANGES.md
  2. 331
      gui/slick/interfaces/default/apiBuilder.tmpl
  3. 1
      gui/slick/interfaces/default/config_general.tmpl
  4. 22
      gui/slick/js/apibuilder.js
  5. 5
      sickbeard/indexers/indexer_api.py
  6. 18
      sickbeard/network_timezones.py
  7. 4
      sickbeard/sbdatetime.py
  8. 63
      sickbeard/scene_numbering.py
  9. 8
      sickbeard/show_queue.py
  10. 2564
      sickbeard/webapi.py
  11. 156
      sickbeard/webserve.py

97
CHANGES.md

@ -1,4 +1,99 @@
### 0.14.0 (2018-02-01 02:30:00 UTC) ### 0.15.0 (2018-xx-xx xx:xx:xx UTC)
* Change overhaul and add API functions
* Change API version... start with 10
* Change set application response header to 'SickGear' + add API version
* Change return timezone (of network) in API
* Add indexer to calls
* Add SickGear Command tip for old SickBeard commands
* Add warning old sickbeard API calls only support tvdb shows
* Add "tvdbid" fallback only for sickbeard calls
* Add listcommands
* Add list of all commands (old + new) in listcommand page at the beginning
* Change hide 'listcommands' command from commands list, since it needs the API builder CSS + is html not json
* Add missing help in webapi
* Add episode info: absolute_number, scene_season, scene_episode, scene_absolute_number
* Add fork to SB command
* Add sg
* Add sg.activatescenenumbering
* Add sg.addrootdir
* Add sg.checkscheduler
* Add sg.deleterootdir
* Add sg.episode
* Add sg.episode.search
* Add sg.episode.setstatus
* Add sg.episode.subtitlesearch
* Add sg.exceptions
* Add sg.forcesearch
* Add sg.future
* Add sg.getdefaults
* Add sg.getindexericon
* Add sg.getindexers to list all indexers
* Add sg.getmessages
* Add sg.getnetworkicon
* Add sg.getrootdirs
* Add sg.getqualities
* Add sg.getqualitystrings
* Add sg.history
* Add sg.history.clear
* Add sg.history.trim
* Add sg.listtraktaccounts
* Add sg.listignorewords
* Add sg.listrequiedwords
* Add sg.logs
* Add sg.pausebacklog
* Add sg.postprocess
* Add sg.ping
* Add sg.restart
* Add sg.searchqueue
* Add sg.searchtv to search all indexers
* Add sg.setexceptions
* Add sg.setignorewords
* Add sg.setrequiredwords
* Add sg.setscenenumber
* Add sg.show
* Add sg.show.addexisting
* Add sg.show.addnew
* Add sg.show.cache
* Add sg.show.delete
* Add sg.show.getbanner
* Add sg.show.getfanart
* Add sg.show.getposter
* Add sg.show.getquality
* Add sg.show.listfanart
* Add sg.show.ratefanart
* Add sg.show.seasonlist
* Add sg.show.seasons
* Add sg.show.setquality
* Add sg.show.stats
* Add sg.show.refresh
* Add sg.show.pause
* Add sg.show.update
* Add sg.shows
* Add sg.shows.browsetrakt
* Add sg.shows.forceupdate
* Add sg.shows.queue
* Add sg.shows.stats
* Change sickbeard to sickgear
* Change sickbeard_call to property
* Change sg.episode.setstatus allow setting of quality
* Change sg.history, history command output
* Change sg.searchtv to list of indexers
* Add uhd4kweb to qualities
* Add upgrade_once to add existing shows
* Add upgrade_once to add new show
* Add upgrade_once to show quality settings (get/set)
* Add 'ids' to Show + Shows
* Add ids to coming eps + get tvdb id from ids
* Add 'status_str' to coming eps
* Add 'local_datetime' to comming eps + runtime
* Add X-Filename response header to getbanner, getposter
* Add X-Fanartname response header for sg.show.getfanart
[develop changelog]
### 0.14.0 (2018-02-01 02:30:00 UTC)
* Change improve core scheduler logic * Change improve core scheduler logic
* Change improve media process to parse anime format 'Show Name 123 - 001 - Ep 1 name' * Change improve media process to parse anime format 'Show Name 123 - 001 - Ep 1 name'

331
gui/slick/interfaces/default/apiBuilder.tmpl

@ -3,7 +3,9 @@
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title>API Builder</title> <title>API Builder</title>
<script type="text/javascript" charset="utf-8"> <link rel="stylesheet" type="text/css" href="$sbRoot/css/style.css?v=$sbPID">
<link rel="stylesheet" type="text/css" href="$sbRoot/css/light.css?v=$sbPID">
<script type="text/javascript" charset="utf-8">
<!-- <!--
sbRoot = "$sbRoot"; sbRoot = "$sbRoot";
//--> //-->
@ -18,6 +20,8 @@ sbRoot = "$sbRoot";
#apibuilder select option { padding: 1px 6px; line-height: 1.2em; } #apibuilder select option { padding: 1px 6px; line-height: 1.2em; }
#apibuilder .disabled { color: #ccc; } #apibuilder .disabled { color: #ccc; }
#apibuilder .action { background-color: #efefef; } #apibuilder .action { background-color: #efefef; }
.parareq {display: block; color: red; font-weight: bolder; font-size: 80%;}
.paraopt {display: block; color: gray; font-size: 80%;}
--> -->
</style> </style>
@ -27,54 +31,201 @@ var disable_empty_list=true;
addListGroup("api", "Command"); addListGroup("api", "Command");
addOption("Command", "SickBeard", "?cmd=sb", 1); //make default addOption("Command", "SickGear", "?cmd=sg", 1); //make default
addOption("Command", "SickBeard", "?cmd=sb");
addOption("Command", "List Commands", "?cmd=listcommands");
addList("Command", "SickBeard.AddRootDir", "?cmd=sb.addrootdir", "sb.addrootdir", "", "", "action"); addList("Command", "SickBeard.AddRootDir", "?cmd=sb.addrootdir", "sb.addrootdir", "", "", "action");
addList("Command", "SickGear.AddRootDir", "?cmd=sg.addrootdir", "sb.addrootdir", "", "", "action");
addOption("Command", "SickBeard.CheckScheduler", "?cmd=sb.checkscheduler", "", "", "action"); addOption("Command", "SickBeard.CheckScheduler", "?cmd=sb.checkscheduler", "", "", "action");
addOption("Command", "SickGear.CheckScheduler", "?cmd=sg.checkscheduler", "", "", "action");
addList("Command", "SickBeard.DeleteRootDir", "?cmd=sb.deleterootdir", "sb.deleterootdir", "", "", "action"); addList("Command", "SickBeard.DeleteRootDir", "?cmd=sb.deleterootdir", "sb.deleterootdir", "", "", "action");
addList("Command", "SickGear.DeleteRootDir", "?cmd=sg.deleterootdir", "sb.deleterootdir", "", "", "action");
addOption("Command", "SickBeard.ForceSearch", "?cmd=sb.forcesearch", "", "", "action"); addOption("Command", "SickBeard.ForceSearch", "?cmd=sb.forcesearch", "", "", "action");
addList("Command", "SickGear.ForceSearch", "?cmd=sg.forcesearch", "sg.forcesearch", "", "action");
addOption("Command", "SickGear.SearchQueue", "?cmd=sg.searchqueue", "", "", "action");
addOption("Command", "SickBeard.GetDefaults", "?cmd=sb.getdefaults", "", "", "action"); addOption("Command", "SickBeard.GetDefaults", "?cmd=sb.getdefaults", "", "", "action");
addOption("Command", "SickGear.GetDefaults", "?cmd=sg.getdefaults", "", "", "action");
addOption("Command", "SickBeard.GetMessages", "?cmd=sb.getmessages", "", "", "action"); addOption("Command", "SickBeard.GetMessages", "?cmd=sb.getmessages", "", "", "action");
addOption("Command", "SickGear.GetMessages", "?cmd=sg.getmessages", "", "", "action");
addOption("Command", "SickGear.GetQualities", "?cmd=sg.getqualities", "", "", "action");
addOption("Command", "SickGear.GetQualityStrings", "?cmd=sg.getqualitystrings", "", "", "action");
addList("Command", "SickGear.GetIndexers", "?cmd=sg.getindexers", "listindexers", "", "action");
addList("Command", "SickGear.GetIndexerIcon", "?cmd=sg.getindexericon", "getindexericon", "", "action");
addList("Command", "SickGear.GetNetworkIcon", "?cmd=sg.getnetworkicon", "getnetworkicon", "", "action");
addOption("Command", "SickBeard.GetRootDirs", "?cmd=sb.getrootdirs", "", "", "action"); addOption("Command", "SickBeard.GetRootDirs", "?cmd=sb.getrootdirs", "", "", "action");
addOption("Command", "SickGar.GetRootDirs", "?cmd=sg.getrootdirs", "", "", "action");
addList("Command", "SickBeard.PauseBacklog", "?cmd=sb.pausebacklog", "sb.pausebacklog", "", "", "action"); addList("Command", "SickBeard.PauseBacklog", "?cmd=sb.pausebacklog", "sb.pausebacklog", "", "", "action");
addList("Command", "SickGear.PauseBacklog", "?cmd=sg.pausebacklog", "sb.pausebacklog", "", "", "action");
addOption("Command", "SickBeard.Ping", "?cmd=sb.ping", "", "", "action"); addOption("Command", "SickBeard.Ping", "?cmd=sb.ping", "", "", "action");
addOption("Command", "SickGear.Ping", "?cmd=sg.ping", "", "", "action");
addOption("Command", "SickBeard.Restart", "?cmd=sb.restart", "", "", "action"); addOption("Command", "SickBeard.Restart", "?cmd=sb.restart", "", "", "action");
addOption("Command", "SickGear.Restart", "?cmd=sg.restart", "", "", "action");
addList("Command", "SickBeard.SearchTVDB", "?cmd=sb.searchtvdb", "sb.searchtvdb", "", "", "action"); addList("Command", "SickBeard.SearchTVDB", "?cmd=sb.searchtvdb", "sb.searchtvdb", "", "", "action");
addList("Command", "SickGear.SearchTV", "?cmd=sg.searchtv", "sg.searchtv", "", "", "action");
addList("Command", "SickBeard.SetDefaults", "?cmd=sb.setdefaults", "sb.setdefaults", "", "", "action"); addList("Command", "SickBeard.SetDefaults", "?cmd=sb.setdefaults", "sb.setdefaults", "", "", "action");
addOption("Command", "SickBeard.Shutdown", "?cmd=sb.shutdown", "", "", "action"); addOption("Command", "SickBeard.Shutdown", "?cmd=sb.shutdown", "", "", "action");
addList("Command", "SickGear.ListIgnoreWords", "?cmd=sg.listignorewords", "listignorewords", "", "action");
addList("Command", "SickGear.SetIgnoreWords", "?cmd=sg.setignorewords", "setwords", "", "action");
addList("Command", "SickGear.ListRequiredWords", "?cmd=sg.listrequiredwords", "listrequiredwords", "", "action");
addList("Command", "SickGear.SetRequiredWords", "?cmd=sg.setrequiredwords", "setwords", "", "action");
addList("Command", "Coming Episodes", "?cmd=future", "future"); addList("Command", "Coming Episodes", "?cmd=future", "future");
addList("Command", "SickGear - Coming Episodes", "?cmd=sg.future", "future");
addList("Command", "Episode", "?cmd=episode", "episode"); addList("Command", "Episode", "?cmd=episode", "episode");
addList("Command", "SickGear.Episode", "?cmd=sg.episode", "sg.episode");
addList("Command", "Episode.Search", "?cmd=episode.search", "episode.search", "", "", "action"); addList("Command", "Episode.Search", "?cmd=episode.search", "episode.search", "", "", "action");
addList("Command", "SickGear.Episode.Search", "?cmd=sg.episode.search", "sg.episode.search", "", "", "action");
addList("Command", "Episode.SetStatus", "?cmd=episode.setstatus", "episode.setstatus", "", "", "action"); addList("Command", "Episode.SetStatus", "?cmd=episode.setstatus", "episode.setstatus", "", "", "action");
addList("Command", "SickGear.Episode.SetStatus", "?cmd=sg.episode.setstatus", "sg.episode.setstatus", "", "", "action");
addList("Command", "Scene Exceptions", "?cmd=exceptions", "exceptions"); addList("Command", "Scene Exceptions", "?cmd=exceptions", "exceptions");
addList("Command", "SickGear Scene Exceptions", "?cmd=sg.exceptions", "sg.exceptions");
addList("Command", "Set Scene Exceptions", "?cmd=sg.setexceptions", "changeexceptions", "", "action");
addList("Command", "Set Scene Number", "?cmd=sg.setscenenumber", "setscenenumber", "", "action");
addList("Command", "Activate Scene Numbering", "?cmd=sg.activatescenenumbering", "activatescenenumber", "", "action");
addList("Command", "History", "?cmd=history", "history"); addList("Command", "History", "?cmd=history", "history");
addList("Command", "SickGear History", "?cmd=sg.history", "history");
addOption("Command", "History.Clear", "?cmd=history.clear", "", "", "action"); addOption("Command", "History.Clear", "?cmd=history.clear", "", "", "action");
addOption("Command", "SickGear.History.Clear", "?cmd=sg.history.clear", "", "", "action");
addOption("Command", "History.Trim", "?cmd=history.trim", "", "", "action"); addOption("Command", "History.Trim", "?cmd=history.trim", "", "", "action");
addOption("Command", "SickGear.History.Trim", "?cmd=sg.history.trim", "", "", "action");
addList("Command", "PostProcess", "?cmd=postprocess", "postprocess", "", "","action"); addList("Command", "PostProcess", "?cmd=postprocess", "postprocess", "", "","action");
addList("Command", "SickGear PostProcess", "?cmd=sg.postprocess", "postprocess", "", "","action");
addList("Command", "Logs", "?cmd=logs", "logs"); addList("Command", "Logs", "?cmd=logs", "logs");
addList("Command", "SickGear Logs", "?cmd=sg.logs", "logs");
addList("Command", "Show", "?cmd=show", "indexerid"); addList("Command", "Show", "?cmd=show", "indexerid");
addList("Command", "SickGear.Show", "?cmd=sg.show", "sg.indexerid");
addList("Command", "Show.AddExisting", "?cmd=show.addexisting", "show.addexisting", "", "", "action"); addList("Command", "Show.AddExisting", "?cmd=show.addexisting", "show.addexisting", "", "", "action");
addList("Command", "SickGear.Show.AddExisting", "?cmd=sg.show.addexisting", "sg.show.addexisting", "", "", "action");
addList("Command", "Show.AddNew", "?cmd=show.addnew", "show.addnew", "", "", "action"); addList("Command", "Show.AddNew", "?cmd=show.addnew", "show.addnew", "", "", "action");
addList("Command", "SickGear.Show.AddNew", "?cmd=sg.show.addnew", "sg.show.addnew", "", "", "action");
addList("Command", "Show.Cache", "?cmd=show.cache", "indexerid", "", "", "action"); addList("Command", "Show.Cache", "?cmd=show.cache", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.Cache", "?cmd=sg.show.cache", "sg.indexerid", "", "", "action");
addList("Command", "Show.Delete", "?cmd=show.delete", "indexerid", "", "", "action"); addList("Command", "Show.Delete", "?cmd=show.delete", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.Delete", "?cmd=sg.show.delete", "sg.indexerid", "", "", "action");
addList("Command", "Show.GetBanner", "?cmd=show.getbanner", "indexerid", "", "", "action"); addList("Command", "Show.GetBanner", "?cmd=show.getbanner", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.GetBanner", "?cmd=sg.show.getbanner", "sg.indexerid", "", "", "action");
addList("Command", "SickGear.Show.ListFanart", "?cmd=sg.show.listfanart", "sg.indexerid", "", "", "action");
addList("Command", "SickGear.Show.GetFanart", "?cmd=sg.show.getfanart", "sg.indexerid", "", "", "action");
addList("Command", "Show.GetPoster", "?cmd=show.getposter", "indexerid", "", "", "action"); addList("Command", "Show.GetPoster", "?cmd=show.getposter", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.GetPoster", "?cmd=sg.show.getposter", "sg.indexerid", "", "", "action");
addList("Command", "Show.GetQuality", "?cmd=show.getquality", "indexerid", "", "", "action"); addList("Command", "Show.GetQuality", "?cmd=show.getquality", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.GetQuality", "?cmd=sg.show.getquality", "sg.indexerid", "", "", "action");
addList("Command", "Show.Pause", "?cmd=show.pause", "show.pause", "", "", "action"); addList("Command", "Show.Pause", "?cmd=show.pause", "show.pause", "", "", "action");
addList("Command", "SickGear.Show.Pause", "?cmd=sg.show.pause", "sg.show.pause", "", "", "action");
addList("Command", "Show.Refresh", "?cmd=show.refresh", "indexerid", "", "", "action"); addList("Command", "Show.Refresh", "?cmd=show.refresh", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.Refresh", "?cmd=sg.show.refresh", "sg.indexerid", "", "", "action");
addList("Command", "Show.SeasonList", "?cmd=show.seasonlist", "show.seasonlist", "", "", "action"); addList("Command", "Show.SeasonList", "?cmd=show.seasonlist", "show.seasonlist", "", "", "action");
addList("Command", "SickGear.Show.SeasonList", "?cmd=sg.show.seasonlist", "sg.show.seasonlist", "", "", "action");
addList("Command", "Show.Seasons", "?cmd=show.seasons", "seasons", "", "", "action"); addList("Command", "Show.Seasons", "?cmd=show.seasons", "seasons", "", "", "action");
addList("Command", "SickGear.Show.Seasons", "?cmd=sg.show.seasons", "sg.seasons", "", "", "action");
addList("Command", "Show.SetQuality", "?cmd=show.setquality", "show.setquality", "", "", "action"); addList("Command", "Show.SetQuality", "?cmd=show.setquality", "show.setquality", "", "", "action");
addList("Command", "SickGear.Show.SetQuality", "?cmd=sg.show.setquality", "sg.show.setquality", "", "", "action");
addList("Command", "Show.Stats", "?cmd=show.stats", "indexerid", "", "", "action"); addList("Command", "Show.Stats", "?cmd=show.stats", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.Stats", "?cmd=sg.show.stats", "sg.indexerid", "", "", "action");
addList("Command", "Show.Update", "?cmd=show.update", "indexerid", "", "", "action"); addList("Command", "Show.Update", "?cmd=show.update", "indexerid", "", "", "action");
addList("Command", "SickGear.Show.Update", "?cmd=sg.show.update", "sg.indexerid", "", "", "action");
addList("Command", "Shows", "?cmd=shows", "shows"); addList("Command", "Shows", "?cmd=shows", "shows");
addList("Command", "SickGear.Shows", "?cmd=sg.shows", "shows");
addList("Command", "SickGear.Shows.BrowseTrakt", "?cmd=sg.shows.browsetrakt", "sg.shows.browsetrakt");
addOption("Command", "Shows.ListTraktAccounts", "?cmd=sg.listtraktaccounts", "", "", "action");
addOption("Command", "Shows.Stats", "?cmd=shows.stats", "", "", "action"); addOption("Command", "Shows.Stats", "?cmd=shows.stats", "", "", "action");
addOption("Command", "SickGear.Shows.Stats", "?cmd=sg.shows.stats", "", "", "action");
addOption("Command", "SickGear.Shows.ForceUpdate", "?cmd=sg.shows.forceupdate", "", "", "action");
addOption("Command", "SickGear.Shows.Queue", "?cmd=sg.shows.queue", "", "", "action");
addOption("sg.shows.browsetrakt", "Anticipated", "&type=anticipated");
addOption("sg.shows.browsetrakt", "New Shows", "&type=newshows");
addOption("sg.shows.browsetrakt", "New Seasons", "&type=newseasons");
addOption("sg.shows.browsetrakt", "Popular", "&type=popular");
addOption("sg.shows.browsetrakt", "Trending", "&type=trending");
addList("sg.shows.browsetrakt", "Recommended", "&type=recommended", "sg.traktaccounts");
addList("sg.shows.browsetrakt", "Watchlist", "&type=watchlist", "sg.traktaccounts");
#from sickbeard import TRAKT_ACCOUNTS
#for $a in $TRAKT_ACCOUNTS
addOption("sg.traktaccounts", "$TRAKT_ACCOUNTS[$a].name", "&account_id=$a");
#end for
addOption("sg.forcesearch", "Recent Search", "&searchtype=recent", 1);
addOption("sg.forcesearch", "Backlog Search", "&searchtype=backlog");
addOption("sg.forcesearch", "Proper Search", "&searchtype=proper");
addOption("listindexers", "Optional Param", "", 1);
addOption("listindexers", "Searchable only", "&searchable-only=1");
addOption("getnetworkicon", "CBS", "&network=cbs");
addOption("getnetworkicon", "NBC", "&network=nbc");
addOption("getnetworkicon", "Youtube", "&network=youtube");
addOption("getnetworkicon", "The CW", "&network=the%20cw");
addOption("getnetworkicon", "Crime & Investigation Network", "&network=crime%20%26%20investigation%20network");
#for $i in $indexers
addList("getindexericon", "$indexers[$i]", "&indexer=$i", "");
#end for
#for $curShow in $sortedShowList:
addList("activatescenenumber", "$curShow.name", "&indexerid=$curShow.indexerid&indexer=$curShow.indexer", "scenenumber-active");
#end for
addOption("scenenumber-active", "Activate", "&activate=1");
addOption("scenenumber-active", "Deactivate", "&activate=0");
#for $curShow in $sortedShowList:
addList("setscenenumber", "$curShow.name", "&indexerid=$curShow.indexerid&indexer=$curShow.indexer", "setscene-fseason");
#end for
addOption("listignorewords", "Optional Param", "", 1);
#for $curShow in $sortedShowList:
addOption("listignorewords", "$curShow.name", "&indexerid=$curShow.indexerid&indexer=$curShow.indexer");
#end for
addList("setwords", "Optional Param", "", "addwords");
#for $curShow in $sortedShowList:
addList("setwords", "$curShow.name", "&indexerid=$curShow.indexerid&indexer=$curShow.indexer", "addwords");
#end for
addList("addwords", "Optional Param", "", "removewords");
addList("addwords", "ignore1", "&add=ignore1", "removewords");
addList("addwords", "ignore2, ignore3", "&add=ignore2|ignore3", "removewords");
addList("removewords", "Optional Param", "", "useregex");
addList("removewords", "ignore1", "&remove=ignore1", "useregex");
addList("removewords", "ignore2", "&remove=ignore2", "useregex");
addList("removewords", "ignore2, ignore3", "&remove=ignore2|ignore3", "useregex");
addOption("useregex", "Optional Param", "", 1);
addOption("useregex", "as Regex", "&regex=1");
addOption("useregex", "as Words", "&regex=0");
addOption("listrequiredwords", "Optional Param", "", 1);
#for $curShow in $sortedShowList:
addOption("listrequiredwords", "$curShow.name", "&indexerid=$curShow.indexerid&indexer=$curShow.indexer");
#end for
addList("setscene-fseason", "forSeason", "", "setscene-fepisode", 1);
addList("setscene-fepisode", "forEpisode", "", "setscene-fabsolute", 1);
addList("setscene-fabsolute", "forAbsolute", "", "setscene-season");
addList("setscene-season", "sceneSeason", "", "setscene-episode", 1);
addList("setscene-episode", "sceneEpisode", "", "setscene-absolute", 1);
addList("setscene-absolute", "sceneAbsolute", "", "");
#for $c in range(1, 11):
addList("setscene-fseason", "$c", "&forSeason=$c", "setscene-fepisode");
addList("setscene-fepisode", "$c", "&forEpisode=$c", "setscene-fabsolute");
addList("setscene-fabsolute", "$c", "&forAbsolute=$c", "setscene-season");
addList("setscene-season", "$c", "&sceneSeason=$c", "setscene-episode");
addList("setscene-episode", "$c", "&sceneEpisode=$c", "setscene-absolute");
addList("setscene-absolute", "$c", "&sceneAbsolute=$c", "");
#end for
// addOption("indexerid", "Optional Param", "", 1); // addOption("indexerid", "Optional Param", "", 1);
#for $curShow in $sortedShowList: #for $curShow in $sortedShowList:
addOption("indexerid", "$curShow.name", "&indexerid=$curShow.indexerid"); addOption("indexerid", "$curShow.name", "&indexerid=$curShow.indexerid");
#end for #end for
#for $curShow in $sortedShowList:
addOption("sg.indexerid", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid");
#end for
addOption("logs", "Optional Param", "", 1); addOption("logs", "Optional Param", "", 1);
addOption("logs", "Debug", "&min_level=debug"); addOption("logs", "Debug", "&min_level=debug");
addOption("logs", "Info", "&min_level=info"); addOption("logs", "Info", "&min_level=info");
@ -109,20 +260,26 @@ addOption("shows", "Show Only Not Paused", "&paused=0");
addOption("shows", "Sort by Show Name", "&sort=name"); addOption("shows", "Sort by Show Name", "&sort=name");
addOption("shows", "Sort by TVDB ID", "&sort=id"); addOption("shows", "Sort by TVDB ID", "&sort=id");
addList("show.addexisting", "C:\\temp\\show1", "&location=C:\\temp\\show1", "show.addexisting-indexerid"); addList("sg.show.addexisting", "101501 (Ancient Aliens)", "&indexer=1&indexerid=101501", "show.addexisting-loc");
addList("show.addexisting", "D:\\Temp\\show2", "&location=D:\\Temp\\show2", "show.addexisting-indexerid"); addList("sg.show.addexisting", "80348 (Chuck)", "&indexer=1&indexerid=80348", "show.addexisting-loc");
addList("show.addexisting", "S:\\TV\\Ancient Aliens", "&location=S:\\TV\\Ancient Aliens", "show.addexisting-indexerid");
addList("show.addexisting", "S:\\TV\\Chuck", "&location=S:\\TV\\Chuck", "show.addexisting-indexerid"); addList("show.addexisting", "101501 (Ancient Aliens)", "&tvdbid=101501", "show.addexisting-loc");
addList("show.addexisting", "80348 (Chuck)", "&tvdbid=80348", "show.addexisting-loc");
addList("show.addexisting-indexerid", "101501 (Ancient Aliens)", "&indexerid=101501", "show.addexisting-opt"); addList("show.addexisting-loc", "C:\\temp\\show1", "&location=C:\\temp\\show1", "show.addexisting-opt");
addList("show.addexisting-indexerid", "80348 (Chuck)", "&indexerid=80348", "show.addexisting-opt"); addList("show.addexisting-loc", "D:\\Temp\\show2", "&location=D:\\Temp\\show2", "show.addexisting-opt");
addList("show.addexisting-loc", "S:\\TV\\Ancient Aliens", "&location=S:\\TV\\Ancient Aliens", "show.addexisting-opt");
addList("show.addexisting-loc", "S:\\TV\\Chuck", "&location=S:\\TV\\Chuck", "show.addexisting-opt");
addOption("show.addexisting-opt", "Optional Param", "", 1); addOption("show.addexisting-opt", "Optional Param", "", 1);
addList("show.addexisting-opt", "No Season Folder", "&season_folder=0", "quality"); addList("show.addexisting-opt", "No Season Folder", "&season_folder=0", "quality");
addList("show.addexisting-opt", "Use Season Folder", "&season_folder=1", "quality"); addList("show.addexisting-opt", "Use Season Folder", "&season_folder=1", "quality");
addList("show.addnew", "101501 (Ancient Aliens)", "&indexerid=101501", "show.addnew-loc"); addList("show.addnew", "101501 (Ancient Aliens)", "&tvdbid=101501", "show.addnew-loc");
addList("show.addnew", "80348 (Chuck)", "&indexerid=80348", "show.addnew-loc"); addList("show.addnew", "80348 (Chuck)", "&tvdbid=80348", "show.addnew-loc");
addList("sg.show.addnew", "101501 (Ancient Aliens)", "&indexer=1&indexerid=101501", "show.addnew-loc");
addList("sg.show.addnew", "80348 (Chuck)", "&indexer=1&indexerid=80348", "show.addnew-loc");
addOption("show.addnew-loc", "Optional Param", "", 1); addOption("show.addnew-loc", "Optional Param", "", 1);
addList("show.addnew-loc", "C:\\Temp", "&location=C:\\temp", "show.addnew-status"); addList("show.addnew-loc", "C:\\Temp", "&location=C:\\temp", "show.addnew-status");
@ -141,52 +298,56 @@ addList("show.addnew-opt", "No Season Folder", "&season_folder=0", "quality");
addList("show.addnew-opt", "Use Season Folder", "&season_folder=1", "quality"); addList("show.addnew-opt", "Use Season Folder", "&season_folder=1", "quality");
addOptGroup("sb.searchtvdb", "Search by Name"); addOptGroup("sb.searchtvdb", "Search by Name");
addList("sb.searchtvdb", "Lost", "&name=Lost", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "Lost", "&name=Lost", "");
addList("sb.searchtvdb", "office", "&name=office", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "office", "&name=office", "");
addList("sb.searchtvdb", "OffiCE", "&name=OffiCE", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "OffiCE", "&name=OffiCE", "");
addList("sb.searchtvdb", "Leno", "&name=leno", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "Leno", "&name=leno", "");
addList("sb.searchtvdb", "Top Gear", "&name=Top Gear", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "Top Gear", "&name=Top Gear", "");
endOptGroup("sb.searchtvdb"); endOptGroup("sb.searchtvdb");
addOptGroup("sb.searchtvdb", "Search by indexerid"); addOptGroup("sb.searchtvdb", "Search by indexerid");
addList("sb.searchtvdb", "73739", "&indexerid=73739", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "73739", "&indexerid=73739", "");
addList("sb.searchtvdb", "74608", "&indexerid=74608", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "74608", "&indexerid=74608", "");
addList("sb.searchtvdb", "199051", "&indexerid=199051", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "199051", "&indexerid=199051", "");
addList("sb.searchtvdb", "123456 (invalid show)", "&indexerid=123456", "sb.searchtvdb-lang"); addList("sb.searchtvdb", "123456 (invalid show)", "&indexerid=123456", "");
endOptGroup("sb.searchtvdb"); endOptGroup("sb.searchtvdb");
addOption("sb.searchtvdb-lang", "Optional Param", "", 1); addOptGroup("sg.searchtv", "Search by Name");
addOption("sb.searchtvdb-lang", "Chinese", "&lang=zh"); // 27 addList("sg.searchtv", "Lost", "&name=Lost", "indexertosearch");
addOption("sb.searchtvdb-lang", "Croatian", "&lang=hr"); // 31 addList("sg.searchtv", "office", "&name=office", "indexertosearch");
addOption("sb.searchtvdb-lang", "Czech", "&lang=cs"); // 28 addList("sg.searchtv", "OffiCE", "&name=OffiCE", "indexertosearch");
addOption("sb.searchtvdb-lang", "Danish", "&lang=da"); // 10 addList("sg.searchtv", "Leno", "&name=leno", "indexertosearch");
addOption("sb.searchtvdb-lang", "Dutch", "&lang=nl"); // 13 addList("sg.searchtv", "Top Gear", "&name=Top Gear", "indexertosearch");
addOption("sb.searchtvdb-lang", "English", "&lang=en"); // 7 endOptGroup("sg.searchtv");
addOption("sb.searchtvdb-lang", "Finnish", "&lang=fi"); // 11 -- Suomeksi addOptGroup("sg.searchtv", "Search by indexerid");
addOption("sb.searchtvdb-lang", "French", "&lang=fr"); // 17 addList("sg.searchtv", "73739", "&indexerid=73739", "indexertosearch");
addOption("sb.searchtvdb-lang", "German", "&lang=de"); // 14 addList("sg.searchtv", "74608", "&indexerid=74608", "indexertosearch");
addOption("sb.searchtvdb-lang", "Greek", "&lang=el"); // 20 addList("sg.searchtv", "199051", "&indexerid=199051", "indexertosearch");
addOption("sb.searchtvdb-lang", "Hebrew", "&lang=he"); // 24 addList("sg.searchtv", "123456 (invalid show)", "&indexerid=123456", "indexertosearch");
addOption("sb.searchtvdb-lang", "Hungarian", "&lang=hu"); // 19 -- Magyar endOptGroup("sg.searchtv");
addOption("sb.searchtvdb-lang", "Italian", "&lang=it"); // 15
addOption("sb.searchtvdb-lang", "Japanese", "&lang=ja"); // 25 addOption("indexertosearch", "Optional Param", "", 1);
addOption("sb.searchtvdb-lang", "Korean", "&lang=ko"); // 32 addOption("indexertosearch", "All Indexers", "&indexers=-1");
addOption("sb.searchtvdb-lang", "Norwegian", "&lang=no"); // 9
addOption("sb.searchtvdb-lang", "Polish", "&lang=pl"); // 18 #for $i in $searchindexers
addOption("sb.searchtvdb-lang", "Portuguese", "&lang=pt");// 26 addOption("indexertosearch", "$searchindexers[$i]", "&indexers=$i");
addOption("sb.searchtvdb-lang", "Russian", "&lang=ru"); // 22 #end for
addOption("sb.searchtvdb-lang", "Slovenian", "&lang=sl"); // 30
addOption("sb.searchtvdb-lang", "Spanish", "&lang=es"); // 16
addOption("sb.searchtvdb-lang", "Swedish", "&lang=sv"); // 8
addOption("sb.searchtvdb-lang", "Turkish", "&lang=tr"); // 21
#for $curShow in $sortedShowList: #for $curShow in $sortedShowList:
addList("seasons", "$curShow.name", "&indexerid=$curShow.indexerid", "seasons-$curShow.indexerid"); addList("seasons", "$curShow.name", "&indexerid=$curShow.indexerid", "seasons-$curShow.indexerid");
#end for #end for
#for $curShow in $sortedShowList: #for $curShow in $sortedShowList:
addList("sg.seasons", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid", "seasons-$curShow.indexerid");
#end for
#for $curShow in $sortedShowList:
addList("show.seasonlist", "$curShow.name", "&indexerid=$curShow.indexerid", "show.seasonlist-sort"); addList("show.seasonlist", "$curShow.name", "&indexerid=$curShow.indexerid", "show.seasonlist-sort");
#end for #end for
#for $curShow in $sortedShowList:
addList("sg.show.seasonlist", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid", "show.seasonlist-sort");
#end for
addOption("show.seasonlist-sort", "Optional Param", "", 1); addOption("show.seasonlist-sort", "Optional Param", "", 1);
addOption("show.seasonlist-sort", "Sort by Ascending", "&sort=asc"); addOption("show.seasonlist-sort", "Sort by Ascending", "&sort=asc");
@ -194,6 +355,10 @@ addOption("show.seasonlist-sort", "Sort by Ascending", "&sort=asc");
addList("show.setquality", "$curShow.name", "&indexerid=$curShow.indexerid", "quality"); addList("show.setquality", "$curShow.name", "&indexerid=$curShow.indexerid", "quality");
#end for #end for
#for $curShow in $sortedShowList:
addList("sg.show.setquality", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid", "quality");
#end for
//build out generic quality options //build out generic quality options
addOptGroup("quality", "Quality Templates"); addOptGroup("quality", "Quality Templates");
addOption("quality", "SD", "&initial=sdtv|sddvd"); addOption("quality", "SD", "&initial=sdtv|sddvd");
@ -244,16 +409,25 @@ addOption("seasons-$curShow", "$curShowSeason.season", "&season=$curShowSeason.s
#end for #end for
#for $curShow in $sortedShowList: #for $curShow in $sortedShowList:
addList("sg.episode", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid", "episode-$curShow.indexerid");
#end for
#for $curShow in $sortedShowList:
addList("episode", "$curShow.name", "&indexerid=$curShow.indexerid", "episode-$curShow.indexerid"); addList("episode", "$curShow.name", "&indexerid=$curShow.indexerid", "episode-$curShow.indexerid");
#end for #end for
// build out each show's season+episode list for episode cmd // build out each show's season+episode list for episode cmd
#for $curShow in $episodeSQLResults: #for $curShow in $episodeSQLResults:
#for $curShowSeason in $episodeSQLResults[$curShow]: #for $curShowSeason in $episodeSQLResults[$curShow]:
addList("episode-$curShow", "$curShowSeason.season x $curShowSeason.episode", "&season=$curShowSeason.season&episode=$curShowSeason.episode", "episode-$curShow-full"); addList("episode-$curShow", "$curShowSeason.season x $curShowSeason.episode", "&season=$curShowSeason.season&episode=$curShowSeason.episode", "episode-full");
#end for #end for
addOption("episode-$curShow-full", "Optional Param", "", 1); #end for
addOption("episode-$curShow-full", "Show Full Path", "&full_path=1"); addOption("episode-full", "Optional Param", "", 1);
addOption("episode-full", "Show Full Path", "&full_path=1");
// build out tvshow list for sg.episode.search
#for $curShow in $sortedShowList:
addList("sg.episode.search", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid", "episode.search-$curShow.indexerid");
#end for #end for
// build out tvshow list for episode.search // build out tvshow list for episode.search
@ -268,6 +442,31 @@ addOption("episode.search-$curShow", "$curShowSeason.season x $curShowSeason.epi
#end for #end for
#end for #end for
// build out tvshow list for sg.episode.setstatus
#for $curShow in $sortedShowList:
addList("sg.episode.setstatus", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid", "sg.episode.setstatus-$curShow.indexerid");
#end for
#for $curShow in $episodeSQLResults:
#for $curShowSeason in $episodeSQLResults[$curShow]:
addList("sg.episode.setstatus-$curShow", "$curShowSeason.season x $curShowSeason.episode", "&season=$curShowSeason.season&episode=$curShowSeason.episode", "sg.episode-status");
#end for
#end for
addList("sg.episode-status", "Wanted", "&status=wanted", "sg.episode.quality");
addList("sg.episode-status", "Skipped", "&status=skipped", "sg.episode.quality");
addList("sg.episode-status", "Archived", "&status=archived", "sg.episode.quality");
addList("sg.episode-status", "Ignored", "&status=ignored", "sg.episode.quality");
addList("sg.episode-status", "Snatched", "&status=snatched", "sg.episode.quality");
addList("sg.episode-status", "Downloaded", "&status=downloaded", "sg.episode.quality");
#from sickbeard.webapi import quality_map
addOption("sg.episode.quality", "Opt Param", 1);
#for $q in $quality_map:
addOption("sg.episode.quality", "$q", "&quality=$q");
#end for
// build out tvshow list for episode.setstatus // build out tvshow list for episode.setstatus
#for $curShow in $sortedShowList: #for $curShow in $sortedShowList:
addList("episode.setstatus", "$curShow.name", "&indexerid=$curShow.indexerid", "episode.setstatus-$curShow.indexerid"); addList("episode.setstatus", "$curShow.name", "&indexerid=$curShow.indexerid", "episode.setstatus-$curShow.indexerid");
@ -276,13 +475,13 @@ addList("episode.setstatus", "$curShow.name", "&indexerid=$curShow.indexerid", "
// build out each show's season+episode list for episode.setstatus cmd // build out each show's season+episode list for episode.setstatus cmd
#for $curShow in $episodeSQLResults: #for $curShow in $episodeSQLResults:
#for $curShowSeason in $episodeSQLResults[$curShow]: #for $curShowSeason in $episodeSQLResults[$curShow]:
addList("episode.setstatus-$curShow", "$curShowSeason.season x $curShowSeason.episode", "&season=$curShowSeason.season&episode=$curShowSeason.episode", "episode-status-$curShow"); addList("episode.setstatus-$curShow", "$curShowSeason.season x $curShowSeason.episode", "&season=$curShowSeason.season&episode=$curShowSeason.episode", "episode-status");
#end for #end for
addOption("episode-status-$curShow", "Wanted", "&status=wanted");
addOption("episode-status-$curShow", "Skipped", "&status=skipped");
addOption("episode-status-$curShow", "Archived", "&status=archived");
addOption("episode-status-$curShow", "Ignored", "&status=ignored");
#end for #end for
addOption("episode-status", "Wanted", "&status=wanted");
addOption("episode-status", "Skipped", "&status=skipped");
addOption("episode-status", "Archived", "&status=archived");
addOption("episode-status", "Ignored", "&status=ignored");
addOption("future", "Optional Param", "", 1); addOption("future", "Optional Param", "", 1);
addList("future", "Sort by Date", "&sort=date", "future-type"); addList("future", "Sort by Date", "&sort=date", "future-type");
@ -324,6 +523,28 @@ addOption("exceptions", "Optional Param", "", 1);
addOption("exceptions", "$curShow.name", "&indexerid=$curShow.indexerid"); addOption("exceptions", "$curShow.name", "&indexerid=$curShow.indexerid");
#end for #end for
addOption("sg.exceptions", "Optional Param", "", 1);
#for $curShow in $sortedShowList:
addOption("sg.exceptions", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid");
#end for
#for $curShow in $sortedShowList:
addList("changeexceptions", "$curShow.name", "&indexerid=$curShow.indexerid&indexer=$curShow.indexer", "exceptionforseason");
#end for
addList("exceptionforseason", "All Seasons", "&forseason=-1", "addexceptions");
#for $c in range(1, 11):
addList("exceptionforseason", "All Seasons", "&forseason=$c", "addexceptions");
#end for
addList("addexceptions", "Optional Param", "", "removeexceptions");
addList("addexceptions", "Test Name 1", "&add=Test Name 1", "removeexceptions");
addList("addexceptions", "Test Name 1, Name 2", "&add=Test Name 1|Name 2", "removeexceptions");
addOption("removeexceptions", "Optional Param", "", 1);
addOption("removeexceptions", "Test Name 1", "&remove=Test Name 1");
addOption("removeexceptions", "Test Name 1, Name 2", "&remove=Test Name 1|Name 2");
addOption("sb.pausebacklog", "Optional Param", "", 1); addOption("sb.pausebacklog", "Optional Param", "", 1);
addOption("sb.pausebacklog", "Pause", "&pause=1"); addOption("sb.pausebacklog", "Pause", "&pause=1");
addOption("sb.pausebacklog", "Unpause", "&pause=0"); addOption("sb.pausebacklog", "Unpause", "&pause=0");
@ -343,6 +564,9 @@ addOption("sb.deleterootdir", "S:\\Invalid_Location", "&location=S:\\Invalid_Loc
#for $curShow in $sortedShowList: #for $curShow in $sortedShowList:
addList("show.pause", "$curShow.name", "&indexerid=$curShow.indexerid", "show.pause-opt"); addList("show.pause", "$curShow.name", "&indexerid=$curShow.indexerid", "show.pause-opt");
#end for #end for
#for $curShow in $sortedShowList:
addList("sg.show.pause", "$curShow.name", "&indexer=$curShow.indexer&indexerid=$curShow.indexerid", "show.pause-opt");
#end for
addOption("show.pause-opt", "Optional Param", "", 1); addOption("show.pause-opt", "Optional Param", "", 1);
addOption("show.pause-opt", "Unpause", "&pause=0"); addOption("show.pause-opt", "Unpause", "&pause=0");
addOption("show.pause-opt", "Pause", "&pause=1"); addOption("show.pause-opt", "Pause", "&pause=1");
@ -350,7 +574,7 @@ addOption("show.pause-opt", "Pause", "&pause=1");
</script> </script>
</head> </head>
<body onload="initListGroup('api', document.apibuilder.firstlevel, document.apibuilder.secondlevel, document.apibuilder.thirdlevel, document.apibuilder.forthlevel, document.apibuilder.fifthlevel, document.apibuilder.sixthlevel, document.apibuilder.seventhlevel)"> <body style="padding-top: 0 !important;" onload="initListGroup('api', document.apibuilder.firstlevel, document.apibuilder.secondlevel, document.apibuilder.thirdlevel, document.apibuilder.forthlevel, document.apibuilder.fifthlevel, document.apibuilder.sixthlevel, document.apibuilder.seventhlevel, document.apibuilder.eigthlevel)">
<form name="apibuilder" id="apibuilder" action=""> <form name="apibuilder" id="apibuilder" action="">
<table align="center"> <table align="center">
@ -372,9 +596,10 @@ addOption("show.pause-opt", "Pause", "&pause=1");
<select name="fifthlevel"><option></option></select> <select name="fifthlevel"><option></option></select>
<select name="sixthlevel"><option></option></select> <select name="sixthlevel"><option></option></select>
<select name="seventhlevel"><option></option></select> <select name="seventhlevel"><option></option></select>
<select name="eigthlevel"><option></option></select>
<div style="float: left; "> <div style="float: left; ">
<input class="btn" type="button" value="Reset" onclick="resetListGroup('api',1)" /> <input class="btn" type="button" value="Reset" onclick="resetListGroup('api',1)" />
<input class="btn" type="button" value="Go" onclick="goListGroup(this.form['apikey'].value, this.form['seventhlevel'].value, this.form['sixthlevel'].value, this.form['fifthlevel'].value, this.form['forthlevel'].value, this.form['thirdlevel'].value, this.form['secondlevel'].value, this.form['firstlevel'].value)" /> <input class="btn" type="button" value="Go" onclick="goListGroup(this.form['apikey'].value, this.form['eigthlevel'].value, this.form['seventhlevel'].value, this.form['sixthlevel'].value, this.form['fifthlevel'].value, this.form['forthlevel'].value, this.form['thirdlevel'].value, this.form['secondlevel'].value, this.form['firstlevel'].value)" />
</div> </div>
</td> </td>
</tr> </tr>

1
gui/slick/interfaces/default/config_general.tmpl

@ -482,6 +482,7 @@
<span class="component-desc"> <span class="component-desc">
<input type="checkbox" name="use_api" class="enabler" id="use_api"#echo ('', $checked)[$sg_var('USE_API')]#> <input type="checkbox" name="use_api" class="enabler" id="use_api"#echo ('', $checked)[$sg_var('USE_API')]#>
<p>permit the use of the SickGear (SickBeard) API</p> <p>permit the use of the SickGear (SickBeard) API</p>
<p><b>Old Sickbeard API calls are limited to shows from thetvdb.com. Use new API LINK for full access</b></p>
</span> </span>
</label> </label>
</div> </div>

22
gui/slick/js/apibuilder.js

@ -10,7 +10,7 @@
var _disable_empty_list=false; var _disable_empty_list=false;
var _hide_empty_list=false; var _hide_empty_list=false;
function goListGroup(apikey, L7, L6, L5, L4, L3, L2, L1){ function goListGroup(apikey, L8, L7, L6, L5, L4, L3, L2, L1){
var GlobalOptions = ""; var GlobalOptions = "";
$('.global').each(function(){ $('.global').each(function(){
var checked = $(this).prop('checked'); var checked = $(this).prop('checked');
@ -26,7 +26,7 @@ function goListGroup(apikey, L7, L6, L5, L4, L3, L2, L1){
}); });
// handle the show.getposter / show.getbanner differently as they return an image and not json // handle the show.getposter / show.getbanner differently as they return an image and not json
if (L1 == "?cmd=show.getposter" || L1 == "?cmd=show.getbanner") { if (L1 == "?cmd=sg.getnetworkicon" || L1 == "?cmd=sg.show.getposter" || L1 == "?cmd=sg.show.getbanner" || L1 == "?cmd=show.getposter" || L1 == "?cmd=show.getbanner" || L1 == "?cmd=sg.getindexericon") {
var imgcache = sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions; var imgcache = sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions;
var html = imgcache + '<br/><br/><img src="' + sbRoot + '/images/loading16.gif" id="imgcache">'; var html = imgcache + '<br/><br/><img src="' + sbRoot + '/images/loading16.gif" id="imgcache">';
$('#apiResponse').html(html); $('#apiResponse').html(html);
@ -36,14 +36,24 @@ function goListGroup(apikey, L7, L6, L5, L4, L3, L2, L1){
cache: false, cache: false,
dataType: "html", dataType: "html",
success: function (img) { success: function (img) {
$('#imgcache').attr('src', imgcache); $('#imgcache').attr('src', imgcache + "&random=" + Math.random() * 100000000000000000000);
} }
}) })
} }
else if (L1 == "?cmd=listcommands")
{
var html = $.ajax({
url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + L8 + GlobalOptions,
async: false,
dataType: "html",
}).responseText;
$('#apiResponse').html(html);
}
else { else {
var html = sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions + "<br/><pre>"; var html = sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + L8 + GlobalOptions + "<br/><pre>";
html += $.ajax({ html += $.ajax({
url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions, url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + L8 + GlobalOptions,
async: false, async: false,
dataType: "html", dataType: "html",
}).responseText; }).responseText;
@ -167,7 +177,7 @@ function cs_addL(dis,link,label,css) { this.items[this.items.length]=new cs_link
function cs_addG(label,css) { this.items[this.items.length]=new cs_groupOBJ(label,css); } function cs_addG(label,css) { this.items[this.items.length]=new cs_groupOBJ(label,css); }
function cs_endG() { this.items[this.items.length]=new cs_groupOBJ2(); } function cs_endG() { this.items[this.items.length]=new cs_groupOBJ2(); }
function cs_showMsg(msg) { window.status=msg; } function cs_showMsg(msg) { console.error(msg); window.status=msg; }
function cs_badContent(n) { cs_goodContent=false; cs_showMsg("["+n+"] Not Found."); } function cs_badContent(n) { cs_goodContent=false; cs_showMsg("["+n+"] Not Found."); }
function _setCookie(name, value) { function _setCookie(name, value) {

5
sickbeard/indexers/indexer_api.py

@ -126,6 +126,11 @@ class indexerApi(object):
return dict((int(x['id']), x['name']) for x in indexerConfig.values() if not x['mapped_only']) return dict((int(x['id']), x['name']) for x in indexerConfig.values() if not x['mapped_only'])
@property @property
def search_indexers(self):
return dict((int(x['id']), x['name']) for x in indexerConfig.values() if not x['mapped_only'] and
x.get('active') and not x.get('defunct'))
@property
def all_indexers(self): def all_indexers(self):
""" """
return all indexers including mapped only indexers return all indexers including mapped only indexers

18
sickbeard/network_timezones.py

@ -295,31 +295,35 @@ def load_network_dict(load=True):
# get timezone of a network or return default timezone # get timezone of a network or return default timezone
def get_network_timezone(network): def get_network_timezone(network, return_name=False):
if network is None: if network is None:
return sb_timezone return sb_timezone
timezone = None timezone = None
timezone_name = None
try: try:
if zoneinfo.ZONEFILENAME is not None: if zoneinfo.ZONEFILENAME is not None:
if not network_dict: if not network_dict:
load_network_dict() load_network_dict()
try: try:
timezone = tz.gettz(network_dupes.get(network) or network_dict.get(network.replace(' ', '').lower()), timezone_name = network_dupes.get(network) or network_dict.get(network.replace(' ', '').lower())
zoneinfo_priority=True) timezone = tz.gettz(timezone_name, zoneinfo_priority=True)
except: except (StandardError, Exception):
pass pass
if timezone is None: if timezone is None:
cc = re.search(r'\(([a-z]+)\)$', network, flags=re.I) cc = re.search(r'\(([a-z]+)\)$', network, flags=re.I)
try: try:
timezone = tz.gettz(country_timezones.get(cc.group(1).upper()), zoneinfo_priority=True) timezone_name = country_timezones.get(cc.group(1).upper())
except: timezone = tz.gettz(timezone_name, zoneinfo_priority=True)
except (StandardError, Exception):
pass pass
except: except (StandardError, Exception):
pass pass
if return_name:
return timezone if isinstance(timezone, datetime.tzinfo) else sb_timezone, timezone_name
return timezone if isinstance(timezone, datetime.tzinfo) else sb_timezone return timezone if isinstance(timezone, datetime.tzinfo) else sb_timezone

4
sickbeard/sbdatetime.py

@ -113,10 +113,10 @@ class sbdatetime(datetime.datetime):
'july', 'august', 'september', 'october', 'november', 'december']) 'july', 'august', 'september', 'october', 'november', 'december'])
@static_or_instance @static_or_instance
def convert_to_setting(self, dt=None): def convert_to_setting(self, dt=None, force_local=False):
obj = (dt, self)[self is not None] obj = (dt, self)[self is not None]
try: try:
if 'local' == sickbeard.TIMEZONE_DISPLAY: if force_local or 'local' == sickbeard.TIMEZONE_DISPLAY:
return obj.astimezone(sb_timezone) return obj.astimezone(sb_timezone)
except (StandardError, Exception): except (StandardError, Exception):
pass pass

63
sickbeard/scene_numbering.py

@ -694,3 +694,66 @@ def fix_xem_numbering(indexer_id, indexer):
if 0 < len(cl): if 0 < len(cl):
my_db = db.DBConnection() my_db = db.DBConnection()
my_db.mass_action(cl) my_db.mass_action(cl)
def set_scene_numbering_helper(indexerid, indexer, forSeason=None, forEpisode=None, forAbsolute=None,
sceneSeason=None, sceneEpisode=None, sceneAbsolute=None):
# sanitize:
indexerid = None if indexerid in [None, 'null', ''] else int(indexerid)
indexer = None if indexer in [None, 'null', ''] else int(indexer)
show_obj = sickbeard.helpers.find_show_by_id(sickbeard.showList, {indexer: indexerid}, no_mapped_ids=True)
if not show_obj:
result = {'success': False}
return result
if not show_obj.is_anime:
for_season = None if forSeason in [None, 'null', ''] else int(forSeason)
for_episode = None if forEpisode in [None, 'null', ''] else int(forEpisode)
scene_season = None if sceneSeason in [None, 'null', ''] else int(sceneSeason)
scene_episode = None if sceneEpisode in [None, 'null', ''] else int(sceneEpisode)
action_log = u'Set episode scene numbering to %sx%s for episode %sx%s of "%s"' \
% (scene_season, scene_episode, for_season, for_episode, show_obj.name)
ep_args = {'show': indexerid, 'season': for_season, 'episode': for_episode}
scene_args = {'indexer_id': indexerid, 'indexer': indexer, 'season': for_season, 'episode': for_episode,
'sceneSeason': scene_season, 'sceneEpisode': scene_episode}
result = {'forSeason': for_season, 'forEpisode': for_episode, 'sceneSeason': None, 'sceneEpisode': None}
else:
for_absolute = None if forAbsolute in [None, 'null', ''] else int(forAbsolute)
scene_absolute = None if sceneAbsolute in [None, 'null', ''] else int(sceneAbsolute)
action_log = u'Set absolute scene numbering to %s for episode %s of "%s"' \
% (scene_absolute, for_absolute, show_obj.name)
ep_args = {'show': indexerid, 'absolute': for_absolute}
scene_args = {'indexer_id': indexerid, 'indexer': indexer, 'absolute_number': for_absolute,
'sceneAbsolute': scene_absolute}
result = {'forAbsolute': for_absolute, 'sceneAbsolute': None}
if ep_args.get('absolute'):
ep_obj = show_obj.getEpisode(absolute_number=int(ep_args['absolute']))
elif None is not ep_args['season'] and None is not ep_args['episode']:
ep_obj = show_obj.getEpisode(int(ep_args['season']), int(ep_args['episode']))
else:
ep_obj = 'Invalid paramaters'
if ep_obj is None:
ep_obj = "Episode couldn't be retrieved"
result['success'] = not isinstance(ep_obj, str)
if result['success']:
logger.log(action_log, logger.DEBUG)
set_scene_numbering(**scene_args)
show_obj.flushEpisodes()
else:
result['errorMessage'] = ep_obj
if not show_obj.is_anime:
scene_numbering = get_scene_numbering(indexerid, indexer, for_season, for_episode)
if scene_numbering:
(result['sceneSeason'], result['sceneEpisode']) = scene_numbering
else:
scene_numbering = get_scene_absolute_numbering(indexerid, indexer, for_absolute)
if scene_numbering:
result['sceneAbsolute'] = scene_numbering
return result

8
sickbeard/show_queue.py

@ -177,10 +177,10 @@ class ShowQueue(generic_queue.GenericQueue):
def addShow(self, indexer, indexer_id, showDir, default_status=None, quality=None, flatten_folders=None, def addShow(self, indexer, indexer_id, showDir, default_status=None, quality=None, flatten_folders=None,
lang='en', subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None, lang='en', subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None,
wanted_begin=None, wanted_latest=None, tag=None, new_show=False, show_name=None): wanted_begin=None, wanted_latest=None, tag=None, new_show=False, show_name=None, upgrade_once=False):
queueItemObj = QueueItemAdd(indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, queueItemObj = QueueItemAdd(indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang,
subtitles, anime, scene, paused, blacklist, whitelist, subtitles, anime, scene, paused, blacklist, whitelist,
wanted_begin, wanted_latest, tag, new_show=new_show, show_name=show_name) wanted_begin, wanted_latest, tag, new_show=new_show, show_name=show_name, upgrade_once=upgrade_once)
self.add_item(queueItemObj) self.add_item(queueItemObj)
@ -238,7 +238,7 @@ class ShowQueueItem(generic_queue.QueueItem):
class QueueItemAdd(ShowQueueItem): class QueueItemAdd(ShowQueueItem):
def __init__(self, indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, subtitles, anime, def __init__(self, indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, subtitles, anime,
scene, paused, blacklist, whitelist, default_wanted_begin, default_wanted_latest, tag, scene, paused, blacklist, whitelist, default_wanted_begin, default_wanted_latest, tag,
scheduled_update=False, new_show=False, show_name=None): scheduled_update=False, new_show=False, show_name=None, upgrade_once=False):
self.indexer = indexer self.indexer = indexer
self.indexer_id = indexer_id self.indexer_id = indexer_id
@ -247,6 +247,7 @@ class QueueItemAdd(ShowQueueItem):
self.default_wanted_begin = default_wanted_begin self.default_wanted_begin = default_wanted_begin
self.default_wanted_latest = default_wanted_latest self.default_wanted_latest = default_wanted_latest
self.quality = quality self.quality = quality
self.upgrade_once = upgrade_once
self.flatten_folders = flatten_folders self.flatten_folders = flatten_folders
self.lang = lang self.lang = lang
self.subtitles = subtitles self.subtitles = subtitles
@ -341,6 +342,7 @@ class QueueItemAdd(ShowQueueItem):
self.show.location = self.showDir self.show.location = self.showDir
self.show.subtitles = self.subtitles if None is not self.subtitles else sickbeard.SUBTITLES_DEFAULT self.show.subtitles = self.subtitles if None is not self.subtitles else sickbeard.SUBTITLES_DEFAULT
self.show.quality = self.quality if self.quality else sickbeard.QUALITY_DEFAULT self.show.quality = self.quality if self.quality else sickbeard.QUALITY_DEFAULT
self.show.archive_firstmatch = self.upgrade_once
self.show.flatten_folders = self.flatten_folders if None is not self.flatten_folders else sickbeard.FLATTEN_FOLDERS_DEFAULT self.show.flatten_folders = self.flatten_folders if None is not self.flatten_folders else sickbeard.FLATTEN_FOLDERS_DEFAULT
self.show.anime = self.anime if None is not self.anime else sickbeard.ANIME_DEFAULT self.show.anime = self.anime if None is not self.anime else sickbeard.ANIME_DEFAULT
self.show.scene = self.scene if None is not self.scene else sickbeard.SCENE_DEFAULT self.show.scene = self.scene if None is not self.scene else sickbeard.SCENE_DEFAULT

2564
sickbeard/webapi.py

File diff suppressed because it is too large

156
sickbeard/webserve.py

@ -51,7 +51,7 @@ from sickbeard.helpers import has_image_ext, remove_article, starify
from sickbeard.indexers.indexer_config import INDEXER_TVDB, INDEXER_TVRAGE, INDEXER_TRAKT from sickbeard.indexers.indexer_config import INDEXER_TVDB, INDEXER_TVRAGE, INDEXER_TRAKT
from sickbeard.scene_numbering import get_scene_numbering, set_scene_numbering, get_scene_numbering_for_show, \ from sickbeard.scene_numbering import get_scene_numbering, set_scene_numbering, get_scene_numbering_for_show, \
get_xem_numbering_for_show, get_scene_absolute_numbering_for_show, get_xem_absolute_numbering_for_show, \ get_xem_numbering_for_show, get_scene_absolute_numbering_for_show, get_xem_absolute_numbering_for_show, \
get_scene_absolute_numbering get_scene_absolute_numbering, set_scene_numbering_helper
from sickbeard.name_cache import buildNameCache from sickbeard.name_cache import buildNameCache
from sickbeard.browser import foldersAtPath from sickbeard.browser import foldersAtPath
from sickbeard.blackandwhitelist import BlackAndWhiteList, short_group_names from sickbeard.blackandwhitelist import BlackAndWhiteList, short_group_names
@ -145,6 +145,13 @@ class BaseHandler(RequestHandler):
return self.get_secure_cookie('sickgear-session-%s' % helpers.md5_for_text(sickbeard.WEB_PORT)) return self.get_secure_cookie('sickgear-session-%s' % helpers.md5_for_text(sickbeard.WEB_PORT))
return True return True
def getImage(self, image):
if ek.ek(os.path.isfile, image):
mime_type, encoding = MimeTypes().guess_type(image)
self.set_header('Content-Type', mime_type)
with ek.ek(open, image, 'rb') as img:
return img.read()
def showPoster(self, show=None, which=None, api=None): def showPoster(self, show=None, which=None, api=None):
# Redirect initial poster/banner thumb to default images # Redirect initial poster/banner thumb to default images
if 'poster' == which[0:6]: if 'poster' == which[0:6]:
@ -175,9 +182,14 @@ class BaseHandler(RequestHandler):
static_image_path = image_file_name static_image_path = image_file_name
if api: if api:
used_file = ek.ek(os.path.basename, static_image_path)
if static_image_path.startswith('/images'):
used_file = 'default'
static_image_path = ek.ek(os.path.join, sickbeard.PROG_DIR, 'gui', 'slick', static_image_path[1:])
mime_type, encoding = MimeTypes().guess_type(static_image_path) mime_type, encoding = MimeTypes().guess_type(static_image_path)
self.set_header('Content-Type', mime_type) self.set_header('Content-Type', mime_type)
with open(static_image_path, 'rb') as img: self.set_header('X-Filename', used_file)
with ek.ek(open, static_image_path, 'rb') as img:
return img.read() return img.read()
else: else:
static_image_path = os.path.normpath(static_image_path.replace(sickbeard.CACHE_DIR, '/cache')) static_image_path = os.path.normpath(static_image_path.replace(sickbeard.CACHE_DIR, '/cache'))
@ -2458,50 +2470,8 @@ class Home(MainHandler):
def setSceneNumbering(self, show, indexer, forSeason=None, forEpisode=None, forAbsolute=None, sceneSeason=None, def setSceneNumbering(self, show, indexer, forSeason=None, forEpisode=None, forAbsolute=None, sceneSeason=None,
sceneEpisode=None, sceneAbsolute=None): sceneEpisode=None, sceneAbsolute=None):
# sanitize: result = set_scene_numbering_helper(show, indexer, forSeason, forEpisode, forAbsolute, sceneSeason,
show = None if show in [None, 'null', ''] else int(show) sceneEpisode, sceneAbsolute)
indexer = None if indexer in [None, 'null', ''] else int(indexer)
show_obj = sickbeard.helpers.findCertainShow(sickbeard.showList, show)
if not show_obj.is_anime:
for_season = None if forSeason in [None, 'null', ''] else int(forSeason)
for_episode = None if forEpisode in [None, 'null', ''] else int(forEpisode)
scene_season = None if sceneSeason in [None, 'null', ''] else int(sceneSeason)
scene_episode = None if sceneEpisode in [None, 'null', ''] else int(sceneEpisode)
action_log = u'Set episode scene numbering to %sx%s for episode %sx%s of "%s"'\
% (scene_season, scene_episode, for_season, for_episode, show_obj.name)
ep_args = {'show': show, 'season': for_season, 'episode': for_episode}
scene_args = {'indexer_id': show, 'indexer': indexer, 'season': for_season, 'episode': for_episode,
'sceneSeason': scene_season, 'sceneEpisode': scene_episode}
result = {'forSeason': for_season, 'forEpisode': for_episode, 'sceneSeason': None, 'sceneEpisode': None}
else:
for_absolute = None if forAbsolute in [None, 'null', ''] else int(forAbsolute)
scene_absolute = None if sceneAbsolute in [None, 'null', ''] else int(sceneAbsolute)
action_log = u'Set absolute scene numbering to %s for episode %s of "%s"'\
% (scene_absolute, for_absolute, show_obj.name)
ep_args = {'show': show, 'absolute': for_absolute}
scene_args = {'indexer_id': show, 'indexer': indexer, 'absolute_number': for_absolute,
'sceneAbsolute': scene_absolute}
result = {'forAbsolute': for_absolute, 'sceneAbsolute': None}
ep_obj = self._getEpisode(**ep_args)
result['success'] = not isinstance(ep_obj, str)
if result['success']:
logger.log(action_log, logger.DEBUG)
set_scene_numbering(**scene_args)
show_obj.flushEpisodes()
else:
result['errorMessage'] = ep_obj
if not show_obj.is_anime:
scene_numbering = get_scene_numbering(show, indexer, for_season, for_episode)
if scene_numbering:
(result['sceneSeason'], result['sceneEpisode']) = scene_numbering
else:
scene_numbering = get_scene_absolute_numbering(show, indexer, for_absolute)
if scene_numbering:
result['sceneAbsolute'] = scene_numbering
return json.dumps(result) return json.dumps(result)
@ -2730,7 +2700,7 @@ class NewHomeAddShows(Home):
re.sub(r'([,.!][^,.!]*?)$', '...', re.sub(r'([,.!][^,.!]*?)$', '...',
re.sub(r'([.!?])(?=\w)', r'\1 ', re.sub(r'([.!?])(?=\w)', r'\1 ',
self.encode_html((show.get('overview', '') or '')[:250:].strip()))), self.encode_html((show.get('overview', '') or '')[:250:].strip()))),
self._get_UWRatio(term, show['seriesname'], show.get('aliases', [])), None, None, self.get_UWRatio(term, show['seriesname'], show.get('aliases', [])), None, None,
self._make_search_image_url(iid, show) self._make_search_image_url(iid, show)
] for show in shows.itervalues()] for iid, shows in results.iteritems())) ] for show in shows.itervalues()] for iid, shows in results.iteritems()))
@ -2791,7 +2761,8 @@ class NewHomeAddShows(Home):
('%s.jpg' % show['id'], show['id']) ('%s.jpg' % show['id'], show['id'])
return img_url return img_url
def _get_UWRatio(self, search_term, showname, aliases): @classmethod
def get_UWRatio(cls, search_term, showname, aliases):
s = fuzz.UWRatio(search_term, showname) s = fuzz.UWRatio(search_term, showname)
# check aliases and give them a little lower score # check aliases and give them a little lower score
for a in aliases: for a in aliases:
@ -3452,6 +3423,93 @@ class NewHomeAddShows(Home):
return self.redirect('/home/addShows/%s' % ('trakt_trending', sickbeard.TRAKT_MRU)[any(sickbeard.TRAKT_MRU)]) return self.redirect('/home/addShows/%s' % ('trakt_trending', sickbeard.TRAKT_MRU)[any(sickbeard.TRAKT_MRU)])
@staticmethod
def get_trakt_data(url_path, *args, **kwargs):
normalised, filtered = ([], [])
error_msg = None
try:
account = kwargs.get('send_oauth', None)
if account:
account = sickbeard.helpers.tryInt(account)
resp = TraktAPI().trakt_request('%sextended=full,images' % url_path, send_oauth=account)
if resp:
if 'show' in resp[0]:
if 'first_aired' in resp[0]:
for item in resp:
item['show']['first_aired'] = item['first_aired']
del item['first_aired']
normalised = resp
else:
for item in resp:
normalised.append({u'show': item})
del resp
except TraktAuthException as e:
logger.log(u'Pin authorisation needed to connect to Trakt service: %s' % ex(e), logger.WARNING)
error_msg = 'Unauthorized: Get another pin in the Notifications Trakt settings'
except TraktException as e:
logger.log(u'Could not connect to Trakt service: %s' % ex(e), logger.WARNING)
except (IndexError, KeyError):
pass
if not normalised:
error_msg = 'No items in watchlist. Use the "Add to watchlist" button at the Trakt website'
raise Exception(error_msg)
oldest_dt = 9999999
newest_dt = 0
oldest = None
newest = None
for item in normalised:
ignore = '''
((bbc|channel\s*?5.*?|itv)\s*?(drama|documentaries))|bbc\s*?(comedy|music)|music\s*?specials|tedtalks
'''
if re.search(ignore, item['show']['title'].strip(), re.I | re.X):
continue
try:
dt = dateutil.parser.parse(item['show']['first_aired'])
dt_ordinal = dt.toordinal()
dt_string = sbdatetime.sbdatetime.sbfdate(dt)
if dt_ordinal < oldest_dt:
oldest_dt = dt_ordinal
oldest = dt_string
if dt_ordinal > newest_dt:
newest_dt = dt_ordinal
newest = dt_string
tmdbid = item.get('show', {}).get('ids', {}).get('tmdb', 0)
tvdbid = item.get('show', {}).get('ids', {}).get('tvdb', 0)
traktid = item.get('show', {}).get('ids', {}).get('trakt', 0)
images = dict(poster=dict(thumb='imagecache?path=browse/thumb/trakt&filename=%s&tmdbid=%s&tvdbid=%s' %
('%s.jpg' % traktid, tmdbid, tvdbid)))
filtered.append(dict(
premiered=dt_ordinal,
premiered_str=dt_string,
when_past=dt_ordinal < datetime.datetime.now().toordinal(), # air time not yet available 16.11.2015
episode_number='' if 'episode' not in item else item['episode']['number'] or 1,
episode_overview=('' if 'episode' not in item else
item['episode']['overview'].strip() or ''),
episode_season='' if 'episode' not in item else item['episode']['season'] or 1,
genres=('' if 'genres' not in item['show'] else
', '.join(['%s' % v for v in item['show']['genres']])),
ids=item['show']['ids'],
images=images,
overview=('' if 'overview' not in item['show'] or None is item['show']['overview'] else
item['show']['overview'].strip()),
rating=0 < item['show'].get('rating', 0) and
('%.2f' % (item['show'].get('rating') * 10)).replace('.00', '') or 0,
title=item['show']['title'].strip(),
url_src_db='https://trakt.tv/shows/%s' % item['show']['ids']['slug'],
url_tvdb=('', '%s%s' % (sickbeard.indexerApi(INDEXER_TVDB).config['show_url'],
item['show']['ids']['tvdb']))[
isinstance(item['show']['ids']['tvdb'], (int, long))
and 0 < item['show']['ids']['tvdb']],
votes='0' if 'votes' not in item['show'] else item['show']['votes']))
except (StandardError, Exception):
pass
return filtered, oldest, newest
def browse_trakt(self, url_path, browse_title, *args, **kwargs): def browse_trakt(self, url_path, browse_title, *args, **kwargs):
browse_type = 'Trakt' browse_type = 'Trakt'
@ -6233,6 +6291,8 @@ class ApiBuilder(MainHandler):
t.seasonSQLResults = seasonSQLResults t.seasonSQLResults = seasonSQLResults
t.episodeSQLResults = episodeSQLResults t.episodeSQLResults = episodeSQLResults
t.indexers = sickbeard.indexerApi().all_indexers
t.searchindexers = sickbeard.indexerApi().search_indexers
if len(sickbeard.API_KEY) == 32: if len(sickbeard.API_KEY) == 32:
t.apikey = sickbeard.API_KEY t.apikey = sickbeard.API_KEY

Loading…
Cancel
Save