Added per-provider options search mode and search fallback.

Search mode allows you to choose season packs only or episodes only which controls how backlogs search for data.

Search fallback if selected will attempt a 2nd search this time using the alternative search mode to see if it can get results if the previous attempt failed.

Provider settings are now read and stored dynamically instead of always having to retrieve them by there static names, this will allow for dropping in new provider modules easier to intergrate with existing options already present.

Fixed search code to not perform dupe searches by mistake.

Cache stores a list of shows we have rejected so that next time around we don't have to process them to know we don't like em.
This commit is contained in:
echel0n 2014-05-16 22:23:11 -07:00
parent 816a3d9572
commit e96035ff4f
25 changed files with 754 additions and 934 deletions

View file

@ -115,8 +115,8 @@ var show_nzb_providers = #if $sickbeard.USE_NZBS then "true" else "false"#;
<span class="component-title jumbo">Configure Provider:</span>
<span class="component-desc">
#set $provider_config_list = []
#for $cur_provider in ("thepiratebay", "tvtorrents", "btn", "torrentleech", "iptorrents", "omgwtfnzbs", "kickasstorrents", "sceneaccess", "hdbits", "nextgen", "speedcd"):
#set $cur_provider_obj = $sickbeard.providers.getProviderClass($cur_provider)
#for $curProvider in $sickbeard.providers.sortedProviderList():
#set $cur_provider_obj = $sickbeard.providers.getProviderClass($curProvider.getID())
#if $cur_provider_obj.providerType == $GenericProvider.NZB and not $sickbeard.USE_NZBS:
#continue
#elif $cur_provider_obj.providerType == $GenericProvider.TORRENT and not $sickbeard.USE_TORRENTS:
@ -140,8 +140,9 @@ var show_nzb_providers = #if $sickbeard.USE_NZBS then "true" else "false"#;
<!-- start div for editing providers //-->
#for $curNewznabProvider in [$curProvider for $curProvider in $sickbeard.newznabProviderList if $curProvider.default and $curProvider.needs_auth]:
#for $curNewznabProvider in [$curProvider for $curProvider in $sickbeard.newznabProviderList]:
<div class="providerDiv" id="${curNewznabProvider.getID()}Div">
#if $curProvider.default and $curProvider.needs_auth
<div class="field-pair">
<label class="clearfix">
<span class="component-title">URL:</span>
@ -154,6 +155,34 @@ var show_nzb_providers = #if $sickbeard.USE_NZBS then "true" else "false"#;
<input class="component-desc newznab_key" type="text" id="${curNewznabProvider.getID()}_hash" value="$curNewznabProvider.key" newznab_name="${curNewznabProvider.getID()}_hash" size="40" />
</label>
</div>
#end if
#if $hasattr($curNewznabProvider, 'search_fallback'):
<div class="field-pair">
<input type="checkbox" name="${curNewznabProvider.getID()}_search_fallback" id="${curNewznabProvider.getID()}_search_fallback" #if $curNewznabProvider.search_fallback then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="${curNewznabProvider.getID()}_search_fallback">
<span class="component-title">Search Fallback</span>
<span class="component-desc">This will restart the search using the alternative method from Search Mode if first attempt fails to return any results to snatch.</span>
</label>
</div>
#end if
#if $hasattr($curNewznabProvider, 'search_mode'):
<div class="field-pair">
<label class="nocheck clearfix">
<span class="component-title">Search Mode</span>
<span class="component-desc">
<input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_sponly" value="sponly" class="radio" #if $curNewznabProvider.search_mode=="sponly" then "checked=\"checked\"" else ""# />Season Packs ONLY!<br />
</span>
</label>
<label class="nocheck clearfix">
<span class="component-title"></span>
<span class="component-desc">
<input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_eponly" value="eponly" class="radio" #if $curNewznabProvider.search_mode=="eponly" then "checked=\"checked\"" else ""# />Episodes ONLY!<br />
</span>
</label>
</div>
#end if
</div>
#end for
@ -172,304 +201,171 @@ var show_nzb_providers = #if $sickbeard.USE_NZBS then "true" else "false"#;
</div>
</div><!-- /omgwtfnzbsDiv //-->
<div class="providerDiv" id="ezrssDiv">
#for $curTorrentProvider in [$curProvider for $curProvider in $sickbeard.providers.sortedProviderList() if $curProvider.providerType == $GenericProvider.TORRENT]:
<div class="providerDiv" id="${curTorrentProvider.getID()}Div">
#if $hasattr($curTorrentProvider, 'api_key'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="ezrss_ratio_desc">Seed Ratio:</span>
<input type="text" name="ezrss_ratio" id="ezrss_ratio" value="$sickbeard.EZRSS_RATIO" size="40" />
<span class="component-title">Api Key:</span>
<input class="component-desc" type="text" name="${curTorrentProvider.getID()}_api_key" id="${curTorrentProvider.getID()}_api_key" value="$curTorrentProvider.api_key" size="40" />
</label>
</div>
</div>
#end if
<div class="providerDiv" id="tvtorrentsDiv">
#if $hasattr($curTorrentProvider, 'digest'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Digest:</span>
<input class="component-desc" type="text" name="tvtorrents_digest" value="$sickbeard.TVTORRENTS_DIGEST" size="40" />
<input class="component-desc" type="text" name="${curTorrentProvider.getID()}_digest" id="${curTorrentProvider.getID()}_digest" value="$curTorrentProvider.digest" size="40" />
</label>
</div>
#end if
#if $hasattr($curTorrentProvider, 'hash'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Hash:</span>
<input class="component-desc" type="text" name="tvtorrents_hash" value="$sickbeard.TVTORRENTS_HASH" size="40" />
<input class="component-desc" type="text" name="${curTorrentProvider.getID()}_hash" id="${curTorrentProvider.getID()}_hash" value="$curTorrentProvider.hash" size="40" />
</label>
</div>
#end if
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="tvtorrents_ratio_desc">Seed Ratio:</span>
<input type="text" name="tvtorrents_ratio" id="tvtorrents_ratio" value="$sickbeard.TVTORRENTS_RATIO" size="40" />
#if $hasattr($curTorrentProvider, 'options'):
<div style="width: 340px; padding-bottom: 10px !important;">
<input type="hidden" id="tvtorrents_option_string" />
<fieldset style="display: block; border-width: 1px !important; border-radius: 5px !important; border-color: #D0D0D0 !important; border-style: solid !important;">
<legend id="seed_options">Advanced Options</legend>
<div class="field-pair" style="margin-top: -2px !important;">
<label class="clearfix" >
<span class="component-title" style="width: 130px !important;">Seeding Goal Ratio(%):</span>
<input class="seed_option" type="text" id="tvtorrents_seed_ratio" size="5" style="margin-left: -5px !important;"/>
</label>
</div>
</div>
<div class="providerDiv" id="thepiratebayDiv">
<div class="field-pair">
<div class="field-pair" style="margin-top: -10px !important;">
<label class="clearfix">
<span class="component-title" id="thepiratebay_ratio_desc">Seed Ratio:</span>
<input type="text" name="thepiratebay_ratio" id="thepiratebay_ratio" value="$sickbeard.THEPIRATEBAY_RATIO" size="40" />
<span class="component-title" style="width: 130px !important;">Seeding Goal Time(h):</span>
<input class="seed_option" type="text" id="tvtorrents_seed_time" size="5" style="margin-left: -5px !important;" />
</label>
</div>
<div style="display: block; text-align: center;margin-top: -10px !important;" class="float-left">
<label class="clearfix">
<span class="component-title" style="margin-left: -49px !important; width: 201px !important;">Process Method:</span>
<select class="seed_option" id="tvtorrents_process_method" class="input-medium" >
#set $process_method_text = {'': "", 'copy': "Copy", 'move': "Move", 'hardlink': "Hard Link", 'symlink' : "Symbolic Link"}
#for $curAction in ('', 'copy', 'move', 'hardlink', 'symlink'):
#set $process_method = ""
<option class="seed_option" value="$curAction" $process_method>$process_method_text[$curAction]</option>
#end for
</select>
</label>
</div>
</fieldset>
</div>
#end if
#if $hasattr($curTorrentProvider, 'username'):
<div class="field-pair">
<input type="checkbox" class="enabler" name="thepiratebay_proxy" id="thepiratebay_proxy" #if $sickbeard.THEPIRATEBAY_PROXY then "checked=\"checked\"" else ""#/>
<label class="clearfix">
<span class="component-title">Access TPB via Proxy</span>
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="${curTorrentProvider.getID()}_username" id="${curTorrentProvider.getID()}_username" value="$curTorrentProvider.username" size="40" />
</label>
</div>
#end if
#if $hasattr($curTorrentProvider, 'password'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="${curTorrentProvider.getID()}_password" id="${curTorrentProvider.getID()}_password" value="$curTorrentProvider.password" size="40" />
</label>
</div>
#end if
#if $hasattr($curTorrentProvider, 'ratio'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="${curTorrentProvider.getID()}_ratio_desc">Seed Ratio:</span>
<input type="text" name="${curTorrentProvider.getID()}_ratio" id="${curTorrentProvider.getID()}_ratio" value="$curTorrentProvider.ratio" size="40" />
</label>
</div>
#end if
#if $hasattr($curTorrentProvider, 'proxy'):
<div class="field-pair">
<input type="checkbox" class="enabler" name="${curTorrentProvider.getID()}_proxy" id="${curTorrentProvider.getID()}_proxy" #if $curTorrentProvider.proxy then "checked=\"checked\"" else ""#/>
<label class="clearfix">
<span class="component-title">Access Provider via Proxy</span>
<span class="component-desc">To bypass Country Blocking Mechanism</span>
</label>
</div>
#end if
<div class="field-pair content_thepiratebay_proxy" id="content_thepiratebay_proxy">
#if $hasattr($curTorrentProvider, 'proxy_url'):
<div class="field-pair content_${curTorrentProvider.getID()}_proxy" id="content_${curTorrentProvider.getID()}_proxy">
<label class="nocheck clearfix">
<span class="component-title">Proxy URL:</span>
<span class="component-desc">
<select name="thepiratebay_proxy_url" id="thepiratebay_proxy_url">
#for $i in $thepiratebay.proxy_dict.keys():
<option value="$thepiratebay.proxy_dict[$i]" #if $thepiratebay.proxy_dict[$i] == $sickbeard.THEPIRATEBAY_PROXY_URL then "selected=\"selected\"" else ""#>$i</option>
<select name="${curTorrentProvider.getID()}_proxy_url" id="${curTorrentProvider.getID()}_proxy_url">
#for $i in $curTorrentProvider.proxy_dict.keys():
<option value="$curTorrentProvider.proxy_dict[$i]" #if $curTorrentProvider.proxy_dict[$i] == $curTorrentProvider.proxy_url then "selected=\"selected\"" else ""#>$i</option>
#end for
</select>
</span>
</label>
</div>
#end if
#if $hasattr($curTorrentProvider, 'confirmed'):
<div class="field-pair">
<input type="checkbox" name="thepiratebay_trusted" id="thepiratebay_trusted" #if $sickbeard.THEPIRATEBAY_TRUSTED then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="thepiratebay_trusted">
<span class="component-title">Trusted Download</span>
<span class="component-desc">Download torrent only from trusted uploaders?</span>
<input type="checkbox" name="${curTorrentProvider.getID()}_confirmed" id="${curTorrentProvider.getID()}_confirmed" #if $curTorrentProvider.confirmed then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="${curTorrentProvider.getID()}_confirmed">
<span class="component-title">Confirmed Download</span>
<span class="component-desc">Download torrent only from trusted/verified uploaders?</span>
</label>
</div>
</div>
#end if
<div class="providerDiv" id="kickasstorrentsDiv">
#if $hasattr($curTorrentProvider, 'freeleech'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="kat_ratio_desc">Seed Ratio:</span>
<input type="text" name="kat_ratio" id="kat_ratio" value="$sickbeard.KAT_RATIO" size="40" />
</label>
</div>
<div class="field-pair">
<input type="checkbox" name="kat_verified" id="kat_verified" #if $sickbeard.KAT_VERIFIED then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="kat_verified">
<span class="component-title">Verified Only</span>
<span class="component-desc">Download only verified torrent?</span>
</label>
</div>
</div>
<div class="providerDiv" id="publichdDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="publichd_ratio_desc">Seed Ratio:</span>
<input type="text" name="publichd_ratio" id="publichd_ratio" value="$sickbeard.PUBLICHD_RATIO" size="40" />
</label>
</div>
</div>
<div class="providerDiv btn" id="btnDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Api Key:</span>
<input class="component-desc" type="text" name="btn_api_key" value="$sickbeard.BTN_API_KEY" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="btn_ratio_desc">Seed Ratio:</span>
<input type="text" name="btn_ratio" id="btn_ratio" value="$sickbeard.BTN_RATIO" size="40" />
</label>
</div>
</div>
<div class="providerDiv" id="torrentleechDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="torrentleech_username" value="$sickbeard.TORRENTLEECH_USERNAME" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="torrentleech_password" value="$sickbeard.TORRENTLEECH_PASSWORD" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="torrentleech_ratio_desc">Seed Ratio:</span>
<input type="text" name="torrentleech_ratio" id="torrentleech_ratio" value="$sickbeard.TORRENTLEECH_RATIO" size="40" />
</label>
</div>
</div>
<div class="providerDiv" id="iptorrentsDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="iptorrents_username" value="$sickbeard.IPTORRENTS_USERNAME" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="iptorrents_password" value="$sickbeard.IPTORRENTS_PASSWORD" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="iptorrents_ratio_desc">Seed Ratio:</span>
<input type="text" name="iptorrents_ratio" id="iptorrents_ratio" value="$sickbeard.IPTORRENTS_RATIO" size="40" />
</label>
</div>
<div class="field-pair">
<input type="checkbox" name="iptorrents_freeleech" id="iptorrents_freeleech" #if $sickbeard.IPTORRENTS_FREELEECH then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="iptorrents_freeleech">
<input type="checkbox" name="${curTorrentProvider.getID()}_freeleech" id="${curTorrentProvider.getID()}_freeleech" #if $curTorrentProvider.freeleech then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="${curTorrentProvider.getID()}_freeleech">
<span class="component-title">FreeLeech</span>
<span class="component-desc">This will only download <b>[FreeLeech]</b> torrents.</span>
</label>
</div>
</div><!-- /iptorrentsDiv //-->
#end if
<div class="providerDiv" id="sceneaccessDiv">
#if $hasattr($curTorrentProvider, 'search_fallback'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="scc_username" value="$sickbeard.SCC_USERNAME" size="40" />
<input type="checkbox" name="${curTorrentProvider.getID()}_search_fallback" id="${curTorrentProvider.getID()}_search_fallback" #if $curTorrentProvider.search_fallback then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="${curTorrentProvider.getID()}_search_fallback">
<span class="component-title">Search Fallback</span>
<span class="component-desc">This will restart the search using the alternative method from Search Mode if first attempt fails to return any results to snatch.</span>
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="scc_password" value="$sickbeard.SCC_PASSWORD" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="scc_ratio_desc">Seed Ratio:</span>
<input type="text" name="scc_ratio" id="scc_ratio" value="$sickbeard.SCC_RATIO" size="40" />
</label>
</div>
</div><!-- /sceneaccessDiv //-->
#end if
<div class="providerDiv" id="hdtorrentsDiv">
#if $hasattr($curTorrentProvider, 'search_mode'):
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="hdtorrents_username" value="$sickbeard.HDTORRENTS_USERNAME" size="40" />
<label class="nocheck clearfix">
<span class="component-title">Search Mode</span>
<span class="component-desc">
<input type="radio" name="${curTorrentProvider.getID()}_search_mode" id="${curTorrentProvider.getID()}_search_mode_sponly" value="sponly" class="radio" #if $curTorrentProvider.search_mode=="sponly" then "checked=\"checked\"" else ""# />Season Packs ONLY!<br />
</span>
</label>
<label class="nocheck clearfix">
<span class="component-title"></span>
<span class="component-desc">
<input type="radio" name="${curTorrentProvider.getID()}_search_mode" id="${curTorrentProvider.getID()}_search_mode_eponly" value="eponly" class="radio" #if $curTorrentProvider.search_mode=="eponly" then "checked=\"checked\"" else ""# />Episodes ONLY!<br />
</span>
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="hdtorrents_password" value="$sickbeard.HDTORRENTS_PASSWORD" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="hdtorrents_ratio_desc">Seed Ratio:</span>
<input type="text" name="hdtorrents_ratio" id="hdtorrents_ratio" value="$sickbeard.HDTORRENTS_RATIO" size="40" />
</label>
</div>
</div><!-- /sceneaccessDiv //-->
#end if
<div class="providerDiv" id="torrentdayDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="torrentday_username" value="$sickbeard.TORRENTDAY_USERNAME" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="torrentday_password" value="$sickbeard.TORRENTDAY_PASSWORD" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="torrentday_ratio_desc">Seed Ratio:</span>
<input type="text" name="torrentday_ratio" id="torrentday_ratio" value="$sickbeard.TORRENTDAY_RATIO" size="40" />
</label>
</div>
<div class="field-pair">
<input type="checkbox" name="torrentday_freeleech" id="torrentday_freeleech" #if $sickbeard.TORRENTDAY_FREELEECH then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="torrentday_freeleech">
<span class="component-title">FreeLeech</span>
<span class="component-desc">This will only download <b>[FreeLeech]</b> torrents.</span>
</label>
</div>
</div><!-- /torrentsDayDiv //-->
<div class="providerDiv" id="nextgenDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="nextgen_username" value="$sickbeard.NEXTGEN_USERNAME" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="nextgen_password" value="$sickbeard.NEXTGEN_PASSWORD" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="nextgen_ratio_desc">Seed Ratio:</span>
<input type="text" name="nextgen_ratio" id="nextgen_ratio" value="$sickbeard.NEXTGEN_RATIO" size="40" />
</label>
</div>
</div><!-- /nextgenDiv //-->
</div>
#end for
<div class="providerDiv" id="hdbitsDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="hdbits_username" value="$sickbeard.HDBITS_USERNAME" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Passkey:</span>
<input class="component-desc" type="text" name="hdbits_passkey" value="$sickbeard.HDBITS_PASSKEY" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="hdbits_ratio_desc">Seed Ratio:</span>
<input type="text" name="hdbits_ratio" id="hdbits_ratio" value="$sickbeard.HDBITS_RATIO" size="40" />
</label>
</div>
</div><!-- /hdbitsDiv //-->
<div class="providerDiv" id="speedcdDiv">
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Username:</span>
<input class="component-desc" type="text" name="speedcd_username" value="$sickbeard.SPEEDCD_USERNAME" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title">Password:</span>
<input class="component-desc" type="password" name="speedcd_password" value="$sickbeard.SPEEDCD_PASSWORD" size="40" />
</label>
</div>
<div class="field-pair">
<label class="clearfix">
<span class="component-title" id="speedcd_ratio_desc">Seed Ratio:</span>
<input type="text" name="speedcd_ratio" id="speedcd_ratio" value="$sickbeard.SPEEDCD_RATIO" size="40" />
</label>
</div>
<div class="field-pair">
<input type="checkbox" name="speedcd_freeleech" id="speedcd_freeleech" #if $sickbeard.SPEEDCD_FREELEECH then "checked=\"checked\"" else ""#/>
<label class="clearfix" for="iptorrents_freeleech">
<span class="component-title">FreeLeech</span>
<span class="component-desc">This will only download <b>[FreeLeech]</b> torrents.</span>
</label>
</div>
</div><!-- /speedcdDiv //-->
<!-- end div for editing providers -->

View file

@ -63,10 +63,12 @@ $(document).ready(function(){
}
$.fn.updateProvider = function (id, url, key) {
$.fn.updateProvider = function (id, url, key, search_mode, search_fallback) {
newznabProviders[id][1][1] = url;
newznabProviders[id][1][2] = key;
newznabProviders[id][1][3] = search_mode;
newznabProviders[id][1][4] = search_fallback;
$(this).populateNewznabSection();
@ -297,8 +299,10 @@ $(document).ready(function(){
var url = $('#'+provider_id+'_url').val();
var key = $(this).val();
var search_mode = $('#'+provider_id+'_search_mode').val();
var search_fallback = $('#'+provider_id+'_search_fallback').val();
$(this).updateProvider(provider_id, url, key);
$(this).updateProvider(provider_id, url, key, search_mode, search_fallback);
});
@ -311,8 +315,10 @@ $(document).ready(function(){
var url = $('#newznab_url').val();
var key = $('#newznab_key').val();
var search_mode = 'eponly';
var search_fallback = 0;
$(this).updateProvider(selectedProvider, url, key);
$(this).updateProvider(selectedProvider, url, key, search_mode, search_fallback);
});

View file

@ -30,9 +30,11 @@ from threading import Lock
# apparently py2exe won't build these unless they're imported somewhere
from sickbeard import providers, metadata, config
from sickbeard.providers.generic import GenericProvider
from providers import ezrss, tvtorrents, btn, newznab, womble, thepiratebay, torrentleech, kat, publichd, iptorrents, \
omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, nextgen, speedcd
from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, naming_ep_type
from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \
naming_ep_type
from sickbeard import searchBacklog, showUpdater, versionChecker, properFinder, autoPostProcesser, \
subtitles, traktWatchListChecker
from sickbeard import helpers, db, exceptions, show_queue, search_queue, scheduler, show_name_helpers
@ -191,83 +193,6 @@ MIN_UPDATE_FREQUENCY = 1
DEFAULT_SEARCH_FREQUENCY = 40
DEFAULT_UPDATE_FREQUENCY = 12
EZRSS = False
EZRSS_RATIO = None
TVTORRENTS = False
TVTORRENTS_DIGEST = None
TVTORRENTS_HASH = None
TVTORRENTS_RATIO = None
BTN = False
BTN_API_KEY = None
BTN_RATIO = None
NEWZNAB_DATA = None
THEPIRATEBAY = False
THEPIRATEBAY_RATIO = None
THEPIRATEBAY_TRUSTED = False
THEPIRATEBAY_PROXY = False
THEPIRATEBAY_PROXY_URL = None
THEPIRATEBAY_BLACKLIST = None
TORRENTLEECH = False
TORRENTLEECH_KEY = None
TORRENTLEECH_USERNAME = None
TORRENTLEECH_PASSWORD = None
TORRENTLEECH_RATIO = None
IPTORRENTS = False
IPTORRENTS_USERNAME = None
IPTORRENTS_PASSWORD = None
IPTORRENTS_RATIO = None
IPTORRENTS_FREELEECH = False
NEXTGEN = False
NEXTGEN_USERNAME = None
NEXTGEN_PASSWORD = None
NEXTGEN_RATIO = None
NEXTGEN_FREELEECH = False
KAT = None
KAT_RATIO = None
KAT_VERIFIED = False
PUBLICHD = None
PUBLICHD_RATIO = None
SCC = False
SCC_USERNAME = None
SCC_PASSWORD = None
SCC_RATIO = None
HDTORRENTS = False
HDTORRENTS_USERNAME = None
HDTORRENTS_PASSWORD = None
HDTORRENTS_RATIO = None
HDTORRENTS_UID = None
HDTORRENTS_HASH = None
TORRENTDAY = None
TORRENTDAY_USERNAME = None
TORRENTDAY_PASSWORD = None
TORRENTDAY_RATIO = None
TORRENTDAY_UID = None
TORRENTDAY_HASH = None
TORRENTDAY_FREELEECH = None
HDBITS = False
HDBITS_USERNAME = None
HDBITS_PASSKEY = None
HDBITS_RATIO = None
SPEEDCD = False
SPEEDCD_USERNAME = None
SPEEDCD_PASSWORD = None
SPEEDCD_RATIO = None
SPEEDCD_FREELEECH = None
ADD_SHOWS_WO_DIR = None
CREATE_MISSING_SHOW_DIRS = None
RENAME_EPISODES = False
@ -502,12 +427,7 @@ def initialize(consoleLogging=True):
USE_PLEX, PLEX_NOTIFY_ONSNATCH, PLEX_NOTIFY_ONDOWNLOAD, PLEX_NOTIFY_ONSUBTITLEDOWNLOAD, PLEX_UPDATE_LIBRARY, \
PLEX_SERVER_HOST, PLEX_HOST, PLEX_USERNAME, PLEX_PASSWORD, \
showUpdateScheduler, __INITIALIZED__, LAUNCH_BROWSER, UPDATE_SHOWS_ON_START, SORT_ARTICLE, showList, loadingShowList, \
NEWZNAB_DATA, NZBS, NZBS_UID, NZBS_HASH, EZRSS, TVTORRENTS, TVTORRENTS_DIGEST, TVTORRENTS_HASH, TVTORRENTS_OPTIONS, BTN, BTN_API_KEY, BTN_OPTIONS, \
THEPIRATEBAY, THEPIRATEBAY_TRUSTED, THEPIRATEBAY_PROXY, THEPIRATEBAY_PROXY_URL, THEPIRATEBAY_BLACKLIST, THEPIRATEBAY_OPTIONS, TORRENTLEECH, TORRENTLEECH_USERNAME, TORRENTLEECH_PASSWORD, TORRENTLEECH_OPTIONS, \
IPTORRENTS, IPTORRENTS_USERNAME, IPTORRENTS_PASSWORD, IPTORRENTS_FREELEECH, IPTORRENTS_OPTIONS, KAT, KAT_VERIFIED, KAT_OPTIONS, PUBLICHD, PUBLICHD_OPTIONS, SCC, SCC_USERNAME, SCC_PASSWORD, SCC_OPTIONS, HDTORRENTS, HDTORRENTS_USERNAME, HDTORRENTS_PASSWORD, HDTORRENTS_UID, HDTORRENTS_HASH, HDTORRENTS_OPTIONS, TORRENTDAY, TORRENTDAY_USERNAME, TORRENTDAY_PASSWORD, TORRENTDAY_UID, TORRENTDAY_HASH, TORRENTDAY_FREELEECH, TORRENTDAY_OPTIONS, \
HDBITS, HDBITS_USERNAME, HDBITS_PASSKEY, HDBITS_OPTIONS, TORRENT_DIR, USENET_RETENTION, SOCKET_TIMEOUT, RSSUPDATE_FREQUENCY, DEFAULT_SEARCH_FREQUENCY, BACKLOG_FREQUENCY, BACKLOG_STARTUP, INDEXER_DEFAULT, RSSUPDATE_STARTUP, \
NEXTGEN, NEXTGEN_USERNAME, NEXTGEN_PASSWORD, NEXTGEN_FREELEECH, NEXTGEN_OPTIONS, SPEEDCD, SPEEDCD_USERNAME, SPEEDCD_PASSWORD, SPEEDCD_FREELEECH, \
EZRSS_RATIO, TVTORRENTS_RATIO, BTN_RATIO, THEPIRATEBAY_RATIO, TORRENTLEECH_RATIO, IPTORRENTS_RATIO, KAT_RATIO, PUBLICHD_RATIO, TORRENTDAY_RATIO, SCC_RATIO, HDTORRENTS_RATIO, HDBITS_RATIO, NEXTGEN_RATIO, SPEEDCD_RATIO, \
NEWZNAB_DATA, NZBS, NZBS_UID, NZBS_HASH,\
QUALITY_DEFAULT, FLATTEN_FOLDERS_DEFAULT, SUBTITLES_DEFAULT, STATUS_DEFAULT, \
GROWL_NOTIFY_ONSNATCH, GROWL_NOTIFY_ONDOWNLOAD, GROWL_NOTIFY_ONSUBTITLEDOWNLOAD, TWITTER_NOTIFY_ONSNATCH, TWITTER_NOTIFY_ONDOWNLOAD, TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD, \
USE_GROWL, GROWL_HOST, GROWL_PASSWORD, USE_PROWL, PROWL_NOTIFY_ONSNATCH, PROWL_NOTIFY_ONDOWNLOAD, PROWL_NOTIFY_ONSUBTITLEDOWNLOAD, PROWL_API, PROWL_PRIORITY, PROG_DIR, \
@ -709,89 +629,6 @@ def initialize(consoleLogging=True):
CREATE_MISSING_SHOW_DIRS = check_setting_int(CFG, 'General', 'create_missing_show_dirs', 0)
ADD_SHOWS_WO_DIR = check_setting_int(CFG, 'General', 'add_shows_wo_dir', 0)
EZRSS = bool(check_setting_int(CFG, 'General', 'use_torrent', 0))
if not EZRSS:
EZRSS = bool(check_setting_int(CFG, 'EZRSS', 'ezrss', 0))
EZRSS_RATIO = check_setting_float(CFG, 'EZRSS', 'ezrss_ratio', 0)
TVTORRENTS = bool(check_setting_int(CFG, 'TVTORRENTS', 'tvtorrents', 0))
TVTORRENTS_DIGEST = check_setting_str(CFG, 'TVTORRENTS', 'tvtorrents_digest', '')
TVTORRENTS_HASH = check_setting_str(CFG, 'TVTORRENTS', 'tvtorrents_hash', '')
TVTORRENTS_RATIO = check_setting_float(CFG, 'TVTORRENTS', 'tvtorrents_ratio', 0)
TVTORRENTS_OPTIONS = check_setting_str(CFG, 'TVTORRENTS', 'tvtorrents_options', '')
BTN = bool(check_setting_int(CFG, 'BTN', 'btn', 0))
BTN_API_KEY = check_setting_str(CFG, 'BTN', 'btn_api_key', '')
BTN_RATIO = check_setting_float(CFG, 'BTN', 'btn_ratio', 0)
BTN_OPTIONS = check_setting_str(CFG, 'BTN', 'btn_options', '')
THEPIRATEBAY = bool(check_setting_int(CFG, 'THEPIRATEBAY', 'thepiratebay', 1))
THEPIRATEBAY_RATIO = check_setting_float(CFG, 'THEPIRATEBAY', 'thepiratebay_ratio', 0)
THEPIRATEBAY_TRUSTED = bool(check_setting_int(CFG, 'THEPIRATEBAY', 'thepiratebay_trusted', 1))
THEPIRATEBAY_PROXY = bool(check_setting_int(CFG, 'THEPIRATEBAY', 'thepiratebay_proxy', 0))
THEPIRATEBAY_PROXY_URL = check_setting_str(CFG, 'THEPIRATEBAY', 'thepiratebay_proxy_url', '')
THEPIRATEBAY_BLACKLIST = check_setting_str(CFG, 'THEPIRATEBAY', 'thepiratebay_blacklist', '')
THEPIRATEBAY_OPTIONS = check_setting_str(CFG, 'THEPIRATEBAY', 'thepiratebay_options', '')
TORRENTLEECH = bool(check_setting_int(CFG, 'TORRENTLEECH', 'torrentleech', 0))
TORRENTLEECH_USERNAME = check_setting_str(CFG, 'TORRENTLEECH', 'torrentleech_username', '')
TORRENTLEECH_PASSWORD = check_setting_str(CFG, 'TORRENTLEECH', 'torrentleech_password', '')
TORRENTLEECH_RATIO = check_setting_float(CFG, 'TORRENTLEECH', 'torrentleech_ratio', 0)
TORRENTLEECH_OPTIONS = check_setting_str(CFG, 'TORRENTLEECH', 'torrentleech_options', '')
IPTORRENTS = bool(check_setting_int(CFG, 'IPTORRENTS', 'iptorrents', 0))
IPTORRENTS_USERNAME = check_setting_str(CFG, 'IPTORRENTS', 'iptorrents_username', '')
IPTORRENTS_PASSWORD = check_setting_str(CFG, 'IPTORRENTS', 'iptorrents_password', '')
IPTORRENTS_RATIO = check_setting_float(CFG, 'IPTORRENTS', 'iptorrents_ratio', 0)
IPTORRENTS_FREELEECH = bool(check_setting_int(CFG, 'IPTORRENTS', 'iptorrents_freeleech', 0))
IPTORRENTS_OPTIONS = check_setting_str(CFG, 'IPTORRENTS', 'iptorrents_options', '')
NEXTGEN = bool(check_setting_int(CFG, 'NEXTGEN', 'nextgen', 0))
NEXTGEN_USERNAME = check_setting_str(CFG, 'NEXTGEN', 'nextgen_username', '')
NEXTGEN_PASSWORD = check_setting_str(CFG, 'NEXTGEN', 'nextgen_password', '')
NEXTGEN_RATIO = check_setting_float(CFG, 'NEXTGEN', 'nextgen_ratio', 0)
NEXTGEN_OPTIONS = check_setting_str(CFG, 'NEXTGEN', 'nextgen_options', '')
KAT = bool(check_setting_int(CFG, 'KAT', 'kat', 0))
KAT_RATIO = check_setting_float(CFG, 'KAT', 'kat_ratio', 0)
KAT_VERIFIED = bool(check_setting_int(CFG, 'KAT', 'kat_verified', 1))
KAT_OPTIONS = check_setting_str(CFG, 'KAT', 'kat_options', '')
PUBLICHD = bool(check_setting_int(CFG, 'PUBLICHD', 'publichd', 0))
PUBLICHD_RATIO = check_setting_float(CFG, 'PUBLICHD', 'publichd_ratio', 0)
PUBLICHD_OPTIONS = check_setting_str(CFG, 'PUBLICHD', 'publichd_options', '')
SCC = bool(check_setting_int(CFG, 'SCC', 'scc', 0))
SCC_USERNAME = check_setting_str(CFG, 'SCC', 'scc_username', '')
SCC_PASSWORD = check_setting_str(CFG, 'SCC', 'scc_password', '')
SCC_RATIO = check_setting_float(CFG, 'SCC', 'scc_ratio', 0)
SCC_OPTIONS = check_setting_str(CFG, 'SCC', 'scc_options', '')
HDTORRENTS = bool(check_setting_int(CFG, 'HDTORRENTS', 'hdtorrents', 0))
HDTORRENTS_USERNAME = check_setting_str(CFG, 'HDTORRENTS', 'hdtorrents_username', '')
HDTORRENTS_PASSWORD = check_setting_str(CFG, 'HDTORRENTS', 'hdtorrents_password', '')
HDTORRENTS_RATIO = check_setting_float(CFG, 'HDTORRENTS', 'hdtorrents_ratio', 0)
HDTORRENTS_OPTIONS = check_setting_str(CFG, 'HDTORRENTS', 'hdtorrents_options', '')
TORRENTDAY = bool(check_setting_int(CFG, 'TORRENTDAY', 'torrentday', 0))
TORRENTDAY_USERNAME = check_setting_str(CFG, 'TORRENTDAY', 'torrentday_username', '')
TORRENTDAY_PASSWORD = check_setting_str(CFG, 'TORRENTDAY', 'torrentday_password', '')
TORRENTDAY_RATIO = check_setting_float(CFG, 'TORRENTDAY', 'torrentday_ratio', 0)
TORRENTDAY_FREELEECH = bool(check_setting_int(CFG, 'TORRENTDAY', 'torrentday_freeleech', 0))
TORRENTDAY_OPTIONS = check_setting_str(CFG, 'TORRENTDAY', 'torrentday_options', '')
HDBITS = bool(check_setting_int(CFG, 'HDBITS', 'hdbits', 0))
HDBITS_USERNAME = check_setting_str(CFG, 'HDBITS', 'hdbits_username', '')
HDBITS_PASSKEY = check_setting_str(CFG, 'HDBITS', 'hdbits_passkey', '')
HDBITS_RATIO = check_setting_float(CFG, 'HDBITS', 'hdbits_ratio', 0)
HDBITS_OPTIONS = check_setting_str(CFG, 'HDBITS', 'hdbits_options', '')
SPEEDCD = bool(check_setting_int(CFG, 'SPEEDCD', 'speedcd', 0))
SPEEDCD_USERNAME = check_setting_str(CFG, 'SPEEDCD', 'speedcd_username', '')
SPEEDCD_PASSWORD = check_setting_str(CFG, 'SPEEDCD', 'speedcd_password', '')
SPEEDCD_RATIO = check_setting_float(CFG, 'SPEEDCD', 'speedcd_ratio', 0)
SPEEDCD_FREELEECH = bool(check_setting_int(CFG, 'SPEEDCD', 'speedcd_freeleech', 0))
NZBS = bool(check_setting_int(CFG, 'NZBs', 'nzbs', 0))
NZBS_UID = check_setting_str(CFG, 'NZBs', 'nzbs_uid', '')
NZBS_HASH = check_setting_str(CFG, 'NZBs', 'nzbs_hash', '')
@ -1123,10 +960,10 @@ def initialize(consoleLogging=True):
runImmediately=BACKLOG_STARTUP)
dailySearchScheduler = scheduler.Scheduler(dailysearcher.DailySearcher(),
cycleTime=datetime.timedelta(minutes=DAILYSEARCH_FREQUENCY),
threadName="DAILYSEARCHER",
silent=True,
runImmediately=True)
cycleTime=datetime.timedelta(minutes=DAILYSEARCH_FREQUENCY),
threadName="DAILYSEARCHER",
silent=True,
runImmediately=True)
subtitlesFinderScheduler = scheduler.Scheduler(subtitles.SubtitlesFinder(),
cycleTime=datetime.timedelta(hours=SUBTITLES_FINDER_FREQUENCY),
@ -1145,6 +982,70 @@ def initialize(consoleLogging=True):
showList = []
loadingShowList = {}
# dynamically load provider settings
for curTorrentProvider in [curProvider for curProvider in providers.sortedProviderList() if
curProvider.providerType == GenericProvider.TORRENT]:
curTorrentProvider.enabled = bool(check_setting_int(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID(), 0))
if hasattr(curTorrentProvider, 'api_key'):
curTorrentProvider.api_key = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_api_key', '')
if hasattr(curTorrentProvider, 'hash'):
curTorrentProvider.hash = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_hash', '')
if hasattr(curTorrentProvider, 'digest'):
curTorrentProvider.digest = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_digest', '')
if hasattr(curTorrentProvider, 'username'):
curTorrentProvider.username = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_username', '')
if hasattr(curTorrentProvider, 'password'):
curTorrentProvider.password = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_password', '') or \
check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_passkey', '')
if hasattr(curTorrentProvider, 'proxy'):
curTorrentProvider.proxy = bool(check_setting_int(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_proxy', 0))
if hasattr(curTorrentProvider, 'proxy_url'):
curTorrentProvider.proxy_url = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_proxy_url', '')
if hasattr(curTorrentProvider, 'confirmed'):
curTorrentProvider.confirmed = bool(check_setting_int(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_confirmed', 0)) or \
bool(check_setting_int(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_trusted', 0)) or \
bool(check_setting_int(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_verified', 0))
if hasattr(curTorrentProvider, 'options'):
curTorrentProvider.options = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_options', '')
if hasattr(curTorrentProvider, 'ratio'):
curTorrentProvider.ratio = float(check_setting_float(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_ratio', 0))
if hasattr(curTorrentProvider, 'freeleech'):
curTorrentProvider.freeleech = bool(check_setting_int(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_freeleech', 0))
if hasattr(curTorrentProvider, 'search_mode'):
curTorrentProvider.search_mode = check_setting_str(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_search_mode', 'eponly')
if hasattr(curTorrentProvider, 'search_fallback'):
curTorrentProvider.search_fallback = bool(check_setting_int(CFG, curTorrentProvider.getID().upper(),
curTorrentProvider.getID() + '_search_mode', 0))
try:
url = 'http://raw.github.com/echel0n/sickrage-init/master/settings.ini'
clear_cache = ElementTree.XML(helpers.getURL(url)).find('cache/clear').text
@ -1154,7 +1055,8 @@ def initialize(consoleLogging=True):
curProvider.cache._clearCache()
CLEAR_CACHE = clear_cache
save_config()
except:pass
except:
pass
__INITIALIZED__ = True
return True
@ -1312,11 +1214,13 @@ def remove_pid_file(PIDFILE):
return True
def sig_handler(signum=None, frame=None):
if type(signum) != type(None):
logger.log(u"Signal %i caught, saving and exiting..." % int(signum))
saveAndShutdown()
def saveAll():
global showList
@ -1494,100 +1398,37 @@ def save_config():
new_config['Blackhole']['nzb_dir'] = NZB_DIR
new_config['Blackhole']['torrent_dir'] = TORRENT_DIR
new_config['EZRSS'] = {}
new_config['EZRSS']['ezrss'] = int(EZRSS)
new_config['EZRSS']['ezrss_ratio'] = float(EZRSS_RATIO)
new_config['TVTORRENTS'] = {}
new_config['TVTORRENTS']['tvtorrents'] = int(TVTORRENTS)
new_config['TVTORRENTS']['tvtorrents_digest'] = TVTORRENTS_DIGEST
new_config['TVTORRENTS']['tvtorrents_hash'] = TVTORRENTS_HASH
new_config['TVTORRENTS']['tvtorrents_ratio'] = float(TVTORRENTS_RATIO)
new_config['TVTORRENTS']['tvtorrents_options'] = TVTORRENTS_OPTIONS
new_config['BTN'] = {}
new_config['BTN']['btn'] = int(BTN)
new_config['BTN']['btn_api_key'] = BTN_API_KEY
new_config['BTN']['btn_ratio'] = float(BTN_RATIO)
new_config['BTN']['btn_options'] = BTN_OPTIONS
new_config['THEPIRATEBAY'] = {}
new_config['THEPIRATEBAY']['thepiratebay'] = int(THEPIRATEBAY)
new_config['THEPIRATEBAY']['thepiratebay_ratio'] = float(THEPIRATEBAY_RATIO)
new_config['THEPIRATEBAY']['thepiratebay_trusted'] = int(THEPIRATEBAY_TRUSTED)
new_config['THEPIRATEBAY']['thepiratebay_proxy'] = int(THEPIRATEBAY_PROXY)
new_config['THEPIRATEBAY']['thepiratebay_proxy_url'] = THEPIRATEBAY_PROXY_URL
new_config['THEPIRATEBAY']['thepiratebay_blacklist'] = THEPIRATEBAY_BLACKLIST
new_config['THEPIRATEBAY']['thepiratebay_options'] = THEPIRATEBAY_OPTIONS
new_config['TORRENTLEECH'] = {}
new_config['TORRENTLEECH']['torrentleech'] = int(TORRENTLEECH)
new_config['TORRENTLEECH']['torrentleech_username'] = TORRENTLEECH_USERNAME
new_config['TORRENTLEECH']['torrentleech_password'] = helpers.encrypt(TORRENTLEECH_PASSWORD, ENCRYPTION_VERSION)
new_config['TORRENTLEECH']['torrentleech_ratio'] = float(TORRENTLEECH_RATIO)
new_config['TORRENTLEECH']['torrentleech_options'] = TORRENTLEECH_OPTIONS
new_config['IPTORRENTS'] = {}
new_config['IPTORRENTS']['iptorrents'] = int(IPTORRENTS)
new_config['IPTORRENTS']['iptorrents_username'] = IPTORRENTS_USERNAME
new_config['IPTORRENTS']['iptorrents_password'] = helpers.encrypt(IPTORRENTS_PASSWORD, ENCRYPTION_VERSION)
new_config['IPTORRENTS']['iptorrents_ratio'] = float(IPTORRENTS_RATIO)
new_config['IPTORRENTS']['iptorrents_freeleech'] = int(IPTORRENTS_FREELEECH)
new_config['IPTORRENTS']['iptorrents_options'] = IPTORRENTS_OPTIONS
new_config['NEXTGEN'] = {}
new_config['NEXTGEN']['nextgen'] = int(NEXTGEN)
new_config['NEXTGEN']['nextgen_username'] = NEXTGEN_USERNAME
new_config['NEXTGEN']['nextgen_password'] = helpers.encrypt(NEXTGEN_PASSWORD, ENCRYPTION_VERSION)
new_config['NEXTGEN']['nextgen_ratio'] = float(NEXTGEN_RATIO)
new_config['NEXTGEN']['nextgen_options'] = NEXTGEN_OPTIONS
new_config['KAT'] = {}
new_config['KAT']['kat'] = int(KAT)
new_config['KAT']['kat_ratio'] = float(KAT_RATIO)
new_config['KAT']['kat_verified'] = int(KAT_VERIFIED)
new_config['KAT']['kat_options'] = KAT_OPTIONS
new_config['PUBLICHD'] = {}
new_config['PUBLICHD']['publichd'] = int(PUBLICHD)
new_config['PUBLICHD']['publichd_ratio'] = float(PUBLICHD_RATIO)
new_config['PUBLICHD']['publichd_options'] = PUBLICHD_OPTIONS
new_config['SCC'] = {}
new_config['SCC']['scc'] = int(SCC)
new_config['SCC']['scc_username'] = SCC_USERNAME
new_config['SCC']['scc_password'] = helpers.encrypt(SCC_PASSWORD, ENCRYPTION_VERSION)
new_config['SCC']['scc_ratio'] = float(SCC_RATIO)
new_config['SCC']['scc_options'] = SCC_OPTIONS
new_config['HDTORRENTS'] = {}
new_config['HDTORRENTS']['hdtorrents'] = int(HDTORRENTS)
new_config['HDTORRENTS']['hdtorrents_username'] = HDTORRENTS_USERNAME
new_config['HDTORRENTS']['hdtorrents_password'] = helpers.encrypt(HDTORRENTS_PASSWORD, ENCRYPTION_VERSION)
new_config['HDTORRENTS']['hdtorrents_ratio'] = float(HDTORRENTS_RATIO)
new_config['HDTORRENTS']['hdtorrents_options'] = HDTORRENTS_OPTIONS
new_config['TORRENTDAY'] = {}
new_config['TORRENTDAY']['torrentday'] = int(TORRENTDAY)
new_config['TORRENTDAY']['torrentday_username'] = TORRENTDAY_USERNAME
new_config['TORRENTDAY']['torrentday_password'] = helpers.encrypt(TORRENTDAY_PASSWORD, ENCRYPTION_VERSION)
new_config['TORRENTDAY']['torrentday_ratio'] = float(TORRENTDAY_RATIO)
new_config['TORRENTDAY']['torrentday_freeleech'] = int(TORRENTDAY_FREELEECH)
new_config['TORRENTDAY']['torrentday_options'] = TORRENTDAY_OPTIONS
new_config['HDBITS'] = {}
new_config['HDBITS']['hdbits'] = int(HDBITS)
new_config['HDBITS']['hdbits_username'] = HDBITS_USERNAME
new_config['HDBITS']['hdbits_passkey'] = HDBITS_PASSKEY
new_config['HDBITS']['hdbits_ratio'] = float(HDBITS_RATIO)
new_config['HDBITS']['hdbits_options'] = HDBITS_OPTIONS
new_config['SPEEDCD'] = {}
new_config['SPEEDCD']['speedcd'] = int(SPEEDCD)
new_config['SPEEDCD']['speedcd_username'] = SPEEDCD_USERNAME
new_config['SPEEDCD']['speedcd_password'] = helpers.encrypt(SPEEDCD_PASSWORD, ENCRYPTION_VERSION)
new_config['SPEEDCD']['speedcd_ratio'] = float(SPEEDCD_RATIO)
new_config['SPEEDCD']['speedcd_freeleech'] = int(SPEEDCD_FREELEECH)
# dynamically save provider settings
for curTorrentProvider in [curProvider for curProvider in providers.sortedProviderList() if
curProvider.providerType == GenericProvider.TORRENT]:
new_config[curTorrentProvider.getID().upper()] = {}
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID()] = int(curTorrentProvider.enabled)
if hasattr(curTorrentProvider, 'digest'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_digest'] = curTorrentProvider.digest
if hasattr(curTorrentProvider, 'hash'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_hash'] = curTorrentProvider.hash
if hasattr(curTorrentProvider, 'api_key'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_api_key'] = curTorrentProvider.api_key
if hasattr(curTorrentProvider, 'username'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_username'] = curTorrentProvider.username
if hasattr(curTorrentProvider, 'password'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_password'] = curTorrentProvider.password
if hasattr(curTorrentProvider, 'confirmed'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_confirmed'] = curTorrentProvider.confirmed
if hasattr(curTorrentProvider, 'ratio'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_ratio'] = float(curTorrentProvider.ratio)
if hasattr(curTorrentProvider, 'options'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_options'] = curTorrentProvider.options
if hasattr(curTorrentProvider, 'proxy'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_proxy'] = curTorrentProvider.proxy
if hasattr(curTorrentProvider, 'proxy_url'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_proxy_url'] = curTorrentProvider.proxy_url
if hasattr(curTorrentProvider, 'freeleech'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_freeleech'] = int(curTorrentProvider.freeleech)
if hasattr(curTorrentProvider, 'search_mode'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_search_mode'] = curTorrentProvider.search_mode
if hasattr(curTorrentProvider, 'search_fallback'):
new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_search_fallback'] = int(curTorrentProvider.search_fallback)
new_config['NZBs'] = {}
new_config['NZBs']['nzbs'] = int(NZBS)
@ -1860,4 +1701,4 @@ def getEpList(epIDs, showid=None):
curEpObj = curShowObj.getEpisode(int(curEp["season"]), int(curEp["episode"]))
epList.append(curEpObj)
return epList
return epList

View file

@ -81,6 +81,8 @@ def getNewznabProviderList(data):
providerDict[curDefault.name].name = curDefault.name
providerDict[curDefault.name].url = curDefault.url
providerDict[curDefault.name].needs_auth = curDefault.needs_auth
providerDict[curDefault.name].search_mode = curDefault.search_mode
providerDict[curDefault.name].search_fallback = curDefault.search_fallback
return filter(lambda x: x, providerList)
@ -89,16 +91,23 @@ def makeNewznabProvider(configString):
if not configString:
return None
search_mode = 'eponly'
search_fallback = 0
try:
name, url, key, catIDs, enabled = configString.split('|')
name, url, key, catIDs, enabled, search_mode, search_fallback = configString.split('|')
except ValueError:
logger.log(u"Skipping Newznab provider string: '" + configString + "', incorrect format", logger.ERROR)
return None
try:
name, url, key, catIDs, enabled = configString.split('|')
except ValueError:
logger.log(u"Skipping Newznab provider string: '" + configString + "', incorrect format", logger.ERROR)
return None
newznab = sys.modules['sickbeard.providers.newznab']
newProvider = newznab.NewznabProvider(name, url, key=key, catIDs=catIDs)
newProvider = newznab.NewznabProvider(name, url, key=key, catIDs=catIDs, search_mode=search_mode, search_fallback=search_fallback)
newProvider.enabled = enabled == '1'
newProvider.search_fallback = search_fallback == '1'
return newProvider
@ -123,7 +132,7 @@ def makeTorrentRssProvider(configString):
def getDefaultNewznabProviders():
return 'Sick Beard Index|http://lolo.sickbeard.com/|0|5030,5040,5060|0!!!NZBs.org|https://nzbs.org/||5030,5040,5060,5070,5090|0!!!Usenet-Crawler|https://www.usenet-crawler.com/||5030,5040,5060|0'
return 'Sick Beard Index|http://lolo.sickbeard.com/|0|5030,5040,5060|0|eponly|0!!!NZBs.org|https://nzbs.org/||5030,5040,5060,5070,5090|0|eponly|0!!!Usenet-Crawler|https://www.usenet-crawler.com/||5030,5040,5060|0|eponly|0'
def getProviderModule(name):

View file

@ -39,18 +39,23 @@ class BTNProvider(generic.TorrentProvider):
generic.TorrentProvider.__init__(self, "BTN")
self.supportsBacklog = True
self.enabled = False
self.api_key = None
self.ratio = None
self.cache = BTNCache(self)
self.url = "http://broadcasthe.net"
def isEnabled(self):
return sickbeard.BTN
return self.enabled
def imageName(self):
return 'btn.png'
def _checkAuth(self):
if not sickbeard.BTN_API_KEY:
if not self.api_key:
raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.")
return True
@ -73,7 +78,7 @@ class BTNProvider(generic.TorrentProvider):
self._checkAuth()
params = {}
apikey = sickbeard.BTN_API_KEY
apikey = self.api_key
# age in seconds
if age:
@ -296,8 +301,7 @@ class BTNProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.BTN_RATIO
return self.ratio
class BTNCache(tvcache.TVCache):
def __init__(self, provider):

View file

@ -32,11 +32,16 @@ class DTTProvider(generic.TorrentProvider):
def __init__(self):
generic.TorrentProvider.__init__(self, "DailyTvTorrents")
self.supportsBacklog = True
self.enabled = False
self.ratio = None
self.cache = DTTCache(self)
self.url = 'http://www.dailytvtorrents.org/'
def isEnabled(self):
return sickbeard.DTT
return self.enabled
def imageName(self):
return 'dailytvtorrents.gif'
@ -46,8 +51,8 @@ class DTTProvider(generic.TorrentProvider):
quality = Quality.sceneQuality(url)
return quality
def getSearchResults(self, show, season, episodes, seasonSearch=False, manualSearch=False):
return generic.TorrentProvider.findSearchResults(self, show, season, episodes, seasonSearch, manualSearch)
def findSearchResults(self, show, season, episodes, search_mode, manualSearch=False):
return generic.TorrentProvider.findSearchResults(self, show, season, episodes, search_mode, manualSearch)
def _dtt_show_id(self, show_name):
return sanitizeSceneName(show_name).replace('.', '-').lower()

View file

@ -40,12 +40,15 @@ class EZRSSProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.ratio = None
self.cache = EZRSSCache(self)
self.url = 'https://www.ezrss.it/'
def isEnabled(self):
return sickbeard.EZRSS
return self.enabled
def imageName(self):
return 'ezrss.png'
@ -57,7 +60,7 @@ class EZRSSProvider(generic.TorrentProvider):
return quality
def getSearchResults(self, show, season, episodes, seasonSearch=False, manualSearch=False):
def findSearchResults(self, show, season, episodes, search_mode, manualSearch=False):
self.show = show
@ -68,7 +71,7 @@ class EZRSSProvider(generic.TorrentProvider):
logger.WARNING)
return results
results = generic.TorrentProvider.findSearchResults(self, show, season, episodes, seasonSearch, manualSearch)
results = generic.TorrentProvider.findSearchResults(self, show, season, episodes, search_mode, manualSearch)
return results
@ -158,7 +161,7 @@ class EZRSSProvider(generic.TorrentProvider):
return None
def seedRatio(self):
return sickbeard.EZRSS_RATIO
return self.ratio
class EZRSSCache(tvcache.TVCache):

View file

@ -52,7 +52,9 @@ class GenericProvider:
self.url = ''
self.show = None
self.supportsBacklog = False
self.search_mode = None
self.search_fallback = False
@ -225,7 +227,7 @@ class GenericProvider:
return (title, url)
def findSearchResults(self, show, season, episodes, seasonSearch=False, manualSearch=False):
def findSearchResults(self, show, season, episodes, search_mode, manualSearch=False):
self._checkAuth()
self.show = show
@ -236,7 +238,7 @@ class GenericProvider:
searched_scene_season = None
for epObj in episodes:
if seasonSearch and searched_scene_season:
if search_mode == 'sponly' and searched_scene_season:
if searched_scene_season == epObj.scene_season:
continue
@ -254,7 +256,7 @@ class GenericProvider:
results.update({epObj.episode:cacheResult[epObj]})
continue
if seasonSearch:
if search_mode == 'sponly':
for curString in self._get_season_search_strings(epObj):
itemList += self._doSearch(curString, len(episodes))
else:
@ -289,7 +291,7 @@ class GenericProvider:
continue
if not (self.show.air_by_date or self.show.sports):
if seasonSearch and len(parse_result.episode_numbers):
if search_mode == 'sponly' and len(parse_result.episode_numbers):
logger.log(
u"This is supposed to be a season pack search but the result " + title + " is not a valid season pack, skipping it",
logger.DEBUG)
@ -413,4 +415,4 @@ class TorrentProvider(GenericProvider):
def __init__(self, name):
GenericProvider.__init__(self, name)
self.providerType = GenericProvider.TORRENT
self.providerType = GenericProvider.TORRENT

View file

@ -38,8 +38,13 @@ class HDBitsProvider(generic.TorrentProvider):
generic.TorrentProvider.__init__(self, "HDBits")
self.supportsBacklog = True
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.cache = HDBitsCache(self)
self.url = 'https://hdbits.org'
@ -48,11 +53,11 @@ class HDBitsProvider(generic.TorrentProvider):
self.download_url = 'http://hdbits.org/download.php?'
def isEnabled(self):
return sickbeard.HDBITS
return self.enabled
def _checkAuth(self):
if not sickbeard.HDBITS_USERNAME or not sickbeard.HDBITS_PASSKEY:
if not self.username or not self.password:
raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.")
return True
@ -83,7 +88,7 @@ class HDBitsProvider(generic.TorrentProvider):
if title:
title = title.replace(' ', '.')
url = self.download_url + urllib.urlencode({'id': item['id'], 'passkey': sickbeard.HDBITS_PASSKEY})
url = self.download_url + urllib.urlencode({'id': item['id'], 'passkey': self.password})
return (title, url)
@ -141,8 +146,8 @@ class HDBitsProvider(generic.TorrentProvider):
def _make_post_data_JSON(self, show=None, episode=None, season=None, search_term=None):
post_data = {
'username': sickbeard.HDBITS_USERNAME,
'passkey': sickbeard.HDBITS_PASSKEY,
'username': self.username,
'passkey': self.password,
'category': [2], # TV Category
}
@ -171,7 +176,7 @@ class HDBitsProvider(generic.TorrentProvider):
return json.dumps(post_data)
def seedRatio(self):
return sickbeard.HDBITS_RATIO
return self.ratio
class HDBitsCache(tvcache.TVCache):

View file

@ -56,6 +56,11 @@ class HDTorrentsProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.cache = HDTorrentsCache(self)
self.url = self.urls['base_url']
@ -65,7 +70,7 @@ class HDTorrentsProvider(generic.TorrentProvider):
self.cookies = None
def isEnabled(self):
return sickbeard.HDTORRENTS
return self.enabled
def imageName(self):
return 'hdtorrents.png'
@ -80,14 +85,14 @@ class HDTorrentsProvider(generic.TorrentProvider):
if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()):
return True
if sickbeard.HDTORRENTS_UID and sickbeard.HDTORRENTS_HASH:
if self.uid and self.hash:
requests.utils.add_dict_to_cookiejar(self.session.cookies, self.cookies)
else:
login_params = {'uid': sickbeard.HDTORRENTS_USERNAME,
'pwd': sickbeard.HDTORRENTS_PASSWORD,
login_params = {'uid': self.username,
'pwd': self.password,
'submit': 'Confirm',
}
@ -102,11 +107,11 @@ class HDTorrentsProvider(generic.TorrentProvider):
logger.log(u'Invalid username or password for ' + self.name + ' Check your settings', logger.ERROR)
return False
sickbeard.HDTORRENTS_UID = requests.utils.dict_from_cookiejar(self.session.cookies)['uid']
sickbeard.HDTORRENTS_HASH = requests.utils.dict_from_cookiejar(self.session.cookies)['pass']
self.uid = requests.utils.dict_from_cookiejar(self.session.cookies)['uid']
self.hash = requests.utils.dict_from_cookiejar(self.session.cookies)['pass']
self.cookies = {'uid': sickbeard.HDTORRENTS_UID,
'pass': sickbeard.HDTORRENTS_HASH
self.cookies = {'uid': self.uid,
'pass': self.hash
}
return True
@ -321,7 +326,7 @@ class HDTorrentsProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.HDTORRENTS_RATIO
return self.ratio
class HDTorrentsCache(tvcache.TVCache):

View file

@ -53,6 +53,12 @@ class IPTorrentsProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.freeleech = False
self.cache = IPTorrentsCache(self)
self.url = self.urls['base_url']
@ -60,7 +66,7 @@ class IPTorrentsProvider(generic.TorrentProvider):
self.categorie = 'l73=1&l78=1&l66=1&l65=1&l79=1&l5=1&l4=1'
def isEnabled(self):
return sickbeard.IPTORRENTS
return self.enabled
def imageName(self):
return 'iptorrents.png'
@ -72,8 +78,8 @@ class IPTorrentsProvider(generic.TorrentProvider):
def _doLogin(self):
login_params = {'username': sickbeard.IPTORRENTS_USERNAME,
'password': sickbeard.IPTORRENTS_PASSWORD,
login_params = {'username': self.username,
'password': self.password,
'login': 'submit',
}
@ -137,7 +143,7 @@ class IPTorrentsProvider(generic.TorrentProvider):
results = []
items = {'Season': [], 'Episode': [], 'RSS': []}
freeleech = '&free=on' if sickbeard.IPTORRENTS_FREELEECH else ''
freeleech = '&free=on' if self.freeleech else ''
if not self._doLogin():
return []
@ -266,8 +272,7 @@ class IPTorrentsProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.IPTORRENTS_RATIO
return self.ratio
class IPTorrentsCache(tvcache.TVCache):
def __init__(self, provider):

View file

@ -56,6 +56,10 @@ class KATProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.confirmed = False
self.ratio = None
self.cache = KATCache(self)
self.url = 'http://kickass.to/'
@ -63,7 +67,7 @@ class KATProvider(generic.TorrentProvider):
self.searchurl = self.url + 'usearch/%s/?field=seeders&sorder=desc' #order by seed
def isEnabled(self):
return sickbeard.KAT
return self.enabled
def imageName(self):
return 'kat.png'
@ -261,7 +265,7 @@ class KATProvider(generic.TorrentProvider):
if mode != 'RSS' and seeders == 0:
continue
if sickbeard.KAT_VERIFIED and not verified:
if self.confirmed and not verified:
logger.log(
u"KAT Provider found result " + title + " but that doesn't seem like a verified result so I'm ignoring it",
logger.DEBUG)
@ -398,7 +402,7 @@ class KATProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.KAT_RATIO
return self.ratio
class KATCache(tvcache.TVCache):

View file

@ -42,7 +42,7 @@ from sickbeard.exceptions import ex, AuthException
class NewznabProvider(generic.NZBProvider):
def __init__(self, name, url, key='', catIDs='5030,5040,5060'):
def __init__(self, name, url, key='', catIDs='5030,5040,5060', search_mode='eponly', search_fallback=False):
generic.NZBProvider.__init__(self, name)
@ -52,6 +52,14 @@ class NewznabProvider(generic.NZBProvider):
self.key = key
self.search_mode = search_mode
self.search_fallback = search_fallback
if self.search_fallback == '0':
self.search_fallback = False
else:
self.search_fallback = True
# a 0 in the key spot indicates that no key is needed
if self.key == '0':
self.needs_auth = False
@ -69,7 +77,7 @@ class NewznabProvider(generic.NZBProvider):
self.default = False
def configStr(self):
return self.name + '|' + self.url + '|' + self.key + '|' + self.catIDs + '|' + str(int(self.enabled))
return self.name + '|' + self.url + '|' + self.key + '|' + self.catIDs + '|' + str(int(self.enabled)) + '|' + self.search_mode + '|' + str(int(self.search_fallback))
def imageName(self):
if ek.ek(os.path.isfile,

View file

@ -56,6 +56,11 @@ class NextGenProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.cache = NextGenCache(self)
self.url = self.urls['base_url']
@ -67,7 +72,7 @@ class NextGenProvider(generic.TorrentProvider):
self.login_opener = None
def isEnabled(self):
return sickbeard.NEXTGEN
return self.enabled
def imageName(self):
return 'nextgen.png'
@ -79,8 +84,8 @@ class NextGenProvider(generic.TorrentProvider):
def getLoginParams(self):
return {
'username': sickbeard.NEXTGEN_USERNAME,
'password': sickbeard.NEXTGEN_PASSWORD,
'username': self.username,
'password': self.password,
}
def loginSuccess(self, output):
@ -315,7 +320,7 @@ class NextGenProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.NEXTGEN_RATIO
return self.ratio
class NextGenCache(tvcache.TVCache):

View file

@ -39,12 +39,14 @@ class NyaaProvider(generic.TorrentProvider):
self.supportsAbsoluteNumbering = True
self.enabled = False
self.cache = NyaaCache(self)
self.url = 'http://www.nyaa.eu/'
def isEnabled(self):
return sickbeard.NYAA
return self.enabled
def imageName(self):
return 'nyaatorrents.png'
@ -54,9 +56,8 @@ class NyaaProvider(generic.TorrentProvider):
quality = Quality.sceneQuality(title)
return quality
def getSearchResults(self, show, season, episodes, seasonSearch=False, manualSearch=False):
results = generic.TorrentProvider.findSearchResults(self, show, season, episodes, seasonSearch, manualSearch)
return results
def findSearchResults(self, show, season, episodes, search_mode, manualSearch=False):
return generic.TorrentProvider.findSearchResults(self, show, season, episodes, search_mode, manualSearch)
def _get_season_search_strings(self, ep_obj):
names = []

View file

@ -54,6 +54,9 @@ class PublicHDProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.ratio = None
self.cache = PublicHDCache(self)
self.url = 'http://phdproxy.com/'
@ -63,7 +66,7 @@ class PublicHDProvider(generic.TorrentProvider):
self.categories = {'Season': ['23'], 'Episode': ['7', '14', '24'], 'RSS': ['7', '14', '23', '24']}
def isEnabled(self):
return sickbeard.PUBLICHD
return self.enabled
def imageName(self):
return 'publichd.png'
@ -290,7 +293,7 @@ class PublicHDProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.PUBLICHD_RATIO
return self.ratio
class PublicHDCache(tvcache.TVCache):

View file

@ -58,6 +58,11 @@ class SCCProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.cache = SCCCache(self)
self.url = self.urls['base_url']
@ -67,7 +72,7 @@ class SCCProvider(generic.TorrentProvider):
self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36'}
def isEnabled(self):
return sickbeard.SCC
return self.enabled
def imageName(self):
return 'scc.png'
@ -79,8 +84,8 @@ class SCCProvider(generic.TorrentProvider):
def _doLogin(self):
login_params = {'username': sickbeard.SCC_USERNAME,
'password': sickbeard.SCC_PASSWORD,
login_params = {'username': self.username,
'password': self.password,
'submit': 'come on in',
}
@ -162,6 +167,8 @@ class SCCProvider(generic.TorrentProvider):
if isinstance(search_string, unicode):
search_string = unidecode(search_string)
nonsceneSearchURL = None
foreignSearchURL = None
if mode == 'Season':
searchURL = self.urls['archive'] % (search_string)
data = [self.getURL(searchURL, headers=self.headers)]
@ -306,7 +313,7 @@ class SCCProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.SCC_RATIO
return self.ratio
class SCCCache(tvcache.TVCache):

View file

@ -52,6 +52,12 @@ class SpeedCDProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.freeleech = False
self.cache = SpeedCDCache(self)
self.url = self.urls['base_url']
@ -59,7 +65,7 @@ class SpeedCDProvider(generic.TorrentProvider):
self.categories = {'Season': {'c14':1}, 'Episode': {'c2':1, 'c49':1}, 'RSS': {'c14':1, 'c2':1, 'c49':1}}
def isEnabled(self):
return sickbeard.SPEEDCD
return self.enabled
def imageName(self):
return 'speedcd.png'
@ -71,12 +77,10 @@ class SpeedCDProvider(generic.TorrentProvider):
def _doLogin(self):
login_params = {'username': sickbeard.SPEEDCD_USERNAME,
'password': sickbeard.SPEEDCD_PASSWORD
login_params = {'username': self.username,
'password': self.password
}
self.session = requests.Session()
try:
response = self.session.post(self.urls['login'], data=login_params, timeout=30, verify=False)
except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError), e:
@ -157,7 +161,7 @@ class SpeedCDProvider(generic.TorrentProvider):
for torrent in torrents:
if sickbeard.SPEEDCD_FREELEECH and not torrent['free']:
if self.freeleech and not torrent['free']:
continue
title = re.sub('<[^>]*>', '', torrent['name'])
@ -245,8 +249,7 @@ class SpeedCDProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.SPEEDCD_RATIO
return self.ratio
class SpeedCDCache(tvcache.TVCache):

View file

@ -63,6 +63,10 @@ class ThePirateBayProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.ratio = None
self.confirmed = False
self.cache = ThePirateBayCache(self)
self.proxy = ThePirateBayWebproxy()
@ -74,7 +78,7 @@ class ThePirateBayProvider(generic.TorrentProvider):
self.re_title_url = '/torrent/(?P<id>\d+)/(?P<title>.*?)//1".+?(?P<url>magnet.*?)//1".+?(?P<seeders>\d+)</td>.+?(?P<leechers>\d+)</td>'
def isEnabled(self):
return sickbeard.THEPIRATEBAY
return self.enabled
def imageName(self):
return 'thepiratebay.png'
@ -257,7 +261,7 @@ class ThePirateBayProvider(generic.TorrentProvider):
continue
#Accept Torrent only from Good People for every Episode Search
if sickbeard.THEPIRATEBAY_TRUSTED and re.search('(VIP|Trusted|Helper)', torrent.group(0)) is None:
if self.confirmed and re.search('(VIP|Trusted|Helper)', torrent.group(0)) is None:
logger.log(u"ThePirateBay Provider found result " + torrent.group(
'title') + " but that doesn't seem like a trusted result so I'm ignoring it", logger.DEBUG)
continue
@ -390,7 +394,7 @@ class ThePirateBayProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.THEPIRATEBAY_RATIO
return self.ratio
class ThePirateBayCache(tvcache.TVCache):
@ -445,14 +449,16 @@ class ThePirateBayWebproxy:
self.Type = 'GlypeProxy'
self.param = 'browse.php?u='
self.option = '&b=32'
self.proxy = False
self.proxy_url = None
def isEnabled(self):
""" Return True if we Choose to call TPB via Proxy """
return sickbeard.THEPIRATEBAY_PROXY
return self.proxy
def getProxyURL(self):
""" Return the Proxy URL Choosen via Provider Setting """
return str(sickbeard.THEPIRATEBAY_PROXY_URL)
return str(self.proxy_url)
def _buildURL(self, url):
""" Return the Proxyfied URL of the page """

View file

@ -53,6 +53,12 @@ class TorrentDayProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.freeleech = False
self.cache = TorrentDayCache(self)
self.url = self.urls['base_url']
@ -63,7 +69,7 @@ class TorrentDayProvider(generic.TorrentProvider):
'RSS': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1, 'c14': 1}}
def isEnabled(self):
return sickbeard.TORRENTDAY
return self.enabled
def imageName(self):
return 'torrentday.png'
@ -78,14 +84,14 @@ class TorrentDayProvider(generic.TorrentProvider):
if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()):
return True
if sickbeard.TORRENTDAY_UID and sickbeard.TORRENTDAY_HASH:
if self.uid and self.hash:
requests.utils.add_dict_to_cookiejar(self.session.cookies, self.cookies)
else:
login_params = {'username': sickbeard.TORRENTDAY_USERNAME,
'password': sickbeard.TORRENTDAY_PASSWORD,
login_params = {'username': self.username,
'password': self.password,
'submit.x': 0,
'submit.y': 0
}
@ -105,11 +111,11 @@ class TorrentDayProvider(generic.TorrentProvider):
return False
if requests.utils.dict_from_cookiejar(self.session.cookies)['uid'] and requests.utils.dict_from_cookiejar(self.session.cookies)['pass']:
sickbeard.TORRENTDAY_UID = requests.utils.dict_from_cookiejar(self.session.cookies)['uid']
sickbeard.TORRENTDAY_HASH = requests.utils.dict_from_cookiejar(self.session.cookies)['pass']
self.uid = requests.utils.dict_from_cookiejar(self.session.cookies)['uid']
self.hash = requests.utils.dict_from_cookiejar(self.session.cookies)['pass']
self.cookies = {'uid': sickbeard.TORRENTDAY_UID,
'pass': sickbeard.TORRENTDAY_HASH
self.cookies = {'uid': self.uid,
'pass': self.hash
}
return True
@ -164,7 +170,7 @@ class TorrentDayProvider(generic.TorrentProvider):
results = []
items = {'Season': [], 'Episode': [], 'RSS': []}
freeleech = '&free=on' if sickbeard.TORRENTDAY_FREELEECH else ''
freeleech = '&free=on' if self.freeleech else ''
if not self._doLogin():
return []
@ -179,7 +185,7 @@ class TorrentDayProvider(generic.TorrentProvider):
post_data = dict({'/browse.php?': None, 'cata': 'yes', 'jxt': 8, 'jxw': 'b', 'search': search_string},
**self.categories[mode])
if sickbeard.TORRENTDAY_FREELEECH:
if self.freeleech:
post_data.update({'free': 'on'})
data = self.session.post(self.urls['search'], data=post_data).json()
@ -268,7 +274,7 @@ class TorrentDayProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.TORRENTDAY_RATIO
return self.ratio
class TorrentDayCache(tvcache.TVCache):

View file

@ -54,6 +54,11 @@ class TorrentLeechProvider(generic.TorrentProvider):
self.supportsBacklog = True
self.enabled = False
self.username = None
self.password = None
self.ratio = None
self.cache = TorrentLeechCache(self)
self.url = self.urls['base_url']
@ -61,7 +66,7 @@ class TorrentLeechProvider(generic.TorrentProvider):
self.categories = "2,26,27,32"
def isEnabled(self):
return sickbeard.TORRENTLEECH
return self.enabled
def imageName(self):
return 'torrentleech.png'
@ -73,8 +78,8 @@ class TorrentLeechProvider(generic.TorrentProvider):
def _doLogin(self):
login_params = {'username': sickbeard.TORRENTLEECH_USERNAME,
'password': sickbeard.TORRENTLEECH_PASSWORD,
login_params = {'username': self.username,
'password': self.password,
'remember_me': 'on',
'login': 'submit',
}
@ -267,7 +272,7 @@ class TorrentLeechProvider(generic.TorrentProvider):
return results
def seedRatio(self):
return sickbeard.TORRENTLEECH_RATIO
return self.ratio
class TorrentLeechCache(tvcache.TVCache):

View file

@ -37,19 +37,25 @@ class TvTorrentsProvider(generic.TorrentProvider):
self.supportsBacklog = False
self.enabled = False
self.hash = None
self.digest = None
self.ratio = None
self.options = None
self.cache = TvTorrentsCache(self)
self.url = 'http://www.tvtorrents.com/'
def isEnabled(self):
return sickbeard.TVTORRENTS
return self.enabled
def imageName(self):
return 'tvtorrents.png'
def _checkAuth(self):
if not sickbeard.TVTORRENTS_DIGEST or not sickbeard.TVTORRENTS_HASH:
if not self.digest or not self.hash:
raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.")
return True
@ -70,7 +76,7 @@ class TvTorrentsProvider(generic.TorrentProvider):
return True
def seedRatio(self):
return sickbeard.TVTORRENTS_RATIO
return self.ratio
class TvTorrentsCache(tvcache.TVCache):
@ -84,7 +90,7 @@ class TvTorrentsCache(tvcache.TVCache):
# These will be ignored on the serverside.
ignore_regex = "all.month|month.of|season[\s\d]*complete"
rss_url = self.provider.url + 'RssServlet?digest=' + sickbeard.TVTORRENTS_DIGEST + '&hash=' + sickbeard.TVTORRENTS_HASH + '&fname=true&exclude=(' + ignore_regex + ')'
rss_url = self.provider.url + 'RssServlet?digest=' + provider.digest + '&hash=' + provider.hash + '&fname=true&exclude=(' + ignore_regex + ')'
logger.log(self.provider.name + u" cache update URL: " + rss_url, logger.DEBUG)
return self.getRSSFeed(rss_url)

View file

@ -316,13 +316,14 @@ def filterSearchResults(show, results):
return foundResults
def searchProviders(queueItem, show, season, episodes, seasonSearch=False, manualSearch=False):
def searchProviders(queueItem, show, season, episodes, manualSearch=False):
threadName = threading.currentThread().name
if seasonSearch:
logger.log(u"Searching for " + show.name + " Season " + str(season) + " pack")
else:
logger.log(u"Searching for episodes we need from " + show.name + " Season " + str(season))
# check if we want to search for season packs instead of just season/episode
seasonSearch = False
seasonEps = show.getAllEpisodes(season)
if len(seasonEps) == len(episodes):
seasonSearch = True
providers = [x for x in sickbeard.providers.sortedProviderList() if x.isActive()]
@ -331,14 +332,26 @@ def searchProviders(queueItem, show, season, episodes, seasonSearch=False, manua
logger.ERROR)
return queueItem
def doSearch():
foundResults = {}
for providerNum, provider in enumerate(providers):
foundResults.setdefault(provider.name, {})
threading.currentThread().name = threadName + ":[" + provider.name + "]"
foundResults = {}
for providerNum, provider in enumerate(providers):
threading.currentThread().name = threadName + ":[" + provider.name + "]"
foundResults.setdefault(provider.name, {})
searchCount = 0
search_mode = 'eponly'
if seasonSearch and provider.search_mode == 'sponly':
search_mode = provider.search_mode
while(True):
searchCount += 1
if search_mode == 'sponly':
logger.log(u"Searching for " + show.name + " Season " + str(season) + " pack")
else:
logger.log(u"Searching for episodes we need from " + show.name + " Season " + str(season))
try:
curResults = provider.findSearchResults(show, season, episodes, seasonSearch, manualSearch)
searchResults = provider.findSearchResults(show, season, episodes, search_mode, manualSearch)
except exceptions.AuthException, e:
logger.log(u"Authentication error: " + ex(e), logger.ERROR)
continue
@ -347,220 +360,225 @@ def searchProviders(queueItem, show, season, episodes, seasonSearch=False, manua
logger.log(traceback.format_exc(), logger.DEBUG)
continue
if not len(curResults):
continue
if len(searchResults) and not provider.search_fallback or searchCount == 2:
foundResults[provider.name] = filterSearchResults(show, searchResults)
break
foundResults[provider.name] = filterSearchResults(show, curResults)
if not len(foundResults[provider.name]):
continue
if search_mode == 'sponly':
logger.log(u"FALLBACK EPISODE SEARCH INITIATED ...")
search_mode = 'eponly'
else:
logger.log(u"FALLBACK SEASON PACK SEARCH INITIATED ...")
search_mode = 'eponly'
anyQualities, bestQualities = Quality.splitQuality(show.quality)
# skip to next provider if we have no results to process
if not len(foundResults[provider.name]):
continue
# pick the best season NZB
bestSeasonNZB = None
if SEASON_RESULT in foundResults[provider.name]:
bestSeasonNZB = pickBestResult(foundResults[provider.name][SEASON_RESULT], show,
anyQualities + bestQualities)
anyQualities, bestQualities = Quality.splitQuality(show.quality)
highest_quality_overall = 0
for cur_episode in foundResults[provider.name]:
for cur_result in foundResults[provider.name][cur_episode]:
if cur_result.quality != Quality.UNKNOWN and cur_result.quality > highest_quality_overall:
highest_quality_overall = cur_result.quality
logger.log(u"The highest quality of any match is " + Quality.qualityStrings[highest_quality_overall],
logger.DEBUG)
# pick the best season NZB
bestSeasonNZB = None
if SEASON_RESULT in foundResults[provider.name]:
bestSeasonNZB = pickBestResult(foundResults[provider.name][SEASON_RESULT], show,
anyQualities + bestQualities)
# see if every episode is wanted
if bestSeasonNZB:
highest_quality_overall = 0
for cur_episode in foundResults[provider.name]:
for cur_result in foundResults[provider.name][cur_episode]:
if cur_result.quality != Quality.UNKNOWN and cur_result.quality > highest_quality_overall:
highest_quality_overall = cur_result.quality
logger.log(u"The highest quality of any match is " + Quality.qualityStrings[highest_quality_overall],
logger.DEBUG)
# get the quality of the season nzb
seasonQual = Quality.sceneQuality(bestSeasonNZB.name)
seasonQual = bestSeasonNZB.quality
# see if every episode is wanted
if bestSeasonNZB:
# get the quality of the season nzb
seasonQual = Quality.sceneQuality(bestSeasonNZB.name)
seasonQual = bestSeasonNZB.quality
logger.log(
u"The quality of the season " + bestSeasonNZB.provider.providerType + " is " + Quality.qualityStrings[
seasonQual], logger.DEBUG)
myDB = db.DBConnection()
allEps = [int(x["episode"]) for x in
myDB.select("SELECT episode FROM tv_episodes WHERE showid = ? AND season = ?",
[show.indexerid, season])]
logger.log(u"Episode list: " + str(allEps), logger.DEBUG)
allWanted = True
anyWanted = False
for curEpNum in allEps:
if not show.wantEpisode(season, curEpNum, seasonQual):
allWanted = False
else:
anyWanted = True
# if we need every ep in the season and there's nothing better then just download this and be done with it (unless single episodes are preferred)
if allWanted and bestSeasonNZB.quality == highest_quality_overall:
logger.log(
u"The quality of the season " + bestSeasonNZB.provider.providerType + " is " + Quality.qualityStrings[
seasonQual], logger.DEBUG)
myDB = db.DBConnection()
allEps = [int(x["episode"]) for x in
myDB.select("SELECT episode FROM tv_episodes WHERE showid = ? AND season = ?",
[show.indexerid, season])]
logger.log(u"Episode list: " + str(allEps), logger.DEBUG)
allWanted = True
anyWanted = False
u"Every ep in this season is needed, downloading the whole " + bestSeasonNZB.provider.providerType + " " + bestSeasonNZB.name)
epObjs = []
for curEpNum in allEps:
if not show.wantEpisode(season, curEpNum, seasonQual):
allWanted = False
else:
anyWanted = True
epObjs.append(show.getEpisode(season, curEpNum))
bestSeasonNZB.episodes = epObjs
queueItem.results = [bestSeasonNZB]
return queueItem
# if we need every ep in the season and there's nothing better then just download this and be done with it (unless single episodes are preferred)
if allWanted and bestSeasonNZB.quality == highest_quality_overall:
elif not anyWanted:
logger.log(
u"No eps from this season are wanted at this quality, ignoring the result of " + bestSeasonNZB.name,
logger.DEBUG)
else:
if bestSeasonNZB.provider.providerType == GenericProvider.NZB:
logger.log(u"Breaking apart the NZB and adding the individual ones to our results", logger.DEBUG)
# if not, break it apart and add them as the lowest priority results
individualResults = nzbSplitter.splitResult(bestSeasonNZB)
individualResults = filter(
lambda x: show_name_helpers.filterBadReleases(x.name) and show_name_helpers.isGoodResult(x.name,
show),
individualResults)
for curResult in individualResults:
if len(curResult.episodes) == 1:
epNum = curResult.episodes[0].episode
elif len(curResult.episodes) > 1:
epNum = MULTI_EP_RESULT
if epNum in foundResults[provider.name]:
foundResults[provider.name][epNum].append(curResult)
else:
foundResults[provider.name][epNum] = [curResult]
# If this is a torrent all we can do is leech the entire torrent, user will have to select which eps not do download in his torrent client
else:
# Season result from Torrent Provider must be a full-season torrent, creating multi-ep result for it.
logger.log(
u"Every ep in this season is needed, downloading the whole " + bestSeasonNZB.provider.providerType + " " + bestSeasonNZB.name)
u"Adding multi-ep result for full-season torrent. Set the episodes you don't want to 'don't download' in your torrent client if desired!")
epObjs = []
for curEpNum in allEps:
epObjs.append(show.getEpisode(season, curEpNum))
bestSeasonNZB.episodes = epObjs
queueItem.results = [bestSeasonNZB]
return queueItem
elif not anyWanted:
logger.log(
u"No eps from this season are wanted at this quality, ignoring the result of " + bestSeasonNZB.name,
logger.DEBUG)
else:
if bestSeasonNZB.provider.providerType == GenericProvider.NZB:
logger.log(u"Breaking apart the NZB and adding the individual ones to our results", logger.DEBUG)
# if not, break it apart and add them as the lowest priority results
individualResults = nzbSplitter.splitResult(bestSeasonNZB)
individualResults = filter(
lambda x: show_name_helpers.filterBadReleases(x.name) and show_name_helpers.isGoodResult(x.name,
show),
individualResults)
for curResult in individualResults:
if len(curResult.episodes) == 1:
epNum = curResult.episodes[0].episode
elif len(curResult.episodes) > 1:
epNum = MULTI_EP_RESULT
if epNum in foundResults[provider.name]:
foundResults[provider.name][epNum].append(curResult)
else:
foundResults[provider.name][epNum] = [curResult]
# If this is a torrent all we can do is leech the entire torrent, user will have to select which eps not do download in his torrent client
epNum = MULTI_EP_RESULT
if epNum in foundResults[provider.name]:
foundResults[provider.name][epNum].append(bestSeasonNZB)
else:
foundResults[provider.name][epNum] = [bestSeasonNZB]
# Season result from Torrent Provider must be a full-season torrent, creating multi-ep result for it.
logger.log(
u"Adding multi-ep result for full-season torrent. Set the episodes you don't want to 'don't download' in your torrent client if desired!")
epObjs = []
for curEpNum in allEps:
epObjs.append(show.getEpisode(season, curEpNum))
bestSeasonNZB.episodes = epObjs
# go through multi-ep results and see if we really want them or not, get rid of the rest
multiResults = {}
if MULTI_EP_RESULT in foundResults[provider.name]:
for multiResult in foundResults[provider.name][MULTI_EP_RESULT]:
epNum = MULTI_EP_RESULT
if epNum in foundResults[provider.name]:
foundResults[provider.name][epNum].append(bestSeasonNZB)
else:
foundResults[provider.name][epNum] = [bestSeasonNZB]
logger.log(u"Seeing if we want to bother with multi-episode result " + multiResult.name, logger.DEBUG)
# go through multi-ep results and see if we really want them or not, get rid of the rest
multiResults = {}
if MULTI_EP_RESULT in foundResults[provider.name]:
for multiResult in foundResults[provider.name][MULTI_EP_RESULT]:
if sickbeard.USE_FAILED_DOWNLOADS and failed_history.hasFailed(multiResult.name, multiResult.size,
multiResult.provider.name):
logger.log(multiResult.name + u" has previously failed, rejecting this multi-ep result")
continue
logger.log(u"Seeing if we want to bother with multi-episode result " + multiResult.name, logger.DEBUG)
# see how many of the eps that this result covers aren't covered by single results
neededEps = []
notNeededEps = []
for epObj in multiResult.episodes:
epNum = epObj.episode
# if we have results for the episode
if epNum in foundResults[provider.name] and len(foundResults[provider.name][epNum]) > 0:
# but the multi-ep is worse quality, we don't want it
# TODO: wtf is this False for
#if False and multiResult.quality <= pickBestResult(foundResults[epNum]):
# notNeededEps.append(epNum)
#else:
neededEps.append(epNum)
else:
neededEps.append(epNum)
if sickbeard.USE_FAILED_DOWNLOADS and failed_history.hasFailed(multiResult.name, multiResult.size,
multiResult.provider.name):
logger.log(multiResult.name + u" has previously failed, rejecting this multi-ep result")
continue
logger.log(
u"Single-ep check result is neededEps: " + str(neededEps) + ", notNeededEps: " + str(notNeededEps),
logger.DEBUG)
# see how many of the eps that this result covers aren't covered by single results
neededEps = []
notNeededEps = []
for epObj in multiResult.episodes:
epNum = epObj.episode
# if we have results for the episode
if epNum in foundResults[provider.name] and len(foundResults[provider.name][epNum]) > 0:
# but the multi-ep is worse quality, we don't want it
# TODO: wtf is this False for
#if False and multiResult.quality <= pickBestResult(foundResults[epNum]):
# notNeededEps.append(epNum)
#else:
neededEps.append(epNum)
else:
neededEps.append(epNum)
if not neededEps:
logger.log(u"All of these episodes were covered by single nzbs, ignoring this multi-ep result",
logger.DEBUG)
continue
# check if these eps are already covered by another multi-result
multiNeededEps = []
multiNotNeededEps = []
for epObj in multiResult.episodes:
epNum = epObj.episode
if epNum in multiResults:
multiNotNeededEps.append(epNum)
else:
multiNeededEps.append(epNum)
logger.log(
u"Multi-ep check result is multiNeededEps: " + str(multiNeededEps) + ", multiNotNeededEps: " + str(
multiNotNeededEps), logger.DEBUG)
if not multiNeededEps:
logger.log(
u"Single-ep check result is neededEps: " + str(neededEps) + ", notNeededEps: " + str(notNeededEps),
u"All of these episodes were covered by another multi-episode nzbs, ignoring this multi-ep result",
logger.DEBUG)
continue
if not neededEps:
logger.log(u"All of these episodes were covered by single nzbs, ignoring this multi-ep result",
logger.DEBUG)
continue
# if we're keeping this multi-result then remember it
for epObj in multiResult.episodes:
multiResults[epObj.episode] = multiResult
# check if these eps are already covered by another multi-result
multiNeededEps = []
multiNotNeededEps = []
for epObj in multiResult.episodes:
epNum = epObj.episode
if epNum in multiResults:
multiNotNeededEps.append(epNum)
else:
multiNeededEps.append(epNum)
logger.log(
u"Multi-ep check result is multiNeededEps: " + str(multiNeededEps) + ", multiNotNeededEps: " + str(
multiNotNeededEps), logger.DEBUG)
if not multiNeededEps:
# don't bother with the single result if we're going to get it with a multi result
for epObj in multiResult.episodes:
epNum = epObj.episode
if epNum in foundResults[provider.name]:
logger.log(
u"All of these episodes were covered by another multi-episode nzbs, ignoring this multi-ep result",
logger.DEBUG)
continue
u"A needed multi-episode result overlaps with a single-episode result for ep #" + str(
epNum) + ", removing the single-episode results from the list", logger.DEBUG)
del foundResults[provider.name][epNum]
# if we're keeping this multi-result then remember it
for epObj in multiResult.episodes:
multiResults[epObj.episode] = multiResult
# don't bother with the single result if we're going to get it with a multi result
for epObj in multiResult.episodes:
epNum = epObj.episode
if epNum in foundResults[provider.name]:
logger.log(
u"A needed multi-episode result overlaps with a single-episode result for ep #" + str(
epNum) + ", removing the single-episode results from the list", logger.DEBUG)
del foundResults[provider.name][epNum]
# of all the single ep results narrow it down to the best one for each episode
queueItem.results += set(multiResults.values())
for curEp in foundResults[provider.name]:
if curEp in (MULTI_EP_RESULT, SEASON_RESULT):
continue
if len(foundResults[provider.name][curEp]) == 0:
continue
bestResult = pickBestResult(foundResults[provider.name][curEp], show)
# if all results were rejected move on to the next episode
if not bestResult:
continue
# add result if its not a duplicate and
found = False
for i, result in enumerate(queueItem.results):
for bestResultEp in bestResult.episodes:
if bestResultEp in result.episodes:
if result.quality < bestResult.quality:
queueItem.results.pop(i)
else:
found = True
if not found:
queueItem.results += [bestResult]
# check that we got all the episodes we wanted first before doing a match and snatch
wantedEpCount = 0
for wantedEp in episodes:
for result in queueItem.results:
if wantedEp in result.episodes and isFinalResult(result):
wantedEpCount += 1
# make sure we search every provider for results unless we found everything we wanted
if providerNum != len(providers) and wantedEpCount != len(episodes):
# of all the single ep results narrow it down to the best one for each episode
queueItem.results += set(multiResults.values())
for curEp in foundResults[provider.name]:
if curEp in (MULTI_EP_RESULT, SEASON_RESULT):
continue
return queueItem
if len(foundResults[provider.name][curEp]) == 0:
continue
results = doSearch()
return results
bestResult = pickBestResult(foundResults[provider.name][curEp], show)
# if all results were rejected move on to the next episode
if not bestResult:
continue
# add result if its not a duplicate and
found = False
for i, result in enumerate(queueItem.results):
for bestResultEp in bestResult.episodes:
if bestResultEp in result.episodes:
if result.quality < bestResult.quality:
queueItem.results.pop(i)
else:
found = True
if not found:
queueItem.results += [bestResult]
# check that we got all the episodes we wanted first before doing a match and snatch
wantedEpCount = 0
for wantedEp in episodes:
for result in queueItem.results:
if wantedEp in result.episodes and isFinalResult(result):
wantedEpCount += 1
# make sure we search every provider for results unless we found everything we wanted
if providerNum != len(providers) and wantedEpCount != len(episodes):
continue
return queueItem

View file

@ -98,7 +98,7 @@ class ManualSearchQueueItem(generic_queue.QueueItem):
try:
logger.log("Beginning manual search for [" + self.segment.prettyName() + "]")
searchResult = search.searchProviders(self, self.show, self.segment.season, [self.segment],False,True)
searchResult = search.searchProviders(self, self.show, self.segment.season, [self.segment], True)
if searchResult:
SearchQueue().snatch_item(searchResult)
@ -131,15 +131,9 @@ class BacklogQueueItem(generic_queue.QueueItem):
wantedEps = self.segment[season]
# check if we want to search for season packs instead of just season/episode
seasonSearch = False
seasonEps = self.show.getAllEpisodes(season)
if len(seasonEps) == len(wantedEps) and not sickbeard.PREFER_EPISODE_RELEASES:
seasonSearch = True
try:
logger.log("Beginning backlog search for [" + self.show.name + "]")
searchResult = search.searchProviders(self, self.show, season, wantedEps, seasonSearch, False)
searchResult = search.searchProviders(self, self.show, season, wantedEps, False)
if searchResult:
SearchQueue().snatch_item(searchResult)
@ -182,7 +176,7 @@ class FailedQueueItem(generic_queue.QueueItem):
if len(failed_episodes):
try:
searchResult = search.searchProviders(self, self.show, failed_episodes[0].season, failed_episodes, False, True)
searchResult = search.searchProviders(self, self.show, failed_episodes[0].season, failed_episodes, True)
if searchResult:
SearchQueue().snatch_item(searchResult)

View file

@ -1449,24 +1449,7 @@ class ConfigProviders:
return '1'
@cherrypy.expose
def saveProviders(self, newznab_string='', torrentrss_string='',
omgwtfnzbs_username=None, omgwtfnzbs_apikey=None,
ezrss_ratio=None,
tvtorrents_digest=None, tvtorrents_hash=None, tvtorrents_ratio=None,
btn_api_key=None, btn_ratio=None,
thepiratebay_ratio=None, thepiratebay_trusted=None, thepiratebay_proxy=None, thepiratebay_proxy_url=None,
torrentleech_username=None, torrentleech_password=None, torrentleech_ratio=None,
iptorrents_username=None, iptorrents_password=None, iptorrents_ratio=None, iptorrents_freeleech=None,
kat_trusted=None, kat_ratio=None, kat_verified=None,
publichd_ratio=None,
scc_username=None, scc_password=None, scc_ratio=None,
hdtorrents_username=None, hdtorrents_password=None, hdtorrents_ratio=None,
torrentday_username=None, torrentday_password=None, torrentday_ratio=None, torrentday_freeleech=None,
hdbits_username=None, hdbits_passkey=None, hdbits_ratio=None,
nextgen_username=None, nextgen_password=None, nextgen_ratio=None,
newzbin_username=None, newzbin_password=None,
speedcd_username=None, speedcd_password=None, speedcd_ratio=None, speedcd_freeleech=None,
provider_order=None):
def saveProviders(self, newznab_string='', torrentrss_string='', provider_order=None, **kwargs):
results = []
@ -1487,9 +1470,7 @@ class ConfigProviders:
cur_name, cur_url, cur_key = curNewznabProviderStr.split('|')
cur_url = config.clean_url(cur_url)
newProvider = newznab.NewznabProvider(cur_name, cur_url, key=cur_key)
cur_id = newProvider.getID()
# if it already exists then update it
@ -1503,7 +1484,28 @@ class ConfigProviders:
else:
newznabProviderDict[cur_id].needs_auth = True
try:
newznabProviderDict[cur_id].search_mode = kwargs[cur_id + '_search_mode'].strip()
except:
newznabProviderDict[cur_id].search_mode = 'eponly'
try:
newznabProviderDict[cur_id].search_fallback = config.checkbox_to_value(
kwargs[cur_id + '_search_fallback'])
except:
newznabProviderDict[cur_id].search_fallback = 0
else:
try:
newProvider.search_mode = kwargs[cur_id + '_search_mode'].strip()
except:
newProvider.search_mode = 'eponly'
try:
newProvider.search_fallback = config.checkbox_to_value(
kwargs[cur_id + '_search_fallback'])
except:
newProvider.search_fallback = 0
sickbeard.newznabProviderList.append(newProvider)
finishedNames.append(cur_id)
@ -1557,120 +1559,91 @@ class ConfigProviders:
provider_list.append(curProvider)
if curProvider == 'nzbs_org_old':
sickbeard.NZBS = curEnabled
elif curProvider == 'newzbin':
sickbeard.NEWZBIN = curEnabled
elif curProvider == 'bin_req':
sickbeard.BINREQ = curEnabled
elif curProvider == 'womble_s_index':
sickbeard.WOMBLE = curEnabled
elif curProvider == 'omgwtfnzbs':
sickbeard.OMGWTFNZBS = curEnabled
elif curProvider == 'ezrss':
sickbeard.EZRSS = curEnabled
elif curProvider == 'tvtorrents':
sickbeard.TVTORRENTS = curEnabled
elif curProvider == 'torrentleech':
sickbeard.TORRENTLEECH = curEnabled
elif curProvider == 'btn':
sickbeard.BTN = curEnabled
elif curProvider == 'thepiratebay':
sickbeard.THEPIRATEBAY = curEnabled
elif curProvider == 'torrentleech':
sickbeard.TORRENTLEECH = curEnabled
elif curProvider == 'iptorrents':
sickbeard.IPTORRENTS = curEnabled
elif curProvider == 'omgwtfnzbs':
sickbeard.OMGWTFNZBS = curEnabled
elif curProvider == 'kickasstorrents':
sickbeard.KAT = curEnabled
elif curProvider == 'publichd':
sickbeard.PUBLICHD = curEnabled
elif curProvider == 'sceneaccess':
sickbeard.SCC = curEnabled
elif curProvider == 'hdtorrents':
sickbeard.HDTORRENTS = curEnabled
elif curProvider == 'torrentday':
sickbeard.TORRENTDAY = curEnabled
elif curProvider == 'hdbits':
sickbeard.HDBITS = curEnabled
elif curProvider == 'nextgen':
sickbeard.NEXTGEN = curEnabled
elif curProvider == 'speedcd':
sickbeard.SPEEDCD = curEnabled
elif curProvider in newznabProviderDict:
newznabProviderDict[curProvider].enabled = bool(curEnabled)
elif curProvider in torrentRssProviderDict:
torrentRssProviderDict[curProvider].enabled = bool(curEnabled)
else:
logger.log(u"don't know what " + curProvider + " is, skipping")
# dynamically set providers enabled/disabled
for provider in sickbeard.providers.sortedProviderList():
if provider.getID() != curProvider or not hasattr(provider, 'enabled'):
continue
sickbeard.EZRSS_RATIO = ezrss_ratio
provider.enabled = curEnabled
sickbeard.TVTORRENTS_DIGEST = tvtorrents_digest.strip()
sickbeard.TVTORRENTS_HASH = tvtorrents_hash.strip()
sickbeard.TVTORRENTS_RATIO = config.to_int(tvtorrents_ratio)
# dynamically load provider settings
for curTorrentProvider in [curProvider for curProvider in sickbeard.providers.sortedProviderList() if
curProvider.providerType == sickbeard.GenericProvider.TORRENT]:
sickbeard.BTN_API_KEY = btn_api_key.strip()
sickbeard.BTN_RATIO = btn_ratio
if hasattr(curTorrentProvider, 'ratio'):
try:
curTorrentProvider.ratio = kwargs[curTorrentProvider.getID() + '_ratio'].strip()
except:
curTorrentProvider.ratio = None
sickbeard.THEPIRATEBAY_RATIO = thepiratebay_ratio
sickbeard.THEPIRATEBAY_TRUSTED = config.checkbox_to_value(thepiratebay_trusted)
if hasattr(curTorrentProvider, 'digest'):
try:
curTorrentProvider.digest = kwargs[curTorrentProvider.getID() + '_digest'].strip()
except:
curTorrentProvider.digest = None
thepiratebay_proxy = config.checkbox_to_value(thepiratebay_proxy)
if thepiratebay_proxy:
sickbeard.THEPIRATEBAY_PROXY_URL = thepiratebay_proxy_url.strip()
else:
sickbeard.THEPIRATEBAY_PROXY_URL = ""
if hasattr(curTorrentProvider, 'hash'):
try:
curTorrentProvider.hash = kwargs[curTorrentProvider.getID() + '_hash'].strip()
except:
curTorrentProvider.hash = None
sickbeard.THEPIRATEBAY_PROXY = thepiratebay_proxy
if hasattr(curTorrentProvider, 'api_key'):
try:
curTorrentProvider.api_key = kwargs[curTorrentProvider.getID() + '_api_key'].strip()
except:
curTorrentProvider.api_key = None
sickbeard.TORRENTLEECH_USERNAME = torrentleech_username
sickbeard.TORRENTLEECH_PASSWORD = torrentleech_password
sickbeard.TORRENTLEECH_RATIO = torrentleech_ratio
if hasattr(curTorrentProvider, 'username'):
try:
curTorrentProvider.username = kwargs[curTorrentProvider.getID() + '_username'].strip()
except:
curTorrentProvider.username = None
sickbeard.IPTORRENTS_USERNAME = iptorrents_username.strip()
sickbeard.IPTORRENTS_PASSWORD = iptorrents_password.strip()
sickbeard.IPTORRENTS_RATIO = iptorrents_ratio
if hasattr(curTorrentProvider, 'password'):
try:
curTorrentProvider.password = kwargs[curTorrentProvider.getID() + '_password'].strip()
except:
curTorrentProvider.password = None
sickbeard.IPTORRENTS_FREELEECH = config.checkbox_to_value(iptorrents_freeleech)
if hasattr(curTorrentProvider, 'confirmed'):
try:
curTorrentProvider.confirmed = config.checkbox_to_value(kwargs[curTorrentProvider.getID() + '_confirmed'])
except:
curTorrentProvider.confirmed = 0
sickbeard.KAT_TRUSTED = config.checkbox_to_value(kat_trusted)
sickbeard.KAT_RATIO = kat_ratio
sickbeard.KAT_VERIFIED = config.checkbox_to_value(kat_verified)
if hasattr(curTorrentProvider, 'proxy'):
try:
curTorrentProvider.proxy = config.checkbox_to_value(kwargs[curTorrentProvider.getID() + '_proxy'])
except:
curTorrentProvider.proxy = 0
sickbeard.PUBLICHD_RATIO = publichd_ratio
if hasattr(curTorrentProvider, 'proxy_url'):
try:
curTorrentProvider.proxy_url = kwargs[curTorrentProvider.getID() + '_proxy_url'].strip()
except:
curTorrentProvider.proxy_url = None
sickbeard.TORRENTDAY_USERNAME = torrentday_username.strip()
sickbeard.TORRENTDAY_PASSWORD = torrentday_password.strip()
sickbeard.TORRENTDAY_RATIO = torrentday_ratio
if hasattr(curTorrentProvider, 'freeleech'):
try:
curTorrentProvider.freeleech = config.checkbox_to_value(kwargs[curTorrentProvider.getID() + '_freeleech'])
except:
curTorrentProvider.freeleech = 0
sickbeard.TORRENTDAY_FREELEECH = config.checkbox_to_value(torrentday_freeleech)
if hasattr(curTorrentProvider, 'search_mode'):
try:
curTorrentProvider.search_mode = kwargs[curTorrentProvider.getID() + '_search_mode'].strip()
except:
curTorrentProvider.search_mode = 'eponly'
sickbeard.SCC_USERNAME = scc_username.strip()
sickbeard.SCC_PASSWORD = scc_password.strip()
sickbeard.SCC_RATIO = scc_ratio
if hasattr(curTorrentProvider, 'search_fallback'):
try:
curTorrentProvider.search_fallback = config.checkbox_to_value(kwargs[curTorrentProvider.getID() + '_search_fallback'])
except:
curTorrentProvider.search_fallback = 0
sickbeard.HDTORRENTS_USERNAME = hdtorrents_username.strip()
sickbeard.HDTORRENTS_PASSWORD = hdtorrents_password.strip()
sickbeard.HDTORRENTS_RATIO = hdtorrents_ratio
sickbeard.HDBITS_USERNAME = hdbits_username.strip()
sickbeard.HDBITS_PASSKEY = hdbits_passkey.strip()
sickbeard.HDBITS_RATIO = hdbits_ratio
sickbeard.OMGWTFNZBS_USERNAME = omgwtfnzbs_username.strip()
sickbeard.OMGWTFNZBS_APIKEY = omgwtfnzbs_apikey.strip()
sickbeard.NEXTGEN_USERNAME = nextgen_username.strip()
sickbeard.NEXTGEN_PASSWORD = nextgen_password.strip()
sickbeard.NEXTGEN_RATIO = nextgen_ratio
sickbeard.SPEEDCD_USERNAME = speedcd_username.strip()
sickbeard.SPEEDCD_PASSWORD = speedcd_password.strip()
sickbeard.SPEEDCD_RATIO = speedcd_ratio
sickbeard.SPEEDCD_FREELEECH = config.checkbox_to_value(speedcd_freeleech)
sickbeard.OMGWTFNZBS_USERNAME = kwargs['omgwtfnzbs_username'].strip()
sickbeard.OMGWTFNZBS_APIKEY = kwargs['omgwtfnzbs_apikey'].strip()
sickbeard.NEWZNAB_DATA = '!!!'.join([x.configStr() for x in sickbeard.newznabProviderList])
sickbeard.PROVIDER_ORDER = provider_list