Merge branch 'master' into develop
|
@ -25,6 +25,13 @@
|
||||||
* Change emails to Unicode aware
|
* Change emails to Unicode aware
|
||||||
|
|
||||||
|
|
||||||
|
### 0.11.4 (2016-01-31 11:30:00 UTC)
|
||||||
|
|
||||||
|
* Fix issue setting some custom name patterns on the "Config/Post Processing/Episode Naming" tab
|
||||||
|
* Remove Strike torrent provider
|
||||||
|
* Add network icons
|
||||||
|
|
||||||
|
|
||||||
### 0.11.3 (2016-01-16 20:00:00 UTC)
|
### 0.11.3 (2016-01-16 20:00:00 UTC)
|
||||||
|
|
||||||
* Fix Search Settings display fail
|
* Fix Search Settings display fail
|
||||||
|
|
BIN
gui/slick/images/network/bbc hd.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
gui/slick/images/network/bravo!.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.3 KiB |
BIN
gui/slick/images/network/cctv.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
gui/slick/images/network/cnbc.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
gui/slick/images/network/living.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
gui/slick/images/network/prime.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
gui/slick/images/network/sky living.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
gui/slick/images/network/sky sports.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gui/slick/images/network/stv.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
gui/slick/images/network/svt.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
gui/slick/images/network/tvnz.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 417 B |
|
@ -10,7 +10,6 @@ $(document).ready(function () {
|
||||||
})();
|
})();
|
||||||
|
|
||||||
function israr_supported() {
|
function israr_supported() {
|
||||||
var pattern = $('#naming_pattern').val();
|
|
||||||
$.get(sbRoot + '/config/postProcessing/isRarSupported',
|
$.get(sbRoot + '/config/postProcessing/isRarSupported',
|
||||||
function (data) {
|
function (data) {
|
||||||
if (data == "supported") {
|
if (data == "supported") {
|
||||||
|
@ -29,9 +28,8 @@ $(document).ready(function () {
|
||||||
function fill_examples() {
|
function fill_examples() {
|
||||||
var pattern = $('#naming_pattern').val();
|
var pattern = $('#naming_pattern').val();
|
||||||
var multi = $('#naming_multi_ep :selected').val();
|
var multi = $('#naming_multi_ep :selected').val();
|
||||||
var anime_type = $('input[name="naming_anime"]:checked').val();
|
|
||||||
|
|
||||||
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3},
|
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern},
|
||||||
function (data) {
|
function (data) {
|
||||||
if (data) {
|
if (data) {
|
||||||
$('#naming_example').text(data + '.ext');
|
$('#naming_example').text(data + '.ext');
|
||||||
|
@ -41,7 +39,7 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3},
|
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi},
|
||||||
function (data) {
|
function (data) {
|
||||||
if (data) {
|
if (data) {
|
||||||
$('#naming_example_multi').text(data + '.ext');
|
$('#naming_example_multi').text(data + '.ext');
|
||||||
|
@ -51,7 +49,7 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type},
|
$.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi},
|
||||||
function (data) {
|
function (data) {
|
||||||
if (data == "invalid") {
|
if (data == "invalid") {
|
||||||
$('#naming_pattern').qtip('option', {
|
$('#naming_pattern').qtip('option', {
|
||||||
|
@ -80,6 +78,8 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function fill_abd_examples() {
|
function fill_abd_examples() {
|
||||||
|
if (!$('#naming_custom_abd').is(':checked'))
|
||||||
|
return;
|
||||||
var pattern = $('#naming_abd_pattern').val();
|
var pattern = $('#naming_abd_pattern').val();
|
||||||
|
|
||||||
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'},
|
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'},
|
||||||
|
@ -121,47 +121,8 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function fill_sports_examples() {
|
function fill_sports_examples() {
|
||||||
var pattern = $('#naming_sports_pattern').val();
|
if (!$('#naming_custom_sports').is(':checked'))
|
||||||
|
return;
|
||||||
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'},
|
|
||||||
function (data) {
|
|
||||||
if (data) {
|
|
||||||
$('#naming_sports_example').text(data + '.ext');
|
|
||||||
$('#naming_sports_example_div').show();
|
|
||||||
} else {
|
|
||||||
$('#naming_sports_example_div').hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'},
|
|
||||||
function (data) {
|
|
||||||
if (data == "invalid") {
|
|
||||||
$('#naming_sports_pattern').qtip('option', {
|
|
||||||
'content.text': 'This pattern is invalid.',
|
|
||||||
'style.classes': 'qtip-red qtip-rounded qtip-shadow'
|
|
||||||
});
|
|
||||||
$('#naming_sports_pattern').qtip('toggle', true);
|
|
||||||
$('#naming_sports_pattern').css('background-color', '#FFDDDD');
|
|
||||||
} else if (data == "seasonfolders") {
|
|
||||||
$('#naming_sports_pattern').qtip('option', {
|
|
||||||
'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.',
|
|
||||||
'style.classes': 'qtip-red qtip-rounded qtip-shadow'
|
|
||||||
});
|
|
||||||
$('#naming_sports_pattern').qtip('toggle', true);
|
|
||||||
$('#naming_sports_pattern').css('background-color', '#FFFFDD');
|
|
||||||
} else {
|
|
||||||
$('#naming_sports_pattern').qtip('option', {
|
|
||||||
'content.text': 'This pattern is valid.',
|
|
||||||
'style.classes': 'qtip-green qtip-rounded qtip-shadow'
|
|
||||||
});
|
|
||||||
$('#naming_sports_pattern').qtip('toggle', false);
|
|
||||||
$('#naming_sports_pattern').css('background-color', '#FFFFFF');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function fill_sports_examples() {
|
|
||||||
var pattern = $('#naming_sports_pattern').val();
|
var pattern = $('#naming_sports_pattern').val();
|
||||||
|
|
||||||
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'},
|
$.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'},
|
||||||
|
@ -203,6 +164,8 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function fill_anime_examples() {
|
function fill_anime_examples() {
|
||||||
|
if (!$('#naming_custom_anime').is(':checked'))
|
||||||
|
return;
|
||||||
var pattern = $('#naming_anime_pattern').val();
|
var pattern = $('#naming_anime_pattern').val();
|
||||||
var multi = $('#naming_anime_multi_ep :selected').val();
|
var multi = $('#naming_anime_multi_ep :selected').val();
|
||||||
var anime_type = $('input[name="naming_anime"]:checked').val();
|
var anime_type = $('input[name="naming_anime"]:checked').val();
|
||||||
|
@ -549,4 +512,4 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
return save_config;
|
return save_config;
|
||||||
}))
|
}))
|
||||||
});
|
});
|
||||||
|
|
|
@ -24,33 +24,37 @@ from sickbeard import encodingKludge as ek
|
||||||
from sickbeard import tv
|
from sickbeard import tv
|
||||||
from sickbeard import common
|
from sickbeard import common
|
||||||
from sickbeard import logger
|
from sickbeard import logger
|
||||||
from sickbeard.name_parser.parser import NameParser, InvalidNameException
|
from sickbeard.name_parser.parser import NameParser
|
||||||
|
|
||||||
from common import Quality, DOWNLOADED
|
from common import Quality, DOWNLOADED
|
||||||
|
|
||||||
name_presets = ('%SN - %Sx%0E - %EN',
|
name_presets = (
|
||||||
'%S.N.S%0SE%0E.%E.N',
|
'%SN - %Sx%0E - %EN',
|
||||||
'%Sx%0E - %EN',
|
'%S.N.S%0SE%0E.%E.N',
|
||||||
'S%0SE%0E - %EN',
|
'%Sx%0E - %EN',
|
||||||
'Season %0S/%S.N.S%0SE%0E.%Q.N-%RG'
|
'S%0SE%0E - %EN',
|
||||||
|
'Season %0S/%S.N.S%0SE%0E.%Q.N-%RG'
|
||||||
)
|
)
|
||||||
|
|
||||||
name_anime_presets = name_presets
|
name_anime_presets = name_presets
|
||||||
|
|
||||||
name_abd_presets = ('%SN - %A-D - %EN',
|
name_abd_presets = (
|
||||||
'%S.N.%A.D.%E.N.%Q.N',
|
'%SN - %A-D - %EN',
|
||||||
'%Y/%0M/%S.N.%A.D.%E.N-%RG'
|
'%S.N.%A.D.%E.N.%Q.N',
|
||||||
|
'%Y/%0M/%S.N.%A.D.%E.N-%RG'
|
||||||
)
|
)
|
||||||
|
|
||||||
name_sports_presets = ('%SN - %A-D - %EN',
|
name_sports_presets = (
|
||||||
'%S.N.%A.D.%E.N.%Q.N',
|
'%SN - %A-D - %EN',
|
||||||
'%Y/%0M/%S.N.%A.D.%E.N-%RG'
|
'%S.N.%A.D.%E.N.%Q.N',
|
||||||
|
'%Y/%0M/%S.N.%A.D.%E.N-%RG'
|
||||||
)
|
)
|
||||||
|
|
||||||
class TVShow():
|
|
||||||
|
class TVShow:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.name = "Show Name"
|
self.name = 'Show Name'
|
||||||
self.genre = "Comedy"
|
self.genre = 'Comedy'
|
||||||
self.indexerid = 1
|
self.indexerid = 1
|
||||||
self.air_by_date = 0
|
self.air_by_date = 0
|
||||||
self.sports = 0
|
self.sports = 0
|
||||||
|
@ -58,26 +62,17 @@ class TVShow():
|
||||||
self.scene = 0
|
self.scene = 0
|
||||||
|
|
||||||
def _is_anime(self):
|
def _is_anime(self):
|
||||||
if (self.anime > 0):
|
return 0 < self.anime
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
is_anime = property(_is_anime)
|
is_anime = property(_is_anime)
|
||||||
|
|
||||||
def _is_sports(self):
|
def _is_sports(self):
|
||||||
if (self.sports > 0):
|
return 0 < self.sports
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
is_sports = property(_is_sports)
|
is_sports = property(_is_sports)
|
||||||
|
|
||||||
def _is_scene(self):
|
def _is_scene(self):
|
||||||
if (self.scene > 0):
|
return 0 < self.scene
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
is_scene = property(_is_scene)
|
is_scene = property(_is_scene)
|
||||||
|
|
||||||
|
@ -106,16 +101,19 @@ def check_force_season_folders(pattern=None, multi=None, anime_type=None):
|
||||||
to be enabled or not.
|
to be enabled or not.
|
||||||
|
|
||||||
Returns true if season folders need to be forced on or false otherwise.
|
Returns true if season folders need to be forced on or false otherwise.
|
||||||
|
:param pattern: String Naming Pattern
|
||||||
|
:param multi: Bool Multi-episode pattern
|
||||||
|
:param anime_type: Integer Numbering type to use for anime pattern
|
||||||
"""
|
"""
|
||||||
if pattern == None:
|
if None is pattern:
|
||||||
pattern = sickbeard.NAMING_PATTERN
|
pattern = sickbeard.NAMING_PATTERN
|
||||||
|
|
||||||
if anime_type == None:
|
if None is anime_type:
|
||||||
anime_type = sickbeard.NAMING_ANIME
|
anime_type = sickbeard.NAMING_ANIME
|
||||||
|
|
||||||
valid = not validate_name(pattern, None, anime_type, file_only=True)
|
valid = not validate_name(pattern, None, anime_type, file_only=True)
|
||||||
|
|
||||||
if multi != None:
|
if None is not multi:
|
||||||
valid = valid or not validate_name(pattern, multi, anime_type, file_only=True)
|
valid = valid or not validate_name(pattern, multi, anime_type, file_only=True)
|
||||||
|
|
||||||
return valid
|
return valid
|
||||||
|
@ -126,18 +124,21 @@ def check_valid_naming(pattern=None, multi=None, anime_type=None):
|
||||||
Checks if the name is can be parsed back to its original form for both single and multi episodes.
|
Checks if the name is can be parsed back to its original form for both single and multi episodes.
|
||||||
|
|
||||||
Returns true if the naming is valid, false if not.
|
Returns true if the naming is valid, false if not.
|
||||||
|
:param pattern: String Naming Pattern
|
||||||
|
:param multi: Bool Multi-episode pattern
|
||||||
|
:param anime_type: Integer Numbering type to use for anime pattern
|
||||||
"""
|
"""
|
||||||
if pattern == None:
|
if None is pattern:
|
||||||
pattern = sickbeard.NAMING_PATTERN
|
pattern = sickbeard.NAMING_PATTERN
|
||||||
|
|
||||||
if anime_type == None:
|
if None is anime_type:
|
||||||
anime_type = sickbeard.NAMING_ANIME
|
anime_type = sickbeard.NAMING_ANIME
|
||||||
|
|
||||||
logger.log(u"Checking whether the pattern " + pattern + " is valid for a single episode", logger.DEBUG)
|
logger.log(u'Checking whether the pattern %s is valid for a single episode' % pattern, logger.DEBUG)
|
||||||
valid = validate_name(pattern, None, anime_type)
|
valid = validate_name(pattern, None, anime_type)
|
||||||
|
|
||||||
if multi != None:
|
if None is not multi:
|
||||||
logger.log(u"Checking whether the pattern " + pattern + " is valid for a multi episode", logger.DEBUG)
|
logger.log(u'Checking whether the pattern %s is valid for a multi episode' % pattern, logger.DEBUG)
|
||||||
valid = valid and validate_name(pattern, multi, anime_type)
|
valid = valid and validate_name(pattern, multi, anime_type)
|
||||||
|
|
||||||
return valid
|
return valid
|
||||||
|
@ -148,67 +149,72 @@ def check_valid_abd_naming(pattern=None):
|
||||||
Checks if the name is can be parsed back to its original form for an air-by-date format.
|
Checks if the name is can be parsed back to its original form for an air-by-date format.
|
||||||
|
|
||||||
Returns true if the naming is valid, false if not.
|
Returns true if the naming is valid, false if not.
|
||||||
|
:param pattern: String Naming Pattern
|
||||||
"""
|
"""
|
||||||
if pattern == None:
|
if None is pattern:
|
||||||
pattern = sickbeard.NAMING_PATTERN
|
pattern = sickbeard.NAMING_PATTERN
|
||||||
|
|
||||||
logger.log(u"Checking whether the pattern " + pattern + " is valid for an air-by-date episode", logger.DEBUG)
|
logger.log(u'Checking whether the pattern %s is valid for an air-by-date episode' % pattern, logger.DEBUG)
|
||||||
valid = validate_name(pattern, abd=True)
|
valid = validate_name(pattern, abd=True)
|
||||||
|
|
||||||
return valid
|
return valid
|
||||||
|
|
||||||
|
|
||||||
def check_valid_sports_naming(pattern=None):
|
def check_valid_sports_naming(pattern=None):
|
||||||
"""
|
"""
|
||||||
Checks if the name is can be parsed back to its original form for an sports format.
|
Checks if the name is can be parsed back to its original form for an sports format.
|
||||||
|
|
||||||
Returns true if the naming is valid, false if not.
|
Returns true if the naming is valid, false if not.
|
||||||
|
:param pattern: String Naming Pattern
|
||||||
"""
|
"""
|
||||||
if pattern == None:
|
if None is pattern:
|
||||||
pattern = sickbeard.NAMING_PATTERN
|
pattern = sickbeard.NAMING_PATTERN
|
||||||
|
|
||||||
logger.log(u"Checking whether the pattern " + pattern + " is valid for an sports episode", logger.DEBUG)
|
logger.log(u'Checking whether the pattern %s is valid for an sports episode' % pattern, logger.DEBUG)
|
||||||
valid = validate_name(pattern, sports=True)
|
valid = validate_name(pattern, sports=True)
|
||||||
|
|
||||||
return valid
|
return valid
|
||||||
|
|
||||||
def validate_name(pattern, multi=None, anime_type=None, file_only=False, abd=False, sports=False):
|
|
||||||
ep = generate_sample_ep(multi, abd, sports, anime_type)
|
|
||||||
|
|
||||||
new_name = ep.formatted_filename(pattern, multi, anime_type) + '.ext'
|
def validate_name(pattern, multi=None, anime_type=None, file_only=False, abd=False, sports=False):
|
||||||
|
ep = generate_sample_ep(multi, abd, sports, anime_type=anime_type)
|
||||||
|
|
||||||
|
new_name = u'%s.ext' % ep.formatted_filename(pattern, multi, anime_type)
|
||||||
new_path = ep.formatted_dir(pattern, multi)
|
new_path = ep.formatted_dir(pattern, multi)
|
||||||
if not file_only:
|
if not file_only:
|
||||||
new_name = ek.ek(os.path.join, new_path, new_name)
|
new_name = ek.ek(os.path.join, new_path, new_name)
|
||||||
|
|
||||||
if not new_name:
|
if not new_name:
|
||||||
logger.log(u"Unable to create a name out of " + pattern, logger.DEBUG)
|
logger.log(u'Unable to create a name out of %s' % pattern, logger.DEBUG)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
logger.log(u"Trying to parse " + new_name, logger.DEBUG)
|
logger.log(u'Trying to parse %s' % new_name, logger.DEBUG)
|
||||||
|
|
||||||
parser = NameParser(True, showObj=ep.show, naming_pattern=True)
|
parser = NameParser(True, showObj=ep.show, naming_pattern=True)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = parser.parse(new_name)
|
result = parser.parse(new_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.log(u"Unable to parse " + new_name + ", not valid", logger.DEBUG)
|
logger.log(u'Unable to parse %s, not valid' % new_name, logger.DEBUG)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
logger.log("The name " + new_name + " parsed into " + str(result), logger.DEBUG)
|
logger.log(u'The name %s parsed into %s' % (new_name, result), logger.DEBUG)
|
||||||
|
|
||||||
if abd or sports:
|
if abd or sports:
|
||||||
if result.air_date != ep.airdate:
|
if result.air_date != ep.airdate:
|
||||||
logger.log(u"Air date incorrect in parsed episode, pattern isn't valid", logger.DEBUG)
|
logger.log(u'Air date incorrect in parsed episode, pattern isn\'t valid', logger.DEBUG)
|
||||||
return False
|
return False
|
||||||
elif anime_type != 3:
|
elif 3 == anime_type:
|
||||||
if len(result.ab_episode_numbers) and result.ab_episode_numbers != [x.absolute_number for x in [ep] + ep.relatedEps]:
|
|
||||||
logger.log(u"Absolute numbering incorrect in parsed episode, pattern isn't valid", logger.DEBUG)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
if result.season_number != ep.season:
|
if result.season_number != ep.season:
|
||||||
logger.log(u"Season number incorrect in parsed episode, pattern isn't valid", logger.DEBUG)
|
logger.log(u'Season number incorrect in parsed episode, pattern isn\'t valid', logger.DEBUG)
|
||||||
return False
|
return False
|
||||||
if result.episode_numbers != [x.episode for x in [ep] + ep.relatedEps]:
|
if result.episode_numbers != [x.episode for x in [ep] + ep.relatedEps]:
|
||||||
logger.log(u"Episode numbering incorrect in parsed episode, pattern isn't valid", logger.DEBUG)
|
logger.log(u'Episode numbering incorrect in parsed episode, pattern isn\'t valid', logger.DEBUG)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if len(result.ab_episode_numbers) and result.ab_episode_numbers != [x.absolute_number for x in
|
||||||
|
[ep] + ep.relatedEps]:
|
||||||
|
logger.log(u'Absolute numbering incorrect in parsed episode, pattern isn\'t valid', logger.DEBUG)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -216,14 +222,11 @@ def validate_name(pattern, multi=None, anime_type=None, file_only=False, abd=Fal
|
||||||
|
|
||||||
def generate_sample_ep(multi=None, abd=False, sports=False, anime=False, anime_type=None):
|
def generate_sample_ep(multi=None, abd=False, sports=False, anime=False, anime_type=None):
|
||||||
# make a fake episode object
|
# make a fake episode object
|
||||||
ep = TVEpisode(2, 3, 3, "Ep Name")
|
ep = TVEpisode(2, 3, 3, 'Ep Name')
|
||||||
|
|
||||||
ep._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV)
|
ep._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV)
|
||||||
ep._airdate = datetime.date(2011, 3, 9)
|
ep._airdate = datetime.date(2011, 3, 9)
|
||||||
|
|
||||||
if anime:
|
|
||||||
ep.show.anime = 1
|
|
||||||
|
|
||||||
if abd:
|
if abd:
|
||||||
ep._release_name = 'Show.Name.2011.03.09.HDTV.XviD-RLSGROUP'
|
ep._release_name = 'Show.Name.2011.03.09.HDTV.XviD-RLSGROUP'
|
||||||
ep.show.air_by_date = 1
|
ep.show.air_by_date = 1
|
||||||
|
@ -231,38 +234,28 @@ def generate_sample_ep(multi=None, abd=False, sports=False, anime=False, anime_t
|
||||||
ep._release_name = 'Show.Name.2011.03.09.HDTV.XviD-RLSGROUP'
|
ep._release_name = 'Show.Name.2011.03.09.HDTV.XviD-RLSGROUP'
|
||||||
ep.show.sports = 1
|
ep.show.sports = 1
|
||||||
else:
|
else:
|
||||||
if anime_type != 3:
|
if not anime or 3 == anime_type:
|
||||||
ep.show.anime = 1
|
|
||||||
ep._release_name = 'Show.Name.003.HDTV.XviD-RLSGROUP'
|
|
||||||
else:
|
|
||||||
ep._release_name = 'Show.Name.S02E03.HDTV.XviD-RLSGROUP'
|
ep._release_name = 'Show.Name.S02E03.HDTV.XviD-RLSGROUP'
|
||||||
|
else:
|
||||||
if multi != None:
|
ep._release_name = 'Show.Name.003.HDTV.XviD-RLSGROUP'
|
||||||
ep._name = "Ep Name (1)"
|
|
||||||
|
|
||||||
if anime_type != 3:
|
|
||||||
ep.show.anime = 1
|
ep.show.anime = 1
|
||||||
|
|
||||||
ep._release_name = 'Show.Name.003-004.HDTV.XviD-RLSGROUP'
|
if None is not multi:
|
||||||
|
ep._name = 'Ep Name (1)'
|
||||||
secondEp = TVEpisode(2, 4, 4, "Ep Name (2)")
|
second_ep = TVEpisode(2, 4, 4, 'Ep Name (2)')
|
||||||
secondEp._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV)
|
second_ep._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV)
|
||||||
secondEp._release_name = ep._release_name
|
second_ep._release_name = ep._release_name
|
||||||
|
ep.relatedEps.append(second_ep)
|
||||||
ep.relatedEps.append(secondEp)
|
if not anime or 3 == anime_type:
|
||||||
else:
|
|
||||||
ep._release_name = 'Show.Name.S02E03E04E05.HDTV.XviD-RLSGROUP'
|
ep._release_name = 'Show.Name.S02E03E04E05.HDTV.XviD-RLSGROUP'
|
||||||
|
|
||||||
secondEp = TVEpisode(2, 4, 4, "Ep Name (2)")
|
third_ep = TVEpisode(2, 5, 5, 'Ep Name (3)')
|
||||||
secondEp._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV)
|
third_ep._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV)
|
||||||
secondEp._release_name = ep._release_name
|
third_ep._release_name = ep._release_name
|
||||||
|
ep.relatedEps.append(third_ep)
|
||||||
thirdEp = TVEpisode(2, 5, 5, "Ep Name (3)")
|
else:
|
||||||
thirdEp._status = Quality.compositeStatus(DOWNLOADED, Quality.HDTV)
|
ep._release_name = 'Show.Name.003-004.HDTV.XviD-RLSGROUP'
|
||||||
thirdEp._release_name = ep._release_name
|
ep.show.anime = 1
|
||||||
|
|
||||||
ep.relatedEps.append(secondEp)
|
|
||||||
ep.relatedEps.append(thirdEp)
|
|
||||||
|
|
||||||
return ep
|
return ep
|
||||||
|
|
||||||
|
@ -270,4 +263,4 @@ def generate_sample_ep(multi=None, abd=False, sports=False, anime=False, anime_t
|
||||||
def test_name(pattern, multi=None, abd=False, sports=False, anime=False, anime_type=None):
|
def test_name(pattern, multi=None, abd=False, sports=False, anime=False, anime_type=None):
|
||||||
ep = generate_sample_ep(multi, abd, sports, anime, anime_type)
|
ep = generate_sample_ep(multi, abd, sports, anime, anime_type)
|
||||||
|
|
||||||
return {'name': ep.formatted_filename(pattern, multi, anime_type), 'dir': ep.formatted_dir(pattern, multi)}
|
return {'name': ep.formatted_filename(pattern, multi, anime_type), 'dir': ep.formatted_dir(pattern, multi)}
|
||||||
|
|
|
@ -26,7 +26,7 @@ from sickbeard import logger
|
||||||
from . import newznab, omgwtfnzbs, womble
|
from . import newznab, omgwtfnzbs, womble
|
||||||
# torrent
|
# torrent
|
||||||
from . import alpharatio, beyondhd, bitmetv, bitsoup, btn, freshontv, funfile, gftracker, grabtheinfo, \
|
from . import alpharatio, beyondhd, bitmetv, bitsoup, btn, freshontv, funfile, gftracker, grabtheinfo, \
|
||||||
hdbits, hdspace, iptorrents, kat, morethan, pisexy, pretome, rarbg, scc, scenetime, shazbat, speedcd, strike, \
|
hdbits, hdspace, iptorrents, kat, morethan, pisexy, pretome, rarbg, scc, scenetime, shazbat, speedcd, \
|
||||||
thepiratebay, torrentbytes, torrentday, torrenting, torrentleech, torrentshack, transmithe_net, tvchaosuk
|
thepiratebay, torrentbytes, torrentday, torrenting, torrentleech, torrentshack, transmithe_net, tvchaosuk
|
||||||
# anime
|
# anime
|
||||||
from . import nyaatorrents, tokyotoshokan
|
from . import nyaatorrents, tokyotoshokan
|
||||||
|
@ -54,7 +54,6 @@ __all__ = ['omgwtfnzbs',
|
||||||
'scenetime',
|
'scenetime',
|
||||||
'shazbat',
|
'shazbat',
|
||||||
'speedcd',
|
'speedcd',
|
||||||
'strike',
|
|
||||||
'thepiratebay',
|
'thepiratebay',
|
||||||
'torrentbytes',
|
'torrentbytes',
|
||||||
'torrentday',
|
'torrentday',
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
# coding=utf-8
|
|
||||||
#
|
|
||||||
# This file is part of SickGear.
|
|
||||||
#
|
|
||||||
# SickGear is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# SickGear is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with SickGear. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
import re
|
|
||||||
from . import generic
|
|
||||||
from sickbeard import helpers
|
|
||||||
from sickbeard.helpers import tryInt
|
|
||||||
|
|
||||||
|
|
||||||
class StrikeProvider(generic.TorrentProvider):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
generic.TorrentProvider.__init__(self, 'Strike')
|
|
||||||
|
|
||||||
self.url_base = 'https://getstrike.net/'
|
|
||||||
self.urls = {'config_provider_home_uri': self.url_base,
|
|
||||||
'search': self.url_base + 'api/v2/torrents/search/?category=%s&phrase=%s'}
|
|
||||||
|
|
||||||
self.url = self.urls['config_provider_home_uri']
|
|
||||||
|
|
||||||
self.minseed, self.minleech = 2 * [None]
|
|
||||||
|
|
||||||
def _search_provider(self, search_params, **kwargs):
|
|
||||||
|
|
||||||
results = []
|
|
||||||
items = {'Cache': [], 'Season': [], 'Episode': [], 'Propers': []}
|
|
||||||
|
|
||||||
for mode in search_params.keys():
|
|
||||||
search_show = mode in ['Season', 'Episode']
|
|
||||||
if not search_show and helpers.has_anime():
|
|
||||||
search_params[mode] *= (1, 2)['Cache' == mode]
|
|
||||||
|
|
||||||
for enum, search_string in enumerate(search_params[mode]):
|
|
||||||
search_url = self.urls['search'] % \
|
|
||||||
(('tv', 'anime')[(search_show and bool(self.show and self.show.is_anime)) or bool(enum)],
|
|
||||||
(re.sub('[\.\s]+', ' ', search_string), 'x264')['Cache' == mode])
|
|
||||||
|
|
||||||
data_json = self.get_url(search_url, json=True)
|
|
||||||
|
|
||||||
cnt = len(items[mode])
|
|
||||||
try:
|
|
||||||
for item in data_json['torrents']:
|
|
||||||
seeders, leechers, title, download_magnet, size = [tryInt(n, n) for n in [item.get(x) for x in [
|
|
||||||
'seeds', 'leeches', 'torrent_title', 'magnet_uri', 'size']]]
|
|
||||||
if self._peers_fail(mode, seeders, leechers):
|
|
||||||
continue
|
|
||||||
|
|
||||||
if title and download_magnet:
|
|
||||||
items[mode].append((title, download_magnet, seeders, self._bytesizer(size)))
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
self._log_search(mode, len(items[mode]) - cnt, search_url)
|
|
||||||
|
|
||||||
self._sort_seeders(mode, items)
|
|
||||||
|
|
||||||
results = list(set(results + items[mode]))
|
|
||||||
|
|
||||||
return results
|
|
||||||
|
|
||||||
def _season_strings(self, ep_obj, **kwargs):
|
|
||||||
|
|
||||||
return generic.TorrentProvider._season_strings(self, ep_obj, scene=False)
|
|
||||||
|
|
||||||
def _episode_strings(self, ep_obj, **kwargs):
|
|
||||||
|
|
||||||
return generic.TorrentProvider._episode_strings(self, ep_obj, scene=False, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
provider = StrikeProvider()
|
|