diff --git a/gui/slick/images/network/american heroes channel.png b/gui/slick/images/network/american heroes channel.png new file mode 100644 index 0000000000000000000000000000000000000000..9c95a0685f5f3c1564f4ece6a512d35c73824372 Binary files /dev/null and b/gui/slick/images/network/american heroes channel.png differ diff --git a/gui/slick/images/network/bravo (us).png b/gui/slick/images/network/bravo (us).png new file mode 100644 index 0000000000000000000000000000000000000000..41329084916114564fcac8d16c82d27c295108e9 Binary files /dev/null and b/gui/slick/images/network/bravo (us).png differ diff --git a/gui/slick/images/network/channel 5.png b/gui/slick/images/network/channel 5.png new file mode 100644 index 0000000000000000000000000000000000000000..9108b16ff6ceff7adeffe0de48bc193b0e54250d Binary files /dev/null and b/gui/slick/images/network/channel 5.png differ diff --git a/gui/slick/images/network/chiba tv.png b/gui/slick/images/network/chiba tv.png new file mode 100644 index 0000000000000000000000000000000000000000..f98e3c03a185b51530f653393e980e16fd21e328 Binary files /dev/null and b/gui/slick/images/network/chiba tv.png differ diff --git a/gui/slick/images/network/military channel.png b/gui/slick/images/network/military channel.png new file mode 100644 index 0000000000000000000000000000000000000000..4541fcd7b7846a31c0356177774d698a0523b718 Binary files /dev/null and b/gui/slick/images/network/military channel.png differ diff --git a/gui/slick/images/network/spike.png b/gui/slick/images/network/spike.png new file mode 100644 index 0000000000000000000000000000000000000000..def751e4ae7a35d507aecb2496decc68b9d22798 Binary files /dev/null and b/gui/slick/images/network/spike.png differ diff --git a/gui/slick/images/network/sun-tv.png b/gui/slick/images/network/sun-tv.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ce8af77ed58480f8f4a030ee11659d98ececa7 Binary files /dev/null and b/gui/slick/images/network/sun-tv.png differ diff --git a/gui/slick/images/network/syndication.png b/gui/slick/images/network/syndication.png new file mode 100644 index 0000000000000000000000000000000000000000..ece0dd551f17741aed21fa74fc9ffa2b945605bd Binary files /dev/null and b/gui/slick/images/network/syndication.png differ diff --git a/gui/slick/images/network/teletama.png b/gui/slick/images/network/teletama.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1b3075d5782e36bf72d8f9ec4bade50ca2472c Binary files /dev/null and b/gui/slick/images/network/teletama.png differ diff --git a/gui/slick/images/network/uktv yesterday.png b/gui/slick/images/network/uktv yesterday.png new file mode 100644 index 0000000000000000000000000000000000000000..29e7638ef674b6c4075783394dd860a656da21d4 Binary files /dev/null and b/gui/slick/images/network/uktv yesterday.png differ diff --git a/gui/slick/images/network/we tv.png b/gui/slick/images/network/we tv.png new file mode 100644 index 0000000000000000000000000000000000000000..d29c3489372da614d0a338cdd99ec88de9d0fb07 Binary files /dev/null and b/gui/slick/images/network/we tv.png differ diff --git a/gui/slick/interfaces/default/apiBuilder.tmpl b/gui/slick/interfaces/default/apiBuilder.tmpl index 3e4e5fd0410d3b87d16f1e386a87fee520776985..e7b0454f48fe45a3d6cd205ec1e44fd8cf24d906 100644 --- a/gui/slick/interfaces/default/apiBuilder.tmpl +++ b/gui/slick/interfaces/default/apiBuilder.tmpl @@ -32,25 +32,29 @@ addListGroup("api", "Command"); addOption("Command", "SickRage", "?cmd=sb", 1); //make default addList("Command", "SickRage.AddRootDir", "?cmd=sb.addrootdir", "sb.addrootdir", "", "", "action"); -addOption("Command", "SickRage.CheckVersion", "?cmd=sb.checkversion", "", "", "action"); addOption("Command", "SickRage.CheckScheduler", "?cmd=sb.checkscheduler", "", "", "action"); +addOption("Command", "SickRage.CheckVersion", "?cmd=sb.checkversion", "", "", "action"); addList("Command", "SickRage.DeleteRootDir", "?cmd=sb.deleterootdir", "sb.deleterootdir", "", "", "action"); -addOption("Command", "SickRage.ForceSearch", "?cmd=sb.forcesearch", "", "", "action"); addOption("Command", "SickRage.GetDefaults", "?cmd=sb.getdefaults", "", "", "action"); addOption("Command", "SickRage.GetMessages", "?cmd=sb.getmessages", "", "", "action"); addOption("Command", "SickRage.GetRootDirs", "?cmd=sb.getrootdirs", "", "", "action"); addList("Command", "SickRage.PauseBacklog", "?cmd=sb.pausebacklog", "sb.pausebacklog", "", "", "action"); addOption("Command", "SickRage.Ping", "?cmd=sb.ping", "", "", "action"); addOption("Command", "SickRage.Restart", "?cmd=sb.restart", "", "", "action"); -addList("Command", "SickRage.searchindexers", "?cmd=sb.searchindexers", "sb.searchindexers", "", "", "action"); +addList("Command", "SickRage.SearchIndexers", "?cmd=sb.searchindexers", "sb.searchindexers", "", "", "action"); +addList("Command", "SickRage.SearchTVDb", "?cmd=sb.searchtvdb", "sb.searchindexers", "", "", "action"); +addList("Command", "SickRage.SearchTVRage", "?cmd=sb.searchtvrage", "sb.searchindexers", "", "", "action"); addList("Command", "SickRage.SetDefaults", "?cmd=sb.setdefaults", "sb.setdefaults", "", "", "action"); addOption("Command", "SickRage.Shutdown", "?cmd=sb.shutdown", "", "", "action"); addOption("Command", "SickRage.Update", "?cmd=sb.update", "", "", "action"); +addOption("Command", "Backlog", "?cmd=backlog", "", "", "action"); addList("Command", "Coming Episodes", "?cmd=future", "future"); addList("Command", "Episode", "?cmd=episode", "episode"); addList("Command", "Episode.Search", "?cmd=episode.search", "episode.search", "", "", "action"); addList("Command", "Episode.SetStatus", "?cmd=episode.setstatus", "episode.setstatus", "", "", "action"); +addList("Command", "Episode.SubtitleSearch", "?cmd=episode.subtitlesearch", "episode.search", "", "", "action"); addList("Command", "Scene Exceptions", "?cmd=exceptions", "exceptions"); +addOption("Command", "Failed", "?cmd=failed", "", "", "action"); addList("Command", "History", "?cmd=history", "history"); addOption("Command", "History.Clear", "?cmd=history.clear", "", "", "action"); addOption("Command", "History.Trim", "?cmd=history.trim", "", "", "action"); diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index e66804939e7e22f321b092a3f0f3b373c7ed352f..afe0cfd7e1bb89b17720e33c597230f3e6fe85bb 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -64,8 +64,6 @@ class MainSanityCheck(db.DBSanityCheck): cur_dupe_id["show_id"])) self.connection.action("DELETE FROM tv_shows WHERE show_id = ?", [cur_dupe_id["show_id"]]) - else: - logger.log(u"No duplicate show, check passed", logger.DEBUG) def fix_duplicate_episodes(self): @@ -88,9 +86,6 @@ class MainSanityCheck(db.DBSanityCheck): logger.log(u"Deleting duplicate episode with episode_id: " + str(cur_dupe_id["episode_id"])) self.connection.action("DELETE FROM tv_episodes WHERE episode_id = ?", [cur_dupe_id["episode_id"]]) - else: - logger.log(u"No duplicate episode, check passed", logger.DEBUG) - def fix_orphan_episodes(self): sqlResults = self.connection.select( @@ -102,9 +97,6 @@ class MainSanityCheck(db.DBSanityCheck): logger.log(u"Deleting orphan episode with episode_id: " + str(cur_orphan["episode_id"])) self.connection.action("DELETE FROM tv_episodes WHERE episode_id = ?", [cur_orphan["episode_id"]]) - else: - logger.log(u"No orphan episodes, check passed", logger.DEBUG) - def fix_missing_table_indexes(self): if not self.connection.select("PRAGMA index_info('idx_indexer_id')"): logger.log(u"Missing idx_indexer_id for TV Shows table detected!, fixing...") @@ -135,19 +127,14 @@ class MainSanityCheck(db.DBSanityCheck): curDate = datetime.date.today() sqlResults = self.connection.select( - "SELECT episode_id, showid FROM tv_episodes WHERE airdate > ? AND status in (?,?)", + "SELECT episode_id FROM tv_episodes WHERE (airdate > ? or airdate = 1) AND status in (?,?)", [curDate.toordinal(), common.SKIPPED, common.WANTED]) for cur_unaired in sqlResults: - logger.log(u"UNAIRED episode detected! episode_id: " + str(cur_unaired["episode_id"]) + " showid: " + str( - cur_unaired["showid"]), logger.DEBUG) - logger.log(u"Fixing unaired episode status with episode_id: " + str(cur_unaired["episode_id"])) + logger.log(u"Fixing unaired episode status for episode_id: %s" % cur_unaired["episode_id"]) self.connection.action("UPDATE tv_episodes SET status = ? WHERE episode_id = ?", [common.UNAIRED, cur_unaired["episode_id"]]) - else: - logger.log(u"No UNAIRED episodes, check passed", logger.DEBUG) - def fix_tvrage_show_statues(self): status_map = { 'returning series': 'Continuing', @@ -177,8 +164,6 @@ class MainSanityCheck(db.DBSanityCheck): logger.log(u"Fixing malformed episode status with episode_id: " + str(cur_ep["episode_id"])) self.connection.action("UPDATE tv_episodes SET status = ? WHERE episode_id = ?", [common.UNKNOWN, cur_ep["episode_id"]]) - else: - logger.log(u"No MALFORMED episode statuses, check passed", logger.DEBUG) def fix_invalid_airdates(self): @@ -192,9 +177,6 @@ class MainSanityCheck(db.DBSanityCheck): logger.log(u"Fixing bad episode airdate for episode_id: " + str(bad_airdate["episode_id"])) self.connection.action("UPDATE tv_episodes SET airdate = '1' WHERE episode_id = ?", [bad_airdate["episode_id"]]) - else: - logger.log(u"No bad episode airdates, check passed", logger.DEBUG) - def fix_subtitles_codes(self): sqlResults = self.connection.select( diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 276aea5f8b8f796ffbf4627b1eb170f55bb5c02e..053fef76092eac52921af23c1013d37d34959e3c 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -131,6 +131,7 @@ def remove_non_release_groups(name): '\[Seedbox\]$': 'searchre', '\[AndroidTwoU\]$': 'searchre', '\.RiPSaLoT$': 'searchre', + '\.GiuseppeTnT$': 'searchre', '-NZBGEEK$': 'searchre', '-RP$': 'searchre', '-20-40$': 'searchre', @@ -1116,7 +1117,7 @@ def makeZip(fileList, archive): 'archive' is the file name for the archive with a full path """ try: - a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED) + a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED, allowZip64=True) for f in fileList: a.write(f) a.close() diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 5e1357f0fbb331edc26866bd4239438aecf8f7cb..6fcf33dcd4905f0d048fe8684a56f9e010c8faeb 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -214,12 +214,12 @@ def makeTorrentRssProvider(configString): def getDefaultNewznabProviders(): #name|url|key|catIDs|enabled|search_mode|search_fallback|enable_daily|enable_backlog - return 'NZB.Cat|https://nzb.cat/||5030,5040,5010,5060|0|eponly|1|1|1!!!' + \ + return 'NZB.Cat|https://nzb.cat/||5030,5040,5010|0|eponly|1|1|1!!!' + \ + 'NZBGeek|https://api.nzbgeek.info/||5030,5040|0|eponly|0|0|0!!!' + \ 'Sick Beard Index|http://lolo.sickbeard.com/|0|5030,5040|0|eponly|0|0|0!!!' + \ 'NZBs.org|https://nzbs.org/||5030,5040|0|eponly|0|0|0!!!' + \ 'Usenet-Crawler|https://www.usenet-crawler.com/||5030,5040|0|eponly|0|0|0' - def getProviderModule(name): name = name.lower() prefix = "sickbeard.providers." diff --git a/sickbeard/providers/cpasbien.py b/sickbeard/providers/cpasbien.py index bf82134f2dd772e1a61f970125b97264edcaf5eb..ad4a0b43ebff34d257445dbccac0d8aee531ff51 100644 --- a/sickbeard/providers/cpasbien.py +++ b/sickbeard/providers/cpasbien.py @@ -121,7 +121,11 @@ class CpasbienProvider(generic.TorrentProvider): for search_string in search_params[mode]: searchURL = self.url + '/recherche/'+search_string.replace('.','-')+'.html' - data = self.getURL(searchURL) + data = self.getURL(searchURL) + + if not data: + continue + try: with BS4Parser(data, features=["html5lib", "permissive"]) as html: diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index c10d5e6205416f24cbb2cd16d344fcc77cb567c1..16bc0b008f836512f5820d729bb1a786e9efe2d3 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -75,7 +75,6 @@ class GenericProvider: self.btCacheURLS = [ 'http://torcache.net/torrent/{torrent_hash}.torrent', - 'http://zoink.ch/torrent/{torrent_name}.torrent', 'http://torrage.com/torrent/{torrent_hash}.torrent', #'http://itorrents.org/torrent/{torrent_hash}.torrent', ] diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index 58206969fb4e2b308454fbfcefc000c84cbf7c2a..a9f18435cb0e4eb8069c19b8d26da7f805c06ffc 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -260,6 +260,9 @@ class NewznabProvider(generic.NZBProvider): "attrs": "rageid", "offset": 0} + if search_params: + params.update(search_params) + # category ids if self.show and self.show.is_sports: params['cat'] = self.catIDs + ',5060' @@ -268,9 +271,6 @@ class NewznabProvider(generic.NZBProvider): else: params['cat'] = self.catIDs - if search_params: - params.update(search_params) - if self.needs_auth and self.key: params['apikey'] = self.key diff --git a/sickbeard/tv.py b/sickbeard/tv.py index d00e8ddbd62823e3aebd20eecc7d0bd356026820..260a06b1ca5ef74cebc9ee755b321990da88ce4c 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -1780,44 +1780,19 @@ class TVEpisode(object): return if self.location: - logger.log(str(self.show.indexerid) + u": Setting status for " + str(season) + "x" + str( - episode) + " based on status " + str(self.status) + " and existence of " + self.location, logger.DEBUG) + logger.log(u"%s: Setting status for S%02dE%02d based on status %s and location %s" % + (self.show.indexerid, season, episode, statusStrings[self.status], self.location), logger.DEBUG) - # if we don't have the file if not ek.ek(os.path.isfile, self.location): - - # if it hasn't aired yet set the status to UNAIRED - if self.airdate >= datetime.date.today() and self.status in [SKIPPED, UNAIRED, UNKNOWN, WANTED]: - logger.log(u"Episode airs in the future, marking it UNAIRED", logger.DEBUG) - self.status = UNAIRED - - # if there's no airdate then set it to skipped (and respect ignored) - elif self.airdate == datetime.date.fromordinal(1): - if self.status == IGNORED: - logger.log(u"Episode has no air date, but it's already marked as ignored", logger.DEBUG) - else: - logger.log(u"Episode has no air date, automatically marking it unaired", logger.DEBUG) - self.status = UNAIRED - - # if we don't have the file and the airdate is in the past + if self.airdate >= datetime.date.today() or self.airdate == datetime.date.fromordinal(1): + logger.log(u"Episode airs in the future or has no airdate, marking it %s" % statusStrings[UNAIRED], logger.DEBUG) + self.status = UNAIRED if self.season > 0 else SKIPPED # Some specials have no airdate + elif self.status in [UNAIRED, UNKNOWN]: + # Only do UNAIRED/UNKNOWN, it could already be snatched/ignored/skipped, or downloaded/archived to disconnected media + logger.log(u"Episode has already aired, marking it %s" % statusStrings[self.show.default_ep_status], logger.DEBUG) + self.status = self.show.default_ep_status if self.season > 0 else SKIPPED # auto-skip specials else: - if self.status == UNAIRED: - if self.season > 0: - self.status = WANTED - else: - self.status = SKIPPED - - # if we somehow are still UNKNOWN then just use the shows defined default status or SKIPPED - elif self.status == UNKNOWN: - if self.season > 0: #If it's not a special - self.status = self.show.default_ep_status - else: - self.status = SKIPPED - - else: - logger.log( - u"Not touching status because we have no ep file, the airdate is in the past, and the status is " + str( - self.status), logger.DEBUG) + logger.log(u"Not touching status [ %s ] It could be skipped/ignored/snatched/archived" % statusStrings[self.status], logger.DEBUG) # if we have a media file then it's downloaded elif sickbeard.helpers.isMediaFile(self.location): diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index ef8371c7aa54d3d007cd73fc5e24b9cfae1174a2..f82ad918577ba59c8f163fa4d932994bd8c27d09 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -175,7 +175,7 @@ class ApiHandler(RequestHandler): cmd, cmdIndex = cmd.split("_") # this gives us the clear cmd and the index logger.log(u"API :: " + cmd + ": curKwargs " + str(curKwargs), logger.DEBUG) - if not (multiCmds and cmd in ('show.getposter', 'show.getbanner')): # skip these cmd while chaining + if not (multiCmds and cmd in ('show.getposter', 'show.getbanner', 'show.getnetworklogo')): # skip these cmd while chaining try: if cmd in _functionMaper: # map function @@ -1807,8 +1807,8 @@ class CMD_SickBeardSearchTVDB(CMD_SickBeardSearchIndexers): def __init__(self, args, kwargs): - self.indexerid, args = self.check_params(args, kwargs, "tvdbid", None, False, "int", []) CMD_SickBeardSearchIndexers.__init__(self, args, kwargs) + self.indexerid, args = self.check_params(args, kwargs, "tvdbid", None, False, "int", []) class CMD_SickBeardSearchTVRAGE(CMD_SickBeardSearchIndexers): @@ -1820,8 +1820,8 @@ class CMD_SickBeardSearchTVRAGE(CMD_SickBeardSearchIndexers): } def __init__(self, args, kwargs): - self.indexerid, args = self.check_params(args, kwargs, "tvrageid", None, False, "int", []) CMD_SickBeardSearchIndexers.__init__(self, args, kwargs) + self.indexerid, args = self.check_params(args, kwargs, "tvrageid", None, False, "int", []) class CMD_SickBeardSetDefaults(ApiCall):