diff --git a/gui/slick/css/style.css b/gui/slick/css/style.css index 7f7bef1f1e5663a06e39ed3e769e61ab41102ac3..b4d7e261be368dce1e1ae17700cfb154f6e52155 100644 --- a/gui/slick/css/style.css +++ b/gui/slick/css/style.css @@ -2976,7 +2976,7 @@ li.token-input-token { } li.token-input-token img { - padding-top: 7px; + padding-top: 3px; padding-right: 4px; float: left; } diff --git a/gui/slick/js/lib/jquery.tokeninput.js b/gui/slick/js/lib/jquery.tokeninput.js index 5ef1b848253697db47349dbe156fee3a0a2952f5..5eec491e16278debb91c5e53173a7583382b408c 100644 --- a/gui/slick/js/lib/jquery.tokeninput.js +++ b/gui/slick/js/lib/jquery.tokeninput.js @@ -43,8 +43,8 @@ var DEFAULT_SETTINGS = { idPrefix: "token-input-", // Formatters - resultsFormatter: function(item){ return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' /> " + item[this.propertyToSearch]+ "</li>" }, - tokenFormatter: function(item) { return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' /> <p>" + item[this.propertyToSearch] + "</p></li>" }, + resultsFormatter: function(item){ return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' onError=this.onerror=null;this.src='"+srRoot+"/images/flags/unknown.png'; /> " + item[this.propertyToSearch]+ "</li>" }, + tokenFormatter: function(item) { return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' onError=this.onerror=null;this.src='"+srRoot+"/images/flags/unknown.png'; /> <p>" + item[this.propertyToSearch] + "</p></li>" }, flag: "flag", // Callbacks diff --git a/gui/slick/js/manageSubtitleMissed.js b/gui/slick/js/manageSubtitleMissed.js index a05ff4480d55b3c2d199b24ab3670a784b562cba..228b3f171a3368379f88dce97151b63586483493 100644 --- a/gui/slick/js/manageSubtitleMissed.js +++ b/gui/slick/js/manageSubtitleMissed.js @@ -8,12 +8,6 @@ $(document).ready(function() { row += ' <td align="center"><input type="checkbox" class="'+indexer_id+'-epcheck" name="'+indexer_id+'-'+season+'x'+episode+'"'+checked+'></td>'; row += ' <td style="width: 1%;">'+season+'x'+episode+'</td>'; row += ' <td>'+name+'</td>'; - row += ' <td style="float: right;">'; - subtitles = subtitles.split(','); - for (var i in subtitles) { - row += ' <img src="/images/subtitles/flags/'+subtitles[i]+'.png" width="16" height="11" alt="'+subtitles[i]+'" /> '; - } - row += ' </td>'; row += ' </tr>'; return row; diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index 3272d7f29957f415773f3be709f7ebcb9049bcc3..73dae7847488b6157ceaabc492e5153f065175f1 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -313,6 +313,7 @@ <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.tokeninput.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script><!-- Can't be added to bower --> diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 82492a048837c48f41097f1c303c0cbff6a80fb5..8b27416b9eaff36d8c3b103274d9189c627cead4 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -137,6 +137,7 @@ def remove_non_release_groups(name): r'\[rarbg\]$': 'searchre', r'\[eztv\]$': 'searchre', r'\[ettv\]$': 'searchre', + r'\[cttv\]$': 'searchre', r'\[vtv\]$': 'searchre', r'\[EtHD\]$': 'searchre', r'\[GloDLS\]$': 'searchre', @@ -542,7 +543,7 @@ def hardlinkFile(srcFile, destFile): fixSetGroupID(destFile) except Exception as e: logger.log(u"Failed to create hardlink of %s at %s. Error: %r. Copying instead" - % (srcFile, destFile, ex(e)), logger.ERROR) + % (srcFile, destFile, ex(e)), logger.WARNING) copyFile(srcFile, destFile) @@ -576,7 +577,7 @@ def moveAndSymlinkFile(srcFile, destFile): ek(symlink, destFile, srcFile) except Exception as e: logger.log(u"Failed to create symlink of %s at %s. Error: %r. Copying instead" - % (srcFile, destFile, ex(e)), logger.ERROR) + % (srcFile, destFile, ex(e)), logger.WARNING) copyFile(srcFile, destFile) diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index d853b45554108f64a2610f56a92e7239b4760d9a..93542264b21f1b629e25a91b1b337ec9fa090b6d 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -73,7 +73,7 @@ class ExtraTorrentProvider(generic.TorrentProvider): continue try: - data = xmltodict.parse(HTMLParser.HTMLParser().unescape(data).replace('&', '&')) + data = xmltodict.parse(HTMLParser.HTMLParser().unescape(data.encode('utf-8')).replace('&', '&')) except ExpatError as e: logger.log(u"Failed parsing provider. Traceback: %r\n%r" % (traceback.format_exc(), data), logger.ERROR) continue @@ -87,7 +87,7 @@ class ExtraTorrentProvider(generic.TorrentProvider): entries = entries if isinstance(entries, list) else [entries] for item in entries: - title = item['title'] + title = item['title'].decode('utf-8') # info_hash = item['info_hash'] size = int(item['size']) seeders = helpers.tryInt(item['seeders'], 0) diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index 5200f2c13a10feba1a015ac78afe164575efbf46..a136415e206ecc964b078aa8b7d6e9c506bdd07d 100644 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -92,7 +92,7 @@ class KATProvider(generic.TorrentProvider): continue try: - data = xmltodict.parse(HTMLParser.HTMLParser().unescape(data).replace('&', '&')) + data = xmltodict.parse(HTMLParser.HTMLParser().unescape(data.encode('utf-8')).replace('&', '&')) except ExpatError as e: logger.log(u"Failed parsing provider. Traceback: %r\n%r" % (traceback.format_exc(), data), logger.ERROR) continue @@ -107,7 +107,7 @@ class KATProvider(generic.TorrentProvider): for item in entries: try: - title = item['title'] + title = item['title'].decode('utf-8') # Use the torcache link kat provides, # unless it is not torcache or we are not using blackhole diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py index 228ac0109249063d5ca97e29b5a91624faa448d1..7a8625c8c6ba3d44525b230207dc683de04665f5 100644 --- a/sickbeard/providers/torrentproject.py +++ b/sickbeard/providers/torrentproject.py @@ -82,8 +82,12 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): logger.log("Torrent has less than 10 seeds getting dyn trackers: " + title, logger.DEBUG) trackerUrl = self.urls['api'] + "" + t_hash + "/trackers_json" jdata = self.getURL(trackerUrl, json=True) - download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "".join(["&tr=" + s for s in jdata]) - logger.log("Dyn Magnet: " + download_url, logger.DEBUG) + if jdata == "maintenance": + download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" + logger.log("Tracker url is in " + jdata + " mode, using hardcoded one" , logger.INFO) + else: + download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "".join(["&tr=" + s for s in jdata]) + logger.log("Dyn Magnet: " + download_url, logger.DEBUG) else: download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" logger.log("Result has less than 10 seeds but not using Dyn Magnet becouse its from RSS" + title, logger.DEBUG) diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index 5e6959caa16df430c0e3919ecc89f1c265700d9f..1b5ab9f938d6d63adbe548b8ffa330ab7dc4b5e0 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -74,7 +74,6 @@ provider_urls = { 'tvsubtitles': 'http://www.tvsubtitles.net' } -SINGLE = 'und' def sortedServiceList(): newList = [] @@ -149,13 +148,6 @@ def downloadSubtitles(subtitles_info): logger.log(u'%s: No subtitles found for S%02dE%02d on any provider' % (subtitles_info['show.indexerid'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) - for subtitle in found_subtitles: - # Force subtitle encoding to utf-8 for some languages - if subtitle.language.alpha3 == 'pol': - setattr(subtitle, 'encoding', 'utf-8') - elif subtitle.language.alpha3 == 'bul': - setattr(subtitle, 'encoding', 'utf-8') - save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) if not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith(('.mkv', '.mp4')): @@ -181,12 +173,12 @@ def save_subtitles(video, subtitles, single=False, directory=None): for subtitle in subtitles: # check content if subtitle.content is None: - logger.log("Skipping subtitle %r: no content" % subtitle, logger.DEBUG) + logger.log("Skipping subtitle for %s: no content" % video.name, logger.DEBUG) continue # check language if subtitle.language in set(s.language for s in saved_subtitles): - logger.log("Skipping subtitle %r: language already saved" % subtitle, logger.DEBUG) + logger.log("Skipping subtitle for %s: language already saved" % video.name, logger.DEBUG) continue # create subtitle path @@ -195,7 +187,7 @@ def save_subtitles(video, subtitles, single=False, directory=None): subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1]) # save content as is or in the specified encoding - logger.log("Saving %r to %r" % (subtitle, subtitle_path), logger.DEBUG) + logger.log("Saving subtitle for %s to %s" % (video.name, subtitle_path), logger.DEBUG) if subtitle.encoding: with io.open(subtitle_path, 'w', encoding=subtitle.encoding) as f: f.write(subtitle.text) @@ -294,11 +286,6 @@ def subtitlesLanguages(video_path): elif hasattr(language, 'alpha2') and language.alpha2: resultList.append(language.alpha2) - defaultLang = wantedLanguages() - - if ('pob' in defaultLang or 'pb' in defaultLang) and ('pt' not in defaultLang and 'por' not in defaultLang): - resultList = [x if not x in ['por', 'pt'] else u'pob' for x in resultList] - return (sorted(resultList), should_save_subtitles) def getEmbeddedLanguages(video_path): @@ -325,7 +312,7 @@ def getEmbeddedLanguages(video_path): else: logger.log('MKV has no subtitle track', logger.DEBUG) except MalformedMKVError: - logger.log('MKV seems to be malformed, ignoring embedded subtitles', logger.WARNING) + logger.log('MKV seems to be malformed, ignoring embedded subtitles', logger.INFO) return embedded_subtitle_languages @@ -339,6 +326,8 @@ def scan_subtitle_languages(path): subtitles.add(Language.fromopensubtitles(os.path.splitext(p)[0][-2:])) elif os.path.splitext(p)[0].endswith(language_extensions) and len(os.path.splitext(p)[0].rsplit('.', 1)[1]) is 3: subtitles.add(Language.fromopensubtitles(os.path.splitext(p)[0][-3:])) + elif os.path.splitext(p)[0].endswith('pt-BR') and len(os.path.splitext(p)[0].rsplit('.', 1)[1]) is 5: + subtitles.add(Language.fromopensubtitles('pob')) else: subtitles.add(Language('und')) @@ -374,7 +363,7 @@ class SubtitlesFinder(): # get episodes on which we want subtitles # criteria is: # - show subtitles = 1 - # - episode subtitles != config wanted languages or SINGLE (depends on config multi) + # - episode subtitles != config wanted languages or 'und' (depends on config multi) # - search count < 2 and diff(airdate, now) > 1 week : now -> 1d # - search count < 7 and diff(airdate, now) <= 1 week : now -> 4h -> 8h -> 16h -> 1d -> 1d -> 1d diff --git a/sickrage/show/ComingEpisodes.py b/sickrage/show/ComingEpisodes.py index 2f929ec2fb94f51673d802c0dfc38e0d4978f0ea..1411e3f42ce4fe8dec8ae08089ec374d20c43256 100644 --- a/sickrage/show/ComingEpisodes.py +++ b/sickrage/show/ComingEpisodes.py @@ -19,7 +19,7 @@ import sickbeard from datetime import date, timedelta -from sickbeard.common import IGNORED, Quality, WANTED +from sickbeard.common import IGNORED, Quality, WANTED, UNAIRED from sickbeard.db import DBConnection from sickbeard.network_timezones import parse_date_time from sickbeard.sbdatetime import sbdatetime @@ -108,9 +108,9 @@ class ComingEpisodes: 'AND s.indexer_id = e.showid ' 'AND airdate < ? ' 'AND airdate >= ? ' - 'AND e.status = ? ' + 'AND e.status IN (?,?) ' 'AND e.status NOT IN (' + ','.join(['?'] * len(qualities_list)) + ')', - [today, recently, WANTED] + qualities_list + [today, recently, WANTED, UNAIRED] + qualities_list ) results = [dict(result) for result in results]