diff --git a/gui/slick/views/apiBuilder.mako b/gui/slick/views/apiBuilder.mako index a1aa2b7ae2f6c80dec14c4ddaa3ccb79fe8a34e0..b889ded427f5531013ac05c471bfd8aafbad23de 100644 --- a/gui/slick/views/apiBuilder.mako +++ b/gui/slick/views/apiBuilder.mako @@ -85,10 +85,10 @@ <div class="collapse navbar-collapse" id="nav-collapsed"> <div class="btn-group navbar-btn" data-toggle="buttons"> <label class="btn btn-primary"> - <input autocomplete="off" id="option-profile" type="checkbox" /> Profile + <input autocomplete="off" id="option-profile" type="checkbox" autocapitalize="off" /> Profile </label> <label class="btn btn-primary"> - <input autocomplete="off" id="option-jsonp" type="checkbox" /> JSONP + <input autocomplete="off" id="option-jsonp" type="checkbox" autocapitalize="off" /> JSONP </label> </div> @@ -103,7 +103,7 @@ <form class="navbar-form navbar-right"> <div class="form-group"> - <input autocomplete="off" class="form-control" id="command-search" placeholder="Command name" type="search"/> + <input autocomplete="off" class="form-control" id="command-search" placeholder="Command name" type="search" autocapitalize="off" /> </div> </form> </div> @@ -213,7 +213,7 @@ var episodes = ${episodes}; <td>${parameter_help['desc'] if 'desc' in parameter_help else ''}</td> <td>${parameter_help['type'] if 'type' in parameter_help else ''}</td> <td>${parameter_help['defaultValue'] if 'defaultValue' in parameter_help else ''}</td> - <td>${parameter_help['allowedValues'] if 'allowedValues' in parameter_help else ''}</td> + <td>${parameter_help['allowed_values'] if 'allowed_values' in parameter_help else ''}</td> </tr> % endfor </tbody> @@ -224,7 +224,7 @@ var episodes = ${episodes}; % for parameter in parameters: <% parameter_help = parameters[parameter] - allowed_values = parameter_help['allowedValues'] if 'allowedValues' in parameter_help else '' + allowed_values = parameter_help['allowed_values'] if 'allowed_values' in parameter_help else '' type = parameter_help['type'] if 'type' in parameter_help else '' %> @@ -271,10 +271,10 @@ var episodes = ${episodes}; </select> % elif type == 'int': % if parameter not in ('episode', 'season'): - <input class="form-control" name="${parameter}" placeholder="${parameter}" type="number" data-command="${command}" /> + <input class="form-control" name="${parameter}" placeholder="${parameter}" type="number" data-command="${command}" autocapitalize="off" /> % endif % elif type == 'string': - <input class="form-control" name="${parameter}" placeholder="${parameter}" type="text" data-command="${command}" /> + <input class="form-control" name="${parameter}" placeholder="${parameter}" type="text" data-command="${command}" autocapitalize="off" /> % endif % endfor </div> diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako index d006a14999b465671f1074ce49a58253d13848f2..f4595aae2a0c18b070ee13178153f9362d857098 100644 --- a/gui/slick/views/config_anime.mako +++ b/gui/slick/views/config_anime.mako @@ -27,7 +27,7 @@ <fieldset class="component-group-list"> <div class="field-pair"> - <input type="checkbox" class="enabler" name="use_anidb" id="use_anidb" ${('', 'checked="checked"')[bool(sickbeard.USE_ANIDB)]} /> + <input type="checkbox" class="enabler" name="use_anidb" id="use_anidb" ${('', 'checked="checked"')[bool(sickbeard.USE_ANIDB)]} autocapitalize="off" /> <label for="use_notifo"> <span class="component-title">Enable</span> <span class="component-desc">Should SickRage use data from AniDB?</span> @@ -38,7 +38,7 @@ <div class="field-pair"> <label class="nocheck"> <span class="component-title">AniDB Username</span> - <input type="text" name="anidb_username" id="anidb_username" value="${sickbeard.ANIDB_USERNAME}" class="form-control input-sm input350" /> + <input type="text" name="anidb_username" id="anidb_username" value="${sickbeard.ANIDB_USERNAME}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> @@ -49,7 +49,7 @@ <div class="field-pair"> <label class="nocheck"> <span class="component-title">AniDB Password</span> - <input type="password" name="anidb_password" id="anidb_password" value="${sickbeard.ANIDB_PASSWORD}" class="form-control input-sm input350" /> + <input type="password" name="anidb_password" id="anidb_password" value="${sickbeard.ANIDB_PASSWORD}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> @@ -57,14 +57,14 @@ </label> </div> <div class="field-pair"> - <input type="checkbox" name="anidb_use_mylist" id="anidb_use_mylist" ${('', 'checked="checked"')[bool(sickbeard.ANIDB_USE_MYLIST)]}/> + <input type="checkbox" name="anidb_use_mylist" id="anidb_use_mylist" ${('', 'checked="checked"')[bool(sickbeard.ANIDB_USE_MYLIST)]} autocapitalize="off" /> <label> <span class="component-title">AniDB MyList</span> <span class="component-desc">Do you want to add the PostProcessed Episodes to the MyList ?</span> </label> </div> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> </div><!-- /component-group //--> @@ -76,17 +76,17 @@ </div> <fieldset class="component-group-list"> <div class="field-pair"> - <input type="checkbox" class="enabler" name="split_home" id="split_home" ${('', 'checked="checked"')[bool(sickbeard.ANIME_SPLIT_HOME)]}/> + <input type="checkbox" class="enabler" name="split_home" id="split_home" ${('', 'checked="checked"')[bool(sickbeard.ANIME_SPLIT_HOME)]} autocapitalize="off" /> <label for="use_notifo"> <span class="component-title">Split show lists</span> <span class="component-desc">Separate anime and normal shows in groups</span> </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> </div><!-- /component-group //--> - <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <br><input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </div><!-- /config-components //--> diff --git a/gui/slick/views/config_backuprestore.mako b/gui/slick/views/config_backuprestore.mako index a93bcc664cadbbb9f38bfb3dd0bd9e8b4f101a8a..4374943bd71b04a2df98582c573ccc8e2247e91f 100644 --- a/gui/slick/views/config_backuprestore.mako +++ b/gui/slick/views/config_backuprestore.mako @@ -43,8 +43,8 @@ <br><br> - <input type="text" name="backupDir" id="backupDir" class="form-control input-sm input350" /> - <input class="btn btn-inline" type="button" value="Backup" id="Backup" /> + <input type="text" name="backupDir" id="backupDir" class="form-control input-sm input350" autocapitalize="off" /> + <input class="btn btn-inline" type="button" value="Backup" id="Backup" autocapitalize="off" /> <br> @@ -66,8 +66,8 @@ <br><br> - <input type="text" name="backupFile" id="backupFile" class="form-control input-sm input350" /> - <input class="btn btn-inline" type="button" value="Restore" id="Restore" /> + <input type="text" name="backupFile" id="backupFile" class="form-control input-sm input350" autocapitalize="off" /> + <input class="btn btn-inline" type="button" value="Restore" id="Restore" autocapitalize="off" /> <br> diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index d0f4f429b2561ed9432430f5bf201600fa2790fc..db9c0a10f629b4c8e43b9212d4cb1265c228d6ab 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -62,7 +62,7 @@ <label for="launch_browser"> <span class="component-title">Launch browser</span> <span class="component-desc"> - <input type="checkbox" name="launch_browser" id="launch_browser" ${('', 'checked="checked"')[bool(sickbeard.LAUNCH_BROWSER)]}/> + <input type="checkbox" name="launch_browser" id="launch_browser" ${('', 'checked="checked"')[bool(sickbeard.LAUNCH_BROWSER)]} autocapitalize="off" /> <p>open the SickRage home page on startup</p> </span> </label> @@ -86,7 +86,7 @@ <label for="showupdate_hour"> <span class="component-title">When to update shows</span> <span class="component-desc"> - <input type="text" name="showupdate_hour" id="showupdate_hour" value="${sickbeard.SHOWUPDATE_HOUR}" class="form-control input-sm input75" /> + <input type="text" name="showupdate_hour" id="showupdate_hour" value="${sickbeard.SHOWUPDATE_HOUR}" class="form-control input-sm input75" autocapitalize="off" /> <p>with information such as next air dates, show ended, etc. Use 15 for 3pm, 4 for 4am etc. Anything over 23 or under 0 will be set to 0 (12am)</p> </span> </label> @@ -96,11 +96,11 @@ <span class="component-title">Send to trash for actions</span> <span class="component-desc"> <label for="trash_remove_show" class="nextline-block"> - <input type="checkbox" name="trash_remove_show" id="trash_remove_show" ${('', 'checked="checked"')[bool(sickbeard.TRASH_REMOVE_SHOW)]}/> + <input type="checkbox" name="trash_remove_show" id="trash_remove_show" ${('', 'checked="checked"')[bool(sickbeard.TRASH_REMOVE_SHOW)]} autocapitalize="off" /> <p>when using show "Remove" and delete files</p> </label> <label for="trash_rotate_logs" class="nextline-block"> - <input type="checkbox" name="trash_rotate_logs" id="trash_rotate_logs" ${('', 'checked="checked"')[bool(sickbeard.TRASH_ROTATE_LOGS)]}/> + <input type="checkbox" name="trash_rotate_logs" id="trash_rotate_logs" ${('', 'checked="checked"')[bool(sickbeard.TRASH_ROTATE_LOGS)]} autocapitalize="off" /> <p>on scheduled deletes of the oldest log files</p> </label> <div class="clear-left"><p>selected actions use trash (recycle bin) instead of the default permanent delete</p></div> @@ -111,7 +111,7 @@ <label for="log_dir"> <span class="component-title">Log file folder location</span> <span class="component-desc"> - <input type="text" name="log_dir" id="log_dir" value="${sickbeard.ACTUAL_LOG_DIR}" class="form-control input-sm input350" /> + <input type="text" name="log_dir" id="log_dir" value="${sickbeard.ACTUAL_LOG_DIR}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -120,7 +120,7 @@ <label for="log_nr"> <span class="component-title">Number of Log files saved</span> <span class="component-desc"> - <input type="text" name="log_nr" id="log_nr" value="${sickbeard.LOG_NR}" class="form-control input-sm input75" /> + <input type="text" name="log_nr" id="log_nr" value="${sickbeard.LOG_NR}" class="form-control input-sm input75" autocapitalize="off" /> <p>number of log files saved when rotating logs (default: 5) (REQUIRES RESTART)</p> </span> </label> @@ -130,7 +130,7 @@ <label for="log_size"> <span class="component-title">Size of Log files saved</span> <span class="component-desc"> - <input type="text" name="log_size" id="log_size" value="${sickbeard.LOG_SIZE}" class="form-control input-sm input75" /> + <input type="text" name="log_size" id="log_size" value="${sickbeard.LOG_SIZE}" class="form-control input-sm input75" autocapitalize="off" /> <p>maximum size of a log file saved (default: 1048576 (1MB)) (REQUIRES RESTART)</p> </span> </label> @@ -155,7 +155,7 @@ <label for="indexer_timeout"> <span class="component-title">Timeout show indexer at</span> <span class="component-desc"> - <input type="text" name="indexer_timeout" id="indexer_timeout" value="${sickbeard.INDEXER_TIMEOUT}" class="form-control input-sm input75" /> + <input type="text" name="indexer_timeout" id="indexer_timeout" value="${sickbeard.INDEXER_TIMEOUT}" class="form-control input-sm input75" autocapitalize="off" /> <p>seconds of inactivity when finding new shows (default:10)</p> </span> </label> @@ -171,7 +171,7 @@ </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> </div> <div class="component-group"> @@ -186,7 +186,7 @@ <label for="version_notify"> <span class="component-title">Check software updates</span> <span class="component-desc"> - <input type="checkbox" name="version_notify" id="version_notify" ${('', 'checked="checked"')[bool(sickbeard.VERSION_NOTIFY)]}/> + <input type="checkbox" name="version_notify" id="version_notify" ${('', 'checked="checked"')[bool(sickbeard.VERSION_NOTIFY)]} autocapitalize="off" /> <p>and display notifications when updates are available. Checks are run on startup and at the frequency set below*</p> </span> @@ -197,7 +197,7 @@ <label for="auto_update"> <span class="component-title">Automatically update</span> <span class="component-desc"> - <input type="checkbox" name="auto_update" id="auto_update" ${('', 'checked="checked"')[bool(sickbeard.AUTO_UPDATE)]}/> + <input type="checkbox" name="auto_update" id="auto_update" ${('', 'checked="checked"')[bool(sickbeard.AUTO_UPDATE)]} autocapitalize="off" /> <p>fetch and install software updates. Updates are run on startup and in the background at the frequency set below*</p> </span> @@ -208,7 +208,7 @@ <label> <span class="component-title">Check the server every*</span> <span class="component-desc"> - <input type="text" name="update_frequency" id="update_frequency" value="${sickbeard.UPDATE_FREQUENCY}" class="form-control input-sm input75" /> + <input type="text" name="update_frequency" id="update_frequency" value="${sickbeard.UPDATE_FREQUENCY}" class="form-control input-sm input75" autocapitalize="off" /> <p>hours for software updates (default:12)</p> </span> </label> @@ -218,13 +218,13 @@ <label for="notify_on_update"> <span class="component-title">Notify on software update</span> <span class="component-desc"> - <input type="checkbox" name="notify_on_update" id="notify_on_update" ${('', 'checked="checked"')[bool(sickbeard.NOTIFY_ON_UPDATE)]}/> + <input type="checkbox" name="notify_on_update" id="notify_on_update" ${('', 'checked="checked"')[bool(sickbeard.NOTIFY_ON_UPDATE)]} autocapitalize="off" /> <p>send a message to all enabled notifiers when SickRage has been updated</p> </span> </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> </div> @@ -266,7 +266,7 @@ <label for="sort_article"> <span class="component-title">Sort with "The", "A", "An"</span> <span class="component-desc"> - <input type="checkbox" name="sort_article" id="sort_article" ${('', 'checked="checked"')[bool(sickbeard.SORT_ARTICLE)]}/> + <input type="checkbox" name="sort_article" id="sort_article" ${('', 'checked="checked"')[bool(sickbeard.SORT_ARTICLE)]} autocapitalize="off" /> <p>include articles ("The", "A", "An") when sorting show lists</p> </span> </label> @@ -275,7 +275,7 @@ <label for="coming_eps_missed_range"> <span class="component-title">Missed episodes range</span> <span class="component-desc"> - <input type="number" step="1" min="7" name="coming_eps_missed_range" id="coming_eps_missed_range" value="${sickbeard.COMING_EPS_MISSED_RANGE}" class="form-control input-sm input75" /> + <input type="number" step="1" min="7" name="coming_eps_missed_range" id="coming_eps_missed_range" value="${sickbeard.COMING_EPS_MISSED_RANGE}" class="form-control input-sm input75" autocapitalize="off" /> <p>Set the range in days of the missed episodes in the Schedule page</p> </span> </label> @@ -284,7 +284,7 @@ <label for="fuzzy_dating"> <span class="component-title">Display fuzzy dates</span> <span class="component-desc"> - <input type="checkbox" name="fuzzy_dating" id="fuzzy_dating" class="viewIf datePresets" ${('', 'checked="checked"')[bool(sickbeard.FUZZY_DATING)]}/> + <input type="checkbox" name="fuzzy_dating" id="fuzzy_dating" class="viewIf datePresets" ${('', 'checked="checked"')[bool(sickbeard.FUZZY_DATING)]} autocapitalize="off" /> <p>move absolute dates into tooltips and display e.g. "Last Thu", "On Tue"</p> </span> </label> @@ -293,7 +293,7 @@ <label for="trim_zero"> <span class="component-title">Trim zero padding</span> <span class="component-desc"> - <input type="checkbox" name="trim_zero" id="trim_zero" ${('', 'checked="checked"')[bool(sickbeard.TRIM_ZERO)]}/> + <input type="checkbox" name="trim_zero" id="trim_zero" ${('', 'checked="checked"')[bool(sickbeard.TRIM_ZERO)]} autocapitalize="off" /> <p>remove the leading number "0" shown on hour of day, and date of month</p> </span> </label> @@ -336,10 +336,10 @@ <span class="component-title">Timezone:</span> <span class="component-desc"> <label for="local" class="space-right"> - <input type="radio" name="timezone_display" id="local" value="local" ${('', 'checked="checked"')[sickbeard.TIMEZONE_DISPLAY == "local"]} />Local + <input type="radio" name="timezone_display" id="local" value="local" ${('', 'checked="checked"')[sickbeard.TIMEZONE_DISPLAY == "local"]} autocapitalize="off" />Local </label> <label for="network"> - <input type="radio" name="timezone_display" id="network" value="network" ${('', 'checked="checked"')[sickbeard.TIMEZONE_DISPLAY == "network"]} />Network + <input type="radio" name="timezone_display" id="network" value="network" ${('', 'checked="checked"')[sickbeard.TIMEZONE_DISPLAY == "network"]} autocapitalize="off" />Network </label> <div class="clear-left"> <p>display dates and times in either your timezone or the shows network timezone</p> @@ -353,7 +353,7 @@ <div class="field-pair"> <label for="download_url"> <span class="component-title">Download url</span> - <input type="text" name="download_url" id="download_url" value="${sickbeard.DOWNLOAD_URL}" size="35" /> + <input type="text" name="download_url" id="download_url" value="${sickbeard.DOWNLOAD_URL}" size="35" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -362,7 +362,7 @@ </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> @@ -382,7 +382,7 @@ <label for="api_key"> <span class="component-title">API key</span> <span class="component-desc"> - <input type="text" name="api_key" id="api_key" value="${sickbeard.API_KEY}" class="form-control input-sm input300" readonly="readonly" /> + <input type="text" name="api_key" id="api_key" value="${sickbeard.API_KEY}" class="form-control input-sm input300" readonly="readonly" autocapitalize="off" /> <input class="btn btn-inline" type="button" id="generate_new_apikey" value="Generate"> <div class="clear-left"> <p>used to give 3rd party programs limited access to SickRage</p> @@ -396,7 +396,7 @@ <label for="web_log"> <span class="component-title">HTTP logs</span> <span class="component-desc"> - <input type="checkbox" name="web_log" id="web_log" ${('', 'checked="checked"')[bool(sickbeard.WEB_LOG)]}/> + <input type="checkbox" name="web_log" id="web_log" ${('', 'checked="checked"')[bool(sickbeard.WEB_LOG)]} autocapitalize="off" /> <p>enable logs from the internal Tornado web server</p> </span> </label> @@ -406,7 +406,7 @@ <label for="web_username"> <span class="component-title">HTTP username</span> <span class="component-desc"> - <input type="text" name="web_username" id="web_username" value="${sickbeard.WEB_USERNAME}" class="form-control input-sm input300" /> + <input type="text" name="web_username" id="web_username" value="${sickbeard.WEB_USERNAME}" class="form-control input-sm input300" autocapitalize="off" /> <p>set blank for no login</p> </span> </label> @@ -416,7 +416,7 @@ <label for="web_password"> <span class="component-title">HTTP password</span> <span class="component-desc"> - <input type="password" name="web_password" id="web_password" value="${sickbeard.WEB_PASSWORD}" class="form-control input-sm input300" /> + <input type="password" name="web_password" id="web_password" value="${sickbeard.WEB_PASSWORD}" class="form-control input-sm input300" autocapitalize="off" /> <p>blank = no authentication</span> </label> </div> @@ -425,7 +425,7 @@ <label for="web_port"> <span class="component-title">HTTP port</span> <span class="component-desc"> - <input type="text" name="web_port" id="web_port" value="${sickbeard.WEB_PORT}" class="form-control input-sm input100" /> + <input type="text" name="web_port" id="web_port" value="${sickbeard.WEB_PORT}" class="form-control input-sm input100" autocapitalize="off" /> <p>web port to browse and access SickRage (default:8081)</p> </span> </label> @@ -435,7 +435,7 @@ <label for="web_ipv6"> <span class="component-title">Listen on IPv6</span> <span class="component-desc"> - <input type="checkbox" name="web_ipv6" id="web_ipv6" ${('', 'checked="checked"')[bool(sickbeard.WEB_IPV6)]}/> + <input type="checkbox" name="web_ipv6" id="web_ipv6" ${('', 'checked="checked"')[bool(sickbeard.WEB_IPV6)]} autocapitalize="off" /> <p>attempt binding to any available IPv6 address</p> </span> </label> @@ -445,7 +445,7 @@ <label for="enable_https"> <span class="component-title">Enable HTTPS</span> <span class="component-desc"> - <input type="checkbox" name="enable_https" class="enabler" id="enable_https" ${('', 'checked="checked"')[bool(sickbeard.ENABLE_HTTPS)]}/> + <input type="checkbox" name="enable_https" class="enabler" id="enable_https" ${('', 'checked="checked"')[bool(sickbeard.ENABLE_HTTPS)]} autocapitalize="off" /> <p>enable access to the web interface using a HTTPS address</p> </span> </label> @@ -455,7 +455,7 @@ <label for="https_cert"> <span class="component-title">HTTPS certificate</span> <span class="component-desc"> - <input type="text" name="https_cert" id="https_cert" value="${sickbeard.HTTPS_CERT}" class="form-control input-sm input300" /> + <input type="text" name="https_cert" id="https_cert" value="${sickbeard.HTTPS_CERT}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>file name or path to HTTPS certificate</p></div> </span> </label> @@ -464,7 +464,7 @@ <label for="https_key"> <span class="component-title">HTTPS key</span> <span class="component-desc"> - <input type="text" name="https_key" id="https_key" value="${sickbeard.HTTPS_KEY}" class="form-control input-sm input300" /> + <input type="text" name="https_key" id="https_key" value="${sickbeard.HTTPS_KEY}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>file name or path to HTTPS key</p></div> </span> </label> @@ -475,13 +475,13 @@ <label for="handle_reverse_proxy"> <span class="component-title">Reverse proxy headers</span> <span class="component-desc"> - <input type="checkbox" name="handle_reverse_proxy" id="handle_reverse_proxy" ${('', 'checked="checked"')[bool(sickbeard.HANDLE_REVERSE_PROXY)]}/> + <input type="checkbox" name="handle_reverse_proxy" id="handle_reverse_proxy" ${('', 'checked="checked"')[bool(sickbeard.HANDLE_REVERSE_PROXY)]} autocapitalize="off" /> <p>accept the following reverse proxy headers (advanced)...<br>(X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto)</p> </span> </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> @@ -517,7 +517,7 @@ <label> <span class="component-title">Anonymous redirect</span> <span class="component-desc"> - <input type="text" name="anon_redirect" value="${sickbeard.ANON_REDIRECT}" class="form-control input-sm input300" /> + <input type="text" name="anon_redirect" value="${sickbeard.ANON_REDIRECT}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>backlink protection via anonymizer service, must end in "?"</p></div> </span> </label> @@ -527,7 +527,7 @@ <label for="debug"> <span class="component-title">Enable debug</span> <span class="component-desc"> - <input type="checkbox" name="debug" id="debug" ${('', 'checked="checked"')[bool(sickbeard.DEBUG)]}/> + <input type="checkbox" name="debug" id="debug" ${('', 'checked="checked"')[bool(sickbeard.DEBUG)]} autocapitalize="off" /> <p>Enable debug logs<p> </span> </label> @@ -537,8 +537,8 @@ <label for="ssl_verify"> <span class="component-title">Verify SSL Certs</span> <span class="component-desc"> - <input type="checkbox" name="ssl_verify" id="ssl_verify" ${('', 'checked="checked"')[bool(sickbeard.SSL_VERIFY)]}/> - <p>Verify SSL Certificates (Disable this for broken SSL installs (Like QNAP)<p> + <input type="checkbox" name="ssl_verify" id="ssl_verify" ${('', 'checked="checked"')[bool(sickbeard.SSL_VERIFY)]} autocapitalize="off" /> + <p>Verify SSL Certificates (Disable this for broken SSL installs (Like QNAP))<p> </span> </label> </div> @@ -547,7 +547,7 @@ <label for="no_restart"> <span class="component-title">No Restart</span> <span class="component-desc"> - <input type="checkbox" name="no_restart" id="no_restart" ${('', 'checked="checked"')[bool(sickbeard.NO_RESTART)]}/> + <input type="checkbox" name="no_restart" id="no_restart" ${('', 'checked="checked"')[bool(sickbeard.NO_RESTART)]} autocapitalize="off" /> <p>Only shutdown when restarting SR. Only select this when you have external software restarting SR automatically when it stops (like FireDaemon)</p> </span> @@ -559,7 +559,7 @@ <label for="encryption_version"> <span class="component-title">Encrypt passwords</span> <span class="component-desc"> - <input type="checkbox" name="encryption_version" id="encryption_version" ${('', 'checked="checked"')[bool(sickbeard.ENCRYPTION_VERSION)]}/> + <input type="checkbox" name="encryption_version" id="encryption_version" ${('', 'checked="checked"')[bool(sickbeard.ENCRYPTION_VERSION)]} autocapitalize="off" /> <p>in the <code>config.ini</code> file. <b>Warning:</b> Passwords must only contain <a target="_blank" href="${anon_url('http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters')}">ASCII characters</a></p> </span> @@ -570,7 +570,7 @@ <label for="calendar_unprotected"> <span class="component-title">Unprotected calendar</span> <span class="component-desc"> - <input type="checkbox" name="calendar_unprotected" id="calendar_unprotected" ${('', 'checked="checked"')[bool(sickbeard.CALENDAR_UNPROTECTED)]}/> + <input type="checkbox" name="calendar_unprotected" id="calendar_unprotected" ${('', 'checked="checked"')[bool(sickbeard.CALENDAR_UNPROTECTED)]} autocapitalize="off" /> <p>allow subscribing to the calendar without user and password. Some services like Google Calendar only work this way</p> </span> @@ -582,7 +582,7 @@ <label for="calendar_icons"> <span class="component-title">Google Calendar Icons</span> <span class="component-desc"> - <input type="checkbox" name="calendar_icons" id="calendar_icons" ${('', 'checked="checked"')[bool(sickbeard.CALENDAR_ICONS)]}/> + <input type="checkbox" name="calendar_icons" id="calendar_icons" ${('', 'checked="checked"')[bool(sickbeard.CALENDAR_ICONS)]} autocapitalize="off" /> <p>show an icon next to exported calendar events in Google Calendar.</p> </span> @@ -593,7 +593,7 @@ <label> <span class="component-title">Proxy host</span> <span class="component-desc"> - <input type="text" name="proxy_setting" value="${sickbeard.PROXY_SETTING}" class="form-control input-sm input300" /> + <input type="text" name="proxy_setting" value="${sickbeard.PROXY_SETTING}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>blank to disable or proxy to use when connecting to providers</p></div> </label> </div> @@ -602,7 +602,7 @@ <label for="proxy_indexers"> <span class="component-title">Use proxy for indexers</span> <span class="component-desc"> - <input type="checkbox" name="proxy_indexers" id="proxy_indexers" ${('', 'checked="checked"')[bool(sickbeard.PROXY_INDEXERS)]}/> + <input type="checkbox" name="proxy_indexers" id="proxy_indexers" ${('', 'checked="checked"')[bool(sickbeard.PROXY_INDEXERS)]} autocapitalize="off" /> <p>use proxy host for connecting to indexers (thetvdb)</p> </span> </label> @@ -612,8 +612,8 @@ <label for="skip_removed_files"> <span class="component-title">Skip Remove Detection</span> <span class="component-desc"> - <input type="checkbox" name="skip_removed_files" id="skip_removed_files" ${('', 'checked="checked"')[bool(sickbeard.SKIP_REMOVED_FILES)]}/> - <p>Skip detection of removed files. If disable it will set default deleted status</p> + <input type="checkbox" name="skip_removed_files" id="skip_removed_files" ${('', 'checked="checked"')[bool(sickbeard.SKIP_REMOVED_FILES)]} autocapitalize="off" /> + <p>Skip detection of removed files. If disabled the episode will be set to the default deleted status</p> </span> <div class="clear-left"> <span class="component-desc"><b>NOTE:</b> This may mean SickRage misses renames as well</span> @@ -636,7 +636,7 @@ <option value="${defStatus}" ${('', 'selected="selected"')[sickbeard.EP_DEFAULT_DELETED_STATUS == defStatus]}>${statusStrings[defStatus]}</option> % endfor </select> - <input type="hidden" name="ep_default_deleted_status" value="${sickbeard.EP_DEFAULT_DELETED_STATUS}" /> + <input type="hidden" name="ep_default_deleted_status" value="${sickbeard.EP_DEFAULT_DELETED_STATUS}" autocapitalize="off" /> % endif <span>Define the status to be set for media file that has been deleted.</span> <div class="clear-left"> @@ -647,7 +647,7 @@ </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> </div> @@ -695,7 +695,7 @@ <label for="git_username"> <span class="component-title">GitHub username</span> <span class="component-desc"> - <input type="text" name="git_username" id="git_username" value="${sickbeard.GIT_USERNAME}" class="form-control input-sm input300" /> + <input type="text" name="git_username" id="git_username" value="${sickbeard.GIT_USERNAME}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>*** (REQUIRED FOR SUBMITTING ISSUES) ***</p></div> </span> </label> @@ -705,7 +705,7 @@ <label for="git_password"> <span class="component-title">GitHub password</span> <span class="component-desc"> - <input type="password" name="git_password" id="git_password" value="${sickbeard.GIT_PASSWORD}" class="form-control input-sm input300" /> + <input type="password" name="git_password" id="git_password" value="${sickbeard.GIT_PASSWORD}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>*** (REQUIRED FOR SUBMITTING ISSUES) ***</p></div> </span> </label> @@ -715,7 +715,7 @@ <label for="git_remote"> <span class="component-title">GitHub remote for branch</span> <span class="component-desc"> - <input type="text" name="git_remote" id="git_remote" value="${sickbeard.GIT_REMOTE}" class="form-control input-sm input300" /> + <input type="text" name="git_remote" id="git_remote" value="${sickbeard.GIT_REMOTE}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>default:origin. Access repo configured remotes (save then refresh browser)</p></div> </span> </label> @@ -725,7 +725,7 @@ <label> <span class="component-title">Git executable path</span> <span class="component-desc"> - <input type="text" name="git_path" value="${sickbeard.GIT_PATH}" class="form-control input-sm input300" /> + <input type="text" name="git_path" value="${sickbeard.GIT_PATH}" class="form-control input-sm input300" autocapitalize="off" /> <div class="clear-left"><p>only needed if OS is unable to locate git from env</p></div> </span> </label> @@ -735,7 +735,7 @@ <label for="git_reset"> <span class="component-title">Git reset</span> <span class="component-desc"> - <input type="checkbox" name="git_reset" id="git_reset" ${('', 'checked="checked"')[bool(sickbeard.GIT_RESET)]}/> + <input type="checkbox" name="git_reset" id="git_reset" ${('', 'checked="checked"')[bool(sickbeard.GIT_RESET)]} autocapitalize="off" /> <p>removes untracked files and performs a hard reset on git branch automatically to help resolve update issues</p> </span> </label> @@ -745,13 +745,13 @@ <label for="git_autoissues"> <span class="component-title">Git auto-issues submit</span> <span class="component-desc"> - <input type="checkbox" name="git_autoissues" id="git_autoissues" ${('', 'checked="checked"')[bool(sickbeard.GIT_AUTOISSUES)]} disable/> + <input type="checkbox" name="git_autoissues" id="git_autoissues" ${('', 'checked="checked"')[bool(sickbeard.GIT_AUTOISSUES)]} disable autocapitalize="off" /> <p>automatically submit bug/issue reports to our issue tracker when errors are logged</p> </span> </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> </div> @@ -760,7 +760,7 @@ <br> <h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">${sickbeard.DATA_DIR}</span></b> </h6> - <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" /> + <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" autocapitalize="off" /> </div><!-- /config-components --> diff --git a/gui/slick/views/config_notifications.mako b/gui/slick/views/config_notifications.mako index 69f41f94d3ea1f41285f0afa1ca61469978525ea..a8c288ca9a2673c11060eab0f8bd3bb3e57ff08b 100644 --- a/gui/slick/views/config_notifications.mako +++ b/gui/slick/views/config_notifications.mako @@ -36,7 +36,7 @@ <label class="clearfix" for="use_kodi"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_kodi" id="use_kodi" ${('', 'checked="checked"')[bool(sickbeard.USE_KODI)]}/> + <input type="checkbox" class="enabler" name="use_kodi" id="use_kodi" ${('', 'checked="checked"')[bool(sickbeard.USE_KODI)]} autocapitalize="off" /> <p>should SickRage send KODI commands ?<p> </span> </label> @@ -47,7 +47,7 @@ <label for="kodi_always_on"> <span class="component-title">Always on</span> <span class="component-desc"> - <input type="checkbox" name="kodi_always_on" id="kodi_always_on" ${('', 'checked="checked"')[bool(sickbeard.KODI_ALWAYS_ON)]}/> + <input type="checkbox" name="kodi_always_on" id="kodi_always_on" ${('', 'checked="checked"')[bool(sickbeard.KODI_ALWAYS_ON)]} autocapitalize="off" /> <p>log errors when unreachable ?</p> </span> </label> @@ -56,7 +56,7 @@ <label for="kodi_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="kodi_notify_onsnatch" id="kodi_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.KODI_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="kodi_notify_onsnatch" id="kodi_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.KODI_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -65,7 +65,7 @@ <label for="kodi_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="kodi_notify_ondownload" id="kodi_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.KODI_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="kodi_notify_ondownload" id="kodi_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.KODI_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -74,7 +74,7 @@ <label for="kodi_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="kodi_notify_onsubtitledownload" id="kodi_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.KODI_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="kodi_notify_onsubtitledownload" id="kodi_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.KODI_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -83,7 +83,7 @@ <label for="kodi_update_library"> <span class="component-title">Update library</span> <span class="component-desc"> - <input type="checkbox" name="kodi_update_library" id="kodi_update_library" ${('', 'checked="checked"')[bool(sickbeard.KODI_UPDATE_LIBRARY)]}/> + <input type="checkbox" name="kodi_update_library" id="kodi_update_library" ${('', 'checked="checked"')[bool(sickbeard.KODI_UPDATE_LIBRARY)]} autocapitalize="off" /> <p>update KODI library when a download finishes ?</p> </span> </label> @@ -92,7 +92,7 @@ <label for="kodi_update_full"> <span class="component-title">Full library update</span> <span class="component-desc"> - <input type="checkbox" name="kodi_update_full" id="kodi_update_full" ${('', 'checked="checked"')[bool(sickbeard.KODI_UPDATE_FULL)]}/> + <input type="checkbox" name="kodi_update_full" id="kodi_update_full" ${('', 'checked="checked"')[bool(sickbeard.KODI_UPDATE_FULL)]} autocapitalize="off" /> <p>perform a full library update if update per-show fails ?</p> </span> </label> @@ -101,7 +101,7 @@ <label for="kodi_update_onlyfirst"> <span class="component-title">Only update first host</span> <span class="component-desc"> - <input type="checkbox" name="kodi_update_onlyfirst" id="kodi_update_onlyfirst" ${('', 'checked="checked"')[bool(sickbeard.KODI_UPDATE_ONLYFIRST)]}/> + <input type="checkbox" name="kodi_update_onlyfirst" id="kodi_update_onlyfirst" ${('', 'checked="checked"')[bool(sickbeard.KODI_UPDATE_ONLYFIRST)]} autocapitalize="off" /> <p>only send library updates to the first active host ?</p> </span> </label> @@ -109,7 +109,7 @@ <div class="field-pair"> <label for="kodi_host"> <span class="component-title">KODI IP:Port</span> - <input type="text" name="kodi_host" id="kodi_host" value="${sickbeard.KODI_HOST}" class="form-control input-sm input350" /> + <input type="text" name="kodi_host" id="kodi_host" value="${sickbeard.KODI_HOST}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -123,7 +123,7 @@ <div class="field-pair"> <label for="kodi_username"> <span class="component-title">KODI username</span> - <input type="text" name="kodi_username" id="kodi_username" value="${sickbeard.KODI_USERNAME}" class="form-control input-sm input250" /> + <input type="text" name="kodi_username" id="kodi_username" value="${sickbeard.KODI_USERNAME}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -133,7 +133,7 @@ <div class="field-pair"> <label for="kodi_password"> <span class="component-title">KODI password</span> - <input type="password" name="kodi_password" id="kodi_password" value="${sickbeard.KODI_PASSWORD}" class="form-control input-sm input250" /> + <input type="password" name="kodi_password" id="kodi_password" value="${sickbeard.KODI_PASSWORD}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -141,8 +141,8 @@ </label> </div> <div class="testNotification" id="testKODI-result">Click below to test.</div> - <input class="btn" type="button" value="Test KODI" id="testKODI" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test KODI" id="testKODI" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_kodi //--> </fieldset> @@ -162,7 +162,7 @@ <label for="use_plex"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_plex" id="use_plex" ${('', 'checked="checked"')[bool(sickbeard.USE_PLEX)]}/> + <input type="checkbox" class="enabler" name="use_plex" id="use_plex" ${('', 'checked="checked"')[bool(sickbeard.USE_PLEX)]} autocapitalize="off" /> <p>should SickRage send Plex commands ?</p> </span> </label> @@ -172,7 +172,7 @@ <div class="field-pair"> <label for="plex_server_token"> <span class="component-title">Plex Media Server Auth Token</span> - <input type="text" name="plex_server_token" id="plex_server_token" value="${sickbeard.PLEX_SERVER_TOKEN}" class="form-control input-sm input250" /> + <input type="text" name="plex_server_token" id="plex_server_token" value="${sickbeard.PLEX_SERVER_TOKEN}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -188,7 +188,7 @@ <label for="plex_username"> <span class="component-title">Server Username</span> <span class="component-desc"> - <input type="text" name="plex_username" id="plex_username" value="${sickbeard.PLEX_USERNAME}" class="form-control input-sm input250" /> + <input type="text" name="plex_username" id="plex_username" value="${sickbeard.PLEX_USERNAME}" class="form-control input-sm input250" autocapitalize="off" /> <p>blank = no authentication</p> </span> </label> @@ -197,7 +197,7 @@ <label for="plex_password"> <span class="component-title">Server/client password</span> <span class="component-desc"> - <input type="password" name="plex_password" id="plex_password" value="${'*' * len(sickbeard.PLEX_PASSWORD)}" class="form-control input-sm input250" /> + <input type="password" name="plex_password" id="plex_password" value="${'*' * len(sickbeard.PLEX_PASSWORD)}" class="form-control input-sm input250" autocapitalize="off" /> <p>blank = no authentication</p> </span> </label> @@ -209,7 +209,7 @@ <label for="plex_update_library"> <span class="component-title">Update server library</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="plex_update_library" id="plex_update_library" ${('', 'checked="checked"')[bool(sickbeard.PLEX_UPDATE_LIBRARY)]}/> + <input type="checkbox" class="enabler" name="plex_update_library" id="plex_update_library" ${('', 'checked="checked"')[bool(sickbeard.PLEX_UPDATE_LIBRARY)]} autocapitalize="off" /> <p>update Plex Media Server library when a download finishes</p> </span> </label> @@ -219,7 +219,7 @@ <label for="plex_server_host"> <span class="component-title">Plex Media Server IP:Port</span> <span class="component-desc"> - <input type="text" name="plex_server_host" id="plex_server_host" value="${re.sub(r'\b,\b', ', ', sickbeard.PLEX_SERVER_HOST)}" class="form-control input-sm input350" /> + <input type="text" name="plex_server_host" id="plex_server_host" value="${re.sub(r'\b,\b', ', ', sickbeard.PLEX_SERVER_HOST)}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"> <p>one or more hosts running Plex Media Server<br>(eg. 192.168.1.1:32400, 192.168.1.2:32400)</p> </div> @@ -229,8 +229,8 @@ <div class="field-pair"> <div class="testNotification" id="testPMS-result">Click below to test Plex server(s)</div> - <input class="btn" type="button" value="Test Plex Server" id="testPMS" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Plex Server" id="testPMS" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> <div class="clear-left"> </div> </div> </div> @@ -249,7 +249,7 @@ <label for="use_plex_client"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_plex" id="use_plex_client" ${('', 'checked="checked"')[bool(sickbeard.USE_PLEX_CLIENT)]}/> + <input type="checkbox" class="enabler" name="use_plex" id="use_plex_client" ${('', 'checked="checked"')[bool(sickbeard.USE_PLEX_CLIENT)]} autocapitalize="off" /> <p>should SickRage send Plex commands ?</p> </span> </label> @@ -260,7 +260,7 @@ <label for="plex_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="plex_notify_onsnatch" id="plex_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PLEX_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="plex_notify_onsnatch" id="plex_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PLEX_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -269,7 +269,7 @@ <label for="plex_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="plex_notify_ondownload" id="plex_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PLEX_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="plex_notify_ondownload" id="plex_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PLEX_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -278,7 +278,7 @@ <label for="plex_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="plex_notify_onsubtitledownload" id="plex_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PLEX_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="plex_notify_onsubtitledownload" id="plex_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PLEX_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -287,7 +287,7 @@ <label for="plex_host"> <span class="component-title">Plex Client IP:Port</span> <span class="component-desc"> - <input type="text" name="plex_host" id="plex_host" value="${sickbeard.PLEX_HOST}" class="form-control input-sm input350" /> + <input type="text" name="plex_host" id="plex_host" value="${sickbeard.PLEX_HOST}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"> <p>one or more hosts running Plex client<br>(eg. 192.168.1.100:3000, 192.168.1.101:3000)</p> </div> @@ -299,7 +299,7 @@ <label for="plex_username"> <span class="component-title">Server Username</span> <span class="component-desc"> - <input type="text" name="plex_client_username" id="plex_client_username" value="${sickbeard.PLEX_CLIENT_USERNAME}" class="form-control input-sm input250" /> + <input type="text" name="plex_client_username" id="plex_client_username" value="${sickbeard.PLEX_CLIENT_USERNAME}" class="form-control input-sm input250" autocapitalize="off" /> <p>blank = no authentication</p> </span> </label> @@ -308,7 +308,7 @@ <label for="plex_client_password"> <span class="component-title">Client Password</span> <span class="component-desc"> - <input type="password" name="plex_client_password" id="plex_client_password" value="${'*' * len(sickbeard.PLEX_CLIENT_PASSWORD)}" class="form-control input-sm input250" /> + <input type="password" name="plex_client_password" id="plex_client_password" value="${'*' * len(sickbeard.PLEX_CLIENT_PASSWORD)}" class="form-control input-sm input250" autocapitalize="off" /> <p>blank = no authentication</p> </span> </label> @@ -317,8 +317,8 @@ <div class="field-pair"> <div class="testNotification" id="testPMC-result">Click below to test Plex client(s)</div> - <input class="btn" type="button" value="Test Plex Client" id="testPMC" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Plex Client" id="testPMC" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> <div class=clear-left><p>Note: some Plex clients <b class="boldest">do not</b> support notifications e.g. Plexapp for Samsung TVs</p></div> </div> </div><!-- /content_use_plex_client --> @@ -337,7 +337,7 @@ <label for="use_emby"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_emby" id="use_emby" ${('', 'checked="checked"')[bool(sickbeard.USE_EMBY)]} /> + <input type="checkbox" class="enabler" name="use_emby" id="use_emby" ${('', 'checked="checked"')[bool(sickbeard.USE_EMBY)]} autocapitalize="off" /> <p>should SickRage send update commands to Emby?<p> </span> </label> @@ -346,7 +346,7 @@ <div class="field-pair"> <label for="emby_host"> <span class="component-title">Emby IP:Port</span> - <input type="text" name="emby_host" id="emby_host" value="${sickbeard.EMBY_HOST}" class="form-control input-sm input250" /> + <input type="text" name="emby_host" id="emby_host" value="${sickbeard.EMBY_HOST}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -356,12 +356,12 @@ <div class="field-pair"> <label for="emby_apikey"> <span class="component-title">Emby API Key</span> - <input type="text" name="emby_apikey" id="emby_apikey" value="${sickbeard.EMBY_APIKEY}" class="form-control input-sm input250" /> + <input type="text" name="emby_apikey" id="emby_apikey" value="${sickbeard.EMBY_APIKEY}" class="form-control input-sm input250" autocapitalize="off" /> </label> </div> <div class="testNotification" id="testEMBY-result">Click below to test.</div> - <input class="btn" type="button" value="Test Emby" id="testEMBY" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Emby" id="testEMBY" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div> <!-- /content_use_emby //--> </fieldset> @@ -379,7 +379,7 @@ <label for="use_nmj"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_nmj" id="use_nmj" ${('', 'checked="checked"')[bool(sickbeard.USE_NMJ)]}/> + <input type="checkbox" class="enabler" name="use_nmj" id="use_nmj" ${('', 'checked="checked"')[bool(sickbeard.USE_NMJ)]} autocapitalize="off" /> <p>should SickRage send update commands to NMJ ?</p> </span> </label> @@ -389,7 +389,7 @@ <div class="field-pair"> <label for="nmj_host"> <span class="component-title">Popcorn IP address</span> - <input type="text" name="nmj_host" id="nmj_host" value="${sickbeard.NMJ_HOST}" class="form-control input-sm input250" /> + <input type="text" name="nmj_host" id="nmj_host" value="${sickbeard.NMJ_HOST}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -399,7 +399,7 @@ <div class="field-pair"> <label> <span class="component-title">Get settings</span> - <input class="btn btn-inline" type="button" value="Get Settings" id="settingsNMJ" /> + <input class="btn btn-inline" type="button" value="Get Settings" id="settingsNMJ" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -409,7 +409,7 @@ <div class="field-pair"> <label for="nmj_database"> <span class="component-title">NMJ database</span> - <input type="text" name="nmj_database" id="nmj_database" value="${sickbeard.NMJ_DATABASE}" class="form-control input-sm input250" ${(' readonly="readonly"', '')[sickbeard.NMJ_DATABASE is True]}/> + <input type="text" name="nmj_database" id="nmj_database" value="${sickbeard.NMJ_DATABASE}" class="form-control input-sm input250" ${(' readonly="readonly"', '')[sickbeard.NMJ_DATABASE is True]} autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -419,7 +419,7 @@ <div class="field-pair"> <label for="nmj_mount"> <span class="component-title">NMJ mount url</span> - <input type="text" name="nmj_mount" id="nmj_mount" value="${sickbeard.NMJ_MOUNT}" class="form-control input-sm input250" ${(' readonly="readonly"', '')[sickbeard.NMJ_MOUNT is True]}/> + <input type="text" name="nmj_mount" id="nmj_mount" value="${sickbeard.NMJ_MOUNT}" class="form-control input-sm input250" ${(' readonly="readonly"', '')[sickbeard.NMJ_MOUNT is True]} autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -427,8 +427,8 @@ </label> </div> <div class="testNotification" id="testNMJ-result">Click below to test.</div> - <input class="btn" type="button" value="Test NMJ" id="testNMJ" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test NMJ" id="testNMJ" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_nmj //--> </fieldset> @@ -445,7 +445,7 @@ <label for="use_nmjv2"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_nmjv2" id="use_nmjv2" ${('', 'checked="checked"')[bool(sickbeard.USE_NMJv2)]}/> + <input type="checkbox" class="enabler" name="use_nmjv2" id="use_nmjv2" ${('', 'checked="checked"')[bool(sickbeard.USE_NMJv2)]} autocapitalize="off" /> <p>should SickRage send update commands to NMJv2 ?</p> </span> </label> @@ -455,7 +455,7 @@ <div class="field-pair"> <label for="nmjv2_host"> <span class="component-title">Popcorn IP address</span> - <input type="text" name="nmjv2_host" id="nmjv2_host" value="${sickbeard.NMJv2_HOST}" class="form-control input-sm input250" /> + <input type="text" name="nmjv2_host" id="nmjv2_host" value="${sickbeard.NMJv2_HOST}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -466,10 +466,10 @@ <span class="component-title">Database location</span> <span class="component-desc"> <label for="NMJV2_DBLOC_A" class="space-right"> - <input type="radio" NAME="nmjv2_dbloc" VALUE="local" id="NMJV2_DBLOC_A" ${('', 'checked="checked"')[sickbeard.NMJv2_DBLOC == 'local']}/>PCH Local Media + <input type="radio" NAME="nmjv2_dbloc" VALUE="local" id="NMJV2_DBLOC_A" ${('', 'checked="checked"')[sickbeard.NMJv2_DBLOC == 'local']} autocapitalize="off" />PCH Local Media </label> <label for="NMJV2_DBLOC_B"> - <input type="radio" NAME="nmjv2_dbloc" VALUE="network" id="NMJV2_DBLOC_B" ${('', 'checked="checked"')[sickbeard.NMJv2_DBLOC == 'network']}/>PCH Network Media + <input type="radio" NAME="nmjv2_dbloc" VALUE="network" id="NMJV2_DBLOC_B" ${('', 'checked="checked"')[sickbeard.NMJv2_DBLOC == 'network']} autocapitalize="off" />PCH Network Media </label> </span> </div> @@ -496,7 +496,7 @@ <div class="field-pair"> <label for="settingsNMJv2"> <span class="component-title">Find database</span> - <input type="button" class="btn btn-inline" value="Find Database" id="settingsNMJv2" /> + <input type="button" class="btn btn-inline" value="Find Database" id="settingsNMJv2" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -506,7 +506,7 @@ <div class="field-pair"> <label for="nmjv2_database"> <span class="component-title">NMJv2 database</span> - <input type="text" name="nmjv2_database" id="nmjv2_database" value="${sickbeard.NMJv2_DATABASE}" class="form-control input-sm input250" ${(' readonly="readonly"', '')[sickbeard.NMJv2_DATABASE is True]}/> + <input type="text" name="nmjv2_database" id="nmjv2_database" value="${sickbeard.NMJv2_DATABASE}" class="form-control input-sm input250" ${(' readonly="readonly"', '')[sickbeard.NMJv2_DATABASE is True]} autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -514,8 +514,8 @@ </label> </div> <div class="testNotification" id="testNMJv2-result">Click below to test.</div> - <input class="btn" type="button" value="Test NMJv2" id="testNMJv2" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test NMJv2" id="testNMJv2" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_nmjv2 //--> </fieldset> @@ -535,7 +535,7 @@ <label for="use_synoindex"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_synoindex" id="use_synoindex" ${('', 'checked="checked"')[bool(sickbeard.USE_SYNOINDEX)]}/> + <input type="checkbox" class="enabler" name="use_synoindex" id="use_synoindex" ${('', 'checked="checked"')[bool(sickbeard.USE_SYNOINDEX)]} autocapitalize="off" /> <p>should SickRage send Synology notifications ?</p> </span> </label> @@ -546,7 +546,7 @@ </div> <div id="content_use_synoindex"> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_synoindex //--> </fieldset> @@ -565,7 +565,7 @@ <label for="use_synologynotifier"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_synologynotifier" id="use_synologynotifier" ${('', 'checked="checked"')[bool(sickbeard.USE_SYNOLOGYNOTIFIER)]}/> + <input type="checkbox" class="enabler" name="use_synologynotifier" id="use_synologynotifier" ${('', 'checked="checked"')[bool(sickbeard.USE_SYNOLOGYNOTIFIER)]} autocapitalize="off" /> <p>should SickRage send notifications to the Synology Notifier ?</p> </span> </label> @@ -579,7 +579,7 @@ <label for="synologynotifier_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="synologynotifier_notify_onsnatch" id="synologynotifier_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="synologynotifier_notify_onsnatch" id="synologynotifier_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -588,7 +588,7 @@ <label for="synologynotifier_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="synologynotifier_notify_ondownload" id="synologynotifier_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="synologynotifier_notify_ondownload" id="synologynotifier_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -597,12 +597,12 @@ <label for="synologynotifier_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="synologynotifier_notify_onsubtitledownload" id="synologynotifier_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="synologynotifier_notify_onsubtitledownload" id="synologynotifier_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> </div> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div> </fieldset> </div><!-- /synology notifier component-group //--> @@ -619,7 +619,7 @@ <label for="use_pytivo"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_pytivo" id="use_pytivo" ${('', 'checked="checked"')[bool(sickbeard.USE_PYTIVO)]}/> + <input type="checkbox" class="enabler" name="use_pytivo" id="use_pytivo" ${('', 'checked="checked"')[bool(sickbeard.USE_PYTIVO)]} autocapitalize="off" /> <p>should SickRage send notifications to pyTivo ?</p> </span> </label> @@ -633,7 +633,7 @@ <div class="field-pair"> <label for="pytivo_host"> <span class="component-title">pyTivo IP:Port</span> - <input type="text" name="pytivo_host" id="pytivo_host" value="${sickbeard.PYTIVO_HOST}" class="form-control input-sm input250" /> + <input type="text" name="pytivo_host" id="pytivo_host" value="${sickbeard.PYTIVO_HOST}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -643,7 +643,7 @@ <div class="field-pair"> <label for="pytivo_share_name"> <span class="component-title">pyTivo share name</span> - <input type="text" name="pytivo_share_name" id="pytivo_share_name" value="${sickbeard.PYTIVO_SHARE_NAME}" class="form-control input-sm input250" /> + <input type="text" name="pytivo_share_name" id="pytivo_share_name" value="${sickbeard.PYTIVO_SHARE_NAME}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -653,14 +653,14 @@ <div class="field-pair"> <label for="pytivo_tivo_name"> <span class="component-title">Tivo name</span> - <input type="text" name="pytivo_tivo_name" id="pytivo_tivo_name" value="${sickbeard.PYTIVO_TIVO_NAME}" class="form-control input-sm input250" /> + <input type="text" name="pytivo_tivo_name" id="pytivo_tivo_name" value="${sickbeard.PYTIVO_TIVO_NAME}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> <span class="component-desc">(Messages & Settings > Account & System Information > System Information > DVR name)</span> </label> </div> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_pytivo //--> </fieldset> @@ -681,7 +681,7 @@ <label for="use_growl"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_growl" id="use_growl" ${('', 'checked="checked"')[bool(sickbeard.USE_GROWL)]}/> + <input type="checkbox" class="enabler" name="use_growl" id="use_growl" ${('', 'checked="checked"')[bool(sickbeard.USE_GROWL)]} autocapitalize="off" /> <p>should SickRage send Growl notifications ?</p> </span> </label> @@ -692,7 +692,7 @@ <label for="growl_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="growl_notify_onsnatch" id="growl_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.GROWL_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="growl_notify_onsnatch" id="growl_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.GROWL_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -701,7 +701,7 @@ <label for="growl_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="growl_notify_ondownload" id="growl_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.GROWL_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="growl_notify_ondownload" id="growl_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.GROWL_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -710,7 +710,7 @@ <label for="growl_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="growl_notify_onsubtitledownload" id="growl_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.GROWL_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="growl_notify_onsubtitledownload" id="growl_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.GROWL_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -718,7 +718,7 @@ <div class="field-pair"> <label for="growl_host"> <span class="component-title">Growl IP:Port</span> - <input type="text" name="growl_host" id="growl_host" value="${sickbeard.GROWL_HOST}" class="form-control input-sm input250" /> + <input type="text" name="growl_host" id="growl_host" value="${sickbeard.GROWL_HOST}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -728,7 +728,7 @@ <div class="field-pair"> <label for="growl_password"> <span class="component-title">Growl password</span> - <input type="password" name="growl_password" id="growl_password" value="${sickbeard.GROWL_PASSWORD}" class="form-control input-sm input250" /> + <input type="password" name="growl_password" id="growl_password" value="${sickbeard.GROWL_PASSWORD}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -740,8 +740,8 @@ </label> </div> <div class="testNotification" id="testGrowl-result">Click below to register and test Growl, this is required for Growl notifications to work.</div> - <input class="btn" type="button" value="Register Growl" id="testGrowl" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Register Growl" id="testGrowl" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_growl //--> </fieldset> @@ -759,7 +759,7 @@ <label for="use_prowl"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_prowl" id="use_prowl" ${('', 'checked="checked"')[bool(sickbeard.USE_PROWL)]}/> + <input type="checkbox" class="enabler" name="use_prowl" id="use_prowl" ${('', 'checked="checked"')[bool(sickbeard.USE_PROWL)]} autocapitalize="off" /> <p>should SickRage send Prowl notifications ?</p> </span> </label> @@ -770,7 +770,7 @@ <label for="prowl_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="prowl_notify_onsnatch" id="prowl_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PROWL_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="prowl_notify_onsnatch" id="prowl_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PROWL_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -779,7 +779,7 @@ <label for="prowl_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="prowl_notify_ondownload" id="prowl_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PROWL_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="prowl_notify_ondownload" id="prowl_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PROWL_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -788,7 +788,7 @@ <label for="prowl_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="prowl_notify_onsubtitledownload" id="prowl_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PROWL_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="prowl_notify_onsubtitledownload" id="prowl_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PROWL_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -796,13 +796,13 @@ <div class="field-pair"> <label for="prowl_message_title"> <span class="component-title">Prowl Message Title:</span> - <input type="text" name="prowl_message_title" id="prowl_message_title" value="${sickbeard.PROWL_MESSAGE_TITLE}" class="form-control input-sm input250" /> + <input type="text" name="prowl_message_title" id="prowl_message_title" value="${sickbeard.PROWL_MESSAGE_TITLE}" class="form-control input-sm input250" autocapitalize="off" /> </label> </div> <div class="field-pair"> <label for="prowl_api"> <span class="component-title">Global Prowl API key(s):</span> - <input type="text" name="prowl_api" id="prowl_api" value="${sickbeard.PROWL_API}" class="form-control input-sm input250" /> + <input type="text" name="prowl_api" id="prowl_api" value="${sickbeard.PROWL_API}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -822,7 +822,7 @@ </label> <label> <span class="component-title"> </span> - <input type="text" name="prowl_show_list" id="prowl_show_list" class="form-control input-sm input350" /> + <input type="text" name="prowl_show_list" id="prowl_show_list" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -832,7 +832,7 @@ </label> <label> <span class="component-title"> </span> - <input id="prowl_show_save" class="btn" type="button" value="Save for this show" /> + <input id="prowl_show_save" class="btn" type="button" value="Save for this show" autocapitalize="off" /> </label> </div> <div class="field-pair"> @@ -852,8 +852,8 @@ </label> </div> <div class="testNotification" id="testProwl-result">Click below to test.</div> - <input class="btn" type="button" value="Test Prowl" id="testProwl" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Prowl" id="testProwl" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_prowl //--> </fieldset> @@ -871,7 +871,7 @@ <label for="use_libnotify"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_libnotify" id="use_libnotify" ${('', 'checked="checked"')[bool(sickbeard.USE_LIBNOTIFY)]}/> + <input type="checkbox" class="enabler" name="use_libnotify" id="use_libnotify" ${('', 'checked="checked"')[bool(sickbeard.USE_LIBNOTIFY)]} autocapitalize="off" /> <p>should SickRage send Libnotify notifications ?</p> </span> </label> @@ -882,7 +882,7 @@ <label for="libnotify_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="libnotify_notify_onsnatch" id="libnotify_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.LIBNOTIFY_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="libnotify_notify_onsnatch" id="libnotify_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.LIBNOTIFY_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -891,7 +891,7 @@ <label for="libnotify_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="libnotify_notify_ondownload" id="libnotify_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.LIBNOTIFY_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="libnotify_notify_ondownload" id="libnotify_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.LIBNOTIFY_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -900,14 +900,14 @@ <label for="libnotify_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="libnotify_notify_onsubtitledownload" id="libnotify_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.LIBNOTIFY_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="libnotify_notify_onsubtitledownload" id="libnotify_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.LIBNOTIFY_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> </div> <div class="testNotification" id="testLibnotify-result">Click below to test.</div> - <input class="btn" type="button" value="Test Libnotify" id="testLibnotify" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Libnotify" id="testLibnotify" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_libnotify //--> </fieldset> @@ -925,7 +925,7 @@ <label for="use_pushover"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_pushover" id="use_pushover" ${('', 'checked="checked"')[bool(sickbeard.USE_PUSHOVER)]}/> + <input type="checkbox" class="enabler" name="use_pushover" id="use_pushover" ${('', 'checked="checked"')[bool(sickbeard.USE_PUSHOVER)]} autocapitalize="off" /> <p>should SickRage send Pushover notifications ?</p> </span> </label> @@ -936,7 +936,7 @@ <label for="pushover_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="pushover_notify_onsnatch" id="pushover_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PUSHOVER_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="pushover_notify_onsnatch" id="pushover_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PUSHOVER_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -945,7 +945,7 @@ <label for="pushover_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="pushover_notify_ondownload" id="pushover_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHOVER_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="pushover_notify_ondownload" id="pushover_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHOVER_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -954,7 +954,7 @@ <label for="pushover_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="pushover_notify_onsubtitledownload" id="pushover_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="pushover_notify_onsubtitledownload" id="pushover_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -962,7 +962,7 @@ <div class="field-pair"> <label for="pushover_userkey"> <span class="component-title">Pushover key</span> - <input type="text" name="pushover_userkey" id="pushover_userkey" value="${sickbeard.PUSHOVER_USERKEY}" class="form-control input-sm input250" /> + <input type="text" name="pushover_userkey" id="pushover_userkey" value="${sickbeard.PUSHOVER_USERKEY}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -972,7 +972,7 @@ <div class="field-pair"> <label for="pushover_apikey"> <span class="component-title">Pushover API key</span> - <input type="text" name="pushover_apikey" id="pushover_apikey" value="${sickbeard.PUSHOVER_APIKEY}" class="form-control input-sm input250" /> + <input type="text" name="pushover_apikey" id="pushover_apikey" value="${sickbeard.PUSHOVER_APIKEY}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -982,7 +982,7 @@ <div class="field-pair"> <label for="pushover_device"> <span class="component-title">Pushover devices</span> - <input type="text" name="pushover_device" id="pushover_device" value="${sickbeard.PUSHOVER_DEVICE}" class="form-control input-sm input250" /> + <input type="text" name="pushover_device" id="pushover_device" value="${sickbeard.PUSHOVER_DEVICE}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1024,8 +1024,8 @@ </label> </div> <div class="testNotification" id="testPushover-result">Click below to test.</div> - <input class="btn" type="button" value="Test Pushover" id="testPushover" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Pushover" id="testPushover" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_pushover //--> </fieldset> @@ -1042,7 +1042,7 @@ <label for="use_boxcar2"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_boxcar2" id="use_boxcar2" ${('', 'checked="checked"')[bool(sickbeard.USE_BOXCAR2)]}/> + <input type="checkbox" class="enabler" name="use_boxcar2" id="use_boxcar2" ${('', 'checked="checked"')[bool(sickbeard.USE_BOXCAR2)]} autocapitalize="off" /> <p>should SickRage send Boxcar notifications ?</p> </span> </label> @@ -1053,7 +1053,7 @@ <label for="boxcar2_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="boxcar2_notify_onsnatch" id="boxcar2_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.BOXCAR2_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="boxcar2_notify_onsnatch" id="boxcar2_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.BOXCAR2_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -1062,7 +1062,7 @@ <label for="boxcar2_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="boxcar2_notify_ondownload" id="boxcar2_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.BOXCAR2_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="boxcar2_notify_ondownload" id="boxcar2_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.BOXCAR2_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -1071,7 +1071,7 @@ <label for="boxcar2_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="boxcar2_notify_onsubtitledownload" id="boxcar2_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.BOXCAR2_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="boxcar2_notify_onsubtitledownload" id="boxcar2_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.BOXCAR2_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -1079,7 +1079,7 @@ <div class="field-pair"> <label for="boxcar2_accesstoken"> <span class="component-title">Boxcar2 access token</span> - <input type="text" name="boxcar2_accesstoken" id="boxcar2_accesstoken" value="${sickbeard.BOXCAR2_ACCESSTOKEN}" class="form-control input-sm input250" /> + <input type="text" name="boxcar2_accesstoken" id="boxcar2_accesstoken" value="${sickbeard.BOXCAR2_ACCESSTOKEN}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1087,8 +1087,8 @@ </label> </div> <div class="testNotification" id="testBoxcar2-result">Click below to test.</div> - <input class="btn" type="button" value="Test Boxcar" id="testBoxcar2" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Boxcar" id="testBoxcar2" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_boxcar2 //--> </fieldset> @@ -1105,7 +1105,7 @@ <label for="use_nma"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_nma" id="use_nma" ${('', 'checked="checked"')[bool(sickbeard.USE_NMA)]}/> + <input type="checkbox" class="enabler" name="use_nma" id="use_nma" ${('', 'checked="checked"')[bool(sickbeard.USE_NMA)]} autocapitalize="off" /> <p>should SickRage send NMA notifications ?</p> </span> </label> @@ -1116,7 +1116,7 @@ <label for="nma_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="nma_notify_onsnatch" id="nma_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.NMA_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="nma_notify_onsnatch" id="nma_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.NMA_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -1125,7 +1125,7 @@ <label for="nma_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="nma_notify_ondownload" id="nma_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.NMA_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="nma_notify_ondownload" id="nma_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.NMA_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -1134,7 +1134,7 @@ <label for="nma_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="nma_notify_onsubtitledownload" id="nma_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.NMA_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="nma_notify_onsubtitledownload" id="nma_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.NMA_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -1142,7 +1142,7 @@ <div class="field-pair"> <label for="nma_api"> <span class="component-title">NMA API key:</span> - <input type="text" name="nma_api" id="nma_api" value="${sickbeard.NMA_API}" class="form-control input-sm input350" /> + <input type="text" name="nma_api" id="nma_api" value="${sickbeard.NMA_API}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1166,8 +1166,8 @@ </label> </div> <div class="testNotification" id="testNMA-result">Click below to test.</div> - <input class="btn" type="button" value="Test NMA" id="testNMA" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test NMA" id="testNMA" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_nma //--> </fieldset> @@ -1184,7 +1184,7 @@ <label for="use_pushalot"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_pushalot" id="use_pushalot" ${('', 'checked="checked"')[bool(sickbeard.USE_PUSHALOT)]}/> + <input type="checkbox" class="enabler" name="use_pushalot" id="use_pushalot" ${('', 'checked="checked"')[bool(sickbeard.USE_PUSHALOT)]} autocapitalize="off" /> <p>should SickRage send Pushalot notifications ? </span> </label> @@ -1195,7 +1195,7 @@ <label for="pushalot_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="pushalot_notify_onsnatch" id="pushalot_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PUSHALOT_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="pushalot_notify_onsnatch" id="pushalot_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PUSHALOT_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -1204,7 +1204,7 @@ <label for="pushalot_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="pushalot_notify_ondownload" id="pushalot_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHALOT_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="pushalot_notify_ondownload" id="pushalot_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHALOT_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -1213,7 +1213,7 @@ <label for="pushalot_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="pushalot_notify_onsubtitledownload" id="pushalot_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHALOT_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="pushalot_notify_onsubtitledownload" id="pushalot_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHALOT_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -1221,7 +1221,7 @@ <div class="field-pair"> <label for="pushalot_authorizationtoken"> <span class="component-title">Pushalot authorization token</span> - <input type="text" name="pushalot_authorizationtoken" id="pushalot_authorizationtoken" value="${sickbeard.PUSHALOT_AUTHORIZATIONTOKEN}" class="form-control input-sm input350" /> + <input type="text" name="pushalot_authorizationtoken" id="pushalot_authorizationtoken" value="${sickbeard.PUSHALOT_AUTHORIZATIONTOKEN}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1229,8 +1229,8 @@ </label> </div> <div class="testNotification" id="testPushalot-result">Click below to test.</div> - <input type="button" class="btn" value="Test Pushalot" id="testPushalot" /> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="button" class="btn" value="Test Pushalot" id="testPushalot" autocapitalize="off" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_pushalot //--> </fieldset> @@ -1247,7 +1247,7 @@ <label for="use_pushbullet"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_pushbullet" id="use_pushbullet" ${('', 'checked="checked"')[bool(sickbeard.USE_PUSHBULLET)]}/> + <input type="checkbox" class="enabler" name="use_pushbullet" id="use_pushbullet" ${('', 'checked="checked"')[bool(sickbeard.USE_PUSHBULLET)]} autocapitalize="off" /> <p>should SickRage send Pushbullet notifications ?</p> </span> </label> @@ -1258,7 +1258,7 @@ <label for="pushbullet_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="pushbullet_notify_onsnatch" id="pushbullet_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PUSHBULLET_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="pushbullet_notify_onsnatch" id="pushbullet_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.PUSHBULLET_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -1267,7 +1267,7 @@ <label for="pushbullet_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="pushbullet_notify_ondownload" id="pushbullet_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHBULLET_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="pushbullet_notify_ondownload" id="pushbullet_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHBULLET_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -1276,7 +1276,7 @@ <label for="pushbullet_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="pushbullet_notify_onsubtitledownload" id="pushbullet_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHBULLET_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="pushbullet_notify_onsubtitledownload" id="pushbullet_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.PUSHBULLET_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -1284,7 +1284,7 @@ <div class="field-pair"> <label for="pushbullet_api"> <span class="component-title">Pushbullet API key</span> - <input type="text" name="pushbullet_api" id="pushbullet_api" value="${sickbeard.PUSHBULLET_API}" class="form-control input-sm input350" /> + <input type="text" name="pushbullet_api" id="pushbullet_api" value="${sickbeard.PUSHBULLET_API}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1296,7 +1296,7 @@ <span class="component-title">Pushbullet devices</span> <select name="pushbullet_device_list" id="pushbullet_device_list" class="form-control input-sm"></select> <input type="hidden" id="pushbullet_device" value="${sickbeard.PUSHBULLET_DEVICE}"> - <input type="button" class="btn btn-inline" value="Update device list" id="getPushbulletDevices" /> + <input type="button" class="btn btn-inline" value="Update device list" id="getPushbulletDevices" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1304,8 +1304,8 @@ </label> </div> <div class="testNotification" id="testPushbullet-result">Click below to test.</div> - <input type="button" class="btn" value="Test Pushbullet" id="testPushbullet" /> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="button" class="btn" value="Test Pushbullet" id="testPushbullet" autocapitalize="off" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_pushbullet //--> </fieldset> @@ -1321,7 +1321,7 @@ <label for="use_freemobile"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_freemobile" id="use_freemobile" ${('', 'checked="checked"')[bool(sickbeard.USE_FREEMOBILE)]}/> + <input type="checkbox" class="enabler" name="use_freemobile" id="use_freemobile" ${('', 'checked="checked"')[bool(sickbeard.USE_FREEMOBILE)]} autocapitalize="off" /> <p>should SickRage send SMS notifications ?</p> </span> </label> @@ -1332,7 +1332,7 @@ <label for="freemobile_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="freemobile_notify_onsnatch" id="freemobile_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.FREEMOBILE_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="freemobile_notify_onsnatch" id="freemobile_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.FREEMOBILE_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a SMS when a download starts ?</p> </span> </label> @@ -1341,7 +1341,7 @@ <label for="freemobile_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="freemobile_notify_ondownload" id="freemobile_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.FREEMOBILE_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="freemobile_notify_ondownload" id="freemobile_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.FREEMOBILE_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a SMS when a download finishes ?</p> </span> </label> @@ -1350,7 +1350,7 @@ <label for="freemobile_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="freemobile_notify_onsubtitledownload" id="freemobile_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="freemobile_notify_onsubtitledownload" id="freemobile_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a SMS when subtitles are downloaded ?</p> </span> </label> @@ -1358,7 +1358,7 @@ <div class="field-pair"> <label for="freemobile_id"> <span class="component-title">Free Mobile customer ID</span> - <input type="text" name="freemobile_id" id="freemobile_id" value="${sickbeard.FREEMOBILE_ID}" class="form-control input-sm input250" /> + <input type="text" name="freemobile_id" id="freemobile_id" value="${sickbeard.FREEMOBILE_ID}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1368,7 +1368,7 @@ <div class="field-pair"> <label for="freemobile_password"> <span class="component-title">Free Mobile API Key</span> - <input type="text" name="freemobile_apikey" id="freemobile_apikey" value="${sickbeard.FREEMOBILE_APIKEY}" class="form-control input-sm input250" /> + <input type="text" name="freemobile_apikey" id="freemobile_apikey" value="${sickbeard.FREEMOBILE_APIKEY}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1376,8 +1376,8 @@ </label> </div> <div class="testNotification" id="testFreeMobile-result">Click below to test your settings.</div> - <input class="btn" type="button" value="Test SMS" id="testFreeMobile" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test SMS" id="testFreeMobile" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_freemobile //--> </fieldset> @@ -1397,7 +1397,7 @@ <label for="use_twitter"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_twitter" id="use_twitter" ${('', 'checked="checked"')[bool(sickbeard.USE_TWITTER)]}/> + <input type="checkbox" class="enabler" name="use_twitter" id="use_twitter" ${('', 'checked="checked"')[bool(sickbeard.USE_TWITTER)]} autocapitalize="off" /> <p>should SickRage post tweets on Twitter ?</p> </span> </label> @@ -1412,7 +1412,7 @@ <label for="twitter_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="twitter_notify_onsnatch" id="twitter_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="twitter_notify_onsnatch" id="twitter_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -1421,7 +1421,7 @@ <label for="twitter_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="twitter_notify_ondownload" id="twitter_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="twitter_notify_ondownload" id="twitter_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -1430,7 +1430,7 @@ <label for="twitter_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="twitter_notify_onsubtitledownload" id="twitter_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="twitter_notify_onsubtitledownload" id="twitter_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -1439,7 +1439,7 @@ <label for="twitter_usedm"> <span class="component-title">Send direct message</span> <span class="component-desc"> - <input type="checkbox" name="twitter_usedm" id="twitter_usedm" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_USEDM)]}/> + <input type="checkbox" name="twitter_usedm" id="twitter_usedm" ${('', 'checked="checked"')[bool(sickbeard.TWITTER_USEDM)]} autocapitalize="off" /> <p>send a notification via Direct Message, not via status update</p> </span> </label> @@ -1447,7 +1447,7 @@ <div class="field-pair"> <label for="twitter_dmto"> <span class="component-title">Send DM to</span> - <input type="text" name="twitter_dmto" id="twitter_dmto" value="${sickbeard.TWITTER_DMTO}" class="form-control input-sm input250" /> + <input type="text" name="twitter_dmto" id="twitter_dmto" value="${sickbeard.TWITTER_DMTO}" class="form-control input-sm input250" autocapitalize="off" /> </label> <p> <span class="component-desc">Twitter account to send Direct Messages to (must follow you)</span> @@ -1459,7 +1459,7 @@ </label> <label> <span style="font-size: 11px;">Click the "Request Authorization" button.<br> This will open a new page containing an auth key.<br> <b>Note:</b> if nothing happens check your popup blocker.<br></span> - <input class="btn" type="button" value="Request Authorization" id="twitterStep1" /> + <input class="btn" type="button" value="Request Authorization" id="twitterStep1" autocapitalize="off" /> </label> </div> <div class="field-pair"> @@ -1468,8 +1468,8 @@ </label> <label> <span style="font-size: 11px;">Enter the key Twitter gave you below, and click "Verify Key".<br><br></span> - <input type="text" id="twitter_key" value="" class="form-control input-sm input350" /> - <input class="btn btn-inline" type="button" value="Verify Key" id="twitterStep2" /> + <input type="text" id="twitter_key" value="" class="form-control input-sm input350" autocapitalize="off" /> + <input class="btn btn-inline" type="button" value="Verify Key" id="twitterStep2" autocapitalize="off" /> </label> </div> <!-- @@ -1480,8 +1480,8 @@ </div> //--> <div class="testNotification" id="testTwitter-result">Click below to test.</div> - <input class="btn" type="button" value="Test Twitter" id="testTwitter" /> - <input type="submit" class="config_submitter btn" value="Save Changes" /> + <input class="btn" type="button" value="Test Twitter" id="testTwitter" autocapitalize="off" /> + <input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_twitter //--> </fieldset> @@ -1499,7 +1499,7 @@ <label for="use_trakt"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_trakt" id="use_trakt" ${('', 'checked="checked"')[bool(sickbeard.USE_TRAKT)]}/> + <input type="checkbox" class="enabler" name="use_trakt" id="use_trakt" ${('', 'checked="checked"')[bool(sickbeard.USE_TRAKT)]} autocapitalize="off" /> <p>should SickRage send Trakt.tv notifications ?</p> </span> </label> @@ -1509,28 +1509,28 @@ <div class="field-pair"> <label for="trakt_username"> <span class="component-title">Trakt username</span> - <input type="text" name="trakt_username" id="trakt_username" value="${sickbeard.TRAKT_USERNAME}" class="form-control input-sm input250" /> + <input type="text" name="trakt_username" id="trakt_username" value="${sickbeard.TRAKT_USERNAME}" class="form-control input-sm input250" autocapitalize="off" /> </label> <p> <span class="component-desc">username of your Trakt account.</span> </p> </div> <input type="hidden" id="trakt_pin_url" value="${sickbeard.TRAKT_PIN_URL}"> - <input type="button" class="btn ${('', 'hide')[bool(sickbeard.TRAKT_ACCESS_TOKEN)]}" value="Get Trakt PIN" id="TraktGetPin" /> + <input type="button" class="btn ${('', 'hide')[bool(sickbeard.TRAKT_ACCESS_TOKEN)]}" value="Get Trakt PIN" id="TraktGetPin" autocapitalize="off" /> <div class="field-pair"> <label for="trakt_pin"> <span class="component-title">Trakt PIN</span> - <input type="text" name="trakt_pin" id="trakt_pin" value="" class="form-control input-sm input250" /> + <input type="text" name="trakt_pin" id="trakt_pin" value="" class="form-control input-sm input250" autocapitalize="off" /> </label> <p> <span class="component-desc">PIN code to authorize SickRage to access Trakt on your behalf.</span> </p> </div> - <input type="button" class="btn hide" value="Authorize SickRage" id="authTrakt" /> + <input type="button" class="btn hide" value="Authorize SickRage" id="authTrakt" autocapitalize="off" /> <div class="field-pair"> <label for="trakt_timeout"> <span class="component-title">API Timeout</span> - <input type="text" name="trakt_timeout" id="trakt_timeout" value="${sickbeard.TRAKT_TIMEOUT}" class="form-control input-sm input75" /> + <input type="text" name="trakt_timeout" id="trakt_timeout" value="${sickbeard.TRAKT_TIMEOUT}" class="form-control input-sm input75" autocapitalize="off" /> </label> <p> <span class="component-desc"> @@ -1554,7 +1554,7 @@ <label for="trakt_sync"> <span class="component-title">Sync libraries</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="trakt_sync" id="trakt_sync" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_SYNC)]}/> + <input type="checkbox" class="enabler" name="trakt_sync" id="trakt_sync" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_SYNC)]} autocapitalize="off" /> <p>sync your SickRage show library with your trakt show library.</p> </span> </label> @@ -1564,7 +1564,7 @@ <label for="trakt_sync_remove"> <span class="component-title">Remove Episodes From Collection</span> <span class="component-desc"> - <input type="checkbox" name="trakt_sync_remove" id="trakt_sync_remove" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_SYNC_REMOVE)]}/> + <input type="checkbox" name="trakt_sync_remove" id="trakt_sync_remove" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_SYNC_REMOVE)]} autocapitalize="off" /> <p>Remove an Episode from your Trakt Collection if it is not in your SickRage Library.</p> </span> </label> @@ -1574,7 +1574,7 @@ <label for="trakt_sync_watchlist"> <span class="component-title">Sync watchlist</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="trakt_sync_watchlist" id="trakt_sync_watchlist" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_SYNC_WATCHLIST)]}/> + <input type="checkbox" class="enabler" name="trakt_sync_watchlist" id="trakt_sync_watchlist" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_SYNC_WATCHLIST)]} autocapitalize="off" /> <p>sync your SickRage show watchlist with your trakt show watchlist (either Show and Episode).</p> <p>Episode will be added on watch list when wanted or snatched and will be removed when downloaded </p> </span> @@ -1599,7 +1599,7 @@ <label for="trakt_remove_watchlist"> <span class="component-title">Remove episode</span> <span class="component-desc"> - <input type="checkbox" name="trakt_remove_watchlist" id="trakt_remove_watchlist" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_REMOVE_WATCHLIST)]}/> + <input type="checkbox" name="trakt_remove_watchlist" id="trakt_remove_watchlist" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_REMOVE_WATCHLIST)]} autocapitalize="off" /> <p>remove an episode from your watchlist after it is downloaded.</p> </span> </label> @@ -1608,7 +1608,7 @@ <label for="trakt_remove_serieslist"> <span class="component-title">Remove series</span> <span class="component-desc"> - <input type="checkbox" name="trakt_remove_serieslist" id="trakt_remove_serieslist" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_REMOVE_SERIESLIST)]}/> + <input type="checkbox" name="trakt_remove_serieslist" id="trakt_remove_serieslist" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_REMOVE_SERIESLIST)]} autocapitalize="off" /> <p>remove the whole series from your watchlist after any download.</p> </span> </label> @@ -1617,7 +1617,7 @@ <label for="trakt_remove_show_from_sickrage"> <span class="component-title">Remove watched show:</span> <span class="component-desc"> - <input type="checkbox" name="trakt_remove_show_from_sickrage" id="trakt_remove_show_from_sickrage" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_REMOVE_SHOW_FROM_SICKRAGE)]}/> + <input type="checkbox" name="trakt_remove_show_from_sickrage" id="trakt_remove_show_from_sickrage" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_REMOVE_SHOW_FROM_SICKRAGE)]} autocapitalize="off" /> <p>remove the show from sickrage if it's ended and completely watched</p> </span> </label> @@ -1626,7 +1626,7 @@ <label for="trakt_start_paused"> <span class="component-title">Start paused</span> <span class="component-desc"> - <input type="checkbox" name="trakt_start_paused" id="trakt_start_paused" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_START_PAUSED)]}/> + <input type="checkbox" name="trakt_start_paused" id="trakt_start_paused" ${('', 'checked="checked"')[bool(sickbeard.TRAKT_START_PAUSED)]} autocapitalize="off" /> <p>shows grabbed from your trakt watchlist start paused.</p> </span> </label> @@ -1635,7 +1635,7 @@ <div class="field-pair"> <label for="trakt_blacklist_name"> <span class="component-title">Trakt blackList name</span> - <input type="text" name="trakt_blacklist_name" id="trakt_blacklist_name" value="${sickbeard.TRAKT_BLACKLIST_NAME}" class="form-control input-sm input150" /> + <input type="text" name="trakt_blacklist_name" id="trakt_blacklist_name" value="${sickbeard.TRAKT_BLACKLIST_NAME}" class="form-control input-sm input150" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1643,8 +1643,8 @@ </label> </div> <div class="testNotification" id="testTrakt-result">Click below to test.</div> - <input type="button" class="btn" value="Test Trakt" id="testTrakt" /> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="button" class="btn" value="Test Trakt" id="testTrakt" autocapitalize="off" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_trakt //--> </fieldset> </div><!-- /trakt component-group //--> @@ -1660,7 +1660,7 @@ <label for="use_email"> <span class="component-title">Enable</span> <span class="component-desc"> - <input type="checkbox" class="enabler" name="use_email" id="use_email" ${('', 'checked="checked"')[bool(sickbeard.USE_EMAIL)]}/> + <input type="checkbox" class="enabler" name="use_email" id="use_email" ${('', 'checked="checked"')[bool(sickbeard.USE_EMAIL)]} autocapitalize="off" /> <p>should SickRage send email notifications ?</p> </span> </label> @@ -1671,7 +1671,7 @@ <label for="email_notify_onsnatch"> <span class="component-title">Notify on snatch</span> <span class="component-desc"> - <input type="checkbox" name="email_notify_onsnatch" id="email_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_NOTIFY_ONSNATCH)]}/> + <input type="checkbox" name="email_notify_onsnatch" id="email_notify_onsnatch" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_NOTIFY_ONSNATCH)]} autocapitalize="off" /> <p>send a notification when a download starts ?</p> </span> </label> @@ -1680,7 +1680,7 @@ <label for="email_notify_ondownload"> <span class="component-title">Notify on download</span> <span class="component-desc"> - <input type="checkbox" name="email_notify_ondownload" id="email_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_NOTIFY_ONDOWNLOAD)]}/> + <input type="checkbox" name="email_notify_ondownload" id="email_notify_ondownload" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_NOTIFY_ONDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when a download finishes ?</p> </span> </label> @@ -1689,7 +1689,7 @@ <label for="email_notify_onsubtitledownload"> <span class="component-title">Notify on subtitle download</span> <span class="component-desc"> - <input type="checkbox" name="email_notify_onsubtitledownload" id="email_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_NOTIFY_ONSUBTITLEDOWNLOAD)]}/> + <input type="checkbox" name="email_notify_onsubtitledownload" id="email_notify_onsubtitledownload" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_NOTIFY_ONSUBTITLEDOWNLOAD)]} autocapitalize="off" /> <p>send a notification when subtitles are downloaded ?</p> </span> </label> @@ -1697,7 +1697,7 @@ <div class="field-pair"> <label for="email_host"> <span class="component-title">SMTP host</span> - <input type="text" name="email_host" id="email_host" value="${sickbeard.EMAIL_HOST}" class="form-control input-sm input250" /> + <input type="text" name="email_host" id="email_host" value="${sickbeard.EMAIL_HOST}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1707,7 +1707,7 @@ <div class="field-pair"> <label for="email_port"> <span class="component-title">SMTP port</span> - <input type="text" name="email_port" id="email_port" value="${sickbeard.EMAIL_PORT}" class="form-control input-sm input75" /> + <input type="text" name="email_port" id="email_port" value="${sickbeard.EMAIL_PORT}" class="form-control input-sm input75" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1717,7 +1717,7 @@ <div class="field-pair"> <label for="email_from"> <span class="component-title">SMTP from</span> - <input type="text" name="email_from" id="email_from" value="${sickbeard.EMAIL_FROM}" class="form-control input-sm input250" /> + <input type="text" name="email_from" id="email_from" value="${sickbeard.EMAIL_FROM}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1728,7 +1728,7 @@ <label for="email_tls"> <span class="component-title">Use TLS</span> <span class="component-desc"> - <input type="checkbox" name="email_tls" id="email_tls" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_TLS)]}/> + <input type="checkbox" name="email_tls" id="email_tls" ${('', 'checked="checked"')[bool(sickbeard.EMAIL_TLS)]} autocapitalize="off" /> <p>check to use TLS encryption.</p> </span> </label> @@ -1736,7 +1736,7 @@ <div class="field-pair"> <label for="email_user"> <span class="component-title">SMTP user</span> - <input type="text" name="email_user" id="email_user" value="${sickbeard.EMAIL_USER}" class="form-control input-sm input250" /> + <input type="text" name="email_user" id="email_user" value="${sickbeard.EMAIL_USER}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1746,7 +1746,7 @@ <div class="field-pair"> <label for="email_password"> <span class="component-title">SMTP password</span> - <input type="password" name="email_password" id="email_password" value="${sickbeard.EMAIL_PASSWORD}" class="form-control input-sm input250" /> + <input type="password" name="email_password" id="email_password" value="${sickbeard.EMAIL_PASSWORD}" class="form-control input-sm input250" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1756,7 +1756,7 @@ <div class="field-pair"> <label for="email_list"> <span class="component-title">Global email list</span> - <input type="text" name="email_list" id="email_list" value="${sickbeard.EMAIL_LIST}" class="form-control input-sm input350" /> + <input type="text" name="email_list" id="email_list" value="${sickbeard.EMAIL_LIST}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1773,7 +1773,7 @@ </label> <label> <span class="component-title"> </span> - <input type="text" name="email_show_list" id="email_show_list" class="form-control input-sm input350" /> + <input type="text" name="email_show_list" id="email_show_list" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -1783,13 +1783,13 @@ </label> <label> <span class="component-title"> </span> - <input id="email_show_save" class="btn" type="button" value="Save for this show" /> + <input id="email_show_save" class="btn" type="button" value="Save for this show" autocapitalize="off" /> </label> </div> <div class="testNotification" id="testEmail-result">Click below to test.</div> - <input class="btn" type="button" value="Test Email" id="testEmail" /> - <input class="btn" type="submit" class="config_submitter" value="Save Changes" /> + <input class="btn" type="button" value="Test Email" id="testEmail" autocapitalize="off" /> + <input class="btn" type="submit" class="config_submitter" value="Save Changes" autocapitalize="off" /> </div><!-- /content_use_email //--> </fieldset> </div><!-- /email component-group //--> @@ -1797,7 +1797,7 @@ </div><!-- /config-components //--> </form> - <br><input type="submit" class="config_submitter btn" value="Save Changes" /><br> + <br><input type="submit" class="config_submitter btn" value="Save Changes" autocapitalize="off" /><br> </div> </div> diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index 51ce0a4c1fd014150e86ef64a76dac7cf40c1223..5c127bede7a364759b1a2013f9e8f98b950a71ca 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -33,7 +33,7 @@ </div> <fieldset class="component-group-list"> <div class="field-pair"> - <input type="checkbox" name="process_automatically" id="process_automatically" ${('', 'checked="checked"')[bool(sickbeard.PROCESS_AUTOMATICALLY)]}/> + <input type="checkbox" name="process_automatically" id="process_automatically" ${('', 'checked="checked"')[bool(sickbeard.PROCESS_AUTOMATICALLY)]} autocapitalize="off" /> <label for="process_automatically"> <span class="component-title">Enable</span> <span class="component-desc">Enable the automatic post processor to scan and process any files in your <i>Post Processing Dir</i>?</span> @@ -46,7 +46,7 @@ <div class="field-pair"> <label class="nocheck" for="tv_download_dir"> <span class="component-title">Post Processing Dir</span> - <input type="text" name="tv_download_dir" id="tv_download_dir" value="${sickbeard.TV_DOWNLOAD_DIR}" class="form-control input-sm input350" /> + <input type="text" name="tv_download_dir" id="tv_download_dir" value="${sickbeard.TV_DOWNLOAD_DIR}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> @@ -81,7 +81,7 @@ <div class="field-pair"> <label class="nocheck"> <span class="component-title">Auto Post-Processing Frequency</span> - <input type="number" min="10" name="autopostprocesser_frequency" id="autopostprocesser_frequency" value="${sickbeard.AUTOPOSTPROCESSER_FREQUENCY}" class="form-control input-sm input75" /> + <input type="number" min="10" name="autopostprocesser_frequency" id="autopostprocesser_frequency" value="${sickbeard.AUTOPOSTPROCESSER_FREQUENCY}" class="form-control input-sm input75" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> @@ -89,7 +89,7 @@ </label> </div> <div class="field-pair"> - <input type="checkbox" name="postpone_if_sync_files" id="postpone_if_sync_files" ${('', 'checked="checked"')[bool(sickbeard.POSTPONE_IF_SYNC_FILES)]}/> + <input type="checkbox" name="postpone_if_sync_files" id="postpone_if_sync_files" ${('', 'checked="checked"')[bool(sickbeard.POSTPONE_IF_SYNC_FILES)]} autocapitalize="off" /> <label for="postpone_if_sync_files"> <span class="component-title">Postpone post processing</span> <span class="component-desc">Wait to process a folder if sync files are present.</span> @@ -98,7 +98,7 @@ <div class="field-pair"> <label class="nocheck"> <span class="component-title">Sync File Extensions</span> - <input type="text" name="sync_files" id="sync_files" value="${sickbeard.SYNC_FILES}" class="form-control input-sm input350" /> + <input type="text" name="sync_files" id="sync_files" value="${sickbeard.SYNC_FILES}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> @@ -106,7 +106,7 @@ </label> </div> <div class="field-pair"> - <input type="checkbox" name="postpone_if_no_subs" id="postpone_if_no_subs" ${('', 'checked="checked"')[bool(sickbeard.POSTPONE_IF_NO_SUBS)]}/> + <input type="checkbox" name="postpone_if_no_subs" id="postpone_if_no_subs" ${('', 'checked="checked"')[bool(sickbeard.POSTPONE_IF_NO_SUBS)]} autocapitalize="off" /> <label for="postpone_if_no_subs"> <span class="component-title">Postpone if no subtitle</span> <span class="component-desc">Wait to process a file until subtitles are present</span> @@ -114,28 +114,28 @@ </label> </div> <div class="field-pair"> - <input type="checkbox" name="rename_episodes" id="rename_episodes" ${('', 'checked="checked"')[bool(sickbeard.RENAME_EPISODES)]}/> + <input type="checkbox" name="rename_episodes" id="rename_episodes" ${('', 'checked="checked"')[bool(sickbeard.RENAME_EPISODES)]} autocapitalize="off" /> <label for="rename_episodes"> <span class="component-title">Rename Episodes</span> <span class="component-desc">Rename episode using the Episode Naming settings?</span> </label> </div> <div class="field-pair"> - <input type="checkbox" name="create_missing_show_dirs" id="create_missing_show_dirs" ${('', 'checked="checked"')[bool(sickbeard.CREATE_MISSING_SHOW_DIRS)]}/> + <input type="checkbox" name="create_missing_show_dirs" id="create_missing_show_dirs" ${('', 'checked="checked"')[bool(sickbeard.CREATE_MISSING_SHOW_DIRS)]} autocapitalize="off" /> <label for="create_missing_show_dirs"> <span class="component-title">Create missing show directories</span> <span class="component-desc">Create missing show directories when they get deleted</span> </label> </div> <div class="field-pair"> - <input type="checkbox" name="add_shows_wo_dir" id="add_shows_wo_dir" ${('', 'checked="checked"')[bool(sickbeard.ADD_SHOWS_WO_DIR)]}/> + <input type="checkbox" name="add_shows_wo_dir" id="add_shows_wo_dir" ${('', 'checked="checked"')[bool(sickbeard.ADD_SHOWS_WO_DIR)]} autocapitalize="off" /> <label for="add_shows_wo_dir"> <span class="component-title">Add shows without directory</span> <span class="component-desc">Add shows without creating a directory (not recommended)</span> </label> </div> <div class="field-pair"> - <input type="checkbox" name="move_associated_files" id="move_associated_files" ${('', 'checked="checked"')[bool(sickbeard.MOVE_ASSOCIATED_FILES)]}/> + <input type="checkbox" name="move_associated_files" id="move_associated_files" ${('', 'checked="checked"')[bool(sickbeard.MOVE_ASSOCIATED_FILES)]} autocapitalize="off" /> <label for="move_associated_files"> <span class="component-title">Move Associated Files</span> <span class="component-desc">Move srr/sfv/etc files with the episode when processed?</span> @@ -144,7 +144,7 @@ <div class="field-pair"> <label class="nocheck"> <span class="component-title">Allowed associated file extensions</span> - <input type="text" name="allowed_extensions" id="allowed_extensions" value="${sickbeard.ALLOWED_EXTENSIONS}" class="form-control input-sm input350" /> + <input type="text" name="allowed_extensions" id="allowed_extensions" value="${sickbeard.ALLOWED_EXTENSIONS}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> @@ -152,14 +152,14 @@ </label> </div> <div class="field-pair"> - <input type="checkbox" name="nfo_rename" id="nfo_rename" ${('', 'checked="checked"')[bool(sickbeard.NFO_RENAME)]}/> + <input type="checkbox" name="nfo_rename" id="nfo_rename" ${('', 'checked="checked"')[bool(sickbeard.NFO_RENAME)]} autocapitalize="off" /> <label for="nfo_rename"> <span class="component-title">Rename .nfo file</span> <span class="component-desc">Rename the original .nfo file to .nfo-orig to avoid conflicts?</span> </label> </div> <div class="field-pair"> - <input type="checkbox" name="airdate_episodes" id="airdate_episodes" ${('', 'checked="checked"')[bool(sickbeard.AIRDATE_EPISODES)]}/> + <input type="checkbox" name="airdate_episodes" id="airdate_episodes" ${('', 'checked="checked"')[bool(sickbeard.AIRDATE_EPISODES)]} autocapitalize="off" /> <label for="airdate_episodes"> <span class="component-title">Change File Date</span> <span class="component-desc">Set last modified filedate to the date that the episode aired?</span> @@ -186,7 +186,7 @@ </label> </div> <div class="field-pair"> - <input id="unpack" type="checkbox" name="unpack" ${('', 'checked="checked"')[bool(sickbeard.UNPACK)]} /> + <input id="unpack" type="checkbox" name="unpack" ${('', 'checked="checked"')[bool(sickbeard.UNPACK)]} autocapitalize="off" /> <label for="unpack"> <span class="component-title">Unpack</span> <span class="component-desc">Unpack any TV releases in your <i>TV Download Dir</i>?</span> @@ -197,14 +197,14 @@ </label> </div> <div class="field-pair"> - <input type="checkbox" name="del_rar_contents" id="del_rar_contents" ${('', 'checked="checked"')[bool(sickbeard.DELRARCONTENTS)]}/> + <input type="checkbox" name="del_rar_contents" id="del_rar_contents" ${('', 'checked="checked"')[bool(sickbeard.DELRARCONTENTS)]} autocapitalize="off" /> <label for="del_rar_contents"> <span class="component-title">Delete RAR contents</span> <span class="component-desc">Delete content of RAR files, even if Process Method not set to move?</span> </label> </div> <div class="field-pair"> - <input type="checkbox" name="no_delete" id="no_delete" ${('', 'checked="checked"')[bool(sickbeard.NO_DELETE)]}/> + <input type="checkbox" name="no_delete" id="no_delete" ${('', 'checked="checked"')[bool(sickbeard.NO_DELETE)]} autocapitalize="off" /> <label for="no_delete"> <span class="component-title">Don't delete empty folders</span> <span class="component-desc">Leave empty folders when Post Processing?</span> @@ -215,7 +215,7 @@ </label> </div> <div class="field-pair"> - <input id="use_failed_downloads" type="checkbox" class="enabler" name="use_failed_downloads" ${('', 'checked="checked"')[bool(sickbeard.USE_FAILED_DOWNLOADS)]}/> + <input id="use_failed_downloads" type="checkbox" class="enabler" name="use_failed_downloads" ${('', 'checked="checked"')[bool(sickbeard.USE_FAILED_DOWNLOADS)]} autocapitalize="off" /> <label for="use_failed_downloads"> <span class="component-title">Use Failed Downloads</span> <span class="component-desc">Use Failed Download Handling?</span> @@ -226,7 +226,7 @@ </div> <div id="content_use_failed_downloads"> <div class="field-pair"> - <input id="delete_failed" type="checkbox" name="delete_failed" ${('', 'checked="checked"')[bool(sickbeard.DELETE_FAILED)]}/> + <input id="delete_failed" type="checkbox" name="delete_failed" ${('', 'checked="checked"')[bool(sickbeard.DELETE_FAILED)]} autocapitalize="off" /> <label for="delete_failed"> <span class="component-title">Delete Failed</span> <span class="component-desc">Delete files left over from a failed download?</span> @@ -240,14 +240,14 @@ <div class="field-pair"> <label class="nocheck"> <span class="component-title">Extra Scripts</span> - <input type="text" name="extra_scripts" value="${'|'.join(sickbeard.EXTRA_SCRIPTS)}" class="form-control input-sm input350" /> + <input type="text" name="extra_scripts" value="${'|'.join(sickbeard.EXTRA_SCRIPTS)}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> <span class="component-desc">See <a href="https://github.com/SickRage/sickrage-issues/wiki/Post-Processing#extra-scripts"><font color='red'><b>Wiki</b></font></a> for script arguments description and usage.</span> </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </fieldset> </div><!-- /component-group1 //--> <div id="core-component-group2" class="component-group"> @@ -284,7 +284,7 @@ </span> <span class="component-desc"> - <input type="text" name="naming_pattern" id="naming_pattern" value="${sickbeard.NAMING_PATTERN}" class="form-control input-sm input350" /> + <input type="text" name="naming_pattern" id="naming_pattern" value="${sickbeard.NAMING_PATTERN}" class="form-control input-sm input350" autocapitalize="off" /> <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_key" title="Toggle Naming Legend" class="legend" class="legend" /> </span> </label> @@ -394,6 +394,21 @@ <td>%Y</td> <td>${datetime.date.today().year}</td> </tr> + <tr> + <td class="align-right"><b>Post-Processing Date:</b></td> + <td>%CM</td> + <td>${datetime.date.today().month}</td> + </tr> + <tr class="even"> + <td> </td> + <td>%CD</td> + <td>${datetime.date.today().day}</td> + </tr> + <tr> + <td> </td> + <td>%CY</td> + <td>${datetime.date.today().year}</td> + </tr> <tr> <td class="align-right"><b>Quality:</b></td> <td>%QN</td> @@ -475,7 +490,7 @@ </div> <div class="field-pair"> - <input type="checkbox" id="naming_strip_year" name="naming_strip_year" ${('', 'checked="checked"')[bool(sickbeard.NAMING_STRIP_YEAR)]}/> + <input type="checkbox" id="naming_strip_year" name="naming_strip_year" ${('', 'checked="checked"')[bool(sickbeard.NAMING_STRIP_YEAR)]} autocapitalize="off" /> <label for="naming_strip_year"> <span class="component-title">Strip Show Year</span> <span class="component-desc">Remove the TV show's year when renaming the file?</span> @@ -487,7 +502,7 @@ </div> <div class="field-pair"> - <input type="checkbox" class="enabler" id="naming_custom_abd" name="naming_custom_abd" ${('', 'checked="checked"')[bool(sickbeard.NAMING_CUSTOM_ABD)]}/> + <input type="checkbox" class="enabler" id="naming_custom_abd" name="naming_custom_abd" ${('', 'checked="checked"')[bool(sickbeard.NAMING_CUSTOM_ABD)]} autocapitalize="off" /> <label for="naming_custom_abd"> <span class="component-title">Custom Air-By-Date</span> <span class="component-desc">Name Air-By-Date shows differently than regular shows?</span> @@ -521,7 +536,7 @@ </span> <span class="component-desc"> - <input type="text" name="naming_abd_pattern" id="naming_abd_pattern" value="${sickbeard.NAMING_ABD_PATTERN}" class="form-control input-sm input350" /> + <input type="text" name="naming_abd_pattern" id="naming_abd_pattern" value="${sickbeard.NAMING_ABD_PATTERN}" class="form-control input-sm input350" autocapitalize="off" /> <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_abd_key" title="Toggle ABD Naming Legend" class="legend" /> </span> </label> @@ -664,7 +679,7 @@ </div><!-- /naming_abd_different --> <div class="field-pair"> - <input type="checkbox" class="enabler" id="naming_custom_sports" name="naming_custom_sports" ${('', 'checked="checked"')[bool(sickbeard.NAMING_CUSTOM_SPORTS)]}/> + <input type="checkbox" class="enabler" id="naming_custom_sports" name="naming_custom_sports" ${('', 'checked="checked"')[bool(sickbeard.NAMING_CUSTOM_SPORTS)]} autocapitalize="off" /> <label for="naming_custom_sports"> <span class="component-title">Custom Sports</span> <span class="component-desc">Name Sports shows differently than regular shows?</span> @@ -698,7 +713,7 @@ </span> <span class="component-desc"> - <input type="text" name="naming_sports_pattern" id="naming_sports_pattern" value="${sickbeard.NAMING_SPORTS_PATTERN}" class="form-control input-sm input350" /> + <input type="text" name="naming_sports_pattern" id="naming_sports_pattern" value="${sickbeard.NAMING_SPORTS_PATTERN}" class="form-control input-sm input350" autocapitalize="off" /> <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_sports_key" title="Toggle Sports Naming Legend" class="legend" /> </span> </label> @@ -842,7 +857,7 @@ <!-- naming_anime_custom --> <div class="field-pair"> - <input type="checkbox" class="enabler" id="naming_custom_anime" name="naming_custom_anime" ${('', 'checked="checked"')[bool(sickbeard.NAMING_CUSTOM_ANIME)]}/> + <input type="checkbox" class="enabler" id="naming_custom_anime" name="naming_custom_anime" ${('', 'checked="checked"')[bool(sickbeard.NAMING_CUSTOM_ANIME)]} autocapitalize="off" /> <label for="naming_custom_anime"> <span class="component-title">Custom Anime</span> <span class="component-desc">Name Anime shows differently than regular shows?</span> @@ -876,7 +891,7 @@ </span> <span class="component-desc"> - <input type="text" name="naming_anime_pattern" id="naming_anime_pattern" value="${sickbeard.NAMING_ANIME_PATTERN}" class="form-control input-sm input350" /> + <input type="text" name="naming_anime_pattern" id="naming_anime_pattern" value="${sickbeard.NAMING_ANIME_PATTERN}" class="form-control input-sm input350" autocapitalize="off" /> <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_anime_key" title="Toggle Anime Naming Legend" class="legend" /> </span> </label> @@ -1033,7 +1048,7 @@ </div> <div class="field-pair"> - <input type="radio" name="naming_anime" id="naming_anime" value="1" ${('', 'checked="checked"')[sickbeard.NAMING_ANIME == 1]}/> + <input type="radio" name="naming_anime" id="naming_anime" value="1" ${('', 'checked="checked"')[sickbeard.NAMING_ANIME == 1]} autocapitalize="off" /> <label for="naming_anime"> <span class="component-title">Add Absolute Number</span> <span class="component-desc">Add the absolute number to the season/episode format?</span> @@ -1045,7 +1060,7 @@ </div> <div class="field-pair"> - <input type="radio" name="naming_anime" id="naming_anime_only" value="2" ${('', 'checked="checked"')[sickbeard.NAMING_ANIME == 2]}/> + <input type="radio" name="naming_anime" id="naming_anime_only" value="2" ${('', 'checked="checked"')[sickbeard.NAMING_ANIME == 2]} autocapitalize="off" /> <label for="naming_anime_only"> <span class="component-title">Only Absolute Number</span> <span class="component-desc">Replace season/episode format with absolute number</span> @@ -1057,7 +1072,7 @@ </div> <div class="field-pair"> - <input type="radio" name="naming_anime" id="naming_anime_none" value="3" ${('', 'checked="checked"')[sickbeard.NAMING_ANIME == 3]}/> + <input type="radio" name="naming_anime" id="naming_anime_none" value="3" ${('', 'checked="checked"')[sickbeard.NAMING_ANIME == 3]} autocapitalize="off" /> <label for="naming_anime_none"> <span class="component-title">No Absolute Number</span> <span class="component-desc">Dont include the absolute number</span> @@ -1070,7 +1085,7 @@ </div><!-- /naming_anime_different --> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </fieldset> </div><!-- /component-group2 //--> @@ -1103,16 +1118,16 @@ <div class="metadata_options_wrapper"> <h4>Create:</h4> <div class="metadata_options"> - <label for="${cur_id}_show_metadata"><input type="checkbox" class="metadata_checkbox" id="${cur_id}_show_metadata" ${('', 'checked="checked"')[bool(cur_metadata_inst.show_metadata)]}/> Show Metadata</label> - <label for="${cur_id}_episode_metadata"><input type="checkbox" class="metadata_checkbox" id="${cur_id}_episode_metadata" ${('', 'checked="checked"')[bool(cur_metadata_inst.episode_metadata)]}/> Episode Metadata</label> - <label for="${cur_id}_fanart"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_fanart" ${('', 'checked="checked"')[bool(cur_metadata_inst.fanart)]}/> Show Fanart</label> - <label for="${cur_id}_poster"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_poster" ${('', 'checked="checked"')[bool(cur_metadata_inst.poster)]}/> Show Poster</label> - <label for="${cur_id}_banner"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_banner" ${('', 'checked="checked"')[bool(cur_metadata_inst.banner)]}/> Show Banner</label> - <label for="${cur_id}_episode_thumbnails"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_episode_thumbnails" ${('', 'checked="checked"')[bool(cur_metadata_inst.episode_thumbnails)]}/> Episode Thumbnails</label> - <label for="${cur_id}_season_posters"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_posters" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_posters)]}/> Season Posters</label> - <label for="${cur_id}_season_banners"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_banners" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_banners)]}/> Season Banners</label> - <label for="${cur_id}_season_all_poster"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_all_poster" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_all_poster)]}/> Season All Poster</label> - <label for="${cur_id}_season_all_banner"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_all_banner" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_all_banner)]}/> Season All Banner</label> + <label for="${cur_id}_show_metadata"><input type="checkbox" class="metadata_checkbox" id="${cur_id}_show_metadata" ${('', 'checked="checked"')[bool(cur_metadata_inst.show_metadata)]} autocapitalize="off" /> Show Metadata</label> + <label for="${cur_id}_episode_metadata"><input type="checkbox" class="metadata_checkbox" id="${cur_id}_episode_metadata" ${('', 'checked="checked"')[bool(cur_metadata_inst.episode_metadata)]} autocapitalize="off" /> Episode Metadata</label> + <label for="${cur_id}_fanart"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_fanart" ${('', 'checked="checked"')[bool(cur_metadata_inst.fanart)]} autocapitalize="off" /> Show Fanart</label> + <label for="${cur_id}_poster"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_poster" ${('', 'checked="checked"')[bool(cur_metadata_inst.poster)]} autocapitalize="off" /> Show Poster</label> + <label for="${cur_id}_banner"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_banner" ${('', 'checked="checked"')[bool(cur_metadata_inst.banner)]} autocapitalize="off" /> Show Banner</label> + <label for="${cur_id}_episode_thumbnails"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_episode_thumbnails" ${('', 'checked="checked"')[bool(cur_metadata_inst.episode_thumbnails)]} autocapitalize="off" /> Episode Thumbnails</label> + <label for="${cur_id}_season_posters"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_posters" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_posters)]} autocapitalize="off" /> Season Posters</label> + <label for="${cur_id}_season_banners"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_banners" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_banners)]} autocapitalize="off" /> Season Banners</label> + <label for="${cur_id}_season_all_poster"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_all_poster" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_all_poster)]} autocapitalize="off" /> Season All Poster</label> + <label for="${cur_id}_season_all_banner"><input type="checkbox" class="float-left metadata_checkbox" id="${cur_id}_season_all_banner" ${('', 'checked="checked"')[bool(cur_metadata_inst.season_all_banner)]} autocapitalize="off" /> Season All Banner</label> </div> </div> <div class="metadata_example_wrapper"> @@ -1130,19 +1145,19 @@ <label for="${cur_id}_season_all_banner"><span id="${cur_id}_eg_season_all_banner">${cur_metadata_inst.eg_season_all_banner}</span></label> </div> </div> - <input type="hidden" name="${cur_id}_data" id="${cur_id}_data" value="${cur_metadata_inst.get_config()}" /> + <input type="hidden" name="${cur_id}_data" id="${cur_id}_data" value="${cur_metadata_inst.get_config()}" autocapitalize="off" /> </div> % endfor <div class="clearfix"></div><br> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </fieldset> </div><!-- /component-group3 //--> <br> <h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">${sickbeard.DATA_DIR}</span></b> </h6> - <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" /> + <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" autocapitalize="off" /> </form> </div> </div> diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index 40808db9b0d223fc52864c26f4467b9b0cfc0a23..f787183053f4b277bb9e845732c85f69de3c4cd3 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -82,7 +82,7 @@ $('#config-components').tabs(); curURL = curProvider.url %> <li class="ui-state-default ${('nzb-provider', 'torrent-provider')[bool(curProvider.providerType == "torrent")]}" id="${curName}"> - <input type="checkbox" id="enable_${curName}" class="provider_enabler" ${('', 'checked="checked"')[curProvider.isEnabled() is True]}/> + <input type="checkbox" id="enable_${curName}" class="provider_enabler" ${('', 'checked="checked"')[curProvider.isEnabled() is True]} autocapitalize="off" /> <a href="${anon_url(curURL)}" class="imgLink" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><img src="${srRoot}/images/providers/${curProvider.imageName()}" alt="${curProvider.name}" title="${curProvider.name}" width="16" height="16" style="vertical-align:middle;"/></a> <span style="vertical-align:middle;">${curProvider.name}</span> ${('*', '')[bool(curProvider.supportsBacklog)]} @@ -91,8 +91,8 @@ $('#config-components').tabs(); </li> % endfor </ul> - <input type="hidden" name="provider_order" id="provider_order" value="${" ".join([x.getID()+':'+str(int(x.isEnabled())) for x in sickbeard.providers.sortedProviderList()])}"/> - <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input type="hidden" name="provider_order" id="provider_order" value="${" ".join([x.getID()+':'+str(int(x.isEnabled())) for x in sickbeard.providers.sortedProviderList()])}" autocapitalize="off" /> + <br><input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </fieldset> </div><!-- /component-group1 //--> @@ -140,7 +140,7 @@ $('#config-components').tabs(); <label for="${curNewznabProvider.getID()}_url"> <span class="component-title">URL:</span> <span class="component-desc"> - <input type="text" id="${curNewznabProvider.getID()}_url" value="${curNewznabProvider.url}" class="form-control input-sm input350" disabled/> + <input type="text" id="${curNewznabProvider.getID()}_url" value="${curNewznabProvider.url}" class="form-control input-sm input350" disabled autocapitalize="off" /> </span> </label> </div> @@ -148,7 +148,7 @@ $('#config-components').tabs(); <label for="${curNewznabProvider.getID()}_hash"> <span class="component-title">API key:</span> <span class="component-desc"> - <input type="text" id="${curNewznabProvider.getID()}_hash" value="${curNewznabProvider.key}" newznab_name="${curNewznabProvider.getID()}_hash" class="newznab_key form-control input-sm input350" /> + <input type="text" id="${curNewznabProvider.getID()}_hash" value="${curNewznabProvider.key}" newznab_name="${curNewznabProvider.getID()}_hash" class="newznab_key form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -159,7 +159,7 @@ $('#config-components').tabs(); <label for="${curNewznabProvider.getID()}_enable_daily"> <span class="component-title">Enable daily searches</span> <span class="component-desc"> - <input type="checkbox" name="${curNewznabProvider.getID()}_enable_daily" id="${curNewznabProvider.getID()}_enable_daily" ${('', 'checked="checked"')[bool(curNewznabProvider.enable_daily)]}/> + <input type="checkbox" name="${curNewznabProvider.getID()}_enable_daily" id="${curNewznabProvider.getID()}_enable_daily" ${('', 'checked="checked"')[bool(curNewznabProvider.enable_daily)]} autocapitalize="off" /> <p>enable provider to perform daily searches.</p> </span> </label> @@ -171,7 +171,7 @@ $('#config-components').tabs(); <label for="${curNewznabProvider.getID()}_enable_backlog"> <span class="component-title">Enable backlog searches</span> <span class="component-desc"> - <input type="checkbox" name="${curNewznabProvider.getID()}_enable_backlog" id="${curNewznabProvider.getID()}_enable_backlog" ${('', 'checked="checked"')[bool(curNewznabProvider.enable_backlog and curNewznabProvider.supportsBacklog)]}/> + <input type="checkbox" name="${curNewznabProvider.getID()}_enable_backlog" id="${curNewznabProvider.getID()}_enable_backlog" ${('', 'checked="checked"')[bool(curNewznabProvider.enable_backlog and curNewznabProvider.supportsBacklog)]} autocapitalize="off" /> <p>enable provider to perform backlog searches.</p> </span> </label> @@ -183,7 +183,7 @@ $('#config-components').tabs(); <label for="${curNewznabProvider.getID()}_search_fallback"> <span class="component-title">Season search fallback</span> <span class="component-desc"> - <input type="checkbox" name="${curNewznabProvider.getID()}_search_fallback" id="${curNewznabProvider.getID()}_search_fallback" ${('', 'checked="checked"')[bool(curNewznabProvider.search_fallback)]}/> + <input type="checkbox" name="${curNewznabProvider.getID()}_search_fallback" id="${curNewznabProvider.getID()}_search_fallback" ${('', 'checked="checked"')[bool(curNewznabProvider.search_fallback)]} autocapitalize="off" /> <p>when searching for a complete season depending on search mode you may return no results, this helps by restarting the search using the opposite search mode.</p> </span> </label> @@ -201,13 +201,13 @@ $('#config-components').tabs(); <label> <span class="component-title"></span> <span class="component-desc"> - <input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_sponly" value="sponly" ${('', 'checked="checked"')[curNewznabProvider.search_mode=="sponly"]}/>season packs only. + <input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_sponly" value="sponly" ${('', 'checked="checked"')[curNewznabProvider.search_mode=="sponly"]} autocapitalize="off" />season packs only. </span> </label> <label> <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" ${('', 'checked="checked"')[curNewznabProvider.search_mode=="eponly"]}/>episodes only. + <input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_eponly" value="eponly" ${('', 'checked="checked"')[curNewznabProvider.search_mode=="eponly"]} autocapitalize="off" />episodes only. </span> </label> </div> @@ -223,7 +223,7 @@ $('#config-components').tabs(); <label for="${curNzbProvider.getID()}_username"> <span class="component-title">Username:</span> <span class="component-desc"> - <input type="text" name="${curNzbProvider.getID()}_username" value="${curNzbProvider.username}" class="form-control input-sm input350" /> + <input type="text" name="${curNzbProvider.getID()}_username" value="${curNzbProvider.username}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -234,7 +234,7 @@ $('#config-components').tabs(); <label for="${curNzbProvider.getID()}_api_key"> <span class="component-title">API key:</span> <span class="component-desc"> - <input type="text" name="${curNzbProvider.getID()}_api_key" value="${curNzbProvider.api_key}" class="form-control input-sm input350" /> + <input type="text" name="${curNzbProvider.getID()}_api_key" value="${curNzbProvider.api_key}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -246,7 +246,7 @@ $('#config-components').tabs(); <label for="${curNzbProvider.getID()}_enable_daily"> <span class="component-title">Enable daily searches</span> <span class="component-desc"> - <input type="checkbox" name="${curNzbProvider.getID()}_enable_daily" id="${curNzbProvider.getID()}_enable_daily" ${('', 'checked="checked"')[bool(curNzbProvider.enable_daily)]}/> + <input type="checkbox" name="${curNzbProvider.getID()}_enable_daily" id="${curNzbProvider.getID()}_enable_daily" ${('', 'checked="checked"')[bool(curNzbProvider.enable_daily)]} autocapitalize="off" /> <p>enable provider to perform daily searches.</p> </span> </label> @@ -258,7 +258,7 @@ $('#config-components').tabs(); <label for="${curNzbProvider.getID()}_enable_backlog"> <span class="component-title">Enable backlog searches</span> <span class="component-desc"> - <input type="checkbox" name="${curNzbProvider.getID()}_enable_backlog" id="${curNzbProvider.getID()}_enable_backlog" ${('', 'checked="checked"')[bool(curNzbProvider.enable_backlog and curNzbProvider.supportsBacklog)]}/> + <input type="checkbox" name="${curNzbProvider.getID()}_enable_backlog" id="${curNzbProvider.getID()}_enable_backlog" ${('', 'checked="checked"')[bool(curNzbProvider.enable_backlog and curNzbProvider.supportsBacklog)]} autocapitalize="off" /> <p>enable provider to perform backlog searches.</p> </span> </label> @@ -270,7 +270,7 @@ $('#config-components').tabs(); <label for="${curNzbProvider.getID()}_search_fallback"> <span class="component-title">Season search fallback</span> <span class="component-desc"> - <input type="checkbox" name="${curNzbProvider.getID()}_search_fallback" id="${curNzbProvider.getID()}_search_fallback" ${('', 'checked="checked"')[bool(curNzbProvider.search_fallback)]}/> + <input type="checkbox" name="${curNzbProvider.getID()}_search_fallback" id="${curNzbProvider.getID()}_search_fallback" ${('', 'checked="checked"')[bool(curNzbProvider.search_fallback)]} autocapitalize="off" /> <p>when searching for a complete season depending on search mode you may return no results, this helps by restarting the search using the opposite search mode.</p> </span> </label> @@ -288,13 +288,13 @@ $('#config-components').tabs(); <label> <span class="component-title"></span> <span class="component-desc"> - <input type="radio" name="${curNzbProvider.getID()}_search_mode" id="${curNzbProvider.getID()}_search_mode_sponly" value="sponly" ${('', 'checked="checked"')[curNzbProvider.search_mode=="sponly"]}/>season packs only. + <input type="radio" name="${curNzbProvider.getID()}_search_mode" id="${curNzbProvider.getID()}_search_mode_sponly" value="sponly" ${('', 'checked="checked"')[curNzbProvider.search_mode=="sponly"]} autocapitalize="off" />season packs only. </span> </label> <label> <span class="component-title"></span> <span class="component-desc"> - <input type="radio" name="${curNzbProvider.getID()}_search_mode" id="${curNzbProvider.getID()}_search_mode_eponly" value="eponly" ${('', 'checked="checked"')[curNzbProvider.search_mode=="eponly"]}/>episodes only. + <input type="radio" name="${curNzbProvider.getID()}_search_mode" id="${curNzbProvider.getID()}_search_mode_eponly" value="eponly" ${('', 'checked="checked"')[curNzbProvider.search_mode=="eponly"]} autocapitalize="off" />episodes only. </span> </label> </div> @@ -311,7 +311,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_custom_url"> <span class="component-title">Custom URL:</span> <span class="component-desc"> - <input type="text" name="${curTorrentProvider.getID()}_custom_url" id="${curTorrentProvider.getID()}_custom_url" value="${curTorrentProvider.custom_url}" class="form-control input-sm input350" /> + <input type="text" name="${curTorrentProvider.getID()}_custom_url" id="${curTorrentProvider.getID()}_custom_url" value="${curTorrentProvider.custom_url}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> <label> @@ -328,7 +328,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_api_key"> <span class="component-title">Api key:</span> <span class="component-desc"> - <input type="text" name="${curTorrentProvider.getID()}_api_key" id="${curTorrentProvider.getID()}_api_key" value="${curTorrentProvider.api_key}" class="form-control input-sm input350" /> + <input type="text" name="${curTorrentProvider.getID()}_api_key" id="${curTorrentProvider.getID()}_api_key" value="${curTorrentProvider.api_key}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -339,7 +339,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_digest"> <span class="component-title">Digest:</span> <span class="component-desc"> - <input type="text" name="${curTorrentProvider.getID()}_digest" id="${curTorrentProvider.getID()}_digest" value="${curTorrentProvider.digest}" class="form-control input-sm input350" /> + <input type="text" name="${curTorrentProvider.getID()}_digest" id="${curTorrentProvider.getID()}_digest" value="${curTorrentProvider.digest}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -350,7 +350,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_hash"> <span class="component-title">Hash:</span> <span class="component-desc"> - <input type="text" name="${curTorrentProvider.getID()}_hash" id="${curTorrentProvider.getID()}_hash" value="${curTorrentProvider.hash}" class="form-control input-sm input350" /> + <input type="text" name="${curTorrentProvider.getID()}_hash" id="${curTorrentProvider.getID()}_hash" value="${curTorrentProvider.hash}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -361,7 +361,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_username"> <span class="component-title">Username:</span> <span class="component-desc"> - <input type="text" name="${curTorrentProvider.getID()}_username" id="${curTorrentProvider.getID()}_username" value="${curTorrentProvider.username}" class="form-control input-sm input350" /> + <input type="text" name="${curTorrentProvider.getID()}_username" id="${curTorrentProvider.getID()}_username" value="${curTorrentProvider.username}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -372,7 +372,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_password"> <span class="component-title">Password:</span> <span class="component-desc"> - <input type="password" name="${curTorrentProvider.getID()}_password" id="${curTorrentProvider.getID()}_password" value="${curTorrentProvider.password}" class="form-control input-sm input350" /> + <input type="password" name="${curTorrentProvider.getID()}_password" id="${curTorrentProvider.getID()}_password" value="${curTorrentProvider.password}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -383,7 +383,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_passkey"> <span class="component-title">Passkey:</span> <span class="component-desc"> - <input type="text" name="${curTorrentProvider.getID()}_passkey" id="${curTorrentProvider.getID()}_passkey" value="${curTorrentProvider.passkey}" class="form-control input-sm input350" /> + <input type="text" name="${curTorrentProvider.getID()}_passkey" id="${curTorrentProvider.getID()}_passkey" value="${curTorrentProvider.passkey}" class="form-control input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -394,7 +394,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_pin"> <span class="component-title">Pin:</span> <span class="component-desc"> - <input type="password" name="${curTorrentProvider.getID()}_pin" id="${curTorrentProvider.getID()}_pin" value="${curTorrentProvider.pin}" class="form-control input-sm input100" /> + <input type="password" name="${curTorrentProvider.getID()}_pin" id="${curTorrentProvider.getID()}_pin" value="${curTorrentProvider.pin}" class="form-control input-sm input100" autocapitalize="off" /> </span> </label> </div> @@ -405,7 +405,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_ratio"> <span class="component-title" id="${curTorrentProvider.getID()}_ratio_desc">Seed ratio:</span> <span class="component-desc"> - <input type="number" step="0.1" name="${curTorrentProvider.getID()}_ratio" id="${curTorrentProvider.getID()}_ratio" value="${curTorrentProvider.ratio}" class="form-control input-sm input75" /> + <input type="number" step="0.1" name="${curTorrentProvider.getID()}_ratio" id="${curTorrentProvider.getID()}_ratio" value="${curTorrentProvider.ratio}" class="form-control input-sm input75" autocapitalize="off" /> </span> </label> <label> @@ -422,7 +422,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_minseed"> <span class="component-title" id="${curTorrentProvider.getID()}_minseed_desc">Minimum seeders:</span> <span class="component-desc"> - <input type="number" name="${curTorrentProvider.getID()}_minseed" id="${curTorrentProvider.getID()}_minseed" value="${curTorrentProvider.minseed}" class="form-control input-sm input75" /> + <input type="number" name="${curTorrentProvider.getID()}_minseed" id="${curTorrentProvider.getID()}_minseed" value="${curTorrentProvider.minseed}" class="form-control input-sm input75" autocapitalize="off" /> </span> </label> </div> @@ -433,7 +433,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_minleech"> <span class="component-title" id="${curTorrentProvider.getID()}_minleech_desc">Minimum leechers:</span> <span class="component-desc"> - <input type="number" name="${curTorrentProvider.getID()}_minleech" id="${curTorrentProvider.getID()}_minleech" value="${curTorrentProvider.minleech}" class="form-control input-sm input75" /> + <input type="number" name="${curTorrentProvider.getID()}_minleech" id="${curTorrentProvider.getID()}_minleech" value="${curTorrentProvider.minleech}" class="form-control input-sm input75" autocapitalize="off" /> </span> </label> </div> @@ -444,7 +444,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_confirmed"> <span class="component-title">Confirmed download</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_confirmed" id="${curTorrentProvider.getID()}_confirmed" ${('', 'checked="checked"')[bool(curTorrentProvider.confirmed)]}/> + <input type="checkbox" name="${curTorrentProvider.getID()}_confirmed" id="${curTorrentProvider.getID()}_confirmed" ${('', 'checked="checked"')[bool(curTorrentProvider.confirmed)]} autocapitalize="off" /> <p>only download torrents from trusted or verified uploaders ?</p> </span> </label> @@ -456,7 +456,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_ranked"> <span class="component-title">Ranked torrents</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_ranked" id="${curTorrentProvider.getID()}_ranked" ${('', 'checked="checked"')[bool(curTorrentProvider.ranked)]} /> + <input type="checkbox" name="${curTorrentProvider.getID()}_ranked" id="${curTorrentProvider.getID()}_ranked" ${('', 'checked="checked"')[bool(curTorrentProvider.ranked)]} autocapitalize="off" /> <p>only download ranked torrents (internal releases)</p> </span> </label> @@ -468,7 +468,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_engrelease"> <span class="component-title">English torrents</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_engrelease" id="${curTorrentProvider.getID()}_engrelease" ${('', 'checked="checked"')[bool(curTorrentProvider.engrelease)]} /> + <input type="checkbox" name="${curTorrentProvider.getID()}_engrelease" id="${curTorrentProvider.getID()}_engrelease" ${('', 'checked="checked"')[bool(curTorrentProvider.engrelease)]} autocapitalize="off" /> <p>only download english torrents ,or torrents containing english subtitles</p> </span> </label> @@ -480,7 +480,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_onlyspasearch"> <span class="component-title">For Spanish torrents</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_onlyspasearch" id="${curTorrentProvider.getID()}_onlyspasearch" ${('', 'checked="checked"')[bool(curTorrentProvider.onlyspasearch)]} /> + <input type="checkbox" name="${curTorrentProvider.getID()}_onlyspasearch" id="${curTorrentProvider.getID()}_onlyspasearch" ${('', 'checked="checked"')[bool(curTorrentProvider.onlyspasearch)]} autocapitalize="off" /> <p>ONLY search on this provider if show info is defined as "Spanish" (avoid provider's use for VOS shows)</p> </span> </label> @@ -507,7 +507,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_freeleech"> <span class="component-title">Freeleech</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_freeleech" id="${curTorrentProvider.getID()}_freeleech" ${('', 'checked="checked"')[bool(curTorrentProvider.freeleech)]}/> + <input type="checkbox" name="${curTorrentProvider.getID()}_freeleech" id="${curTorrentProvider.getID()}_freeleech" ${('', 'checked="checked"')[bool(curTorrentProvider.freeleech)]} autocapitalize="off" /> <p>only download <b>[FreeLeech]</b> torrents.</p> </span> </label> @@ -519,7 +519,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_enable_daily"> <span class="component-title">Enable daily searches</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_enable_daily" id="${curTorrentProvider.getID()}_enable_daily" ${('', 'checked="checked"')[bool(curTorrentProvider.enable_daily)]}/> + <input type="checkbox" name="${curTorrentProvider.getID()}_enable_daily" id="${curTorrentProvider.getID()}_enable_daily" ${('', 'checked="checked"')[bool(curTorrentProvider.enable_daily)]} autocapitalize="off" /> <p>enable provider to perform daily searches.</p> </span> </label> @@ -531,7 +531,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_enable_backlog"> <span class="component-title">Enable backlog searches</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_enable_backlog" id="${curTorrentProvider.getID()}_enable_backlog" ${('', 'checked="checked"')[bool(curTorrentProvider.enable_backlog and curTorrentProvider.supportsBacklog)]}/> + <input type="checkbox" name="${curTorrentProvider.getID()}_enable_backlog" id="${curTorrentProvider.getID()}_enable_backlog" ${('', 'checked="checked"')[bool(curTorrentProvider.enable_backlog and curTorrentProvider.supportsBacklog)]} autocapitalize="off" /> <p>enable provider to perform backlog searches.</p> </span> </label> @@ -543,7 +543,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_search_fallback"> <span class="component-title">Season search fallback</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_search_fallback" id="${curTorrentProvider.getID()}_search_fallback" ${('', 'checked="checked"')[bool(curTorrentProvider.search_fallback)]}/> + <input type="checkbox" name="${curTorrentProvider.getID()}_search_fallback" id="${curTorrentProvider.getID()}_search_fallback" ${('', 'checked="checked"')[bool(curTorrentProvider.search_fallback)]} autocapitalize="off" /> <p>when searching for a complete season depending on search mode you may return no results, this helps by restarting the search using the opposite search mode.</p> </span> </label> @@ -561,13 +561,13 @@ $('#config-components').tabs(); <label> <span class="component-title"></span> <span class="component-desc"> - <input type="radio" name="${curTorrentProvider.getID()}_search_mode" id="${curTorrentProvider.getID()}_search_mode_sponly" value="sponly" ${('', 'checked="checked"')[curTorrentProvider.search_mode=="sponly"]}/>season packs only. + <input type="radio" name="${curTorrentProvider.getID()}_search_mode" id="${curTorrentProvider.getID()}_search_mode_sponly" value="sponly" ${('', 'checked="checked"')[curTorrentProvider.search_mode=="sponly"]} autocapitalize="off" />season packs only. </span> </label> <label> <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" ${('', 'checked="checked"')[curTorrentProvider.search_mode=="eponly"]}/>episodes only. + <input type="radio" name="${curTorrentProvider.getID()}_search_mode" id="${curTorrentProvider.getID()}_search_mode_eponly" value="eponly" ${('', 'checked="checked"')[curTorrentProvider.search_mode=="eponly"]} autocapitalize="off" />episodes only. </span> </label> </div> @@ -593,7 +593,7 @@ $('#config-components').tabs(); <label for="${curTorrentProvider.getID()}_subtitle"> <span class="component-title">Subtitled</span> <span class="component-desc"> - <input type="checkbox" name="${curTorrentProvider.getID()}_subtitle" id="${curTorrentProvider.getID()}_subtitle" ${('', 'checked="checked"')[bool(curTorrentProvider.subtitle)]}/> + <input type="checkbox" name="${curTorrentProvider.getID()}_subtitle" id="${curTorrentProvider.getID()}_subtitle" ${('', 'checked="checked"')[bool(curTorrentProvider.subtitle)]} autocapitalize="off" /> <p>select torrent with Italian subtitle</p> </span> </label> @@ -606,7 +606,7 @@ $('#config-components').tabs(); <!-- end div for editing providers --> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </fieldset> </div><!-- /component-group2 //--> @@ -624,7 +624,7 @@ $('#config-components').tabs(); <label for="newznab_string"> <span class="component-title">Select provider:</span> <span class="component-desc"> - <input type="hidden" name="newznab_string" id="newznab_string" /> + <input type="hidden" name="newznab_string" id="newznab_string" autocapitalize="off" /> <select id="editANewznabProvider" class="form-control input-sm"> <option value="addNewznab">-- add new provider --</option> </select> @@ -636,19 +636,19 @@ $('#config-components').tabs(); <div class="field-pair"> <label for="newznab_name"> <span class="component-title">Provider name:</span> - <input type="text" id="newznab_name" class="form-control input-sm input200" /> + <input type="text" id="newznab_name" class="form-control input-sm input200" autocapitalize="off" /> </label> </div> <div class="field-pair"> <label for="newznab_url"> <span class="component-title">Site URL:</span> - <input type="text" id="newznab_url" class="form-control input-sm input350" /> + <input type="text" id="newznab_url" class="form-control input-sm input350" autocapitalize="off" /> </label> </div> <div class="field-pair"> <label for="newznab_key"> <span class="component-title">API key:</span> - <input type="text" id="newznab_key" class="form-control input-sm input350" /> + <input type="text" id="newznab_key" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -668,17 +668,17 @@ $('#config-components').tabs(); </label> <label> <span class="component-title"> </span> - <span class="component-desc"><input class="btn" type="button" class="newznab_cat_update" id="newznab_cat_update" value="Update Categories" /> + <span class="component-desc"><input class="btn" type="button" class="newznab_cat_update" id="newznab_cat_update" value="Update Categories" autocapitalize="off" /> <span class="updating_categories"></span> </span> </label> </div> <div id="newznab_add_div"> - <input class="btn" type="button" class="newznab_save" id="newznab_add" value="Add" /> + <input class="btn" type="button" class="newznab_save" id="newznab_add" value="Add" autocapitalize="off" /> </div> <div id="newznab_update_div" style="display: none;"> - <input class="btn btn-danger newznab_delete" type="button" class="newznab_delete" id="newznab_delete" value="Delete" /> + <input class="btn btn-danger newznab_delete" type="button" class="newznab_delete" id="newznab_delete" value="Delete" autocapitalize="off" /> </div> </div> @@ -700,7 +700,7 @@ $('#config-components').tabs(); <label for="torrentrss_string"> <span class="component-title">Select provider:</span> <span class="component-desc"> - <input type="hidden" name="torrentrss_string" id="torrentrss_string" /> + <input type="hidden" name="torrentrss_string" id="torrentrss_string" autocapitalize="off" /> <select id="editATorrentRssProvider" class="form-control input-sm"> <option value="addTorrentRss">-- add new provider --</option> </select> @@ -712,19 +712,19 @@ $('#config-components').tabs(); <div class="field-pair"> <label for="torrentrss_name"> <span class="component-title">Provider name:</span> - <input type="text" id="torrentrss_name" class="form-control input-sm input200" /> + <input type="text" id="torrentrss_name" class="form-control input-sm input200" autocapitalize="off" /> </label> </div> <div class="field-pair"> <label for="torrentrss_url"> <span class="component-title">RSS URL:</span> - <input type="text" id="torrentrss_url" class="form-control input-sm input350" /> + <input type="text" id="torrentrss_url" class="form-control input-sm input350" autocapitalize="off" /> </label> </div> <div class="field-pair"> <label for="torrentrss_cookies"> <span class="component-title">Cookies:</span> - <input type="text" id="torrentrss_cookies" class="form-control input-sm input350" /> + <input type="text" id="torrentrss_cookies" class="form-control input-sm input350" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -734,7 +734,7 @@ $('#config-components').tabs(); <div class="field-pair"> <label for="torrentrss_titleTAG"> <span class="component-title">Search element:</span> - <input type="text" id="torrentrss_titleTAG" class="form-control input-sm input200" value="title"/> + <input type="text" id="torrentrss_titleTAG" class="form-control input-sm input200" value="title" autocapitalize="off" /> </label> <label> <span class="component-title"> </span> @@ -742,17 +742,17 @@ $('#config-components').tabs(); </label> </div> <div id="torrentrss_add_div"> - <input type="button" class="btn torrentrss_save" id="torrentrss_add" value="Add" /> + <input type="button" class="btn torrentrss_save" id="torrentrss_add" value="Add" autocapitalize="off" /> </div> <div id="torrentrss_update_div" style="display: none;"> - <input type="button" class="btn btn-danger torrentrss_delete" id="torrentrss_delete" value="Delete" /> + <input type="button" class="btn btn-danger torrentrss_delete" id="torrentrss_delete" value="Delete" autocapitalize="off" /> </div> </div> </fieldset> </div><!-- /component-group4 //--> % endif - <br><input type="submit" class="btn config_submitter_refresh" value="Save Changes" /><br> + <br><input type="submit" class="btn config_submitter_refresh" value="Save Changes" autocapitalize="off" /><br> </div><!-- /config-components //--> diff --git a/gui/slick/views/config_search.mako b/gui/slick/views/config_search.mako index 61e3054dfd68e15001d3933a3efe8f28235f4c52..cb14c318521fb166e840b43b5f299ce21b69cf9e 100644 --- a/gui/slick/views/config_search.mako +++ b/gui/slick/views/config_search.mako @@ -31,7 +31,7 @@ <label for="randomize_providers"> <span class="component-title">Randomize Providers</span> <span class="component-desc"> - <input type="checkbox" name="randomize_providers" id="randomize_providers" class="enabler" ${('', 'checked="checked"')[bool(sickbeard.RANDOMIZE_PROVIDERS)]}/> + <input type="checkbox" name="randomize_providers" id="randomize_providers" class="enabler" ${('', 'checked="checked"')[bool(sickbeard.RANDOMIZE_PROVIDERS)]} autocapitalize="off" /> <p>randomize the provider search order instead of going in order of placement</p> </span> </label> @@ -40,7 +40,7 @@ <label for="download_propers"> <span class="component-title">Download propers</span> <span class="component-desc"> - <input type="checkbox" name="download_propers" id="download_propers" class="enabler" ${('', 'checked="checked"')[bool(sickbeard.DOWNLOAD_PROPERS)]}/> + <input type="checkbox" name="download_propers" id="download_propers" class="enabler" ${('', 'checked="checked"')[bool(sickbeard.DOWNLOAD_PROPERS)]} autocapitalize="off" /> <p>replace original download with "Proper" or "Repack" if nuked</p> </span> </label> @@ -65,7 +65,7 @@ <label> <span class="component-title">Backlog search day(s)</span> <span class="component-desc"> - <input type="text" name="backlog_days" value="${sickbeard.BACKLOG_DAYS}" class="form-control input-sm input75" /> + <input type="text" name="backlog_days" value="${sickbeard.BACKLOG_DAYS}" class="form-control input-sm input75" autocapitalize="off" /> <p>number of day(s) that the "Forced Backlog Search" will cover (e.g. 7 Days)</p> </span> </label> @@ -75,7 +75,7 @@ <label> <span class="component-title">Backlog search frequency</span> <span class="component-desc"> - <input type="text" name="backlog_frequency" value="${sickbeard.BACKLOG_FREQUENCY}" class="form-control input-sm input75" /> + <input type="text" name="backlog_frequency" value="${sickbeard.BACKLOG_FREQUENCY}" class="form-control input-sm input75" autocapitalize="off" /> <p>time in minutes between searches (min. ${sickbeard.MIN_BACKLOG_FREQUENCY})</p> </span> </label> @@ -85,7 +85,7 @@ <label> <span class="component-title">Daily search frequency</span> <span class="component-desc"> - <input type="text" name="dailysearch_frequency" value="${sickbeard.DAILYSEARCH_FREQUENCY}" class="form-control input-sm input75" /> + <input type="text" name="dailysearch_frequency" value="${sickbeard.DAILYSEARCH_FREQUENCY}" class="form-control input-sm input75" autocapitalize="off" /> <p>time in minutes between searches (min. ${sickbeard.MIN_DAILYSEARCH_FREQUENCY})</p> </span> </label> @@ -95,7 +95,7 @@ <label> <span class="component-title">Usenet retention</span> <span class="component-desc"> - <input type="text" name="usenet_retention" value="${sickbeard.USENET_RETENTION}" class="form-control input-sm input75" /> + <input type="text" name="usenet_retention" value="${sickbeard.USENET_RETENTION}" class="form-control input-sm input75" autocapitalize="off" /> <p>age limit in days for usenet articles to be used (e.g. 500)</p> </span> </label> @@ -105,7 +105,7 @@ <label> <span class="component-title">Ignore words</span> <span class="component-desc"> - <input type="text" name="ignore_words" value="${sickbeard.IGNORE_WORDS}" class="form-control input-sm input350" /> + <input type="text" name="ignore_words" value="${sickbeard.IGNORE_WORDS}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left">results with one or more word from this list will be ignored<br> separate words with a comma, e.g. "word1,word2,word3" </div> @@ -117,7 +117,7 @@ <label> <span class="component-title">Require words</span> <span class="component-desc"> - <input type="text" name="require_words" value="${sickbeard.REQUIRE_WORDS}" class="form-control input-sm input350" /> + <input type="text" name="require_words" value="${sickbeard.REQUIRE_WORDS}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left">results with no word from this list will be ignored<br> separate words with a comma, e.g. "word1,word2,word3" </div> @@ -129,7 +129,7 @@ <label> <span class="component-title">Trackers list</span> <span class="component-desc"> - <input type="text" name="trackers_list" value="${sickbeard.TRACKERS_LIST}" class="form-control input-sm input350" /> + <input type="text" name="trackers_list" value="${sickbeard.TRACKERS_LIST}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left">Trackers that will be added to magnets without trackers<br> separate trackers with a comma, e.g. "tracker1,tracker2,tracker3" </div> @@ -141,7 +141,7 @@ <label> <span class="component-title">Ignore language names in subbed results</span> <span class="component-desc"> - <input type="text" name="ignored_subs_list" value="${sickbeard.IGNORED_SUBS_LIST}" class="form-control input-sm input350" /> + <input type="text" name="ignored_subs_list" value="${sickbeard.IGNORED_SUBS_LIST}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left">Ignore subbed releases based on language names <br> Example: "dk" will ignore words: dksub, dksubs, dksubbed, dksubed <br> separate languages with a comma, e.g. "lang1,lang2,lang3 @@ -154,14 +154,14 @@ <label for="allow_high_priority"> <span class="component-title">Allow high priority</span> <span class="component-desc"> - <input type="checkbox" name="allow_high_priority" id="allow_high_priority" ${('', 'checked="checked"')[bool(sickbeard.ALLOW_HIGH_PRIORITY)]}/> + <input type="checkbox" name="allow_high_priority" id="allow_high_priority" ${('', 'checked="checked"')[bool(sickbeard.ALLOW_HIGH_PRIORITY)]} autocapitalize="off" /> <p>set downloads of recently aired episodes to high priority</p> </span> </label> </div> <div class="field-pair"> - <input id="use_failed_downloads" type="checkbox" class="enabler" name="use_failed_downloads" ${('', 'checked="checked"')[bool(sickbeard.USE_FAILED_DOWNLOADS)]} /> + <input id="use_failed_downloads" type="checkbox" class="enabler" name="use_failed_downloads" ${('', 'checked="checked"')[bool(sickbeard.USE_FAILED_DOWNLOADS)]} autocapitalize="off" /> <label for="use_failed_downloads"> <span class="component-title">Use Failed Downloads</span> <span class="component-desc">Use Failed Download Handling?</span> @@ -174,7 +174,7 @@ <div id="content_use_failed_downloads"> <div class="field-pair"> - <input id="delete_failed" type="checkbox" name="delete_failed" ${('', 'checked="checked"')[bool(sickbeard.DELETE_FAILED)]}/> + <input id="delete_failed" type="checkbox" name="delete_failed" ${('', 'checked="checked"')[bool(sickbeard.DELETE_FAILED)]} autocapitalize="off" /> <label for="delete_failed"> <span class="component-title">Delete Failed</span> <span class="component-desc">Delete files left over from a failed download?</span> @@ -186,7 +186,7 @@ </div> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /> </fieldset> </div><!-- /component-group1 //--> @@ -204,7 +204,7 @@ <label for="use_nzbs"> <span class="component-title">Search NZBs</span> <span class="component-desc"> - <input type="checkbox" name="use_nzbs" class="enabler" id="use_nzbs" ${('', 'checked="checked"')[bool(sickbeard.USE_NZBS)]}/> + <input type="checkbox" name="use_nzbs" class="enabler" id="use_nzbs" ${('', 'checked="checked"')[bool(sickbeard.USE_NZBS)]} autocapitalize="off" /> <p>enable NZB search providers</p></span> </label> </div> @@ -229,7 +229,7 @@ <label> <span class="component-title">Black hole folder location</span> <span class="component-desc"> - <input type="text" name="nzb_dir" id="nzb_dir" value="${sickbeard.NZB_DIR}" class="form-control input-sm input350" /> + <input type="text" name="nzb_dir" id="nzb_dir" value="${sickbeard.NZB_DIR}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"><p><b>.nzb</b> files are stored at this location for external software to find and use</p></div> </span> </label> @@ -241,7 +241,7 @@ <label> <span class="component-title">SABnzbd server URL</span> <span class="component-desc"> - <input type="text" id="sab_host" name="sab_host" value="${sickbeard.SAB_HOST}" class="form-control input-sm input350" /> + <input type="text" id="sab_host" name="sab_host" value="${sickbeard.SAB_HOST}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"><p>URL to your SABnzbd server (e.g. http://localhost:8080/)</p></div> </span> </label> @@ -251,7 +251,7 @@ <label> <span class="component-title">SABnzbd username</span> <span class="component-desc"> - <input type="text" name="sab_username" id="sab_username" value="${sickbeard.SAB_USERNAME}" class="form-control input-sm input200" /> + <input type="text" name="sab_username" id="sab_username" value="${sickbeard.SAB_USERNAME}" class="form-control input-sm input200" autocapitalize="off" /> <p>(blank for none)</p> </span> </label> @@ -261,7 +261,7 @@ <label> <span class="component-title">SABnzbd password</span> <span class="component-desc"> - <input type="password" name="sab_password" id="sab_password" value="${sickbeard.SAB_PASSWORD}" class="form-control input-sm input200" /> + <input type="password" name="sab_password" id="sab_password" value="${sickbeard.SAB_PASSWORD}" class="form-control input-sm input200" autocapitalize="off" /> <p>(blank for none)</p> </span> </label> @@ -271,7 +271,7 @@ <label> <span class="component-title">SABnzbd API key</span> <span class="component-desc"> - <input type="text" name="sab_apikey" id="sab_apikey" value="${sickbeard.SAB_APIKEY}" class="form-control input-sm input350" /> + <input type="text" name="sab_apikey" id="sab_apikey" value="${sickbeard.SAB_APIKEY}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"><p>locate at... SABnzbd Config -> General -> API Key</p></div> </span> </label> @@ -281,7 +281,7 @@ <label> <span class="component-title">Use SABnzbd category</span> <span class="component-desc"> - <input type="text" name="sab_category" id="sab_category" value="${sickbeard.SAB_CATEGORY}" class="form-control input-sm input200" /> + <input type="text" name="sab_category" id="sab_category" value="${sickbeard.SAB_CATEGORY}" class="form-control input-sm input200" autocapitalize="off" /> <p>add downloads to this category (e.g. TV)</p> </span> </label> @@ -291,7 +291,7 @@ <label> <span class="component-title">Use SABnzbd category (backlog episodes)</span> <span class="component-desc"> - <input type="text" name="sab_category_backlog" id="sab_category_backlog" value="${sickbeard.SAB_CATEGORY_BACKLOG}" class="form-control input-sm input200" /> + <input type="text" name="sab_category_backlog" id="sab_category_backlog" value="${sickbeard.SAB_CATEGORY_BACKLOG}" class="form-control input-sm input200" autocapitalize="off" /> <p>add downloads of old episodes to this category (e.g. TV)</p> </span> </label> @@ -301,7 +301,7 @@ <label> <span class="component-title">Use SABnzbd category for anime</span> <span class="component-desc"> - <input type="text" name="sab_category_anime" id="sab_category_anime" value="${sickbeard.SAB_CATEGORY_ANIME}" class="form-control input-sm input200" /> + <input type="text" name="sab_category_anime" id="sab_category_anime" value="${sickbeard.SAB_CATEGORY_ANIME}" class="form-control input-sm input200" autocapitalize="off" /> <p>add anime downloads to this category (e.g. anime)</p> </span> </label> @@ -312,7 +312,7 @@ <label> <span class="component-title">Use SABnzbd category for anime (backlog episodes)</span> <span class="component-desc"> - <input type="text" name="sab_category_anime_backlog" id="sab_category_anime_backlog" value="${sickbeard.SAB_CATEGORY_ANIME_BACKLOG}" class="form-control input-sm input200" /> + <input type="text" name="sab_category_anime_backlog" id="sab_category_anime_backlog" value="${sickbeard.SAB_CATEGORY_ANIME_BACKLOG}" class="form-control input-sm input200" autocapitalize="off" /> <p>add anime downloads of old episodes to this category (e.g. anime)</p> </span> </label> @@ -323,7 +323,7 @@ <label for="sab_forced"> <span class="component-title">Use forced priority</span> <span class="component-desc"> - <input type="checkbox" name="sab_forced" class="enabler" id="sab_forced" ${('', 'selected="selected"')[bool(sickbeard.SAB_FORCED)]}/> + <input type="checkbox" name="sab_forced" class="enabler" id="sab_forced" ${('', 'selected="selected"')[bool(sickbeard.SAB_FORCED)]} autocapitalize="off" /> <p>enable to change priority from HIGH to FORCED</p></span> </label> </div> @@ -335,7 +335,7 @@ <label for="nzbget_use_https"> <span class="component-title">Connect using HTTPS</span> <span class="component-desc"> - <input id="nzbget_use_https" type="checkbox" class="enabler" name="nzbget_use_https" ${('', 'selected="selected"')[bool(sickbeard.NZBGET_USE_HTTPS)]}/> + <input id="nzbget_use_https" type="checkbox" class="enabler" name="nzbget_use_https" ${('', 'selected="selected"')[bool(sickbeard.NZBGET_USE_HTTPS)]} autocapitalize="off" /> <p><b>note:</b> enable Secure control in NZBGet and set the correct Secure Port here</p> </span> </label> @@ -346,7 +346,7 @@ <label> <span class="component-title">NZBget host:port</span> <span class="component-desc"> - <input type="text" name="nzbget_host" id="nzbget_host" value="${sickbeard.NZBGET_HOST}" class="form-control input-sm input350" /> + <input type="text" name="nzbget_host" id="nzbget_host" value="${sickbeard.NZBGET_HOST}" class="form-control input-sm input350" autocapitalize="off" /> <p>(e.g. localhost:6789)</p> <div class="clear-left"><p>NZBget RPC host name and port number (not NZBgetweb!)</p></div> </span> @@ -357,7 +357,7 @@ <label> <span class="component-title">NZBget username</span> <span class="component-desc"> - <input type="text" name="nzbget_username" value="${sickbeard.NZBGET_USERNAME}" class="form-control input-sm input200" /> + <input type="text" name="nzbget_username" value="${sickbeard.NZBGET_USERNAME}" class="form-control input-sm input200" autocapitalize="off" /> <p>locate in nzbget.conf (default:nzbget)</p> </span> </label> @@ -367,7 +367,7 @@ <label> <span class="component-title">NZBget password</span> <span class="component-desc"> - <input type="password" name="nzbget_password" id="nzbget_password" value="${sickbeard.NZBGET_PASSWORD}" class="form-control input-sm input200" /> + <input type="password" name="nzbget_password" id="nzbget_password" value="${sickbeard.NZBGET_PASSWORD}" class="form-control input-sm input200" autocapitalize="off" /> <p>locate in nzbget.conf (default:tegbzn6789)</p> </span> </label> @@ -377,7 +377,7 @@ <label> <span class="component-title">Use NZBget category</span> <span class="component-desc"> - <input type="text" name="nzbget_category" id="nzbget_category" value="${sickbeard.NZBGET_CATEGORY}" class="form-control input-sm input200" /> + <input type="text" name="nzbget_category" id="nzbget_category" value="${sickbeard.NZBGET_CATEGORY}" class="form-control input-sm input200" autocapitalize="off" /> <p>send downloads marked this category (e.g. TV)</p> </span> </label> @@ -387,7 +387,7 @@ <label> <span class="component-title">Use NZBget category (backlog episodes)</span> <span class="component-desc"> - <input type="text" name="nzbget_category_backlog" id="nzbget_category_backlog" value="${sickbeard.NZBGET_CATEGORY_BACKLOG}" class="form-control input-sm input200" /> + <input type="text" name="nzbget_category_backlog" id="nzbget_category_backlog" value="${sickbeard.NZBGET_CATEGORY_BACKLOG}" class="form-control input-sm input200" autocapitalize="off" /> <p>send downloads of old episodes marked this category (e.g. TV)</p> </span> </label> @@ -397,7 +397,7 @@ <label> <span class="component-title">Use NZBget category for anime</span> <span class="component-desc"> - <input type="text" name="nzbget_category_anime" id="nzbget_category_anime" value="${sickbeard.NZBGET_CATEGORY_ANIME}" class="form-control input-sm input200" /> + <input type="text" name="nzbget_category_anime" id="nzbget_category_anime" value="${sickbeard.NZBGET_CATEGORY_ANIME}" class="form-control input-sm input200" autocapitalize="off" /> <p>send anime downloads marked this category (e.g. anime)</p> </span> </label> @@ -407,7 +407,7 @@ <label> <span class="component-title">Use NZBget category for anime (backlog episodes)</span> <span class="component-desc"> - <input type="text" name="nzbget_category_anime_backlog" id="nzbget_category_anime_backlog" value="${sickbeard.NZBGET_CATEGORY_ANIME_BACKLOG}" class="form-control input-sm input200" /> + <input type="text" name="nzbget_category_anime_backlog" id="nzbget_category_anime_backlog" value="${sickbeard.NZBGET_CATEGORY_ANIME_BACKLOG}" class="form-control input-sm input200" autocapitalize="off" /> <p>send anime downloads of old episodes marked this category (e.g. anime)</p> </span> </label> @@ -432,8 +432,8 @@ </div> <div class="testNotification" id="testSABnzbd_result">Click below to test</div> - <input class="btn" type="button" value="Test SABnzbd" id="testSABnzbd" class="btn test-button"/> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input class="btn" type="button" value="Test SABnzbd" id="testSABnzbd" class="btn test-button" autocapitalize="off" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </div><!-- /content_use_nzbs //--> @@ -451,7 +451,7 @@ <label for="use_torrents"> <span class="component-title">Search torrents</span> <span class="component-desc"> - <input type="checkbox" name="use_torrents" class="enabler" id="use_torrents" ${('', 'checked="checked"')[bool(sickbeard.USE_TORRENTS)]}/> + <input type="checkbox" name="use_torrents" class="enabler" id="use_torrents" ${('', 'checked="checked"')[bool(sickbeard.USE_TORRENTS)]} autocapitalize="off" /> <p>enable torrent search providers</p> </span> </label> @@ -475,14 +475,14 @@ <label> <span class="component-title">Black hole folder location</span> <span class="component-desc"> - <input type="text" name="torrent_dir" id="torrent_dir" value="${sickbeard.TORRENT_DIR}" class="form-control input-sm input350" /> + <input type="text" name="torrent_dir" id="torrent_dir" value="${sickbeard.TORRENT_DIR}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"><p><b>.torrent</b> files are stored at this location for external software to find and use</p></div> </span> </label> </div> <div></div> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </div> </div> @@ -491,7 +491,7 @@ <label> <span class="component-title" id="host_title">Torrent host:port</span> <span class="component-desc"> - <input type="text" name="torrent_host" id="torrent_host" value="${sickbeard.TORRENT_HOST}" class="form-control input-sm input350" /> + <input type="text" name="torrent_host" id="torrent_host" value="${sickbeard.TORRENT_HOST}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"> <p id="host_desc_torrent">URL to your torrent client (e.g. http://localhost:8000/)</p> </div> @@ -503,7 +503,7 @@ <label> <span class="component-title" id="rpcurl_title">Torrent RPC URL</span> <span class="component-desc"> - <input type="text" name="torrent_rpcurl" id="torrent_rpcurl" value="${sickbeard.TORRENT_RPCURL}" class="form-control input-sm input350"/> + <input type="text" name="torrent_rpcurl" id="torrent_rpcurl" value="${sickbeard.TORRENT_RPCURL}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"> <p id="rpcurl_desc_">The path without leading and trailing slashes (e.g. transmission)</p> </div> @@ -530,7 +530,7 @@ <label for="torrent_verify_cert"> <span class="component-title">Verify certificate</span> <span class="component-desc"> - <input type="checkbox" name="torrent_verify_cert" class="enabler" id="torrent_verify_cert" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_VERIFY_CERT)]}/> + <input type="checkbox" name="torrent_verify_cert" class="enabler" id="torrent_verify_cert" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_VERIFY_CERT)]} autocapitalize="off" /> <p id="torrent_verify_deluge">disable if you get "Deluge: Authentication Error" in your log</p> <p id="torrent_verify_rtorrent">Verify SSL certificates for HTTPS requests</p> </span> @@ -541,7 +541,7 @@ <label> <span class="component-title" id="username_title">Client username</span> <span class="component-desc"> - <input type="text" name="torrent_username" id="torrent_username" value="${sickbeard.TORRENT_USERNAME}" class="form-control input-sm input200" /> + <input type="text" name="torrent_username" id="torrent_username" value="${sickbeard.TORRENT_USERNAME}" class="form-control input-sm input200" autocapitalize="off" /> <p>(blank for none)</p> </span> </label> @@ -551,7 +551,7 @@ <label> <span class="component-title" id="password_title">Client password</span> <span class="component-desc"> - <input type="password" name="torrent_password" id="torrent_password" value="${sickbeard.TORRENT_PASSWORD}" class="form-control input-sm input200" /> + <input type="password" name="torrent_password" id="torrent_password" value="${sickbeard.TORRENT_PASSWORD}" class="form-control input-sm input200" autocapitalize="off" /> <p>(blank for none)</p> </span> </label> @@ -561,7 +561,7 @@ <label> <span class="component-title">Add label to torrent</span> <span class="component-desc"> - <input type="text" name="torrent_label" id="torrent_label" value="${sickbeard.TORRENT_LABEL}" class="form-control input-sm input200" /> + <input type="text" name="torrent_label" id="torrent_label" value="${sickbeard.TORRENT_LABEL}" class="form-control input-sm input200" autocapitalize="off" /> <span id="label_warning_deluge" style="display:none"><p>(blank spaces are not allowed)</p> <div class="clear-left"><p>note: label plugin must be enabled in Deluge clients</p></div> </span> @@ -573,7 +573,7 @@ <label> <span class="component-title">Add label to torrent for anime</span> <span class="component-desc"> - <input type="text" name="torrent_label_anime" id="torrent_label_anime" value="${sickbeard.TORRENT_LABEL_ANIME}" class="form-control input-sm input200" /> + <input type="text" name="torrent_label_anime" id="torrent_label_anime" value="${sickbeard.TORRENT_LABEL_ANIME}" class="form-control input-sm input200" autocapitalize="off" /> <span id="label_anime_warning_deluge" style="display:none"><p>(blank spaces are not allowed)</p> <div class="clear-left"><p>note: label plugin must be enabled in Deluge clients</p></div> </span> @@ -585,7 +585,7 @@ <label> <span class="component-title" id="directory_title">Downloaded files location</span> <span class="component-desc"> - <input type="text" name="torrent_path" id="torrent_path" value="${sickbeard.TORRENT_PATH}" class="form-control input-sm input350" /> + <input type="text" name="torrent_path" id="torrent_path" value="${sickbeard.TORRENT_PATH}" class="form-control input-sm input350" autocapitalize="off" /> <div class="clear-left"><p>where <span id="torrent_client">the torrent client</span> will save downloaded files (blank for client default) <span id="path_synology"> <b>note:</b> the destination has to be a shared folder for Synology DS</span></p> </div> @@ -596,7 +596,7 @@ <div class="field-pair" id="torrent_seed_time_option"> <label> <span class="component-title" id="torrent_seed_time_label">Minimum seeding time is</span> - <span class="component-desc"><input type="number" step="1" name="torrent_seed_time" id="torrent_seed_time" value="${sickbeard.TORRENT_SEED_TIME}" class="form-control input-sm input100" /> + <span class="component-desc"><input type="number" step="1" name="torrent_seed_time" id="torrent_seed_time" value="${sickbeard.TORRENT_SEED_TIME}" class="form-control input-sm input100" autocapitalize="off" /> <p>hours. (default:'0' passes blank to client and '-1' passes nothing)</p></span> </label> </div> @@ -605,7 +605,7 @@ <label> <span class="component-title">Start torrent paused</span> <span class="component-desc"> - <input type="checkbox" name="torrent_paused" class="enabler" id="torrent_paused" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_PAUSED)]}/> + <input type="checkbox" name="torrent_paused" class="enabler" id="torrent_paused" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_PAUSED)]} autocapitalize="off" /> <p>add .torrent to client but do <b style="font-weight:900">not</b> start downloading</p> </span> </label> @@ -615,15 +615,15 @@ <label> <span class="component-title">Allow high bandwidth</span> <span class="component-desc"> - <input type="checkbox" name="torrent_high_bandwidth" class="enabler" id="torrent_high_bandwidth" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_HIGH_BANDWIDTH)]}/> + <input type="checkbox" name="torrent_high_bandwidth" class="enabler" id="torrent_high_bandwidth" ${('', 'checked="checked"')[bool(sickbeard.TORRENT_HIGH_BANDWIDTH)]} autocapitalize="off" /> <p>use high bandwidth allocation if priority is high</p> </span> </label> </div> <div class="testNotification" id="test_torrent_result">Click below to test</div> - <input class="btn" type="button" value="Test Connection" id="test_torrent" class="btn test-button"/> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <input class="btn" type="button" value="Test Connection" id="test_torrent" class="btn test-button" autocapitalize="off" /> + <input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </div> </div><!-- /content_use_torrents //--> </fieldset> @@ -631,7 +631,7 @@ <br> <h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">${sickbeard.DATA_DIR}</span></b> </h6> - <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" /> + <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" autocapitalize="off" /> </div><!-- /config-components //--> </form> diff --git a/gui/slick/views/config_subtitles.mako b/gui/slick/views/config_subtitles.mako index b84bfc6b946110f26ffeba8f490f54a0acbe3bd1..72500662b80cf67160fcfd3ffc215a5ee7bd8838 100644 --- a/gui/slick/views/config_subtitles.mako +++ b/gui/slick/views/config_subtitles.mako @@ -11,7 +11,9 @@ $(document).ready(function() { method: "POST", hintText: "Write to search a language and select it", preventDuplicates: true, - prePopulate: [${','.join("{\"id\": \"" + subtitles.fromietf(lang).opensubtitles + "\", name: \"" + subtitles.fromietf(lang).name + "\"}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}] + prePopulate: [${','.join("{\"id\": \"" + subtitles.fromietf(lang).opensubtitles + "\", name: \"" + subtitles.fromietf(lang).name + "\"}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}], + resultsFormatter: function(item){ return "<li><img src='${srRoot}/images/subtitles/flags/" + item.id + ".png' /> " + item.name + "</li>" }, + tokenFormatter: function(item) { return "<li><img src='${srRoot}/images/subtitles/flags/" + item.id + ".png' /> " + item.name + "</li>" }, }); }); $('#config-components').tabs(); @@ -57,7 +59,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <div class="field-pair"> <label> <span class="component-title">Subtitle Languages</span> - <span class="component-desc"><input type="text" id="subtitles_languages" name="subtitles_languages" /></span> + <span class="component-desc"><input type="text" id="subtitles_languages" name="subtitles_languages" autocapitalize="off" /></span> </label> </div> <div class="field-pair"> @@ -77,7 +79,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <div class="field-pair"> <label> <span class="component-title">Subtitle Find Frequency</span> - <input type="number" name="subtitles_finder_frequency" value="${sickbeard.SUBTITLES_FINDER_FREQUENCY}" hours="1" class="form-control input-sm input75" /> + <input type="number" name="subtitles_finder_frequency" value="${sickbeard.SUBTITLES_FINDER_FREQUENCY}" hours="1" class="form-control input-sm input75" autocapitalize="off" /> <span class="component-desc">time in hours between scans (default: 1)</span> </label> </div> @@ -85,7 +87,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <label class="clearfix" for="subtitles_history"> <span class="component-title">Subtitles History</span> <span class="component-desc"> - <input type="checkbox" name="subtitles_history" id="subtitles_history" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_HISTORY)]}/> + <input type="checkbox" name="subtitles_history" id="subtitles_history" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_HISTORY)]} autocapitalize="off" /> <p>Log downloaded Subtitle on History page?</p> </span> </label> @@ -94,16 +96,27 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <label class="clearfix" for="subtitles_multi"> <span class="component-title">Subtitles Multi-Language</span> <span class="component-desc"> - <input type="checkbox" name="subtitles_multi" id="subtitles_multi" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_MULTI)]}/> + <input type="checkbox" name="subtitles_multi" id="subtitles_multi" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_MULTI)]} autocapitalize="off" /> <p>Append language codes to subtitle filenames?</p> </span> </label> </div> + <label class="clearfix" for="subtitles_download_in_pp"> + <span class="component-title">Subtitles in Post-Process folder</span> + <span class="component-desc"> + <input type="checkbox" name="subtitles_download_in_pp" id="subtitles_download_in_pp" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_DOWNLOAD_IN_PP)]} autocapitalize="off" /> + <p>Download subtitles in post-process folder.</p> + <p>Useful if you only want the episode to be post-processed when it has subtitles associated</p> + <p>You might also want to enable the post-process setting 'Postpone if no subtitle'</p> + </span> + </label> + </div> + <div class="field-pair"> <div class="field-pair"> <label class="clearfix" for="embedded_subtitles_all"> <span class="component-title">Embedded Subtitles</span> <span class="component-desc"> - <input type="checkbox" name="embedded_subtitles_all" id="embedded_subtitles_all" ${('', 'checked="checked"')[bool(sickbeard.EMBEDDED_SUBTITLES_ALL)]}/> + <input type="checkbox" name="embedded_subtitles_all" id="embedded_subtitles_all" ${('', 'checked="checked"')[bool(sickbeard.EMBEDDED_SUBTITLES_ALL)]} autocapitalize="off" /> <p>Ignore subtitles embedded inside video file?</p> <p><b>Warning: </b>this will ignore <u>all</u> embedded subtitles for every video file!</p> </span> @@ -113,7 +126,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <label class="clearfix" for="subtitles_hearing_impaired"> <span class="component-title">Hearing Impaired Subtitles</span> <span class="component-desc"> - <input type="checkbox" name="subtitles_hearing_impaired" id="subtitles_hearing_impaired" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_HEARING_IMPAIRED)]}/> + <input type="checkbox" name="subtitles_hearing_impaired" id="subtitles_hearing_impaired" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_HEARING_IMPAIRED)]} autocapitalize="off" /> <p>Download hearing impaired style subtitles?</p> </span> </label> @@ -121,7 +134,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <div class="field-pair"> <label class="nocheck"> <span class="component-title">Extra Scripts</span> - <input type="text" name="subtitles_extra_scripts" value="${'|'.join(sickbeard.SUBTITLES_EXTRA_SCRIPTS)}" class="form-control input-sm input350" /> + <input type="text" name="subtitles_extra_scripts" value="${'|'.join(sickbeard.SUBTITLES_EXTRA_SCRIPTS)}" class="form-control input-sm input350" autocapitalize="off" /> </label> <label class="nocheck"> <span class="component-title"> </span> @@ -144,7 +157,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } </label> </div> - <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <br><input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </div> </fieldset> </div><!-- /component-group1 //--> @@ -162,7 +175,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <ul id="service_order_list"> % for curService in sickbeard.subtitles.sortedServiceList(): <li class="ui-state-default" id="${curService['name']}"> - <input type="checkbox" id="enable_${curService['name']}" class="service_enabler" ${('', 'checked="checked"')[curService['enabled'] is True]}/> + <input type="checkbox" id="enable_${curService['name']}" class="service_enabler" ${('', 'checked="checked"')[curService['enabled'] is True]} autocapitalize="off" /> <a href="${anon_url(curService['url'])}" class="imgLink" target="_new"> <img src="${srRoot}/images/subtitles/${curService['image']}" alt="${curService['url']}" title="${curService['url']}" width="16" height="16" style="vertical-align:middle;"/> </a> @@ -171,9 +184,9 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } </li> % endfor </ul> - <input type="hidden" name="service_order" id="service_order" value="<%" ".join(['%s:%d' % (x['name'], x['enabled']) for x in sickbeard.subtitles.sortedServiceList()])%>"/> + <input type="hidden" name="service_order" id="service_order" value="<%" ".join(['%s:%d' % (x['name'], x['enabled']) for x in sickbeard.subtitles.sortedServiceList()])%>" autocapitalize="off" /> - <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <br><input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </fieldset> </div><!-- /component-group2 //--> <div id="core-component-group3" class="component-group"> @@ -198,21 +211,21 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } <label class="nocheck" for="${curService['name']}_user"> <span class="component-title">${curService['name'].capitalize()} User Name</span> <span class="component-desc"> - <input type="text" name="${curService['name']}_user" id="${curService['name']}_user" value="${providerLoginDict[curService['name']]['user']}" class="form-control input-sm input300" /> + <input type="text" name="${curService['name']}_user" id="${curService['name']}_user" value="${providerLoginDict[curService['name']]['user']}" class="form-control input-sm input300" autocapitalize="off" /> </span> </label> <label class="nocheck" for="${curService['name']}_pass"> <span class="component-title">${curService['name'].capitalize()} Password</span> <span class="component-desc"> - <input type="password" name="${curService['name']}_pass" id="${curService['name']}_pass" value="${providerLoginDict[curService['name']]['pass']}" class="form-control input-sm input300" /> + <input type="password" name="${curService['name']}_pass" id="${curService['name']}_pass" value="${providerLoginDict[curService['name']]['pass']}" class="form-control input-sm input300" autocapitalize="off" /> </span> </label> </div> % endfor - <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <br><input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </fieldset> </div><!-- /component-group3 //--> - <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> + <br><input type="submit" class="btn config_submitter" value="Save Changes" autocapitalize="off" /><br> </div><!-- /config-components //--> </form> diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako index 23fd582196121cf9e83f8f05437af381a446130d..e213dca5c99c54b9bcfdd45422bef89f8a4337e4 100644 --- a/gui/slick/views/displayShow.mako +++ b/gui/slick/views/displayShow.mako @@ -10,6 +10,7 @@ from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, FAILED from sickbeard.common import Quality, qualityPresets, statusStrings, Overview from sickbeard.helpers import anon_url + from sickrage.helper.common import pretty_file_size %> <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script> @@ -21,7 +22,7 @@ </%block> <%block name="content"> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> -<input type="hidden" id="srRoot" value="${srRoot}" /> +<input type="hidden" id="srRoot" value="${srRoot}" autocapitalize="off" /> <div class="pull-left form-inline"> Change Show: <div class="navShow"><img id="prevShow" src="${srRoot}/images/prev.png" alt="<<" title="Prev Show" /></div> @@ -201,7 +202,7 @@ </tr> % endif - <tr><td class="showLegend">Size:</td><td>${sickbeard.helpers.pretty_filesize(sickbeard.helpers.get_size(showLoc[0]))}</td></tr> + <tr><td class="showLegend">Size:</td><td>${pretty_file_size(sickbeard.helpers.get_size(showLoc[0]))}</td></tr> </table> @@ -239,20 +240,20 @@ % endif % endfor </select> - <input type="hidden" id="showID" value="${show.indexerid}" /> - <input type="hidden" id="indexer" value="${show.indexer}" /> - <input class="btn btn-inline" type="button" id="changeStatus" value="Go" /> + <input type="hidden" id="showID" value="${show.indexerid}" autocapitalize="off" /> + <input type="hidden" id="indexer" value="${show.indexer}" autocapitalize="off" /> + <input class="btn btn-inline" type="button" id="changeStatus" value="Go" autocapitalize="off" /> </div> </br> <div class="pull-right clearfix" id="checkboxControls"> <div style="padding-bottom: 5px;"> - <label for="wanted"><span class="wanted"><input type="checkbox" id="wanted" checked="checked" /> Wanted: <b>${epCounts[Overview.WANTED]}</b></span></label> - <label for="qual"><span class="qual"><input type="checkbox" id="qual" checked="checked" /> Low Quality: <b>${epCounts[Overview.QUAL]}</b></span></label> - <label for="good"><span class="good"><input type="checkbox" id="good" checked="checked" /> Downloaded: <b>${epCounts[Overview.GOOD]}</b></span></label> - <label for="skipped"><span class="skipped"><input type="checkbox" id="skipped" checked="checked" /> Skipped: <b>${epCounts[Overview.SKIPPED]}</b></span></label> - <label for="snatched"><span class="snatched"><input type="checkbox" id="snatched" checked="checked" /> Snatched: <b>${epCounts[Overview.SNATCHED]}</b></span></label> + <label for="wanted"><span class="wanted"><input type="checkbox" id="wanted" checked="checked" autocapitalize="off" /> Wanted: <b>${epCounts[Overview.WANTED]}</b></span></label> + <label for="qual"><span class="qual"><input type="checkbox" id="qual" checked="checked" autocapitalize="off" /> Low Quality: <b>${epCounts[Overview.QUAL]}</b></span></label> + <label for="good"><span class="good"><input type="checkbox" id="good" checked="checked" autocapitalize="off" /> Downloaded: <b>${epCounts[Overview.GOOD]}</b></span></label> + <label for="skipped"><span class="skipped"><input type="checkbox" id="skipped" checked="checked" autocapitalize="off" /> Skipped: <b>${epCounts[Overview.SKIPPED]}</b></span></label> + <label for="snatched"><span class="snatched"><input type="checkbox" id="snatched" checked="checked" autocapitalize="off" /> Snatched: <b>${epCounts[Overview.SNATCHED]}</b></span></label> </div> <button id="popover" type="button" class="btn btn-xs">Select Columns <b class="caret"></b></button> @@ -313,7 +314,7 @@ % if curSeason == -1: <thead> <tr class="seasoncols" style="display:none;"> - <th data-sorter="false" data-priority="critical" class="col-checkbox"><input type="checkbox" class="seasonCheck"/></th> + <th data-sorter="false" data-priority="critical" class="col-checkbox"><input type="checkbox" class="seasonCheck" autocapitalize="off" /></th> <th data-sorter="false" class="col-metadata">NFO</th> <th data-sorter="false" class="col-metadata">TBN</th> <th data-sorter="false" class="col-ep">Episode</th> @@ -352,7 +353,7 @@ </tbody> <tbody class="tablesorter-no-sort"> <tr id="season-${epResult["season"]}-cols" class="seasoncols"> - <th class="col-checkbox"><input type="checkbox" class="seasonCheck" id="${epResult["season"]}" /></th> + <th class="col-checkbox"><input type="checkbox" class="seasonCheck" id="${epResult["season"]}" autocapitalize="off" /></th> <th class="col-metadata">NFO</th> <th class="col-metadata">TBN</th> <th class="col-ep">Episode</th> @@ -392,7 +393,7 @@ </tbody> <tbody class="tablesorter-no-sort"> <tr id="season-${epResult["season"]}-cols" class="seasoncols"> - <th class="col-checkbox"><input type="checkbox" class="seasonCheck" id="${epResult["season"]}" /></th> + <th class="col-checkbox"><input type="checkbox" class="seasonCheck" id="${epResult["season"]}" autocapitalize="off" /></th> <th class="col-metadata">NFO</th> <th class="col-metadata">TBN</th> <th class="col-ep">Episode</th> @@ -420,7 +421,7 @@ <tr class="${Overview.overviewStrings[epCats[epStr]]} season-${curSeason} seasonstyle" id="${'S' + str(epResult["season"]) + 'E' + str(epResult["episode"])}"> <td class="col-checkbox"> % if int(epResult["status"]) != UNAIRED: - <input type="checkbox" class="epCheck" id="${str(epResult["season"])+'x'+str(epResult["episode"])}" name="${str(epResult["season"]) +"x"+str(epResult["episode"])}" /> + <input type="checkbox" class="epCheck" id="${str(epResult["season"])+'x'+str(epResult["episode"])}" name="${str(epResult["season"]) +"x"+str(epResult["episode"])}" autocapitalize="off" /> % endif </td> <td align="center"><img src="${srRoot}/images/${("nfo-no.gif", "nfo.gif")[epResult["hasnfo"]]}" alt="${("N", "Y")[epResult["hasnfo"]]}" width="23" height="11" /></td> @@ -444,7 +445,7 @@ % else: value="${str(scSeas)}x${str(scEpis)}" % endif - style="padding: 0; text-align: center; max-width: 60px;" /> + style="padding: 0; text-align: center; max-width: 60px;" autocapitalize="off" /> </td> <td align="center"> <input type="text" placeholder="${str(dfltAbsolute)}" size="6" maxlength="8" @@ -456,7 +457,7 @@ % else: value="${str(scAbsolute)}" % endif - style="padding: 0; text-align: center; max-width: 60px;" /> + style="padding: 0; text-align: center; max-width: 60px;" autocapitalize="off" /> </td> <td class="col-name"> % if epResult["description"] != "" and epResult["description"] is not None: @@ -469,8 +470,7 @@ <td class="col-name">${epLoc}</td> <td class="col-ep"> % if epResult["file_size"]: - <% file_size = sickbeard.helpers.pretty_filesize(epResult["file_size"]) %> - ${file_size} + ${pretty_file_size(epResult["file_size"])} % endif </td> <td class="col-airdate"> @@ -515,7 +515,7 @@ % endif <td class="col-search"> % if int(epResult["season"]) != 0: - % if ( int(epResult["status"]) in Quality.SNATCHED + Quality.DOWNLOADED ) and sickbeard.USE_FAILED_DOWNLOADS: + % if ( int(epResult["status"]) in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.DOWNLOADED ) and sickbeard.USE_FAILED_DOWNLOADS: <a class="epRetry" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="retryEpisode?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${srRoot}/images/search16.png" height="16" alt="retry" title="Retry Download" /></a> % else: <a class="epSearch" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="searchEpisode?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${srRoot}/images/search16.png" width="16" height="16" alt="search" title="Manual Search" /></a> diff --git a/gui/slick/views/editShow.mako b/gui/slick/views/editShow.mako index 299168570c6e184e613eb6e108dfe120d375dc2f..a16672e695cf46a80d87d7eee841cc4a1a1e4682 100644 --- a/gui/slick/views/editShow.mako +++ b/gui/slick/views/editShow.mako @@ -49,8 +49,8 @@ <label for="location"> <span class="component-title">Show Location</span> <span class="component-desc"> - <input type="hidden" name="show" value="${show.indexerid}" /> - <input type="text" name="location" id="location" value="${show._location}" class="form-control form-control-inline input-sm input350" /> + <input type="hidden" name="show" value="${show.indexerid}" autocapitalize="off" /> + <input type="text" name="location" id="location" value="${show._location}" class="form-control form-control-inline input-sm input350" autocapitalize="off" /> </span> </label> </div> @@ -73,7 +73,7 @@ <label for=""> <span class="component-title">Archive on first match</span> <span class="component-desc"> - <input type="checkbox" id="archive_firstmatch" name="archive_firstmatch" ${('', 'checked="checked"')[show.archive_firstmatch == 1]} /> archive episode after the first best match is found from your archive quality list + <input type="checkbox" id="archive_firstmatch" name="archive_firstmatch" ${('', 'checked="checked"')[show.archive_firstmatch == 1]} autocapitalize="off" /> archive episode after the first best match is found from your archive quality list </span> </label> </div> @@ -106,7 +106,7 @@ <label for="subtitles"> <span class="component-title">Subtitles</span> <span class="component-desc"> - <input type="checkbox" id="subtitles" name="subtitles" ${('', 'checked="checked"')[show.subtitles == 1 and sickbeard.USE_SUBTITLES is True]} ${('disabled="disabled"', '')[bool(sickbeard.USE_SUBTITLES)]}/> search for subtitles + <input type="checkbox" id="subtitles" name="subtitles" ${('', 'checked="checked"')[show.subtitles == 1 and sickbeard.USE_SUBTITLES is True]} ${('disabled="disabled"', '')[bool(sickbeard.USE_SUBTITLES)]} autocapitalize="off" /> search for subtitles </span> </label> </div> @@ -115,7 +115,7 @@ <label for="paused"> <span class="component-title">Paused</span> <span class="component-desc"> - <input type="checkbox" id="paused" name="paused" ${('', 'checked="checked"')[show.paused == 1]} /> pause this show (SickRage will not download episodes) + <input type="checkbox" id="paused" name="paused" ${('', 'checked="checked"')[show.paused == 1]} autocapitalize="off" /> pause this show (SickRage will not download episodes) </span> </label> </div> @@ -133,7 +133,7 @@ <label for="airbydate"> <span class="component-title">Air by date</span> <span class="component-desc"> - <input type="checkbox" id="airbydate" name="air_by_date" ${('', 'checked="checked"')[show.air_by_date == 1]} /> check if the show is released as Show.03.02.2010 rather than Show.S02E03.<br> + <input type="checkbox" id="airbydate" name="air_by_date" ${('', 'checked="checked"')[show.air_by_date == 1]} autocapitalize="off" /> check if the show is released as Show.03.02.2010 rather than Show.S02E03.<br> <span style="color:red">In case of an air date conflict between regular and special episodes, the later will be ignored.</span> </span> </label> @@ -155,7 +155,7 @@ <label for="sports"> <span class="component-title">Sports</span> <span class="component-desc"> - <input type="checkbox" id="sports" name="sports" ${('', 'checked="checked"')[show.sports == 1]}/> check if the show is a sporting or MMA event released as Show.03.02.2010 rather than Show.S02E03<br> + <input type="checkbox" id="sports" name="sports" ${('', 'checked="checked"')[show.sports == 1]} autocapitalize="off" /> check if the show is a sporting or MMA event released as Show.03.02.2010 rather than Show.S02E03<br> <span style="color:red">In case of an air date conflict between regular and special episodes, the later will be ignored.</span> </span> </label> @@ -165,7 +165,7 @@ <label for="season_folders"> <span class="component-title">Season folders</span> <span class="component-desc"> - <input type="checkbox" id="season_folders" name="flatten_folders" ${('checked="checked"', '')[show.flatten_folders == 1 and not sickbeard.NAMING_FORCE_FOLDERS]} ${('', 'disabled="disabled"')[bool(sickbeard.NAMING_FORCE_FOLDERS)]}/> group episodes by season folder (uncheck to store in a single folder) + <input type="checkbox" id="season_folders" name="flatten_folders" ${('checked="checked"', '')[show.flatten_folders == 1 and not sickbeard.NAMING_FORCE_FOLDERS]} ${('', 'disabled="disabled"')[bool(sickbeard.NAMING_FORCE_FOLDERS)]} autocapitalize="off" /> group episodes by season folder (uncheck to store in a single folder) </span> </label> </div> @@ -174,7 +174,7 @@ <label for="scene"> <span class="component-title">Scene Numbering</span> <span class="component-desc"> - <input type="checkbox" id="scene" name="scene" ${('', 'checked="checked"')[show.scene == 1]} /> search by scene numbering (uncheck to search by indexer numbering) + <input type="checkbox" id="scene" name="scene" ${('', 'checked="checked"')[show.scene == 1]} autocapitalize="off" /> search by scene numbering (uncheck to search by indexer numbering) </span> </label> </div> @@ -183,7 +183,7 @@ <label for="dvdorder"> <span class="component-title">DVD Order</span> <span class="component-desc"> - <input type="checkbox" id="dvdorder" name="dvdorder" ${('', 'checked="checked"')[show.dvdorder == 1]} /> use the DVD order instead of the air order<br> + <input type="checkbox" id="dvdorder" name="dvdorder" ${('', 'checked="checked"')[show.dvdorder == 1]} autocapitalize="off" /> use the DVD order instead of the air order<br> <div class="clear-left"><p>A "Force Full Update" is necessary, and if you have existing episodes you need to sort them manually.</p></div> </span> </label> @@ -202,7 +202,7 @@ <label for="rls_ignore_words"> <span class="component-title">Ignored Words</span> <span class="component-desc"> - <input type="text" id="rls_ignore_words" name="rls_ignore_words" id="rls_ignore_words" value="${show.rls_ignore_words}" class="form-control form-control-inline input-sm input350" /><br> + <input type="text" id="rls_ignore_words" name="rls_ignore_words" id="rls_ignore_words" value="${show.rls_ignore_words}" class="form-control form-control-inline input-sm input350" autocapitalize="off" /><br> <div class="clear-left"> <p>comma-separated <i>e.g. "word1,word2,word3"</i></> <p>Search results with one or more words from this list will be ignored.</p> @@ -215,7 +215,7 @@ <label for="rls_require_words"> <span class="component-title">Required Words</span> <span class="component-desc"> - <input type="text" id="rls_require_words" name="rls_require_words" id="rls_require_words" value="${show.rls_require_words}" class="form-control form-control-inline input-sm input350" /><br> + <input type="text" id="rls_require_words" name="rls_require_words" id="rls_require_words" value="${show.rls_require_words}" class="form-control form-control-inline input-sm input350" autocapitalize="off" /><br> <div class="clear-left"> <p>comma-separated <i>e.g. "word1,word2,word3"</i></p> <p>Search results with no words from this list will be ignored.</p> @@ -228,14 +228,14 @@ <label for="SceneName"> <span class="component-title">Scene Exception</span> <span class="component-desc"> - <input type="text" id="SceneName" class="form-control form-control-inline input-sm input200" /><input class="btn btn-inline" type="button" value="Add" id="addSceneName" /><br><br> + <input type="text" id="SceneName" class="form-control form-control-inline input-sm input200" autocapitalize="off" /><input class="btn btn-inline" type="button" value="Add" id="addSceneName" autocapitalize="off" /><br><br> <div class="pull-left"> <select id="exceptions_list" name="exceptions_list" multiple="multiple" style="min-width:200px;height:99px;"> % for cur_exception in show.exceptions: <option value="${cur_exception}">${cur_exception}</option> % endfor </select> - <div><input id="removeSceneName" value="Remove" class="btn float-left" type="button" style="margin-top: 10px;"/></div> + <div><input id="removeSceneName" value="Remove" class="btn float-left" type="button" style="margin-top: 10px;" autocapitalize="off" /></div> </div> <div class="clear-left"><p>This will affect episode search on NZB and torrent providers. This list overrides the original name; it doesn't append to it.</p></div> </span> diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako index 431137155ad592f82290d61f807952451c1ea06e..df431a375c11b71f216b57c55e2505ee9f4555cd 100644 --- a/gui/slick/views/home.mako +++ b/gui/slick/views/home.mako @@ -4,6 +4,7 @@ import calendar from sickbeard import sbdatetime from sickbeard import network_timezones + from sickrage.helper.common import pretty_file_size import re %> <%block name="metas"> @@ -299,23 +300,21 @@ if not cur_total: cur_total = 0 - if cur_total != 0: - download_stat = str(cur_downloaded) - download_stat_tip = "Downloaded: " + str(cur_downloaded) - if cur_snatched > 0: - download_stat = download_stat + "+" + str(cur_snatched) - download_stat_tip = download_stat_tip + "
" + "Snatched: " + str(cur_snatched) + download_stat = str(cur_downloaded) + download_stat_tip = "Downloaded: " + str(cur_downloaded) + if cur_snatched: + download_stat = download_stat + "+" + str(cur_snatched) + download_stat_tip = download_stat_tip + "
" + "Snatched: " + str(cur_snatched) - download_stat = download_stat + " / " + str(cur_total) - download_stat_tip = download_stat_tip + "
" + "Total: " + str(cur_total) - else: - download_stat = '?' - download_stat_tip = "no data" + download_stat = download_stat + " / " + str(cur_total) + download_stat_tip = download_stat_tip + "
" + "Total: " + str(cur_total) nom = cur_downloaded - den = cur_total - if den == 0: + if cur_total: + den = cur_total + else: den = 1 + download_stat_tip = "Unaired" progressbar_percent = nom * 100 / den %> @@ -393,7 +392,7 @@ </td> ## <% show_size = sickbeard.helpers.get_size(curShow._location) %> - ## <td align="center" data-show-size="${show_size}">${sickbeard.helpers.pretty_filesize(show_size)}</td> + ## <td align="center" data-show-size="${show_size}">${pretty_file_size(show_size)}</td> <td align="center"> <% paused = int(curShow.paused) == 0 and curShow.status == 'Continuing' %> diff --git a/gui/slick/views/home_addExistingShow.mako b/gui/slick/views/home_addExistingShow.mako index 902429e6ba7945de409a708d7ef7fad849d41a70..5a39036099f5041e371ca350669f047da5d30c84 100644 --- a/gui/slick/views/home_addExistingShow.mako +++ b/gui/slick/views/home_addExistingShow.mako @@ -41,7 +41,7 @@ <p>SickRage can add existing shows, using the current options, by using locally stored NFO/XML metadata to eliminate user interaction. If you would rather have SickRage prompt you to customize each show, then use the checkbox below.</p> - <p><input type="checkbox" name="promptForSettings" id="promptForSettings" /> <label for="promptForSettings">Prompt me to set settings for each show</label></p> + <p><input type="checkbox" name="promptForSettings" id="promptForSettings" autocapitalize="off" /> <label for="promptForSettings">Prompt me to set settings for each show</label></p> <hr /> @@ -52,7 +52,7 @@ <div id="tableDiv"></div> <br> <br> - <input class="btn btn-primary" type="button" value="Submit" id="submitShowDirs" /> + <input class="btn btn-primary" type="button" value="Submit" id="submitShowDirs" autocapitalize="off" /> </form> diff --git a/gui/slick/views/home_newShow.mako b/gui/slick/views/home_newShow.mako index 6905df264290f57e0007e556907b0bdcca2105b7..9137f8e01e42844f7146936338da38d0d69c3c44 100644 --- a/gui/slick/views/home_newShow.mako +++ b/gui/slick/views/home_newShow.mako @@ -34,16 +34,16 @@ <legend class="legendStep">Find a show on theTVDB</legend> <div class="stepDiv"> - <input type="hidden" id="indexer_timeout" value="${sickbeard.INDEXER_TIMEOUT}" /> + <input type="hidden" id="indexer_timeout" value="${sickbeard.INDEXER_TIMEOUT}" autocapitalize="off" /> % if use_provided_info: Show retrieved from existing metadata: <a href="${anon_url(sickbeard.indexerApi(provided_indexer).config['show_url'], provided_indexer_id)}">${provided_indexer_name}</a> - <input type="hidden" id="indexerLang" name="indexerLang" value="en" /> - <input type="hidden" id="whichSeries" name="whichSeries" value="${provided_indexer_id}" /> - <input type="hidden" id="providedIndexer" name="providedIndexer" value="${provided_indexer}" /> - <input type="hidden" id="providedName" value="${provided_indexer_name}" /> + <input type="hidden" id="indexerLang" name="indexerLang" value="en" autocapitalize="off" /> + <input type="hidden" id="whichSeries" name="whichSeries" value="${provided_indexer_id}" autocapitalize="off" /> + <input type="hidden" id="providedIndexer" name="providedIndexer" value="${provided_indexer}" autocapitalize="off" /> + <input type="hidden" id="providedName" value="${provided_indexer_name}" autocapitalize="off" /> % else: - <input type="text" id="nameToSearch" value="${default_show_name}" class="form-control form-control-inline input-sm input350" /> + <input type="text" id="nameToSearch" value="${default_show_name}" class="form-control form-control-inline input-sm input350" autocapitalize="off" /> <select name="indexerLang" id="indexerLangSelect" class="form-control form-control-inline input-sm bfh-languages" data-language="${sickbeard.INDEXER_DEFAULT_LANGUAGE}" data-available="${','.join(sickbeard.indexerApi().config['valid_languages'])}"> </select><b>*</b> @@ -57,7 +57,7 @@ % endfor </select> - <input class="btn btn-inline" type="button" id="searchName" value="Search" /> + <input class="btn btn-inline" type="button" id="searchName" value="Search" autocapitalize="off" /> <br><br> <b>*</b> This will only affect the language of the retrieved metadata file contents and episode filenames.<br> @@ -74,7 +74,7 @@ <div class="stepDiv"> % if provided_show_dir: Pre-chosen Destination Folder: <b>${provided_show_dir}</b> <br> - <input type="hidden" id="fullShowPath" name="fullShowPath" value="${provided_show_dir}" /><br> + <input type="hidden" id="fullShowPath" name="fullShowPath" value="${provided_show_dir}" autocapitalize="off" /><br> % else: <%include file="/inc_rootDirs.mako"/> % endif @@ -89,17 +89,17 @@ </fieldset> % for curNextDir in other_shows: - <input type="hidden" name="other_shows" value="${curNextDir}" /> + <input type="hidden" name="other_shows" value="${curNextDir}" autocapitalize="off" /> % endfor - <input type="hidden" name="skipShow" id="skipShow" value="" /> + <input type="hidden" name="skipShow" id="skipShow" value="" autocapitalize="off" /> </form> <br> <div style="width: 100%; text-align: center;"> -<input class="btn" type="button" id="addShowButton" value="Add Show" disabled="disabled" /> +<input class="btn" type="button" id="addShowButton" value="Add Show" disabled="disabled" autocapitalize="off" /> % if provided_show_dir: -<input class="btn" type="button" id="skipShowButton" value="Skip Show" /> +<input class="btn" type="button" id="skipShowButton" value="Skip Show" autocapitalize="off" /> % endif </div> </div></div></div></div> diff --git a/gui/slick/views/home_postprocess.mako b/gui/slick/views/home_postprocess.mako index 8876ebd9c2ed11848b9bd1ff332edab78b8c3755..dc2fdac89bb086a385c8df3dafde1c061f2c32a3 100644 --- a/gui/slick/views/home_postprocess.mako +++ b/gui/slick/views/home_postprocess.mako @@ -19,7 +19,7 @@ <b>Enter the folder containing the episode:</b> </td> <td> - <input type="text" name="dir" id="episodeDir" class="form-control form-control-inline input-sm input350" /> + <input type="text" name="dir" id="episodeDir" class="form-control form-control-inline input-sm input350" autocapitalize="off" /> </td> </tr> <tr> @@ -72,7 +72,7 @@ </tr> % endif </table> - <input id="submit" class="btn" type="submit" value="Process" /> + <input id="submit" class="btn" type="submit" value="Process" autocapitalize="off" /> </form> </div> </%block> diff --git a/gui/slick/views/inc_addShowOptions.mako b/gui/slick/views/inc_addShowOptions.mako index bfeb9b4653c54aa20618f28e1b5cbf3f9b737f90..d6f4655fa2b9f159748ee59883812e488887d162 100644 --- a/gui/slick/views/inc_addShowOptions.mako +++ b/gui/slick/views/inc_addShowOptions.mako @@ -9,7 +9,7 @@ <label for="subtitles" class="clearfix"> <span class="component-title">Subtitles</span> <span class="component-desc"> - <input type="checkbox" name="subtitles" id="subtitles" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_DEFAULT)]} /> + <input type="checkbox" name="subtitles" id="subtitles" ${('', 'checked="checked"')[bool(sickbeard.SUBTITLES_DEFAULT)]} autocapitalize="off" /> <p>Download subtitles for this show?</p> </span> </label> @@ -44,7 +44,7 @@ <label for="flatten_folders" class="clearfix"> <span class="component-title">Flatten Folders</span> <span class="component-desc"> - <input class="cb" type="checkbox" name="flatten_folders" id="flatten_folders" ${('', 'checked="checked"')[bool(sickbeard.FLATTEN_FOLDERS_DEFAULT)]}/> + <input class="cb" type="checkbox" name="flatten_folders" id="flatten_folders" ${('', 'checked="checked"')[bool(sickbeard.FLATTEN_FOLDERS_DEFAULT)]} autocapitalize="off" /> <p>Disregard sub-folders?</p> </span> </label> @@ -55,7 +55,7 @@ <label for="anime" class="clearfix"> <span class="component-title">Anime</span> <span class="component-desc"> - <input type="checkbox" name="anime" id="anime" ${('', 'checked="checked"')[bool(sickbeard.ANIME_DEFAULT)]} /> + <input type="checkbox" name="anime" id="anime" ${('', 'checked="checked"')[bool(sickbeard.ANIME_DEFAULT)]} autocapitalize="off" /> <p>Is this show an Anime?<p> </span> </label> @@ -66,7 +66,7 @@ <label for="scene" class="clearfix"> <span class="component-title">Scene Numbering</span> <span class="component-desc"> - <input type="checkbox" name="scene" id="scene" ${('', 'checked="checked"')[bool(sickbeard.SCENE_DEFAULT)]} /> + <input type="checkbox" name="scene" id="scene" ${('', 'checked="checked"')[bool(sickbeard.SCENE_DEFAULT)]} autocapitalize="off" /> <p>Is this show scene numbered?</p> </span> </label> @@ -76,7 +76,7 @@ <label for="archive" class="clearfix"> <span class="component-title">Archive first match</span> <span class="component-desc"> - <input type="checkbox" name="archive" id="archive" ${('', 'checked="checked"')[bool(sickbeard.ARCHIVE_DEFAULT)]} /> + <input type="checkbox" name="archive" id="archive" ${('', 'checked="checked"')[bool(sickbeard.ARCHIVE_DEFAULT)]} autocapitalize="off" /> <p>Archive episodes after downloading first match?</p> </span> </label> @@ -90,7 +90,7 @@ <br> <div class="field-pair alt"> <label for="saveDefaultsButton" class="nocheck clearfix"> - <span class="component-title"><input class="btn btn-inline" type="button" id="saveDefaultsButton" value="Save Defaults" disabled="disabled" /></span> + <span class="component-title"><input class="btn btn-inline" type="button" id="saveDefaultsButton" value="Save Defaults" disabled="disabled" autocapitalize="off" /></span> <span class="component-desc"> <p>Use current values as the defaults</p> </span> @@ -101,5 +101,5 @@ <% import sickbeard.blackandwhitelist %> <%include file="/inc_blackwhitelist.mako"/> % else: - <input type="hidden" name="anime" id="anime" value="0" /> + <input type="hidden" name="anime" id="anime" value="0" autocapitalize="off" /> % endif diff --git a/gui/slick/views/inc_blackwhitelist.mako b/gui/slick/views/inc_blackwhitelist.mako index 37cc9fb65d8669432e430faccc6c1b555ee52844..5e9157fa9e39542b3a6030516f90addf838d161e 100644 --- a/gui/slick/views/inc_blackwhitelist.mako +++ b/gui/slick/views/inc_blackwhitelist.mako @@ -1,6 +1,6 @@ <div id="blackwhitelist"> - <input type="hidden" name="whitelist" id="whitelist"/> - <input type="hidden" name="blacklist" id="blacklist"/> + <input type="hidden" name="whitelist" id="whitelist" autocapitalize="off" /> + <input type="hidden" name="blacklist" id="blacklist" autocapitalize="off" /> <b>Fansub Groups:</b> <div > @@ -22,7 +22,7 @@ % endfor </select> <br> - <input class="btn" id="removeW" value="Remove" type="button"/> + <input class="btn" id="removeW" value="Remove" type="button" autocapitalize="off" /> </div> <div class="blackwhitelist pool"> <span><h4>Available Groups</h4></span> @@ -34,8 +34,8 @@ % endfor </select> <br> - <input class="btn" id="addW" value="Add to Whitelist" type="button"/> - <input class="btn" id="addB" value="Add to Blacklist" type="button"/> + <input class="btn" id="addW" value="Add to Whitelist" type="button" autocapitalize="off" /> + <input class="btn" id="addB" value="Add to Blacklist" type="button" autocapitalize="off" /> </div> <div class="blackwhitelist black"> <span><h4>Blacklist</h4></span> @@ -45,12 +45,12 @@ % endfor </select> <br> - <input class="btn" id="removeB" value="Remove" type="button"/> + <input class="btn" id="removeB" value="Remove" type="button" autocapitalize="off" /> </div> </div> <br style="clear:both" /> <div class="blackwhitelist manual"> - <input type="text" id="addToPoolText" class="form-control form-control-inline input-sm input250" /> + <input type="text" id="addToPoolText" class="form-control form-control-inline input-sm input250" autocapitalize="off" /> <input class="btn btn-inline" type="button" value="Add to Whitelist" id="addToWhite"> <input class="btn btn-inline" type="button" value="Add to Blacklist" id="addToBlack"> </div> diff --git a/gui/slick/views/inc_rootDirs.mako b/gui/slick/views/inc_rootDirs.mako index ecdec42255be6864b5c5397236fde1cb664ad22a..8196c1b1c73a3b4f9b6226b5358a99c5b194bfe8 100644 --- a/gui/slick/views/inc_rootDirs.mako +++ b/gui/slick/views/inc_rootDirs.mako @@ -12,7 +12,7 @@ <span id="sampleRootDir"></span> -<input type="hidden" id="whichDefaultRootDir" value="${backend_default}" /> +<input type="hidden" id="whichDefaultRootDir" value="${backend_default}" autocapitalize="off" /> <div class="rootdir-selectbox"> <select name="rootDir" id="rootDirs" size="6"> % for cur_dir in backend_dirs: @@ -21,9 +21,9 @@ </select> </div> <div id="rootDirsControls" class="rootdir-controls"> - <input class="btn" type="button" id="addRootDir" value="New" /> - <input class="btn" type="button" id="editRootDir" value="Edit" /> - <input class="btn" type="button" id="deleteRootDir" value="Delete" /> - <input class="btn" type="button" id="defaultRootDir" value="Set as Default *" /> + <input class="btn" type="button" id="addRootDir" value="New" autocapitalize="off" /> + <input class="btn" type="button" id="editRootDir" value="Edit" autocapitalize="off" /> + <input class="btn" type="button" id="deleteRootDir" value="Delete" autocapitalize="off" /> + <input class="btn" type="button" id="defaultRootDir" value="Set as Default *" autocapitalize="off" /> </div> -<input type="text" style="display: none" id="rootDirText" /> +<input type="text" style="display: none" id="rootDirText" autocapitalize="off" /> diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index 19fcb9965b463ad3cd2721cec972f892edd7e1da..3b850185cad01a60fd8ad8c7d9dacccadb4e611c 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -3,6 +3,7 @@ import re import sickbeard from sickbeard import network_timezones + from sickrage.helper.common import pretty_file_size from sickrage.show.Show import Show from time import time @@ -301,7 +302,7 @@ <div> % if has_resource_module: - Memory used: <span class="footerhighlight">${sickbeard.helpers.pretty_filesize(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)}</span> | + Memory used: <span class="footerhighlight">${pretty_file_size(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)}</span> | % endif Load time: <span class="footerhighlight">${"%.4f" % (time() - sbStartTime)}s</span> / Mako: <span class="footerhighlight">${"%.4f" % (time() - makoStartTime)}s</span> | Branch: <span class="footerhighlight">${sickbeard.BRANCH}</span> | diff --git a/gui/slick/views/login.mako b/gui/slick/views/login.mako index 57a20f0cc9a353810446bacf5db65fd484b7c9f1..c863b8d65d447acab4dcb7b8b737846ef71e47ff 100644 --- a/gui/slick/views/login.mako +++ b/gui/slick/views/login.mako @@ -3,11 +3,11 @@ <div class="login"> <form action="" method="post"> <h1>SickRage</h1> - <div class="ctrlHolder"><input class="inlay" name="username" type="text" placeholder="Username" autocomplete="off" /></div> - <div class="ctrlHolder"><input class="inlay" name="password" type="password" placeholder="Password" autocomplete="off" /></div> + <div class="ctrlHolder"><input class="inlay" name="username" type="text" placeholder="Username" autocomplete="off" autocapitalize="off" /></div> + <div class="ctrlHolder"><input class="inlay" name="password" type="password" placeholder="Password" autocomplete="off" autocapitalize="off" /></div> <div class="ctrlHolder"> - <label class="remember_me" title="for 30 days"><input class="inlay" id="remember_me" name="remember_me" type="checkbox" value="1"checked="checked" /> Remember me</label> - <input class="button" name="submit" type="submit" value="Login" /> + <label class="remember_me" title="for 30 days"><input class="inlay" id="remember_me" name="remember_me" type="checkbox" value="1"checked="checked" autocapitalize="off" /> Remember me</label> + <input class="button" name="submit" type="submit" value="Login" autocapitalize="off" /> </div> </form> </div> diff --git a/gui/slick/views/manage.mako b/gui/slick/views/manage.mako index bcac1e4bd9a5cbad61c83e517c6d20c9e0be3aeb..23b8c5993e7e23dbc12fc3bbe6bab763a00f4af5 100644 --- a/gui/slick/views/manage.mako +++ b/gui/slick/views/manage.mako @@ -19,7 +19,7 @@ <table id="massUpdateTable" class="sickbeardTable tablesorter" cellspacing="1" border="0" cellpadding="0"> <thead> <tr> - <th class="col-checkbox">Edit<br><input type="checkbox" class="bulkCheck" id="editCheck" /></th> + <th class="col-checkbox">Edit<br><input type="checkbox" class="bulkCheck" id="editCheck" autocapitalize="off" /></th> <th class="nowrap" style="text-align: left;">Show Name</th> <th class="col-quality">Quality</th> <th class="col-legend">Sports</th> @@ -31,22 +31,22 @@ <th class="col-legend">Subtitle</th> <th class="col-legend">Default Ep<br>Status</th> <th class="col-legend">Status</th> - <th width="1%">Update<br><input type="checkbox" class="bulkCheck" id="updateCheck" /></th> - <th width="1%">Rescan<br><input type="checkbox" class="bulkCheck" id="refreshCheck" /></th> - <th width="1%">Rename<br><input type="checkbox" class="bulkCheck" id="renameCheck" /></th> + <th width="1%">Update<br><input type="checkbox" class="bulkCheck" id="updateCheck" autocapitalize="off" /></th> + <th width="1%">Rescan<br><input type="checkbox" class="bulkCheck" id="refreshCheck" autocapitalize="off" /></th> + <th width="1%">Rename<br><input type="checkbox" class="bulkCheck" id="renameCheck" autocapitalize="off" /></th> % if sickbeard.USE_SUBTITLES: - <th width="1%">Search Subtitle<br><input type="checkbox" class="bulkCheck" id="subtitleCheck" /></th> + <th width="1%">Search Subtitle<br><input type="checkbox" class="bulkCheck" id="subtitleCheck" autocapitalize="off" /></th> % endif - <!-- <th>Force Metadata Regen <input type="checkbox" class="bulkCheck" id="metadataCheck" /></th>//--> - <th width="1%">Delete<br><input type="checkbox" class="bulkCheck" id="deleteCheck" /></th> - <th width="1%">Remove<br><input type="checkbox" class="bulkCheck" id="removeCheck" /></th> + <!-- <th>Force Metadata Regen <input type="checkbox" class="bulkCheck" id="metadataCheck" autocapitalize="off" /></th>//--> + <th width="1%">Delete<br><input type="checkbox" class="bulkCheck" id="deleteCheck" autocapitalize="off" /></th> + <th width="1%">Remove<br><input type="checkbox" class="bulkCheck" id="removeCheck" autocapitalize="off" /></th> </tr> </thead> <tfoot> <tr> - <td rowspan="1" colspan="2" class="align-center alt"><input class="btn pull-left" type="button" value="Edit Selected" id="submitMassEdit" /></td> - <td rowspan="1" colspan="${(15, 16)[bool(sickbeard.USE_SUBTITLES)]}" class="align-right alt"><input class="btn pull-right" type="button" value="Submit" id="submitMassUpdate" /></td> + <td rowspan="1" colspan="2" class="align-center alt"><input class="btn pull-left" type="button" value="Edit Selected" id="submitMassEdit" autocapitalize="off" /></td> + <td rowspan="1" colspan="${(15, 16)[bool(sickbeard.USE_SUBTITLES)]}" class="align-right alt"><input class="btn pull-right" type="button" value="Submit" id="submitMassUpdate" autocapitalize="off" /></td> </tr> </tfoot> @@ -67,39 +67,39 @@ <% curUpdate_disabled = "disabled=\"disabled\" " %> % endif - <% curUpdate = "<input type=\"checkbox\" class=\"updateCheck\" id=\"update-"+str(curShow.indexerid)+"\" "+curUpdate_disabled+"/>" %> + <% curUpdate = "<input type=\"checkbox\" class=\"updateCheck\" id=\"update-"+str(curShow.indexerid)+"\" "+curUpdate_disabled+" autocapitalize="off" />" %> % if sickbeard.showQueueScheduler.action.isBeingRefreshed(curShow) or sickbeard.showQueueScheduler.action.isInRefreshQueue(curShow): <% curRefresh_disabled = "disabled=\"disabled\" " %> % endif - <% curRefresh = "<input type=\"checkbox\" class=\"refreshCheck\" id=\"refresh-"+str(curShow.indexerid)+"\" "+curRefresh_disabled+"/>" %> + <% curRefresh = "<input type=\"checkbox\" class=\"refreshCheck\" id=\"refresh-"+str(curShow.indexerid)+"\" "+curRefresh_disabled+" autocapitalize="off" />" %> % if sickbeard.showQueueScheduler.action.isBeingRenamed(curShow) or sickbeard.showQueueScheduler.action.isInRenameQueue(curShow): <% curRename = "disabled=\"disabled\" " %> % endif - <% curRename = "<input type=\"checkbox\" class=\"renameCheck\" id=\"rename-"+str(curShow.indexerid)+"\" "+curRename_disabled+"/>" %> + <% curRename = "<input type=\"checkbox\" class=\"renameCheck\" id=\"rename-"+str(curShow.indexerid)+"\" "+curRename_disabled+" autocapitalize="off" />" %> % if not curShow.subtitles or sickbeard.showQueueScheduler.action.isBeingSubtitled(curShow) or sickbeard.showQueueScheduler.action.isInSubtitleQueue(curShow): <% curSubtitle_disabled = "disabled=\"disabled\" " %> % endif - <% curSubtitle = "<input type=\"checkbox\" class=\"subtitleCheck\" id=\"subtitle-"+str(curShow.indexerid)+"\" "+curSubtitle_disabled+"/>" %> + <% curSubtitle = "<input type=\"checkbox\" class=\"subtitleCheck\" id=\"subtitle-"+str(curShow.indexerid)+"\" "+curSubtitle_disabled+" autocapitalize="off" />" %> % if sickbeard.showQueueScheduler.action.isBeingRenamed(curShow) or sickbeard.showQueueScheduler.action.isInRenameQueue(curShow) or sickbeard.showQueueScheduler.action.isInRefreshQueue(curShow): <% curDelete = "disabled=\"disabled\" " %> % endif - <% curDelete = "<input type=\"checkbox\" class=\"deleteCheck\" id=\"delete-"+str(curShow.indexerid)+"\" "+curDelete_disabled+"/>" %> + <% curDelete = "<input type=\"checkbox\" class=\"deleteCheck\" id=\"delete-"+str(curShow.indexerid)+"\" "+curDelete_disabled+" autocapitalize="off" />" %> % if sickbeard.showQueueScheduler.action.isBeingRenamed(curShow) or sickbeard.showQueueScheduler.action.isInRenameQueue(curShow) or sickbeard.showQueueScheduler.action.isInRefreshQueue(curShow): <% curRemove = "disabled=\"disabled\" " %> % endif - <% curRemove = "<input type=\"checkbox\" class=\"removeCheck\" id=\"remove-"+str(curShow.indexerid)+"\" "+curRemove_disabled+"/>" %> + <% curRemove = "<input type=\"checkbox\" class=\"removeCheck\" id=\"remove-"+str(curShow.indexerid)+"\" "+curRemove_disabled+" autocapitalize="off" />" %> <tr> - <td align="center"><input type="checkbox" class="editCheck" id="edit-${curShow.indexerid}" /></td> + <td align="center"><input type="checkbox" class="editCheck" id="edit-${curShow.indexerid}" autocapitalize="off" /></td> <td class="tvShow"><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td> <td align="center">${renderQualityPill(curShow.quality, showTitle=True)}</td> <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_sports) == 1]} width="16" height="16" /></td> diff --git a/gui/slick/views/manage_backlogOverview.mako b/gui/slick/views/manage_backlogOverview.mako index 449418457d9ecb1f435f3f0cd25912fc4d3894a7..9a06ea968251ad4fa2a20d056b5d399239bb01c3 100644 --- a/gui/slick/views/manage_backlogOverview.mako +++ b/gui/slick/views/manage_backlogOverview.mako @@ -20,16 +20,20 @@ % endif <% - totalWanted = 0 - totalQual = 0 - backLogShows = sorted([x for x in sickbeard.showList if showCounts[x.indexerid][Overview.QUAL] + showCounts[x.indexerid][Overview.WANTED]], key=lambda x: x.name) + showQualSnatched = lambda x: Quality.splitQuality(x.quality)[1] and not x.archive_firstmatch + + totalWanted = totalQual = totalQualSnatched = 0 + backLogShows = sorted([x for x in sickbeard.showList if showCounts[x.indexerid][Overview.QUAL] + showCounts[x.indexerid][Overview.WANTED] + showCounts[x.indexerid][Overview.SNATCHED]], key=lambda x: x.name) for curShow in backLogShows: totalWanted += showCounts[curShow.indexerid][Overview.WANTED] totalQual += showCounts[curShow.indexerid][Overview.QUAL] + if showQualSnatched(curShow): + totalQualSnatched += showCounts[x.indexerid][Overview.SNATCHED] %> <div class="h2footer pull-right"> <span class="listing-key wanted">Wanted: <b>${totalWanted}</b></span> + <span class="listing-key snatched">Snatched (Low Quality): <b>${totalQualSnatched}</b></span> <span class="listing-key qual">Low Quality: <b>${totalQual}</b></span> </div><br> @@ -44,11 +48,17 @@ Jump to Show <table class="sickbeardTable" cellspacing="0" border="0" cellpadding="0"> % for curShow in backLogShows: + % if not showQualSnatched(curShow) and not showCounts[curShow.indexerid][Overview.WANTED] + showCounts[curShow.indexerid][Overview.QUAL]: + <% continue %> + % endif <tr class="seasonheader" id="show-${curShow.indexerid}"> <td colspan="3" class="align-left"> <br><h2><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></h2> <div class="pull-right"> <span class="listing-key wanted">Wanted: <b>${showCounts[curShow.indexerid][Overview.WANTED]}</b></span> + % if showQualSnatched(curShow): + <span class="listing-key snatched">Snatched (Low Quality): <b>${showCounts[curShow.indexerid][Overview.SNATCHED]}</b></span> + % endif <span class="listing-key qual">Low Quality: <b>${showCounts[curShow.indexerid][Overview.QUAL]}</b></span> <a class="btn btn-inline forceBacklog" href="${srRoot}/manage/backlogShow?indexer_id=${curShow.indexerid}"><i class="icon-play-circle icon-white"></i> Force Backlog</a> </div> @@ -60,8 +70,12 @@ Jump to Show % for curResult in showSQLResults[curShow.indexerid]: <% whichStr = 'S%02dE%02d' % (curResult['season'], curResult['episode']) - if whichStr not in showCats[curShow.indexerid] or showCats[curShow.indexerid][whichStr] not in (Overview.QUAL, Overview.WANTED): + if whichStr not in showCats[curShow.indexerid] or showCats[curShow.indexerid][whichStr] not in (Overview.QUAL, Overview.WANTED, Overview.SNATCHED): continue + + if not showQualSnatched(curShow): + if showCats[curShow.indexerid][whichStr] == Overview.SNATCHED: + continue %> <tr class="seasonstyle ${Overview.overviewStrings[showCats[curShow.indexerid][whichStr]]}"> <td class="tableleft" align="center">${whichStr}</td> diff --git a/gui/slick/views/manage_episodeStatuses.mako b/gui/slick/views/manage_episodeStatuses.mako index 8bb6aa0d1d459cd6d1c15999498a98587b2fe28c..33d50a6275118a6b3652e9bfb154c9648f457f7b 100644 --- a/gui/slick/views/manage_episodeStatuses.mako +++ b/gui/slick/views/manage_episodeStatuses.mako @@ -31,26 +31,26 @@ Manage episodes with status <select name="whichStatus" class="form-control form- %endif % endfor </select> -<input class="btn btn-inline" type="submit" value="Manage" /> +<input class="btn btn-inline" type="submit" value="Manage" autocapitalize="off" /> </form> % else: <form action="${srRoot}/manage/changeEpisodeStatuses" method="post"> -<input type="hidden" id="oldStatus" name="oldStatus" value="${whichStatus}" /> +<input type="hidden" id="oldStatus" name="oldStatus" value="${whichStatus}" autocapitalize="off" /> <h2>Shows containing ${common.statusStrings[whichStatus]} episodes</h2> <br> <% - if int(whichStatus) in [common.IGNORED, common.SNATCHED] + common.Quality.DOWNLOADED + common.Quality.ARCHIVED: + if int(whichStatus) in [common.IGNORED, common.SNATCHED, common.SNATCHED_PROPER, common.SNATCHED_BEST] + common.Quality.DOWNLOADED + common.Quality.ARCHIVED: row_class = "good" else: row_class = common.Overview.overviewStrings[int(whichStatus)] %> -<input type="hidden" id="row_class" value="${row_class}" /> +<input type="hidden" id="row_class" value="${row_class}" autocapitalize="off" /> Set checked shows/episodes to <select name="newStatus" class="form-control form-control-inline input-sm"> <% @@ -71,7 +71,7 @@ Set checked shows/episodes to <select name="newStatus" class="form-control form- </select> -<input class="btn btn-inline" type="submit" value="Go" /> +<input class="btn btn-inline" type="submit" value="Go" autocapitalize="off" /> <div> <button type="button" class="btn btn-xs selectAllShows">Select all</a></button> @@ -82,8 +82,8 @@ Set checked shows/episodes to <select name="newStatus" class="form-control form- <table class="sickbeardTable manageTable" cellspacing="1" border="0" cellpadding="0"> % for cur_indexer_id in sorted_show_ids: <tr id="${cur_indexer_id}"> - <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all" checked="checked" /></th> - <th colspan="2" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th> + <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all" checked="checked" autocapitalize="off" /></th> + <th colspan="2" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" autocapitalize="off" /></th> </tr> % endfor <tr><td style="padding:0;"></td><td style="padding:0;"></td><td style="padding:0;"></td></tr> diff --git a/gui/slick/views/manage_failedDownloads.mako b/gui/slick/views/manage_failedDownloads.mako index 920e04f8a3054b4f2b94905664d58b7079af0821..16f95ad3cbec7d688cd9ed4057d566d0ddd67024 100644 --- a/gui/slick/views/manage_failedDownloads.mako +++ b/gui/slick/views/manage_failedDownloads.mako @@ -32,7 +32,7 @@ <th width="10%">Size</th> <th width="14%">Provider</th> <th width="1%">Remove<br> - <input type="checkbox" class="bulkCheck" id="removeCheck" /> + <input type="checkbox" class="bulkCheck" id="removeCheck" autocapitalize="off" /> </th> </tr> </thead> @@ -60,7 +60,7 @@ <img src="${srRoot}/images/providers/missing.png" width="16" height="16" alt="missing provider" title="missing provider"/> % endif </td> - <td align="center"><input type="checkbox" class="removeCheck" id="remove-${hItem["release"]}" /></td> + <td align="center"><input type="checkbox" class="removeCheck" id="remove-${hItem["release"]}" autocapitalize="off" /></td> </tr> % endfor </tbody> diff --git a/gui/slick/views/manage_massEdit.mako b/gui/slick/views/manage_massEdit.mako index 0892016a97e75f1e78b853719456eb3d2fefc9cf..3bc6cc31dd6ae8b9b7a8810c147e99f09b8e7533 100644 --- a/gui/slick/views/manage_massEdit.mako +++ b/gui/slick/views/manage_massEdit.mako @@ -26,7 +26,7 @@ <div id="config-content"> <form action="massEditSubmit" method="post"> - <input type="hidden" name="toEdit" value="${showList}" /> + <input type="hidden" name="toEdit" value="${showList}" autocapitalize="off" /> <div id="config-components"> <ul> @@ -74,8 +74,8 @@ <td> <a href="#" class="btn edit_root_dir" class="edit_root_dir" id="edit_root_dir_${cur_index}">Edit</a> <a href="#" class="btn delete_root_dir" class="delete_root_dir" id="delete_root_dir_${cur_index}">Delete</a> - <input type="hidden" name="orig_root_dir_${cur_index}" value="${cur_dir}" /> - <input type="text" style="display: none" name="new_root_dir_${cur_index}" id="new_root_dir_${cur_index}" class="new_root_dir" value="${cur_dir}" /> + <input type="hidden" name="orig_root_dir_${cur_index}" value="${cur_dir}" autocapitalize="off" /> + <input type="text" style="display: none" name="new_root_dir_${cur_index}" id="new_root_dir_${cur_index}" class="new_root_dir" value="${cur_dir}" autocapitalize="off" /> </td> </tr> % endfor diff --git a/gui/slick/views/manage_subtitleMissed.mako b/gui/slick/views/manage_subtitleMissed.mako index d488199aa6787ab8213e2a97c0c81c04ddfa9278..420a4247348da9427eede746d43c079d550a6474 100644 --- a/gui/slick/views/manage_subtitleMissed.mako +++ b/gui/slick/views/manage_subtitleMissed.mako @@ -31,16 +31,16 @@ Manage episodes without <select name="whichSubs" class="form-control form-contro % endfor </select> subtitles -<input class="btn" type="submit" value="Manage" /> +<input class="btn" type="submit" value="Manage" autocapitalize="off" /> </form> % else: -<input type="hidden" id="selectSubLang" name="selectSubLang" value="${whichSubs}" /> +<input type="hidden" id="selectSubLang" name="selectSubLang" value="${whichSubs}" autocapitalize="off" /> <form action="${srRoot}/manage/downloadSubtitleMissed" method="post"> <h2>Episodes without ${subsLanguage} subtitles.</h2> <br> -Download missed subtitles for selected episodes <input class="btn btn-inline" type="submit" value="Go" /> +Download missed subtitles for selected episodes <input class="btn btn-inline" type="submit" value="Go" autocapitalize="off" /> <div> <button type="button" class="btn btn-xs selectAllShows">Select all</a></button> <button type="button" class="btn btn-xs unselectAllShows">Clear all</a></button> @@ -49,8 +49,8 @@ Download missed subtitles for selected episodes <input class="btn btn-inline" ty <table class="sickbeardTable manageTable" cellspacing="1" border="0" cellpadding="0"> % for cur_indexer_id in sorted_show_ids: <tr id="${cur_indexer_id}"> - <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all"checked="checked" /></th> - <th colspan="3" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th> + <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all"checked="checked" autocapitalize="off" /></th> + <th colspan="3" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" autocapitalize="off" /></th> </tr> % endfor </table> diff --git a/gui/slick/views/schedule.mako b/gui/slick/views/schedule.mako index ff76a17c3b8ca220b86e46a71de968345f04a844..32e88b1fe1ce15f96cc1060c91ae407ffddbc8d7 100644 --- a/gui/slick/views/schedule.mako +++ b/gui/slick/views/schedule.mako @@ -70,7 +70,7 @@ <!-- start list view //--> <% show_div = 'listing-default' %> -<input type="hidden" id="srRoot" value="${srRoot}" /> +<input type="hidden" id="srRoot" value="${srRoot}" autocapitalize="off" /> <table id="showListTable" class="sickbeardTable tablesorter seasonstyle" cellspacing="1" border="0" cellpadding="0"> @@ -355,7 +355,7 @@ <br> <br> <div class="calendarWrapper"> -<input type="hidden" id="srRoot" value="${srRoot}" /> +<input type="hidden" id="srRoot" value="${srRoot}" autocapitalize="off" /> % for day in dates: <% tbl_day += 1 %> <table class="sickbeardTable tablesorter calendarTable ${'cal-%s' % (('even', 'odd')[bool(tbl_day % 2)])}" cellspacing="0" border="0" cellpadding="0"> diff --git a/gui/slick/views/testRename.mako b/gui/slick/views/testRename.mako index fb43c9d7739fca6e2f1b7ed003f864c79750af99..71c09bd98ed66921aed0ce786c21fc64f458f2a6 100644 --- a/gui/slick/views/testRename.mako +++ b/gui/slick/views/testRename.mako @@ -18,7 +18,7 @@ <h1 class="title">${title}</h1> % endif -<input type="hidden" id="showID" value="${show.indexerid}" /> +<input type="hidden" id="showID" value="${show.indexerid}" autocapitalize="off" /> <h3>Preview of the proposed name changes</h3> <blockquote> @@ -42,7 +42,7 @@ </td> </tr> <tr class="seasoncols" id="selectall"> - <th class="col-checkbox"><input type="checkbox" class="seriesCheck" id="SelectAll" /></th> + <th class="col-checkbox"><input type="checkbox" class="seriesCheck" id="SelectAll" autocapitalize="off" /></th> <th align="left" valign="top" class="nowrap">Select All</th> <th width="100%" class="col-name" style="visibility:hidden;"></th> </tr> @@ -69,7 +69,7 @@ </td> </tr> <tr class="seasoncols" id="season-${cur_ep_obj.season}-cols"> - <th class="col-checkbox"><input type="checkbox" class="seasonCheck" id="${cur_ep_obj.season}" /></th> + <th class="col-checkbox"><input type="checkbox" class="seasonCheck" id="${cur_ep_obj.season}" autocapitalize="off" /></th> <th class="nowrap">Episode</th> <th class="col-name">Old Location</th> <th class="col-name">New Location</th> @@ -88,7 +88,7 @@ if len(epList) > 1: <tr class="season-${curSeason} ${('wanted', 'good')[curLoc == newLoc]} seasonstyle"> <td class="col-checkbox"> % if curLoc != newLoc: - <input type="checkbox" class="epCheck" id="${str(cur_ep_obj.season) + 'x' + str(cur_ep_obj.episode)}" name="${str(cur_ep_obj.season) + "x" + str(cur_ep_obj.episode)}" /> + <input type="checkbox" class="epCheck" id="${str(cur_ep_obj.season) + 'x' + str(cur_ep_obj.episode)}" name="${str(cur_ep_obj.season) + "x" + str(cur_ep_obj.episode)}" autocapitalize="off" /> % endif </td> <td align="center" valign="top" class="nowrap">${"-".join(map(str, epList))}</td> diff --git a/gui/slick/views/viewlogs.mako b/gui/slick/views/viewlogs.mako index 73e7200c149333126a653410ef38d3306ff1ac0e..a82b7aa243f8dc366b1750c7988fa07f46110166 100644 --- a/gui/slick/views/viewlogs.mako +++ b/gui/slick/views/viewlogs.mako @@ -37,7 +37,7 @@ Filter log by: <select name="logFilter" id="logFilter" class="form-control form- % endfor </select> Search log by: -<input type="text" name="logSearch" placeholder="clear to reset" id="logSearch" value="${('', logSearch)[bool(logSearch)]}" class="form-control form-control-inline input-sm" /> +<input type="text" name="logSearch" placeholder="clear to reset" id="logSearch" value="${('', logSearch)[bool(logSearch)]}" class="form-control form-control-inline input-sm" autocapitalize="off" /> </div> <br> <div class="align-left"><pre> diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 0ddd3a8a710040211449176321a59bc7fbd19229..4079965bb78696d3e66592d570f0e4e89ccf99bd 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -521,6 +521,7 @@ SUBTITLES_HEARING_IMPAIRED = False SUBTITLES_FINDER_FREQUENCY = 1 SUBTITLES_MULTI = False SUBTITLES_EXTRA_SCRIPTS = [] +SUBTITLES_DOWNLOAD_IN_PP = False ADDIC7ED_USER = None ADDIC7ED_PASS = None @@ -608,7 +609,7 @@ def initialize(consoleLogging=True): GUI_NAME, HOME_LAYOUT, HISTORY_LAYOUT, DISPLAY_SHOW_SPECIALS, COMING_EPS_LAYOUT, COMING_EPS_SORT, COMING_EPS_DISPLAY_PAUSED, COMING_EPS_MISSED_RANGE, FUZZY_DATING, TRIM_ZERO, DATE_PRESET, TIME_PRESET, TIME_PRESET_W_SECONDS, THEME_NAME, \ POSTER_SORTBY, POSTER_SORTDIR, HISTORY_LIMIT, CREATE_MISSING_SHOW_DIRS, ADD_SHOWS_WO_DIR, \ METADATA_WDTV, METADATA_TIVO, METADATA_MEDE8ER, IGNORE_WORDS, TRACKERS_LIST, IGNORED_SUBS_LIST, REQUIRE_WORDS, CALENDAR_UNPROTECTED, CALENDAR_ICONS, NO_RESTART, \ - USE_SUBTITLES, SUBTITLES_LANGUAGES, SUBTITLES_DIR, SUBTITLES_SERVICES_LIST, SUBTITLES_SERVICES_ENABLED, SUBTITLES_HISTORY, SUBTITLES_FINDER_FREQUENCY, SUBTITLES_MULTI, EMBEDDED_SUBTITLES_ALL, SUBTITLES_EXTRA_SCRIPTS, subtitlesFinderScheduler, \ + USE_SUBTITLES, SUBTITLES_LANGUAGES, SUBTITLES_DIR, SUBTITLES_SERVICES_LIST, SUBTITLES_SERVICES_ENABLED, SUBTITLES_HISTORY, SUBTITLES_FINDER_FREQUENCY, SUBTITLES_MULTI, SUBTITLES_DOWNLOAD_IN_PP, EMBEDDED_SUBTITLES_ALL, SUBTITLES_EXTRA_SCRIPTS, subtitlesFinderScheduler, \ SUBTITLES_HEARING_IMPAIRED, ADDIC7ED_USER, ADDIC7ED_PASS, LEGENDASTV_USER, LEGENDASTV_PASS, OPENSUBTITLES_USER, OPENSUBTITLES_PASS, \ USE_FAILED_DOWNLOADS, DELETE_FAILED, ANON_REDIRECT, LOCALHOST_IP, DEBUG, DEFAULT_PAGE, PROXY_SETTING, PROXY_INDEXERS, \ AUTOPOSTPROCESSER_FREQUENCY, SHOWUPDATE_HOUR, \ @@ -1146,7 +1147,7 @@ def initialize(consoleLogging=True): SUBTITLES_HEARING_IMPAIRED = bool(check_setting_int(CFG, 'Subtitles', 'subtitles_hearing_impaired', 0)) SUBTITLES_FINDER_FREQUENCY = check_setting_int(CFG, 'Subtitles', 'subtitles_finder_frequency', 1) SUBTITLES_MULTI = bool(check_setting_int(CFG, 'Subtitles', 'subtitles_multi', 1)) - + SUBTITLES_DOWNLOAD_IN_PP = bool(check_setting_int(CFG, 'Subtitles', 'subtitles_download_in_pp', 0)) SUBTITLES_EXTRA_SCRIPTS = [x.strip() for x in check_setting_str(CFG, 'Subtitles', 'subtitles_extra_scripts', '').split('|') if x.strip()] ADDIC7ED_USER = check_setting_str(CFG, 'Subtitles', 'addic7ed_username', '', censor_log=True) @@ -2146,7 +2147,7 @@ def save_config(): new_config['Subtitles']['subtitles_finder_frequency'] = int(SUBTITLES_FINDER_FREQUENCY) new_config['Subtitles']['subtitles_multi'] = int(SUBTITLES_MULTI) new_config['Subtitles']['subtitles_extra_scripts'] = '|'.join(SUBTITLES_EXTRA_SCRIPTS) - + new_config['Subtitles']['subtitles_download_in_pp'] = int(SUBTITLES_DOWNLOAD_IN_PP) new_config['Subtitles']['addic7ed_username'] = ADDIC7ED_USER new_config['Subtitles']['addic7ed_password'] = helpers.encrypt(ADDIC7ED_PASS, ENCRYPTION_VERSION) diff --git a/sickbeard/common.py b/sickbeard/common.py index a23afacfe6f39bf424f9e473c0ab1082204450ee..bbc240b237cd36023f2339ab3e76a6bdd09700f6 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -22,10 +22,9 @@ import operator import platform import re import uuid -from numdict import NumDict +from sickbeard.numdict import NumDict import sys -import os.path sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) @@ -406,7 +405,7 @@ class Quality(object): return (status, Quality.NONE) @staticmethod - def sceneQualityFromName(name, quality): + def sceneQualityFromName(name, quality): # pylint: disable=R0912 """ Get scene naming parameters from filename and quality @@ -548,42 +547,49 @@ class StatusStrings(NumDict): return False # Assign strings to statuses -statusStrings = StatusStrings( - {UNKNOWN: "Unknown", - UNAIRED: "Unaired", - SNATCHED: "Snatched", - DOWNLOADED: "Downloaded", - SKIPPED: "Skipped", - SNATCHED_PROPER: "Snatched (Proper)", - WANTED: "Wanted", - ARCHIVED: "Archived", - IGNORED: "Ignored", - SUBTITLED: "Subtitled", - FAILED: "Failed", - SNATCHED_BEST: "Snatched (Best)" - } -) +statusStrings = StatusStrings({ + UNKNOWN: "Unknown", + UNAIRED: "Unaired", + SNATCHED: "Snatched", + DOWNLOADED: "Downloaded", + SKIPPED: "Skipped", + SNATCHED_PROPER: "Snatched (Proper)", + WANTED: "Wanted", + ARCHIVED: "Archived", + IGNORED: "Ignored", + SUBTITLED: "Subtitled", + FAILED: "Failed", + SNATCHED_BEST: "Snatched (Best)" +}) # pylint: disable=R0903 class Overview(object): UNAIRED = UNAIRED # 1 - QUAL = 2 + SNATCHED = SNATCHED # 2 WANTED = WANTED # 3 - GOOD = 4 + GOOD = DOWNLOADED # 4 SKIPPED = SKIPPED # 5 - - # For both snatched statuses. Note: SNATCHED/QUAL have same value and break dict. - SNATCHED = SNATCHED_PROPER = SNATCHED_BEST # 9 - - overviewStrings = {SKIPPED: "skipped", - WANTED: "wanted", - QUAL: "qual", - GOOD: "good", - UNAIRED: "unaired", - SNATCHED: "snatched"} - -countryList = {'Australia': 'AU', - 'Canada': 'CA', - 'USA': 'US' - } + SNATCHED_PROPER = SNATCHED_PROPER # 9 + SNATCHED_BEST = SNATCHED_BEST # 12 + + # Should suffice! + QUAL = 50 + + overviewStrings = { + SKIPPED: "skipped", + WANTED: "wanted", + QUAL: "qual", + GOOD: "good", + UNAIRED: "unaired", + SNATCHED: "snatched", + # we can give these a different class later, otherwise breaks checkboxes in displayshow for showing different statuses + SNATCHED_BEST: "snatched", + SNATCHED_PROPER: "snatched" + } + +countryList = { + 'Australia': 'AU', + 'Canada': 'CA', + 'USA': 'US' +} diff --git a/sickbeard/config.py b/sickbeard/config.py index f6766920a604dbeb0782f927e802cd8c4896fc7f..670835e10682f47eb762dc66d286d3941e2769b6 100644 --- a/sickbeard/config.py +++ b/sickbeard/config.py @@ -203,6 +203,7 @@ def change_AUTOPOSTPROCESSER_FREQUENCY(freq): sickbeard.autoPostProcesserScheduler.cycleTime = datetime.timedelta(minutes=sickbeard.AUTOPOSTPROCESSER_FREQUENCY) + def change_DAILYSEARCH_FREQUENCY(freq): """ Change frequency of daily search thread @@ -216,6 +217,7 @@ def change_DAILYSEARCH_FREQUENCY(freq): sickbeard.dailySearchScheduler.cycleTime = datetime.timedelta(minutes=sickbeard.DAILYSEARCH_FREQUENCY) + def change_BACKLOG_FREQUENCY(freq): """ Change frequency of backlog thread @@ -230,6 +232,7 @@ def change_BACKLOG_FREQUENCY(freq): sickbeard.backlogSearchScheduler.cycleTime = datetime.timedelta(minutes=sickbeard.BACKLOG_FREQUENCY) + def change_UPDATE_FREQUENCY(freq): """ Change frequency of daily updater thread @@ -243,6 +246,7 @@ def change_UPDATE_FREQUENCY(freq): sickbeard.versionCheckScheduler.cycleTime = datetime.timedelta(hours=sickbeard.UPDATE_FREQUENCY) + def change_SHOWUPDATE_HOUR(freq): """ Change frequency of show updater thread @@ -258,6 +262,7 @@ def change_SHOWUPDATE_HOUR(freq): sickbeard.showUpdateScheduler.start_time = datetime.time(hour=sickbeard.SHOWUPDATE_HOUR) + def change_SUBTITLES_FINDER_FREQUENCY(subtitles_finder_frequency): """ Change frequency of subtitle thread @@ -269,6 +274,7 @@ def change_SUBTITLES_FINDER_FREQUENCY(subtitles_finder_frequency): sickbeard.SUBTITLES_FINDER_FREQUENCY = to_int(subtitles_finder_frequency, 1) + def change_VERSION_NOTIFY(version_notify): """ Change frequency of versioncheck thread @@ -285,6 +291,7 @@ def change_VERSION_NOTIFY(version_notify): if oldSetting is False and version_notify is True: sickbeard.versionCheckScheduler.forceRun() + def change_DOWNLOAD_PROPERS(download_propers): """ Enable/Disable proper download thread @@ -310,6 +317,7 @@ def change_DOWNLOAD_PROPERS(download_propers): sickbeard.traktCheckerScheduler.silent = True logger.log(u"Stopping PROPERFINDER thread", logger.INFO) + def change_USE_TRAKT(use_trakt): """ Enable/disable trakt thread @@ -361,6 +369,7 @@ def change_USE_SUBTITLES(use_subtitles): sickbeard.subtitlesFinderScheduler.silent = True logger.log(u"Stopping SUBTITLESFINDER thread", logger.INFO) + def change_PROCESS_AUTOMATICALLY(process_automatically): """ Enable/Disable postprocessor thread @@ -386,6 +395,7 @@ def change_PROCESS_AUTOMATICALLY(process_automatically): sickbeard.autoPostProcesserScheduler.enable = False sickbeard.autoPostProcesserScheduler.silent = True + def CheckSection(CFG, sec): """ Check if INI section exists, if not create it """ @@ -603,6 +613,7 @@ def check_setting_str(config, cfg_name, item_name, def_val, silent=True, censor_ return my_val + class ConfigMigrator(): def __init__(self, config_obj): """ diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index c3a77d1906dae914984d8b7f37cbffe5147cd598..9e78f997a4578437779ac68dd97fede5d962ecfc 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -18,7 +18,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import os import io import ctypes @@ -54,12 +53,11 @@ from sickbeard.common import USER_AGENT from sickbeard import db from sickbeard.notifiers.synoindex import notifier as synoindex_notifier from sickbeard import clients -from sickbeard.subtitles import isValidLanguage -from sickrage.helper.common import media_extensions, subtitle_extensions +from sickrage.helper.common import media_extensions, pretty_file_size, subtitle_extensions from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex, MultipleShowObjectsException from cachecontrol import CacheControl, caches - +from babelfish import Language from itertools import izip, cycle import shutil @@ -72,6 +70,14 @@ shutil.copyfile = shutil_custom.copyfile_custom urllib._urlopener = classes.SickBeardURLopener() +def isValidLanguage(language): + try: + Language.fromopensubtitles(language) + except Exception: + return False + return True + + def fixGlob(path): path = re.sub(r'\[', '[[]', path) return re.sub(r'(?<!\[)\]', '[]]', path) @@ -95,21 +101,6 @@ def indentXML(elem, level=0): if level and (not elem.tail or not elem.tail.strip()): elem.tail = i - -def remove_extension(name): - """ - Remove download or media extension from name (if any) - """ - - if name and "." in name: - # pylint: disable=W0612 - base_name, sep, extension = name.rpartition('.') # @UnusedVariable - if base_name and extension.lower() in ['nzb', 'torrent'] + media_extensions: - name = base_name - - return name - - def remove_non_release_groups(name): """ Remove non release groups from name @@ -170,54 +161,6 @@ def remove_non_release_groups(name): return _name -def replaceExtension(filename, newExt): - """ - >>> replaceExtension('foo.avi', 'mkv') - 'foo.mkv' - >>> replaceExtension('.vimrc', 'arglebargle') - '.vimrc' - >>> replaceExtension('a.b.c', 'd') - 'a.b.d' - >>> replaceExtension('', 'a') - '' - >>> replaceExtension('foo.bar', '') - 'foo.' - """ - sepFile = filename.rpartition(".") - if sepFile[0] == "": - return filename - else: - return sepFile[0] + "." + newExt - - -def notTorNZBFile(filename): - """ - Returns true if filename is not a NZB nor Torrent file - - :param filename: Filename to check - :return: True if filename is not a NZB nor Torrent - """ - - return not (filename.endswith(".torrent") or filename.endswith(".nzb")) - - -def isSyncFile(filename): - """ - Returns true if filename is a syncfile, indicating filesystem may be in flux - - :param filename: Filename to check - :return: True if this file is a syncfile, False otherwise - """ - - extension = filename.rpartition(".")[2].lower() - # if extension == '!sync' or extension == 'lftp-pget-status' or extension == 'part' or extension == 'bts': - syncfiles = sickbeard.SYNC_FILES - if extension in syncfiles.split(",") or filename.startswith('.syncthing'): - return True - else: - return False - - def isMediaFile(filename): """ Check if named file may contain media @@ -281,29 +224,6 @@ def isBeingWritten(filepath): return False -def sanitizeFileName(name): - """ - >>> sanitizeFileName('a/b/c') - 'a-b-c' - >>> sanitizeFileName('abc') - 'abc' - >>> sanitizeFileName('a"b') - 'ab' - >>> sanitizeFileName('.a.b..') - 'a.b' - """ - - # remove bad chars from the filename - name = re.sub(r'[\\/\*]', '-', name) - name = re.sub(r'[:"<>|?]', '', name) - name = re.sub(ur'\u2122', '', name) # Trade Mark Sign - - # remove leading/trailing periods and spaces - name = name.strip(' .') - - return name - - def remove_file_failed(failed_file): """ Remove file from filesystem @@ -1750,18 +1670,6 @@ def generateApiKey(): return m.hexdigest() -def pretty_filesize(file_bytes): - """Return humanly formatted sizes from bytes""" - for mod in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']: - if file_bytes < 1024.00: - return "%3.2f %s" % (file_bytes, mod) - file_bytes /= 1024.00 - -if __name__ == '__main__': - import doctest - doctest.testmod() - - def remove_article(text=''): """Remove the english articles from a text string""" @@ -1834,7 +1742,7 @@ def verify_freespace(src, dest, oldfile=None): return True else: logger.log(u"Not enough free space: Needed: %s bytes ( %s ), found: %s bytes ( %s )" - % (neededspace, pretty_filesize(neededspace), diskfree, pretty_filesize(diskfree)), logger.WARNING) + % (neededspace, pretty_file_size(neededspace), diskfree, pretty_file_size(diskfree)), logger.WARNING) return False @@ -1905,9 +1813,9 @@ def getDiskSpaceUsage(diskPath=None): if platform.system() == 'Windows': free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(diskPath), None, None, ctypes.pointer(free_bytes)) - return pretty_filesize(free_bytes.value) + return pretty_file_size(free_bytes.value) else: st = os.statvfs(diskPath) - return pretty_filesize(st.f_bavail * st.f_frsize) + return pretty_file_size(st.f_bavail * st.f_frsize) else: return False diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index 5e570fd8f4fe237b4f0185fd8fbe118a3b8d2eba..0a2cc1a414d709ff6f160523906b579d6bebcd42 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -18,7 +18,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import os import io import re @@ -34,6 +33,7 @@ from sickbeard import helpers from sickbeard import logger from sickbeard.metadata import helpers as metadata_helpers from sickbeard.show_name_helpers import allPossibleShowNames +from sickrage.helper.common import replace_extension from sickrage.helper.exceptions import ex from tmdb_api.tmdb_api import TMDB @@ -157,7 +157,7 @@ class GenericMetadata(object): return os.path.join(show_obj.location, self._show_metadata_filename) def get_episode_file_path(self, ep_obj): - return helpers.replaceExtension(ep_obj.location, self._ep_nfo_extension) + return replace_extension(ep_obj.location, self._ep_nfo_extension) def get_fanart_path(self, show_obj): return os.path.join(show_obj.location, self.fanart_name) diff --git a/sickbeard/metadata/kodi.py b/sickbeard/metadata/kodi.py index b093e82729b79f5a094b76caa7e1795157a1f0d4..b7445073ee1d7389bfb5641e52336c05c51112f8 100644 --- a/sickbeard/metadata/kodi.py +++ b/sickbeard/metadata/kodi.py @@ -22,7 +22,7 @@ import os from sickbeard.metadata import generic from sickbeard.metadata import kodi_12plus -from sickbeard import helpers +from sickrage.helper.common import replace_extension from sickrage.helper.encoding import ek @@ -100,7 +100,7 @@ class KODIMetadata(kodi_12plus.KODI_12PlusMetadata): ep_obj: a TVEpisode instance for which to create the thumbnail """ if ek(os.path.isfile, ep_obj.location): - tbn_filename = helpers.replaceExtension(ep_obj.location, 'tbn') + tbn_filename = replace_extension(ep_obj.location, 'tbn') else: return None diff --git a/sickbeard/metadata/kodi_12plus.py b/sickbeard/metadata/kodi_12plus.py index 4014b8144db2c3432538c278e686f0a318807635..2b1eda1500957a013d68517727595a8ad3903683 100644 --- a/sickbeard/metadata/kodi_12plus.py +++ b/sickbeard/metadata/kodi_12plus.py @@ -17,7 +17,9 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +import re import datetime +from babelfish import Country import sickbeard from sickbeard.metadata import generic @@ -74,22 +76,26 @@ class KODI_12PlusMetadata(generic.GenericMetadata): season_all_poster, season_all_banner) - self.name = 'KODI 12+' + self.name = u'KODI 12+' - self.poster_name = "poster.jpg" - self.season_all_poster_name = "season-all-poster.jpg" + self.poster_name = u"poster.jpg" + self.season_all_poster_name = u"season-all-poster.jpg" # web-ui metadata template - self.eg_show_metadata = "tvshow.nfo" - self.eg_episode_metadata = "Season##\\<i>filename</i>.nfo" - self.eg_fanart = "fanart.jpg" - self.eg_poster = "poster.jpg" - self.eg_banner = "banner.jpg" - self.eg_episode_thumbnails = "Season##\\<i>filename</i>-thumb.jpg" - self.eg_season_posters = "season##-poster.jpg" - self.eg_season_banners = "season##-banner.jpg" - self.eg_season_all_poster = "season-all-poster.jpg" - self.eg_season_all_banner = "season-all-banner.jpg" + self.eg_show_metadata = u"tvshow.nfo" + self.eg_episode_metadata = u"Season##\\<i>filename</i>.nfo" + self.eg_fanart = u"fanart.jpg" + self.eg_poster = u"poster.jpg" + self.eg_banner = u"banner.jpg" + self.eg_episode_thumbnails = u"Season##\\<i>filename</i>-thumb.jpg" + self.eg_season_posters = u"season##-poster.jpg" + self.eg_season_banners = u"season##-banner.jpg" + self.eg_season_all_poster = u"season-all-poster.jpg" + self.eg_season_all_banner = u"season-all-banner.jpg" + + @staticmethod + def _split_info(info_string): + return {x.strip().title() for x in re.sub(r'[,/]+', '|', info_string).split('|') if x.strip()} def _show_data(self, show_obj): """ @@ -169,8 +175,19 @@ class KODI_12PlusMetadata(generic.GenericMetadata): indexerid.text = str(myShow["id"]) if getattr(myShow, 'genre', None) and isinstance(myShow["genre"], basestring): - genre = etree.SubElement(tv_node, "genre") - genre.text = " / ".join(x.strip() for x in myShow["genre"].split('|') if x.strip()) + for genre in self._split_info(myShow["genre"]): + cur_genre = etree.SubElement(tv_node, "genre") + cur_genre.text = genre + + if 'country_codes' in show_obj.imdb_info: + for country in self._split_info(show_obj.imdb_info['country_codes']): + try: + cur_country_name = Country(country.upper()).name.title() + except Exception: + continue + + cur_country = etree.SubElement(tv_node, "country") + cur_country.text = cur_country_name if getattr(myShow, 'firstaired', None): premiered = etree.SubElement(tv_node, "premiered") @@ -180,6 +197,16 @@ class KODI_12PlusMetadata(generic.GenericMetadata): studio = etree.SubElement(tv_node, "studio") studio.text = myShow["network"].strip() + if getattr(myShow, 'writer', None) and isinstance(myShow['writer'], basestring): + for writer in self._split_info(myShow['writer']): + cur_writer = etree.SubElement(tv_node, "credits") + cur_writer.text = writer + + if getattr(myShow, 'director', None) and isinstance(myShow['director'], basestring): + for director in self._split_info(myShow['director']): + cur_director = etree.SubElement(tv_node, "director") + cur_director.text = director + if getattr(myShow, '_actors', None): for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, "actor") @@ -310,20 +337,23 @@ class KODI_12PlusMetadata(generic.GenericMetadata): # watched = etree.SubElement(episode, "watched") # watched.text = 'false' - if getattr(myEp, 'writer', None): - ep_credits = etree.SubElement(episode, "credits") - ep_credits.text = myEp['writer'].strip() - - if getattr(myEp, 'director', None): - director = etree.SubElement(episode, "director") - director.text = myEp['director'].strip() - if getattr(myEp, 'rating', None): rating = etree.SubElement(episode, "rating") rating.text = myEp['rating'] + + if getattr(myEp, 'writer', None) and isinstance(myEp['writer'], basestring): + for writer in self._split_info(myEp['writer']): + cur_writer = etree.SubElement(episode, "credits") + cur_writer.text = writer + + if getattr(myEp, 'director', None) and isinstance(myEp['director'], basestring): + for director in self._split_info(myEp['director']): + cur_director = etree.SubElement(episode, "director") + cur_director.text = director + if getattr(myEp, 'gueststars', None) and isinstance(myEp['gueststars'], basestring): - for actor in (x.strip() for x in myEp['gueststars'].split('|') if x.strip()): + for actor in self._split_info(myEp['gueststars']): cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor diff --git a/sickbeard/metadata/mede8er.py b/sickbeard/metadata/mede8er.py index 654465e11d23753794f4f46abbd23e033ec6a904..f24e5f14c8cca9b570b043a63abab6b94692ae14 100644 --- a/sickbeard/metadata/mede8er.py +++ b/sickbeard/metadata/mede8er.py @@ -26,7 +26,7 @@ import sickbeard from sickbeard import logger, helpers from sickbeard.metadata import mediabrowser -from sickrage.helper.common import dateFormat +from sickrage.helper.common import dateFormat, replace_extension from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex, ShowNotFoundException @@ -86,11 +86,11 @@ class Mede8erMetadata(mediabrowser.MediaBrowserMetadata): # self.eg_season_all_banner = "<i>not supported</i>" def get_episode_file_path(self, ep_obj): - return helpers.replaceExtension(ep_obj.location, self._ep_nfo_extension) + return replace_extension(ep_obj.location, self._ep_nfo_extension) @staticmethod def get_episode_thumb_path(ep_obj): - return helpers.replaceExtension(ep_obj.location, 'jpg') + return replace_extension(ep_obj.location, 'jpg') def _show_data(self, show_obj): """ diff --git a/sickbeard/metadata/mediabrowser.py b/sickbeard/metadata/mediabrowser.py index e4319528190a4a2466dc19be684ea0cf6b5acc6c..a917a4b47aa3354d0438e35710f72e89aa7de445 100644 --- a/sickbeard/metadata/mediabrowser.py +++ b/sickbeard/metadata/mediabrowser.py @@ -28,7 +28,7 @@ from sickbeard.metadata import generic from sickbeard import logger, helpers -from sickrage.helper.common import dateFormat +from sickrage.helper.common import dateFormat, replace_extension from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex, ShowNotFoundException @@ -117,7 +117,7 @@ class MediaBrowserMetadata(generic.GenericMetadata): """ if ek(os.path.isfile, ep_obj.location): - xml_file_name = helpers.replaceExtension(ek(os.path.basename, ep_obj.location), self._ep_nfo_extension) + xml_file_name = replace_extension(ek(os.path.basename, ep_obj.location), self._ep_nfo_extension) metadata_dir_name = ek(os.path.join, ek(os.path.dirname, ep_obj.location), 'metadata') xml_file_path = ek(os.path.join, metadata_dir_name, xml_file_name) else: @@ -136,7 +136,7 @@ class MediaBrowserMetadata(generic.GenericMetadata): """ if ek(os.path.isfile, ep_obj.location): - tbn_file_name = helpers.replaceExtension(ek(os.path.basename, ep_obj.location), 'jpg') + tbn_file_name = replace_extension(ek(os.path.basename, ep_obj.location), 'jpg') metadata_dir_name = ek(os.path.join, ek(os.path.dirname, ep_obj.location), 'metadata') tbn_file_path = ek(os.path.join, metadata_dir_name, tbn_file_name) else: diff --git a/sickbeard/metadata/wdtv.py b/sickbeard/metadata/wdtv.py index 03310c80cecf56ca953ca43e0e6a75878cd3e32a..34c9cb539ab1d263eba6a890a92a11784bc5d9cc 100644 --- a/sickbeard/metadata/wdtv.py +++ b/sickbeard/metadata/wdtv.py @@ -27,7 +27,7 @@ import sickbeard from sickbeard.metadata import generic from sickbeard import logger, helpers -from sickrage.helper.common import dateFormat +from sickrage.helper.common import dateFormat, replace_extension from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex, ShowNotFoundException @@ -130,7 +130,7 @@ class WDTVMetadata(generic.GenericMetadata): ep_obj: a TVEpisode instance for which to create the thumbnail """ if ek(os.path.isfile, ep_obj.location): - tbn_filename = helpers.replaceExtension(ep_obj.location, 'metathumb') + tbn_filename = replace_extension(ep_obj.location, 'metathumb') else: return None diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index ee3f0693df2f5176e85c8f06ed10a3a27fa8dd5a..1394505ac1b8c158a3df531bf66ef45eb7dcc0a0 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -18,7 +18,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import os import time import re @@ -27,6 +26,7 @@ import regexes import sickbeard from sickbeard import logger, helpers, scene_numbering, common, scene_exceptions, db +from sickrage.helper.common import remove_extension from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex from dateutil import parser @@ -410,7 +410,7 @@ class NameParser(object): dir_name, file_name = ek(os.path.split, name) if self.file_name: - base_file_name = helpers.remove_extension(file_name) + base_file_name = remove_extension(file_name) else: base_file_name = file_name diff --git a/sickbeard/name_parser/regexes.py b/sickbeard/name_parser/regexes.py index b2beb6882e3eb7d75a7db5548994d307ffc70d96..211375f92273c29b139ab8b1048abbccd63b2591 100644 --- a/sickbeard/name_parser/regexes.py +++ b/sickbeard/name_parser/regexes.py @@ -67,6 +67,18 @@ normal_regexes = [ -(?P<release_group>[^- ]+([. _-]\[.*\])?))?)?$ # Group '''), + ('newpct', + # American Horror Story - Temporada 4 HDTV x264[Cap.408_409]SPANISH AUDIO -NEWPCT + # American Horror Story - Temporada 4 [HDTV][Cap.408][Espanol Castellano] + # American Horror Story - Temporada 4 HDTV x264[Cap.408]SPANISH AUDIO –NEWPCT) + r''' + (?P<series_name>.+?).-.+\d{1,2}[ ,\.] # Show name: American Horror Story + (?P<extra_info>.+)\[Cap\. # Quality: HDTV x264, [HDTV], HDTV x264 + (?P<season_num>\d{1,2}) # Season Number: 4 + (?P<ep_num>\d{2}) # Episode Number: 08 + ((_\d{1,2}(?P<extra_ep_num>\d{2}))|.*]) # Episode number2: 09 + '''), + ('fov', # Show_Name.1x02.Source_Quality_Etc-Group # Show Name - 1x02 - My Ep Name @@ -117,17 +129,6 @@ normal_regexes = [ (?P<ep_num>\d{2})$ # 02 '''), - ('newpct', - # Example: Sobrenatural - Temporada 10 [HDTV][Cap.1023][Espanol Castellano] - r''' - (?P<series_name>.+?) # Showw_Name: "Sobrenatural" - (?:.-.+\d{1,2}.\[) # Separator and junk: " - Temporada 10 [" - (?P<extra_info>.+) # Quality: "HDTV" - (?:\]\[.+\.) # junk: "][Cap." - (?P<season_num>\d{1,2}) # Season number: "10" - (?P<ep_num>\d{2})(?:]) # Episode number: "23" - '''), - ('verbose', # Show Name Season 1 Episode 2 Ep Name r''' diff --git a/sickbeard/nzbSplitter.py b/sickbeard/nzbSplitter.py index 311443aa5077f21f403276a03dcd8f446daf44a6..4374a76d74d09176792ed0d6cb5d57222ad7a71c 100644 --- a/sickbeard/nzbSplitter.py +++ b/sickbeard/nzbSplitter.py @@ -1,5 +1,6 @@ +# coding=utf-8 # Author: Nic Wolfe <nic@wolfeden.ca> -# URL: https://sickrage.github.io +# URL: https://SickRage.GitHub.io # Git: https://github.com/SickRage/SickRage.git # # This file is part of SickRage. @@ -17,190 +18,211 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +# pylint: disable=line-too-long -import requests +import requests # pylint: disable=import-error import re try: - import xml.etree.cElementTree as etree + import xml.etree.cElementTree as ETree except ImportError: - import xml.etree.ElementTree as etree + import xml.etree.ElementTree as ETree from sickbeard import logger, classes, helpers from sickbeard.common import Quality +from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException from sickrage.helper.encoding import ek, ss from sickrage.helper.exceptions import ex -from name_parser.parser import NameParser, InvalidNameException, InvalidShowException - -def getSeasonNZBs(name, urlData, season): +def get_season_nzbs(name, url_data, season): """ Split a season NZB into episodes :param name: NZB name - :param urlData: URL to get data from + :param url_data: URL to get data from :param season: Season to check :return: dict of (episode files, xml matches) """ - try: - showXML = etree.ElementTree(etree.XML(urlData)) - except SyntaxError: - logger.log(u"Unable to parse the XML of " + name + ", not splitting it", logger.ERROR) - return ({}, '') - filename = name.replace(".nzb", "") + # TODO: clean up these regex'es, comment them, and make them all raw strings + regex_string = { + # Match the xmlns in an nzb + # Example: nzbElement.getchildren()[1].tag == '{http://www.newzbin.com/DTD/2003/nzb}file' + # regex match returns 'http://www.newzbin.com/DTD/2003/nzb' + 'nzb_xmlns': r"{(http://[\w_\./]+nzb)}file", + 'scene_name': '([\w\._\ ]+)[\. ]S%02d[\. ]([\w\._\-\ ]+)[\- ]([\w_\-\ ]+?)', # pylint: disable=anomalous-backslash-in-string + 'episode': '\.S%02d(?:[E0-9]+)\.[\w\._]+\-\w+', # pylint: disable=anomalous-backslash-in-string + } - nzbElement = showXML.getroot() + try: + show_xml = ETree.ElementTree(ETree.XML(url_data)) + except SyntaxError: + logger.log(u"Unable to parse the XML of " + name + ", not splitting it", logger.ERROR) # pylint: disable=no-member + return {}, '' - regex = '([\w\._\ ]+)[\. ]S%02d[\. ]([\w\._\-\ ]+)[\- ]([\w_\-\ ]+?)' % season + nzb_element = show_xml.getroot() - sceneNameMatch = re.search(regex, filename, re.I) - if sceneNameMatch: - showName, qualitySection, groupName = sceneNameMatch.groups() # @UnusedVariable - else: - logger.log(u"Unable to parse " + name + " into a scene name. If it's a valid one log a bug.", logger.ERROR) - return ({}, '') + scene_name_match = re.search(regex_string['scene_name'] % season, filename, re.I) + if scene_name_match: + show_name = scene_name_match.groups()[0] + else: # Make sure we aren't missing valid results after changing name_parser and the quality detection + # Most of these will likely be invalid shows + logger.log(u"Unable to parse " + name + " into a scene name.", logger.DEBUG) # pylint: disable=no-member + return {}, '' - regex = '(' + re.escape(showName) + '\.S%02d(?:[E0-9]+)\.[\w\._]+\-\w+' % season + ')' + regex = '(' + re.escape(show_name) + regex_string['episode'] % season + ')' regex = regex.replace(' ', '.') - epFiles = {} + ep_files = {} xmlns = None - for curFile in nzbElement.getchildren(): - xmlnsMatch = re.match("\{(http:\/\/[A-Za-z0-9_\.\/]+\/nzb)\}file", curFile.tag) - if not xmlnsMatch: + for cur_file in nzb_element.getchildren(): + xmlns_match = re.match(regex_string['nzb_xmlns'], cur_file.tag) + if not xmlns_match: continue else: - xmlns = xmlnsMatch.group(1) - match = re.search(regex, curFile.get("subject"), re.I) + xmlns = xmlns_match.group(1) + match = re.search(regex, cur_file.get("subject"), re.I) if not match: - # print curFile.get("subject"), "doesn't match", regex + # regex couldn't match cur_file.get("subject") continue - curEp = match.group(1) - if curEp not in epFiles: - epFiles[curEp] = [curFile] + cur_ep = match.group(1) + if cur_ep not in ep_files: + ep_files[cur_ep] = [cur_file] else: - epFiles[curEp].append(curFile) + ep_files[cur_ep].append(cur_file) + # TODO: Decide what to do if we found multiple valid xmlns strings, should we only return the last??? + return ep_files, xmlns - return (epFiles, xmlns) +def create_nzb_string(file_elements, xmlns): + """ + Extract extra info from file_elements. -def createNZBString(fileElements, xmlns): - rootElement = etree.Element("nzb") + :param file_elements: to be processed + :param xmlns: the xml namespace to be used + :return: string containing all extra info extracted from the file_elements + """ + root_element = ETree.Element("nzb") if xmlns: - rootElement.set("xmlns", xmlns) + root_element.set("xmlns", xmlns) - for curFile in fileElements: - rootElement.append(stripNS(curFile, xmlns)) + for cur_file in file_elements: + root_element.append(strip_xmlns(cur_file, xmlns)) - return etree.tostring(ss(rootElement)) + return ETree.tostring(ss(root_element)) -def saveNZB(nzbName, nzbString): +def save_nzb(nzb_name, nzb_string): """ Save NZB to disk - :param nzbName: Filename/path to write to - :param nzbString: Content to write in file + :param nzb_name: Filename/path to write to + :param nzb_string: Content to write in file """ try: - with ek(open, nzbName + ".nzb", 'w') as nzb_fh: - nzb_fh.write(nzbString) + with ek(open, nzb_name + ".nzb", 'w') as nzb_fh: + nzb_fh.write(nzb_string) - except EnvironmentError, e: - logger.log(u"Unable to save NZB: " + ex(e), logger.ERROR) + except EnvironmentError as error: + logger.log(u"Unable to save NZB: " + ex(error), logger.ERROR) # pylint: disable=no-member -def stripNS(element, ns): - element.tag = element.tag.replace("{" + ns + "}", "") - for curChild in element.getchildren(): - stripNS(curChild, ns) +def strip_xmlns(element, xmlns): + """ + Remove the xml namespace from the element's children. + + :param element: to be processed + :param xmlns: xml namespace to be removed + :return: processed element + """ + element.tag = element.tag.replace("{" + xmlns + "}", "") + for cur_child in element.getchildren(): + strip_xmlns(cur_child, xmlns) return element -def splitResult(result): +def split_result(obj): """ - Split result into seperate episodes + Split obj into separate episodes. - :param result: search result object - :return: False upon failure, a list of episode objects otherwise + :param obj: to search for results + :return: a list of episode objects or an empty list """ - urlData = helpers.getURL(result.url, session=requests.Session(), needBytes=True) - if urlData is None: - logger.log(u"Unable to load url " + result.url + ", can't download season NZB", logger.ERROR) - return False + url_data = helpers.getURL(obj.url, session=requests.Session(), needBytes=True) + if url_data is None: + logger.log(u"Unable to load url " + obj.url + ", can't download season NZB", logger.ERROR) # pylint: disable=no-member + return [] # parse the season ep name try: - np = NameParser(False, showObj=result.show) - parse_result = np.parse(result.name) + parsed_obj = NameParser(False, showObj=obj.show).parse(obj.name) except InvalidNameException: - logger.log(u"Unable to parse the filename " + result.name + " into a valid episode", logger.DEBUG) - return False + logger.log(u"Unable to parse the filename " + obj.name + " into a valid episode", logger.DEBUG) # pylint: disable=no-member + return [] except InvalidShowException: - logger.log(u"Unable to parse the filename " + result.name + " into a valid show", logger.DEBUG) - return False + logger.log(u"Unable to parse the filename " + obj.name + " into a valid show", logger.DEBUG) # pylint: disable=no-member + return [] # bust it up - season = parse_result.season_number if parse_result.season_number is not None else 1 - - separateNZBs, xmlns = getSeasonNZBs(result.name, urlData, season) + season = 1 if parsed_obj.season_number is None else parsed_obj.season_number - resultList = [] + separate_nzbs, xmlns = get_season_nzbs(obj.name, url_data, season) - for newNZB in separateNZBs: + result_list = [] - logger.log(u"Split out " + newNZB + " from " + result.name, logger.DEBUG) + # TODO: Re-evaluate this whole section + # If we have valid results and hit an exception, we ignore the results found so far. + # Maybe we should return the results found or possibly continue with the next iteration of the loop + # Also maybe turn this into a function and generate the results_list with a list comprehension instead + for new_nzb in separate_nzbs: + logger.log(u"Split out " + new_nzb + " from " + obj.name, logger.DEBUG) # pylint: disable=no-member # parse the name try: - np = NameParser(False, showObj=result.show) - parse_result = np.parse(newNZB) + parsed_obj = NameParser(False, showObj=obj.show).parse(new_nzb) except InvalidNameException: - logger.log(u"Unable to parse the filename " + newNZB + " into a valid episode", logger.DEBUG) - return False + logger.log(u"Unable to parse the filename " + new_nzb + " into a valid episode", logger.DEBUG) # pylint: disable=no-member + return [] except InvalidShowException: - logger.log(u"Unable to parse the filename " + newNZB + " into a valid show", logger.DEBUG) - return False + logger.log(u"Unable to parse the filename " + new_nzb + " into a valid show", logger.DEBUG) # pylint: disable=no-member + return [] # make sure the result is sane - if (parse_result.season_number is not None and parse_result.season_number != season) or ( - parse_result.season_number is None and season != 1): - logger.log( - u"Found " + newNZB + " inside " + result.name + " but it doesn't seem to belong to the same season, ignoring it", - logger.WARNING) + if (parsed_obj.season_number != season) or (parsed_obj.season_number is None and season != 1): + # pylint: disable=no-member + logger.log(u"Found " + new_nzb + " inside " + obj.name + " but it doesn't seem to belong to the same season, ignoring it", + logger.WARNING) continue - elif len(parse_result.episode_numbers) == 0: - logger.log( - u"Found " + newNZB + " inside " + result.name + " but it doesn't seem to be a valid episode NZB, ignoring it", - logger.WARNING) + elif len(parsed_obj.episode_numbers) == 0: + # pylint: disable=no-member + logger.log(u"Found " + new_nzb + " inside " + obj.name + " but it doesn't seem to be a valid episode NZB, ignoring it", + logger.WARNING) continue - wantEp = True - for epNo in parse_result.episode_numbers: - if not result.extraInfo[0].wantEpisode(season, epNo, result.quality): - logger.log(u"Ignoring result " + newNZB + " because we don't want an episode that is " + - Quality.qualityStrings[result.quality], logger.INFO) - wantEp = False + want_ep = True + for ep_num in parsed_obj.episode_numbers: + if not obj.extraInfo[0].wantEpisode(season, ep_num, obj.quality): + # pylint: disable=no-member + logger.log(u"Ignoring result " + new_nzb + " because we don't want an episode that is " + + Quality.qualityStrings[obj.quality], logger.INFO) + want_ep = False break - if not wantEp: + if not want_ep: continue # get all the associated episode objects - epObjList = [] - for curEp in parse_result.episode_numbers: - epObjList.append(result.extraInfo[0].getEpisode(season, curEp)) + ep_obj_list = [obj.extraInfo[0].getEpisode(season, ep) for ep in parsed_obj.episode_numbers] # make a result - curResult = classes.NZBDataSearchResult(epObjList) - curResult.name = newNZB - curResult.provider = result.provider - curResult.quality = result.quality - curResult.extraInfo = [createNZBString(separateNZBs[newNZB], xmlns)] + cur_obj = classes.NZBDataSearchResult(ep_obj_list) + cur_obj.name = new_nzb + cur_obj.provider = obj.provider + cur_obj.quality = obj.quality + cur_obj.extraInfo = [create_nzb_string(separate_nzbs[new_nzb], xmlns)] - resultList.append(curResult) + result_list.append(cur_obj) - return resultList + return result_list diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py index de0602842985001cc4cd24ab4d0dc15b5864c63e..0dee5ce8001386351f736d265ecfa954e12bc3d3 100644 --- a/sickbeard/postProcessor.py +++ b/sickbeard/postProcessor.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import glob import fnmatch import os @@ -36,7 +35,7 @@ from sickbeard import notifiers from sickbeard import show_name_helpers from sickbeard import failed_history from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException -from sickrage.helper.common import subtitle_extensions +from sickrage.helper.common import remove_extension, replace_extension, subtitle_extensions from sickrage.helper.encoding import ek from sickrage.helper.exceptions import EpisodeNotFoundException, EpisodePostProcessingFailedException, ex from sickrage.helper.exceptions import ShowDirectoryNotFoundException @@ -353,7 +352,7 @@ class PostProcessor(object): new_file_name = new_base_name + '.' + cur_extension # if we're not renaming we still want to change extensions sometimes else: - new_file_name = helpers.replaceExtension(cur_file_name, cur_extension) + new_file_name = replace_extension(cur_file_name, cur_extension) if sickbeard.SUBTITLES_DIR and cur_extension[-3:] in subtitle_extensions: subs_new_path = ek(os.path.join, new_path, sickbeard.SUBTITLES_DIR) @@ -487,7 +486,7 @@ class PostProcessor(object): myDB = db.DBConnection() for curName in names: search_name = re.sub(r"[\.\- ]", "_", curName) - sql_results = myDB.select("SELECT * FROM history WHERE resource LIKE ?", [search_name]) + sql_results = myDB.select("SELECT showid, season, quality, version, resource FROM history WHERE resource LIKE ? AND action LIKE '%4'", [search_name]) if len(sql_results) == 0: continue @@ -530,7 +529,7 @@ class PostProcessor(object): or parse_result.air_date) and parse_result.release_group: if not self.release_name: - self.release_name = helpers.remove_non_release_groups(helpers.remove_extension(ek(os.path.basename, parse_result.original_name))) + self.release_name = helpers.remove_non_release_groups(remove_extension(ek(os.path.basename, parse_result.original_name))) else: logger.log(u"Parse result not sufficient (all following have to be set). will not save release name", @@ -558,7 +557,7 @@ class PostProcessor(object): logger.log(u"Analyzing name " + name, logger.DEBUG) - name = helpers.remove_non_release_groups(helpers.remove_extension(name)) + name = helpers.remove_non_release_groups(remove_extension(name)) # parse the name to break it into show name, season, and episode np = NameParser(True, tryIndexers=True) @@ -678,16 +677,16 @@ class PostProcessor(object): [show.indexerid, show.indexer, airdate]) if sql_result: - season = int(sql_result[0][0]) - episodes = [int(sql_result[0][1])] + season = int(sql_result[0]['season']) + episodes = [int(sql_result[0]['episode'])] else: # Found no result, try with season 0 sql_result = myDB.select( "SELECT season, episode FROM tv_episodes WHERE showid = ? and indexer = ? and airdate = ?", [show.indexerid, show.indexer, airdate]) if sql_result: - season = int(sql_result[0][0]) - episodes = [int(sql_result[0][1])] + season = int(sql_result[0]['season']) + episodes = [int(sql_result[0]['episode'])] else: self._log( u"Unable to find episode with date " + @@ -700,7 +699,7 @@ class PostProcessor(object): elif season is None and show: myDB = db.DBConnection() numseasonsSQlResult = myDB.select( - "SELECT COUNT(DISTINCT season) as numseasons FROM tv_episodes WHERE showid = ? and indexer = ? and season != 0", + "SELECT COUNT(DISTINCT season) FROM tv_episodes WHERE showid = ? and indexer = ? and season != 0", [show.indexerid, show.indexer]) if int(numseasonsSQlResult[0][0]) == 1 and season is None: self._log( @@ -981,8 +980,8 @@ class PostProcessor(object): if int(ep_obj.season) > 0: myDB = db.DBConnection() max_season = myDB.select( - "SELECT MAX(season) as maxseason FROM tv_episodes WHERE showid = ? and indexer = ?", - [show.indexerid, show.indexer]) + "SELECT MAX(season) FROM tv_episodes WHERE showid = ? and indexer = ?", [show.indexerid, show.indexer]) + # If the file season (ep_obj.season) is bigger than the indexer season (max_season[0][0]), skip the file if int(ep_obj.season) > int(max_season[0][0]): self._log(u"File has season %s, while the indexer is on season %s. The file may be incorrectly labeled or fake, aborting." diff --git a/sickbeard/processTV.py b/sickbeard/processTV.py index ec6ddd064b93a5d5a86c8a7e7975c009e8350dbb..9e2ed2431096cda5cc396d8f0a95bcb3ccd7f644 100644 --- a/sickbeard/processTV.py +++ b/sickbeard/processTV.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import os import stat @@ -28,7 +27,7 @@ from sickbeard import logger from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException from sickbeard import common from sickbeard import failedProcessor -from sickrage.helper.common import subtitle_extensions +from sickrage.helper.common import is_sync_file, is_torrent_or_nzb_file, subtitle_extensions from sickrage.helper.encoding import ek from sickrage.helper.exceptions import EpisodePostProcessingFailedException, ex, FailedPostProcessingFailedException @@ -176,8 +175,8 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior path, dirs, files = get_path_dir_files(dirName, nzbName, proc_type) - files = [x for x in files if helpers.notTorNZBFile(x)] - SyncFiles = [x for x in files if helpers.isSyncFile(x)] + files = [x for x in files if not is_torrent_or_nzb_file(x)] + SyncFiles = [x for x in files if is_sync_file(x)] # Don't post process if files are still being synced and option is activated if SyncFiles and sickbeard.POSTPONE_IF_SYNC_FILES: @@ -241,7 +240,7 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior postpone = False - SyncFiles = [x for x in fileList if helpers.isSyncFile(x)] + SyncFiles = [x for x in fileList if is_sync_file(x)] # Don't post process if files are still being synced and option is activated if SyncFiles and sickbeard.POSTPONE_IF_SYNC_FILES: diff --git a/sickbeard/providers/bitcannon.py b/sickbeard/providers/bitcannon.py index ebdd16551107fca7e2a21f9d60234da964f5529e..a3b9481d1c8c0a50c731bd8c6d247308f43452f9 100644 --- a/sickbeard/providers/bitcannon.py +++ b/sickbeard/providers/bitcannon.py @@ -17,7 +17,8 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -from urllib import quote_plus +import traceback +from urllib import urlencode from sickbeard import logger from sickbeard import tvcache @@ -34,63 +35,91 @@ class BitCannonProvider(generic.TorrentProvider): self.minseed = None self.minleech = None self.ratio = 0 + self.custom_url = None + self.api_key = None self.cache = BitCannonCache(self) - self.url = 'http://127.0.0.1:1337/' - self.urls = { - 'base_url': self.url, - 'search': self.url + 'search/', - 'trackers': self.url + 'stats', + self.search_params = { + 'q': '', + 'category': 'tv', + 'apiKey': '' } def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): + # search_strings comes in one of these formats: + # {'Episode': ['Italian Works S05E10']} + # {'Season': ['Italian Works S05']} + # {'RSS': ['tv', 'anime']} results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - trackers = (self.getURL(self.urls['trackers'], json=True) or {}).get(u'Trackers', []) - if not trackers: - logger.log(u'Could not get tracker list from BitCannon, aborting search') - return results + # select the correct category (TODO: Add more categories?) + anime = (self.show and self.show.anime) or (epObj and epObj.show and epObj.show.anime) or False + self.search_params['category'] = ('tv', 'anime')[anime] + + # Set API Key (if applicable) + if self.api_key: + self.search_params['apiKey'] = self.api_key for mode in search_strings.keys(): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - searchURL = self.urls['search'] + search_string - logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) - data = self.getURL(searchURL, json=True) - for item in data or []: - if 'tv' not in (item.get('Category') or u'').lower(): - continue - title = item.get(u'Title', u'') - info_hash = item.get(u'Btih', u'') - if not all([title, info_hash]): + self.search_params['q'] = search_string.encode('utf-8') if mode is not 'RSS' else '' + if mode is not 'RSS': + logger.log(u"Search string: %s" % search_string, logger.DEBUG) + + try: + url = "http://localhost:3000/" # a default + if self.custom_url is not None: + if not self.custom_url.endswith('/'): + self.custom_url += '/' + url = self.custom_url + search_url = url + "api/search?" + urlencode(self.search_params) + logger.log(u"Search URL: %s" % search_url, logger.DEBUG) + parsed_json = self.getURL(search_url, json=True) + + if not parsed_json: + logger.log(u"No data returned from provider", logger.DEBUG) continue - swarm = item.get(u'Swarm', {}) - seeders = swarm.get(u'Seeders', 0) - leechers = swarm.get(u'Leechers', 0) - size = item.get(u'Size', -1) + if self._check_auth_from_data(parsed_json): + try: + found_torrents = parsed_json['torrents'] + except Exception: + found_torrents = {} - # Filter unseeded torrent - if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': - logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) - continue + for result in found_torrents: + try: + title = result.get('title', '') + info_hash = result.get('infoHash', '') + swarm = result.get('swarm', None) + size = int(result.get('size', 0)) + if swarm is not None: + seeders = int(swarm.get('seeders', 0)) + leechers = int(swarm.get('leechers', 0)) + download_url = "magnet:?xt=urn:btih:" + info_hash + + except (AttributeError, TypeError, KeyError, ValueError): + continue - # Only build the url if we selected it - download_url = 'magnet:?xt=urn:btih:%s&dn=%s&tr=%s' % (info_hash, quote_plus(title.encode('utf-8')), u'&tr='.join([quote_plus(x.encode('utf-8')) for x in trackers])) + if seeders < self.minseed or leechers < self.minleech: + if mode is not 'RSS': + logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) + continue - item = title, download_url, size, seeders, leechers - if mode != 'RSS': - logger.log(u"Found result: %s " % title, logger.DEBUG) + item = title, download_url, size, seeders, leechers + if mode is not 'RSS': + logger.log(u"Found result: %s " % title, logger.DEBUG) - items[mode].append(item) + items[mode].append(item) + + except Exception: + logger.log(u"Failed parsing provider. Traceback: %r" % traceback.format_exc(), logger.ERROR) # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) - results += items[mode] return results @@ -98,18 +127,25 @@ class BitCannonProvider(generic.TorrentProvider): def seedRatio(self): return self.ratio + @staticmethod + def _check_auth_from_data(data): + if data and hasattr(data, 'status') and hasattr(data, 'message'): + if data and data['status'] == 401 and data['message'] == 'Invalid API key': + logger.log(u"Invalid api key. Check your settings", logger.WARNING) + return False + + return True class BitCannonCache(tvcache.TVCache): def __init__(self, provider_obj): tvcache.TVCache.__init__(self, provider_obj) - # only poll KickAss every 10 minutes max + # only poll bitcannon every 20 minutes max self.minTime = 20 def _getRSSData(self): - return {'entries': []} - # search_strings = {'RSS': ['']} - # return {'entries': self.provider._doSearch(search_strings)} + search_params = {'RSS': ['tv', 'anime']} + return {'entries': self.provider._doSearch(search_params)} provider = BitCannonProvider() diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index b1c59d0650abde589970abfedd7a5c95d33fc5cb..89f1526be4a1656e2e8d578d6493e40140bd76ca 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import datetime import os import re @@ -35,10 +34,12 @@ from sickbeard import tvcache from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException from sickbeard.common import Quality from sickbeard.common import user_agents +from sickrage.helper.common import sanitize_filename from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex from sickbeard import show_name_helpers + class GenericProvider(object): NZB = "nzb" TORRENT = "torrent" @@ -163,12 +164,10 @@ class GenericProvider(object): urls = [result.url] if self.providerType == GenericProvider.TORRENT: - filename = ek(os.path.join, sickbeard.TORRENT_DIR, - helpers.sanitizeFileName(result.name) + '.' + self.providerType) + filename = ek(os.path.join, sickbeard.TORRENT_DIR, sanitize_filename(result.name) + '.' + self.providerType) elif self.providerType == GenericProvider.NZB: - filename = ek(os.path.join, sickbeard.NZB_DIR, - helpers.sanitizeFileName(result.name) + '.' + self.providerType) + filename = ek(os.path.join, sickbeard.NZB_DIR, sanitize_filename(result.name) + '.' + self.providerType) return urls, filename diff --git a/sickbeard/providers/newpct.py b/sickbeard/providers/newpct.py index 3bcd2caaffb668c71f5d06d7670bf2259f0e0861..6365f9640944200b244cf2126e9ac22e88d67dd6 100644 --- a/sickbeard/providers/newpct.py +++ b/sickbeard/providers/newpct.py @@ -45,38 +45,30 @@ class newpctProvider(generic.TorrentProvider): self.urls = { 'base_url': 'http://www.newpct.com', - 'search': 'http://www.newpct.com/buscar-descargas/' + 'search': 'http://www.newpct.com/index.php' } self.url = self.urls['base_url'] """ Search query: - http://www.newpct.com/buscar-descargas/cID=0&tLang=0&oBy=0&oMode=0&category_=767&subcategory_=All&idioma_=1&calidad_=All&oByAux=0&oModeAux=0&size_=0&btnb=Filtrar+Busqueda&q=the+strain + http://www.newpct.com/index.php?l=doSearch&q=fringe&category_=767&idioma_=1&bus_de_=All + + q => Show name + category_ = Category "Shows" (767) + idioma_ = Language Spanish (1) + bus_de_ = Date from (All, Semana) - category_=767 => Category Shows - idioma_=1 => Language Spanish - calidad_=All=> Quality ALL - q => Search show """ self.search_params = { - 'cID': 0, - 'tLang': 0, - 'oBy': 0, - 'oMode': 0, + 'l': 'doSearch', + 'q': '', 'category_': 767, - 'subcategory_': 'All', 'idioma_': 1, - 'calidad_': 'All', - 'oByAux': 0, - 'oModeAux': 0, - 'size_': 0, - 'btnb': 'Filtrar+Busqueda', - 'q': '' + 'bus_de_': 'All' } - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] @@ -84,21 +76,26 @@ class newpctProvider(generic.TorrentProvider): # Only search if user conditions are true lang_info = '' if not epObj or not epObj.show else epObj.show.lang - if self.onlyspasearch and lang_info != 'es': - logger.log(u"Show info is not spanish, skipping provider search", logger.DEBUG) - return results for mode in search_strings.keys(): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) + # Only search if user conditions are true + if self.onlyspasearch and lang_info != 'es' and mode is not 'RSS': + logger.log(u"Show info is not spanish, skipping provider search", logger.DEBUG) + continue + for search_string in search_strings[mode]: if mode != 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) - self.search_params.update({'q': search_string.strip()}) + self.search_params['q'] = search_string.strip() if mode is not 'RSS' else '' + self.search_params['bus_de_'] = 'All' if mode is not 'RSS' else 'semana' - logger.log(u"Search URL: %s" % self.urls['search'] + '?' + urllib.parse.urlencode(self.search_params), logger.DEBUG) - data = self.getURL(self.urls['search'], post_data=self.search_params, timeout=30) + searchURL = self.urls['search'] + '?' + urllib.parse.urlencode(self.search_params) + logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) + + data = self.getURL(searchURL, timeout=30) if not data: continue @@ -220,26 +217,27 @@ class newpctProvider(generic.TorrentProvider): @staticmethod def _processTitle(title): - # Remove "Mas informacion sobre " literal from title title = title[22:] - # Quality - title = title.replace('[HDTV]', '[720p HDTV x264]') - title = title.replace('[HDTV 720p AC3 5.1]', '[720p HDTV x264]') - title = title.replace('[HDTV 1080p AC3 5.1]', '[1080p HDTV x264]') - title = title.replace('[DVDRIP]', '[DVDrip x264]') - title = title.replace('[DVD Rip]', '[DVDrip x264]') - title = title.replace('[DVDrip]', '[DVDrip x264]') - title = title.replace('[DVDRIP-AC3.5.1]', '[DVDrip x264]') - title = title.replace('[BLuRayRip]', '[720p BlueRay x264]') - title = title.replace('[BRrip]', '[720p BlueRay x264]') - title = title.replace('[BDrip]', '[720p BlueRay x264]') - title = title.replace('[BluRay Rip]', '[720p BlueRay x264]') - title = title.replace('[BluRay 720p]', '[720p BlueRay x264]') - title = title.replace('[BluRay 1080p]', '[1080p BlueRay x264]') - title = title.replace('[BluRay MicroHD]', '[1080p BlueRay x264]') - title = title.replace('[MicroHD 1080p]', '[1080p BlueRay x264]') + # Quality - Use re module to avoid case sensitive problems with replace + title = re.sub('\[HDTV 1080p.*]', '1080p HDTV x264', title, flags=re.IGNORECASE) + title = re.sub('\[HDTV 720p.*]', '720p HDTV x264', title, flags=re.IGNORECASE) + title = re.sub('\[HDTV]', 'HDTV x264', title, flags=re.IGNORECASE) + title = re.sub('\[DVD.*]', 'DVDrip x264', title, flags=re.IGNORECASE) + title = re.sub('\[BluRay 1080p.*]', '1080p BlueRay x264', title, flags=re.IGNORECASE) + title = re.sub('\[BluRay MicroHD.*]', '1080p BlueRay x264', title, flags=re.IGNORECASE) + title = re.sub('\[MicroHD 1080p.*]', '1080p BlueRay x264', title, flags=re.IGNORECASE) + title = re.sub('\[BLuRay.*]', '720p BlueRay x264', title, flags=re.IGNORECASE) + title = re.sub('\[BRrip.*]', '720p BlueRay x264', title, flags=re.IGNORECASE) + title = re.sub('\[BDrip.*]', '720p BlueRay x264', title, flags=re.IGNORECASE) + + #Language + title = re.sub('\[Spanish.*]', 'SPANISH AUDIO', title, flags=re.IGNORECASE) + title = re.sub(ur'\[Español.*]', 'SPANISH AUDIO', title, flags=re.IGNORECASE) + title = re.sub(u'\[AC3 5\.1 Español.*]', 'SPANISH AUDIO', title, flags=re.IGNORECASE) + + title += '-NEWPCT' return title.strip() @@ -250,10 +248,11 @@ class newpctCache(tvcache.TVCache): tvcache.TVCache.__init__(self, provider_obj) # set this 0 to suppress log line, since we aren't updating it anyways - self.minTime = 0 + self.minTime = 20 def _getRSSData(self): - return {'entries': []} + search_params = {'RSS': ['']} + return {'entries': self.provider._doSearch(search_params)} provider = newpctProvider() diff --git a/sickbeard/search.py b/sickbeard/search.py index 293016c7039b546878ffa48e3bb7593154954670..6fa7e2bec933e2a145e6aa4e2eebe6b63c580c01 100644 --- a/sickbeard/search.py +++ b/sickbeard/search.py @@ -589,7 +589,7 @@ def searchProviders(show, episodes, manualSearch=False, downCurQuality=False): 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(bestSeasonResult) + individualResults = nzbSplitter.split_result(bestSeasonResult) for curResult in individualResults: if len(curResult.episodes) == 1: epNum = curResult.episodes[0].episode diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index 5e06e596a7e4e8d5d4ac81f72a90ed2091ac02f5..402e6a61683c88b1faa4e771fba34ccbe26c9812 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -24,15 +24,15 @@ import traceback import subliminal import subprocess import pkg_resources +import sickbeard from enzyme import MKV, MalformedMKVError from subliminal.api import provider_manager from babelfish import Error as BabelfishError, Language, language_converters - -import sickbeard from sickbeard import logger from sickbeard import history from sickbeard import db -from sickrage.helper.common import dateTimeFormat +from sickbeard import processTV +from sickrage.helper.common import media_extensions, dateTimeFormat from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex @@ -153,7 +153,7 @@ def downloadSubtitles(subtitles_info): save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) - if not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith(('.mkv', '.mp4')): + if not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.rsplit(".", 1)[1] in media_extensions: run_subs_extra_scripts(subtitles_info, found_subtitles, video, single=not sickbeard.SUBTITLES_MULTI) current_subtitles = subtitlesLanguages(video_path)[0] @@ -350,10 +350,52 @@ class SubtitlesFinder(object): """ def __init__(self): self.amActive = False + + def subtitles_download_in_pp(self): + logger.log(u'Checking for needed subtitles in Post-Process folder', logger.INFO) + + providers = getEnabledServiceList() + provider_configs = {'addic7ed': {'username': sickbeard.ADDIC7ED_USER, 'password': sickbeard.ADDIC7ED_PASS}, + 'legendastv': {'username': sickbeard.LEGENDASTV_USER, 'password': sickbeard.LEGENDASTV_PASS}, + 'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS}} + + pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) + + # Search for all wanted languages + languages = set() + for language in frozenset(wantedLanguages()): + languages.add(fromietf(language)) + if not languages: + return + + runPostProcess = False + # Check if PP folder is set + if sickbeard.TV_DOWNLOAD_DIR and os.path.isdir(sickbeard.TV_DOWNLOAD_DIR): + for root, _, files in os.walk(sickbeard.TV_DOWNLOAD_DIR, topdown=False): + for videoFilename in sorted(files): + if videoFilename.rsplit(".", 1)[1] in media_extensions: + try: + video = subliminal.scan_video(os.path.join(root, videoFilename), subtitles=False, embedded_subtitles=False) + subtitles_list = pool.list_subtitles(video, languages) + + if not subtitles_list: + logger.log(u'No subtitles found for %s' % os.path.join(root, videoFilename), logger.DEBUG) + continue + + found_subtitles = pool.download_best_subtitles(subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, only_one=not sickbeard.SUBTITLES_MULTI) + + for subtitle in found_subtitles: + logger.log(u"Found subtitle for %s in %s provider with language %s" % (os.path.join(root, videoFilename), subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) + save_subtitles(video, found_subtitles, directory=root, single=not sickbeard.SUBTITLES_MULTI) + runPostProcess = True + except Exception as e: + logger.log(u"Error occurred when downloading subtitles for: %s. Error: %r" % (os.path.join(root, videoFilename), ex(e))) + if runPostProcess: + logger.log(u"Starting post-process with defaults settings now that we found subtitles") + processTV.processDir(sickbeard.TV_DOWNLOAD_DIR) def run(self, force=False): - self.amActive = True if not sickbeard.USE_SUBTITLES: return @@ -361,6 +403,11 @@ class SubtitlesFinder(object): logger.log(u'Not enough services selected. At least 1 service is required to search subtitles in the background', logger.WARNING) return + self.amActive = True + + if sickbeard.SUBTITLES_DOWNLOAD_IN_PP: + self.subtitles_download_in_pp() + logger.log(u'Checking for subtitles', logger.INFO) # get episodes on which we want subtitles @@ -385,6 +432,7 @@ class SubtitlesFinder(object): if len(sqlResults) == 0: logger.log(u'No subtitles to download', logger.INFO) + self.amActive = False return rules = self._getRules() @@ -407,11 +455,13 @@ class SubtitlesFinder(object): showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(epToSub['showid'])) if not showObj: logger.log(u'Show not found', logger.DEBUG) + self.amActive = False return epObj = showObj.getEpisode(int(epToSub["season"]), int(epToSub["episode"])) if isinstance(epObj, str): logger.log(u'Episode not found', logger.DEBUG) + self.amActive = False return existing_subtitles = epObj.subtitles @@ -421,6 +471,7 @@ class SubtitlesFinder(object): except Exception as e: logger.log(u'Unable to find subtitles', logger.DEBUG) logger.log(str(e), logger.DEBUG) + self.amActive = False return newSubtitles = frozenset(epObj.subtitles).difference(existing_subtitles) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index e5463eadfedb0f5b4ea34d4a8a45a62323ad364c..530673a228e351b55e971255f569d212ba008b64 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -33,6 +33,7 @@ from sickbeard.common import SKIPPED from sickbeard.common import UNKNOWN from sickbeard.common import WANTED from sickbeard.common import Quality +from sickrage.helper.common import sanitize_filename from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex @@ -453,7 +454,7 @@ class TraktChecker(object): location = None if location: - showPath = ek(os.path.join, location, helpers.sanitizeFileName(name)) + showPath = ek(os.path.join, location, sanitize_filename(name)) dir_exists = helpers.makeDir(showPath) if not dir_exists: diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 93ef682dbc8324b46d46c3af1cba6da17157c016..6559e9c6a7797c9102aa3f11965a7bb47a0257c9 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import os.path import datetime import threading @@ -48,7 +47,7 @@ from sickbeard.blackandwhitelist import BlackAndWhiteList from sickbeard import network_timezones from sickbeard.indexers.indexer_config import INDEXER_TVRAGE from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException -from sickrage.helper.common import dateTimeFormat +from sickrage.helper.common import dateTimeFormat, remove_extension, replace_extension, sanitize_filename from sickrage.helper.encoding import ek from sickrage.helper.exceptions import EpisodeDeletedException, EpisodeNotFoundException, ex from sickrage.helper.exceptions import MultipleEpisodesInDatabaseException, MultipleShowsInDatabaseException @@ -56,8 +55,7 @@ from sickrage.helper.exceptions import MultipleShowObjectsException, NoNFOExcept from sickrage.helper.exceptions import ShowNotFoundException from sickbeard.common import Quality, Overview, statusStrings -from sickbeard.common import DOWNLOADED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, ARCHIVED, IGNORED, UNAIRED, WANTED, SKIPPED, \ - UNKNOWN, FAILED +from sickbeard.common import DOWNLOADED, SNATCHED, SNATCHED_PROPER, ARCHIVED, IGNORED, UNAIRED, WANTED, SKIPPED, UNKNOWN from sickbeard.common import NAMING_DUPLICATE, NAMING_EXTEND, NAMING_LIMITED_EXTEND, NAMING_SEPARATED_REPEAT, \ NAMING_LIMITED_EXTEND_E_PREFIXED @@ -1300,14 +1298,21 @@ class TVShow(object): return Overview.GOOD elif epStatus in Quality.FAILED: return Overview.WANTED - elif epStatus in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST: + elif epStatus in Quality.SNATCHED: return Overview.SNATCHED + elif epStatus in Quality.SNATCHED_PROPER: + return Overview.SNATCHED_PROPER + elif epStatus in Quality.SNATCHED_BEST: + return Overview.SNATCHED_BEST elif epStatus in Quality.DOWNLOADED: anyQualities, bestQualities = Quality.splitQuality(self.quality) # @UnusedVariable epStatus, curQuality = Quality.splitCompositeStatus(epStatus) if curQuality not in anyQualities + bestQualities: - if curQuality != Quality.UNKNOWN and curQuality > max(anyQualities): + if curQuality != Quality.UNKNOWN and ( + (anyQualities and curQuality > max(anyQualities)) or + (bestQualities and curQuality > max(bestQualities)) + ): return Overview.GOOD else: return Overview.QUAL @@ -1737,7 +1742,7 @@ class TVEpisode(object): Quality.statusFromName(self.location, anime=self.show.is_anime)), logger.DEBUG) self.status = Quality.statusFromName(self.location, anime=self.show.is_anime) - nfoFile = sickbeard.helpers.replaceExtension(self.location, "nfo") + nfoFile = replace_extension(self.location, "nfo") logger.log(str(self.show.indexerid) + u": Using NFO name " + nfoFile, logger.DEBUG) if ek(os.path.isfile, nfoFile): @@ -1794,7 +1799,7 @@ class TVEpisode(object): else: self.hasnfo = False - if ek(os.path.isfile, sickbeard.helpers.replaceExtension(nfoFile, "tbn")): + if ek(os.path.isfile, replace_extension(nfoFile, "tbn")): self.hastbn = True else: self.hastbn = False @@ -2066,12 +2071,12 @@ class TVEpisode(object): def release_name(name): if name: - name = helpers.remove_non_release_groups(helpers.remove_extension(name)) + name = helpers.remove_non_release_groups(remove_extension(name)) return name def release_group(show, name): if name: - name = helpers.remove_non_release_groups(helpers.remove_extension(name)) + name = helpers.remove_non_release_groups(remove_extension(name)) else: return '' @@ -2156,6 +2161,9 @@ class TVEpisode(object): '%Y': str(self.airdate.year), '%M': str(self.airdate.month), '%D': str(self.airdate.day), + '%CY': str(datetime.date.today().year), + '%CM': str(datetime.date.today().month), + '%CD': str(datetime.date.today().day), '%0M': '%02d' % self.airdate.month, '%0D': '%02d' % self.airdate.day, '%RT': "PROPER" if self.is_proper else "", @@ -2170,9 +2178,9 @@ class TVEpisode(object): # do the replacements for cur_replacement in sorted(replace_map.keys(), reverse=True): - result_name = result_name.replace(cur_replacement, helpers.sanitizeFileName(replace_map[cur_replacement])) + result_name = result_name.replace(cur_replacement, sanitize_filename(replace_map[cur_replacement])) result_name = result_name.replace(cur_replacement.lower(), - helpers.sanitizeFileName(replace_map[cur_replacement].lower())) + sanitize_filename(replace_map[cur_replacement].lower())) return result_name @@ -2406,7 +2414,7 @@ class TVEpisode(object): # split off the dirs only, if they exist name_groups = re.split(r'[\\/]', pattern) - return helpers.sanitizeFileName(self._format_pattern(name_groups[-1], multi, anime_type)) + return sanitize_filename(self._format_pattern(name_groups[-1], multi, anime_type)) def rename(self): """ diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 11fb7e6ae0b110f9fe738372169bebb8913b7334..e3092be6c6a6cea6d955207dec19a7dbf8742d42 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -31,7 +31,7 @@ import datetime import traceback import sickbeard -from sickrage.helper.common import dateFormat, dateTimeFormat, timeFormat +from sickrage.helper.common import dateFormat, dateTimeFormat, pretty_file_size, sanitize_filename, timeFormat from sickrage.helper.encoding import ek from sickrage.helper.exceptions import CantUpdateShowException, ex, ShowDirectoryNotFoundException from sickrage.helper.quality import get_quality_string @@ -192,8 +192,8 @@ class ApiHandler(RequestHandler): for cmd in commands: cur_args, cur_kwargs = self.filter_params(cmd, args, kwargs) - cmd = cmd.split("_") # was a index used for this cmd ? - cmd, cmd_index = cmd[0], cmd[1:] # this gives us the clear cmd and the index + if len(cmd.split("_")) > 1: + cmd, cmd_index = cmd.split("_") logger.log(u"API :: " + cmd + ": cur_kwargs " + str(cur_kwargs), logger.DEBUG) if not (cmd in ('show.getbanner', 'show.getfanart', 'show.getnetworklogo', 'show.getposter') and @@ -305,10 +305,10 @@ class ApiCall(ApiHandler): for paramName in paramDict: if paramName not in self._help[paramType]: self._help[paramType][paramName] = {} - if paramDict[paramName]["allowedValues"]: - self._help[paramType][paramName]["allowedValues"] = paramDict[paramName]["allowedValues"] + if paramDict[paramName]["allowed_values"]: + self._help[paramType][paramName]["allowed_values"] = paramDict[paramName]["allowed_values"] else: - self._help[paramType][paramName]["allowedValues"] = "see desc" + self._help[paramType][paramName]["allowed_values"] = "see desc" self._help[paramType][paramName]["defaultValue"] = paramDict[paramName]["defaultValue"] self._help[paramType][paramName]["type"] = paramDict[paramName]["type"] @@ -431,7 +431,7 @@ class ApiCall(ApiHandler): def _check_param_value(self, value, name, allowed_values): """ will check if value (or all values in it ) are in allowed values will raise an exception if value is "out of range" - if bool(allowedValue) is False a check is not performed and all values are excepted + if bool(allowed_value) is False a check is not performed and all values are excepted """ if allowed_values: error = False @@ -755,7 +755,7 @@ class CMD_Episode(ApiCall): status, quality = Quality.splitCompositeStatus(int(episode["status"])) episode["status"] = _get_status_strings(status) episode["quality"] = get_quality_string(quality) - episode["file_size_human"] = helpers.pretty_filesize(episode["file_size"]) + episode["file_size_human"] = pretty_file_size(episode["file_size"]) return _responds(RESULT_SUCCESS, episode) @@ -2168,7 +2168,7 @@ class CMD_ShowAddNew(ApiCall): indexer = indexer_result['data']['results'][0]['indexer'] # moved the logic check to the end in an attempt to eliminate empty directory being created from previous errors - show_path = ek(os.path.join, self.location, helpers.sanitizeFileName(indexer_name)) + show_path = ek(os.path.join, self.location, sanitize_filename(indexer_name)) # don't create show dir if config says not to if sickbeard.ADD_SHOWS_WO_DIR: @@ -2798,8 +2798,8 @@ class CMD_Shows(ApiCall): shows = {} for curShow in sickbeard.showList: - if not self.paused and not curShow.paused: - continue + if not self.paused and curShow.paused: # If we're not including paused shows, and the current show is paused + continue # continue with the next show indexer_show = helpers.mapIndexersToShow(curShow) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index baa9380f1c216e3f0bb78a744afdea2a91a37ccf..82c55155eecc0c3cca9488c132e6aead3d2dded5 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -53,6 +53,7 @@ from unrar2 import RarFile import adba from libtrakt import TraktAPI from libtrakt.exceptions import traktException +from sickrage.helper.common import sanitize_filename from sickrage.helper.encoding import ek, ss from sickrage.helper.exceptions import CantRefreshShowException, CantUpdateShowException, ex from sickrage.helper.exceptions import MultipleShowObjectsException, NoNFOException, ShowDirectoryNotFoundException @@ -1128,17 +1129,19 @@ class Home(WebRoot): return self.redirect('/' + sickbeard.DEFAULT_PAGE + '/') - def update(self, pid=None): + def update(self, pid=None, branch=None): if str(pid) != str(sickbeard.PID): return self.redirect('/home/') checkversion = CheckVersion() - backup = checkversion._runbackup() + backup = checkversion.updater and checkversion._runbackup() if backup is True: + if branch: + checkversion.updater.branch = branch - if sickbeard.versionCheckScheduler.action.update(): + if checkversion.updater.update(): # do a hard restart sickbeard.events.put(sickbeard.events.SystemEvent.RESTART) @@ -1154,7 +1157,7 @@ class Home(WebRoot): if sickbeard.BRANCH != branch: sickbeard.BRANCH = branch ui.notifications.message('Checking out branch: ', branch) - return self.update(sickbeard.PID) + return self.update(sickbeard.PID, branch) else: ui.notifications.message('Already on branch: ', branch) return self.redirect('/' + sickbeard.DEFAULT_PAGE +'/') @@ -1257,6 +1260,8 @@ class Home(WebRoot): epCounts[Overview.GOOD] = 0 epCounts[Overview.UNAIRED] = 0 epCounts[Overview.SNATCHED] = 0 + epCounts[Overview.SNATCHED_PROPER] = 0 + epCounts[Overview.SNATCHED_BEST] = 0 for curResult in sqlResults: curEpCat = showObj.getOverview(int(curResult["status"] or -1)) @@ -1484,6 +1489,7 @@ class Home(WebRoot): showObj.rls_ignore_words = rls_ignore_words.strip() showObj.rls_require_words = rls_require_words.strip() + location = unicode(location, 'UTF-8') # if we change location clear the db of episodes, change it, write to db, and rescan if os.path.normpath(showObj._location) != os.path.normpath(location): logger.log(os.path.normpath(showObj._location) + " != " + os.path.normpath(location), logger.DEBUG) @@ -2257,7 +2263,7 @@ class HomeAddShows(Home): @staticmethod def sanitizeFileName(name): - return helpers.sanitizeFileName(name) + return sanitize_filename(name) @staticmethod def searchIndexersForShowName(search_term, lang=None, indexer=None): @@ -2585,7 +2591,7 @@ class HomeAddShows(Home): location = None if location: - show_dir = ek(os.path.join, location, helpers.sanitizeFileName(showName)) + show_dir = ek(os.path.join, location, sanitize_filename(showName)) dir_exists = helpers.makeDir(show_dir) if not dir_exists: logger.log(u"Unable to create the folder " + show_dir + ", can't add the show", logger.ERROR) @@ -2676,7 +2682,7 @@ class HomeAddShows(Home): if fullShowPath: show_dir = ek(os.path.normpath, fullShowPath) else: - show_dir = ek(os.path.join, rootDir, helpers.sanitizeFileName(show_name)) + show_dir = ek(os.path.join, rootDir, sanitize_filename(show_name)) # blanket policy - if the dir exists you should have used "add existing show" numbnuts if ek(os.path.isdir, show_dir) and not fullShowPath: @@ -2823,7 +2829,7 @@ class Manage(Home, WebRoot): def showEpisodeStatuses(indexer_id, whichStatus): status_list = [int(whichStatus)] if status_list[0] == SNATCHED: - status_list = Quality.SNATCHED + Quality.SNATCHED_PROPER + status_list = Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST myDB = db.DBConnection() cur_show_results = myDB.select( @@ -2888,7 +2894,7 @@ class Manage(Home, WebRoot): def changeEpisodeStatuses(self, oldStatus, newStatus, *args, **kwargs): status_list = [int(oldStatus)] if status_list[0] == SNATCHED: - status_list = Quality.SNATCHED + Quality.SNATCHED_PROPER + status_list = Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST to_change = {} @@ -3049,6 +3055,8 @@ class Manage(Home, WebRoot): epCounts[Overview.GOOD] = 0 epCounts[Overview.UNAIRED] = 0 epCounts[Overview.SNATCHED] = 0 + epCounts[Overview.SNATCHED_PROPER] = 0 + epCounts[Overview.SNATCHED_BEST] = 0 sqlResults = myDB.select( "SELECT status, season, episode, name, airdate FROM tv_episodes WHERE tv_episodes.showid in (SELECT tv_shows.indexer_id FROM tv_shows WHERE tv_shows.indexer_id = ? AND paused = 0) ORDER BY tv_episodes.season DESC, tv_episodes.episode DESC", @@ -4914,7 +4922,7 @@ class ConfigSubtitles(Config): controller="config", action="subtitles") def saveSubtitles(self, use_subtitles=None, subtitles_plugins=None, subtitles_languages=None, subtitles_dir=None, - service_order=None, subtitles_history=None, subtitles_finder_frequency=None, + service_order=None, subtitles_history=None, subtitles_finder_frequency=None, subtitles_download_in_pp=None, subtitles_multi=None, embedded_subtitles_all=None, subtitles_extra_scripts=None, subtitles_hearing_impaired=None, addic7ed_user=None, addic7ed_pass=None, legendastv_user=None, legendastv_pass=None, opensubtitles_user=None, opensubtitles_pass=None): @@ -4929,6 +4937,7 @@ class ConfigSubtitles(Config): sickbeard.EMBEDDED_SUBTITLES_ALL = config.checkbox_to_value(embedded_subtitles_all) sickbeard.SUBTITLES_HEARING_IMPAIRED = config.checkbox_to_value(subtitles_hearing_impaired) sickbeard.SUBTITLES_MULTI = config.checkbox_to_value(subtitles_multi) + sickbeard.SUBTITLES_DOWNLOAD_IN_PP = config.checkbox_to_value(subtitles_download_in_pp) sickbeard.SUBTITLES_EXTRA_SCRIPTS = [x.strip() for x in subtitles_extra_scripts.split('|') if x.strip()] # Subtitles services @@ -5097,7 +5106,10 @@ class ErrorLogs(WebRoot): 'SHOWUPDATER': u'Show Updater', 'CHECKVERSION': u'Check Version', 'SHOWQUEUE': u'Show Queue', - 'SEARCHQUEUE': u'Search Queue', + 'SEARCHQUEUE': u'Search Queue (All)', + 'SEARCHQUEUE-DAILY-SEARCH': u'Search Queue (Daily Searcher)', + 'SEARCHQUEUE-BACKLOG': u'Search Queue (Backlog)', + 'SEARCHQUEUE-MANUAL': u'Search Queue (Manual)', 'FINDPROPERS': u'Find Propers', 'POSTPROCESSER': u'Postprocesser', 'FINDSUBTITLES': u'Find Subtitles', diff --git a/sickrage/helper/common.py b/sickrage/helper/common.py index e33a796a17c1bef65842b5978e2e2897c5bd06d1..f63111cbd498632dc5dac61c7c5b42e60a1fbed5 100644 --- a/sickrage/helper/common.py +++ b/sickrage/helper/common.py @@ -16,6 +16,9 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +import re +import sickbeard + dateFormat = '%Y-%m-%d' dateTimeFormat = '%Y-%m-%d %H:%M:%S' media_extensions = [ @@ -24,3 +27,109 @@ media_extensions = [ ] subtitle_extensions = ['ass', 'idx', 'srt', 'ssa', 'sub'] timeFormat = '%A %I:%M %p' + + +def is_sync_file(filename): + """ + Check if the provided ``filename`` is a sync file, based on its name. + :param filename: The filename to check + :return: ``True`` if the ``filename`` is a sync file, ``False`` otherwise + """ + + if isinstance(filename, (str, unicode)): + extension = filename.rpartition('.')[2].lower() + + return extension in sickbeard.SYNC_FILES.split(',') or filename.startswith('.syncthing') + + return False + + +def is_torrent_or_nzb_file(filename): + """ + Check if the provided ``filename`` is a NZB file or a torrent file, based on its extension. + :param filename: The filename to check + :return: ``True`` if the ``filename`` is a NZB file or a torrent file, ``False`` otherwise + """ + + if not isinstance(filename, (str, unicode)): + return False + + return filename.rpartition('.')[2].lower() in ['nzb', 'torrent'] + + +def pretty_file_size(size): + """ + Return a human readable representation of the provided ``size``. + :param size: The size to convert + :return: The converted size + """ + + if isinstance(size, str) and size.isdigit(): + size = float(size) + + if not isinstance(size, (int, long, float)): + return '' + + remaining_size = size + + for unit in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']: + if remaining_size < 1024.: + return '%3.2f %s' % (remaining_size, unit) + + remaining_size /= 1024. + + return size + + +def remove_extension(filename): + """ + Remove the extension of the provided ``filename``. + The extension is only removed if it is in `sickrage.helper.common.media_extensions` or ['nzb', 'torrent']. + :param filename: The filename from which we want to remove the extension + :return: The ``filename`` without its extension. + """ + + if isinstance(filename, (str, unicode)) and '.' in filename: + # pylint: disable=W0612 + basename, separator, extension = filename.rpartition('.') # @UnusedVariable + + if basename and extension.lower() in ['nzb', 'torrent'] + media_extensions: + return basename + + return filename + + +def replace_extension(filename, new_extension): + """ + Replace the extension of the provided ``filename`` with a new extension. + :param filename: The filename for which we want to change the extension + :param new_extension: The new extension to apply on the ``filename`` + :return: The ``filename`` with the new extension + """ + + if isinstance(filename, (str, unicode)) and '.' in filename: + # pylint: disable=W0612 + basename, separator, extension = filename.rpartition('.') # @UnusedVariable + + if basename: + return '%s.%s' % (basename, new_extension) + + return filename + + +def sanitize_filename(filename): + """ + Remove specific characters from the provided ``filename``. + :param filename: The filename to clean + :return: The ``filename``cleaned + """ + + if isinstance(filename, (str, unicode)): + filename = re.sub(r'[\\/\*]', '-', filename) + filename = re.sub(r'[:"<>|?]', '', filename) + filename = re.sub(ur'\u2122', '', filename) # Trade Mark Sign + filename = filename.strip(' .') + + return filename + + return '' diff --git a/sickrage/show/Show.py b/sickrage/show/Show.py index a6824fc05054be5fdad8517d8cc0a644465bf02b..0634beb0175d985ffeb154750e812d9e5672d66c 100644 --- a/sickrage/show/Show.py +++ b/sickrage/show/Show.py @@ -60,7 +60,7 @@ class Show: today = str(date.today().toordinal()) downloaded_status = Quality.DOWNLOADED + Quality.ARCHIVED - snatched_status = Quality.SNATCHED + Quality.SNATCHED_PROPER + snatched_status = Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST total_status = [SKIPPED, WANTED] results = db.select( diff --git a/tests/all_tests.py b/tests/all_tests.py index de388878e699e32834af523c5ecf68227e96410d..ca1533cfc9da4e89a6fb1b45c2f1fc89026b9402 100755 --- a/tests/all_tests.py +++ b/tests/all_tests.py @@ -18,49 +18,83 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +# pylint: disable=line-too-long + +""" +Perform all tests in tests/ +""" + + import fnmatch import os import sys import unittest -tests_dir = os.path.abspath(__file__)[:-len(os.path.basename(__file__))] -sys.path.insert(1, os.path.join(tests_dir, '../lib')) -sys.path.insert(1, os.path.join(tests_dir, '..')) +TESTS_DIR = os.path.abspath(__file__)[:-len(os.path.basename(__file__))] + +sys.path.insert(1, os.path.join(TESTS_DIR, '../lib')) +sys.path.insert(1, os.path.join(TESTS_DIR, '..')) class AllTests(unittest.TestCase): + """ + Performs all tests in tests directory. + + Methods + setUp + test_all + _get_module_strings + _get_test_files + _get_test_suites + """ # Block issue_submitter_tests to avoid issue tracker spam on every build - blacklist = [tests_dir + 'all_tests.py', tests_dir + 'issue_submitter_tests.py', tests_dir + 'search_tests.py'] + blacklist = [TESTS_DIR + 'all_tests.py', TESTS_DIR + 'issue_submitter_tests.py', TESTS_DIR + 'search_tests.py'] def setUp(self): + """ + Get all tests + """ self.test_file_strings = self._get_test_files() self.module_strings = self._get_module_strings() self.suites = self._get_test_suites() - self.testSuite = unittest.TestSuite(self.suites) + self.test_suite = unittest.TestSuite(self.suites) - def testAll(self): + def test_all(self): + """ + Perform all tests + """ print "====================" print "STARTING - ALL TESTS" print "====================" for included_files in self.test_file_strings: - print "- " + included_files[len(tests_dir):-3] + print "- " + included_files[len(TESTS_DIR):-3] - text_runner = unittest.TextTestRunner().run(self.testSuite) + text_runner = unittest.TextTestRunner().run(self.test_suite) if not text_runner.wasSuccessful(): sys.exit(-1) def _get_module_strings(self): + """ + Convert the file names into module names + + :return: all module names + """ modules = [] for file_string in self.test_file_strings: - modules.append(file_string[len(tests_dir):len(file_string) - 3].replace(os.sep, '.')) + modules.append(file_string[len(TESTS_DIR):len(file_string) - 3].replace(os.sep, '.')) return modules def _get_test_files(self): + """ + Get the name of all the tests in the tests directory + + :return: all file names that match + """ matches = [] - for root, _, file_names in os.walk(tests_dir): + for root, _, file_names in os.walk(TESTS_DIR): for filename in fnmatch.filter(file_names, '*_tests.py'): filename_with_path = os.path.join(root, filename) @@ -70,8 +104,12 @@ class AllTests(unittest.TestCase): return matches def _get_test_suites(self): - return [unittest.defaultTestLoader.loadTestsFromName(file_string) for file_string in self.module_strings] + """ + Load all test suites + :return: all test suites from tests + """ + return [unittest.defaultTestLoader.loadTestsFromName(file_string) for file_string in self.module_strings] if __name__ == "__main__": unittest.main() diff --git a/tests/common_tests.py b/tests/common_tests.py index b0e6a1df03d3cb955f6a2afb0d9fe0b20d2dedbb..83a77e752553f881eefff862f6b292916ec5eaf9 100644 --- a/tests/common_tests.py +++ b/tests/common_tests.py @@ -2,8 +2,32 @@ """ Unit Tests for sickbeard/common.py + +Classes: + Quality + _getStatusStrings + combineQualities + splitQuality + nameQuality + sceneQuality + assumeQuality + qualityFromFileMeta + compositeStatus + qualityDownloaded + splitCompositeStatus + sceneQualityFromName + statusFromName + StatusStrings + statusStrings + __missing__ + __contains__ + OverView + """ +# TODO: Implement skipped tests + + import sys import os.path import unittest @@ -14,158 +38,216 @@ sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..') from sickbeard import common -class QualityTests(unittest.TestCase): +class QualityStringTests(unittest.TestCase): """ - Test Case for common.Quality + Test Case for strings in common.Quality """ + # TODO: Add more test cases + test_cases = { + 'sd_tv': ["Test.Show.S01E02.PDTV.XViD-GROUP", + "Test.Show.S01E02.PDTV.x264-GROUP", + "Test.Show.S01E02.HDTV.XViD-GROUP", + "Test.Show.S01E02.HDTV.x264-GROUP", + "Test.Show.S01E02.DSR.XViD-GROUP", + "Test.Show.S01E02.DSR.x264-GROUP", + "Test.Show.S01E02.TVRip.XViD-GROUP", + "Test.Show.S01E02.TVRip.x264-GROUP", + "Test.Show.S01E02.WEBRip.XViD-GROUP", + "Test.Show.S01E02.WEBRip.x264-GROUP", + "Test.Show.S01E02.WEB-DL.x264-GROUP", + "Test.Show.S01E02.WEB-DL.AAC2.0.H.264-GROUP", + "Test.Show.S01E02 WEB-DL H 264-GROUP", + "Test.Show.S01E02_WEB-DL_H_264-GROUP", + "Test.Show.S01E02.WEB-DL.AAC2.0.H264-GROUP", ], + 'sd_dvd': ["Test.Show.S01E02.DVDRiP.XViD-GROUP", + "Test.Show.S01E02.DVDRiP.DiVX-GROUP", + "Test.Show.S01E02.DVDRiP.x264-GROUP", + "Test.Show.S01E02.DVDRip.WS.XViD-GROUP", + "Test.Show.S01E02.DVDRip.WS.DiVX-GROUP", + "Test.Show.S01E02.DVDRip.WS.x264-GROUP", + "Test.Show.S01E02.BDRIP.XViD-GROUP", + "Test.Show.S01E02.BDRIP.DiVX-GROUP", + "Test.Show.S01E02.BDRIP.x264-GROUP", + "Test.Show.S01E02.BDRIP.WS.XViD-GROUP", + "Test.Show.S01E02.BDRIP.WS.DiVX-GROUP", + "Test.Show.S01E02.BDRIP.WS.x264-GROUP", ], + 'hd_tv': ["Test.Show.S01E02.720p.HDTV.x264-GROUP", + "Test.Show.S01E02.HR.WS.PDTV.x264-GROUP", ], + 'raw_hd_tv': ["Test.Show.S01E02.720p.HDTV.DD5.1.MPEG2-GROUP", + "Test.Show.S01E02.1080i.HDTV.DD2.0.MPEG2-GROUP", + "Test.Show.S01E02.1080i.HDTV.H.264.DD2.0-GROUP", + "Test Show - S01E02 - 1080i HDTV MPA1.0 H.264 - GROUP", + "Test.Show.S01E02.1080i.HDTV.DD.5.1.h264-GROUP", ], + 'full_hd_tv': ["Test.Show.S01E02.1080p.HDTV.x264-GROUP", ], + 'hd_web_dl': ["Test.Show.S01E02.720p.WEB-DL-GROUP", + "Test.Show.S01E02.720p.WEBRip-GROUP", + "Test.Show.S01E02.WEBRip.720p.H.264.AAC.2.0-GROUP", + "Test.Show.S01E02.720p.WEB-DL.AAC2.0.H.264-GROUP", + "Test Show S01E02 720p WEB-DL AAC2 0 H 264-GROUP", + "Test_Show.S01E02_720p_WEB-DL_AAC2.0_H264-GROUP", + "Test.Show.S01E02.720p.WEB-DL.AAC2.0.H264-GROUP", + "Test.Show.S01E02.720p.iTunes.Rip.H264.AAC-GROUP", ], + 'full_hd_web_dl': ["Test.Show.S01E02.1080p.WEB-DL-GROUP", + "Test.Show.S01E02.1080p.WEBRip-GROUP", + "Test.Show.S01E02.WEBRip.1080p.H.264.AAC.2.0-GROUP", + "Test.Show.S01E02.WEBRip.1080p.H264.AAC.2.0-GROUP", + "Test.Show.S01E02.1080p.iTunes.H.264.AAC-GROUP", + "Test Show S01E02 1080p iTunes H 264 AAC-GROUP", + "Test_Show_S01E02_1080p_iTunes_H_264_AAC-GROUP", ], + 'hd_bluray': ["Test.Show.S01E02.720p.BluRay.x264-GROUP", + "Test.Show.S01E02.720p.HDDVD.x264-GROUP", ], + 'full_hd_bluray': ["Test.Show.S01E02.1080p.BluRay.x264-GROUP", + "Test.Show.S01E02.1080p.HDDVD.x264-GROUP", ], + 'unknown': ["Test.Show.S01E02-SiCKBEARD", ], + } - # TODO: repack / proper ? air-by-date ? season rip? multi-ep? - - def test_SDTV(self): + def test_sd_tv(self): """ Test SDTV against nameQuality """ - tests = [ - "Test.Show.S01E02.PDTV.XViD-GROUP", - "Test.Show.S01E02.PDTV.x264-GROUP", - "Test.Show.S01E02.HDTV.XViD-GROUP", - "Test.Show.S01E02.HDTV.x264-GROUP", - "Test.Show.S01E02.DSR.XViD-GROUP", - "Test.Show.S01E02.DSR.x264-GROUP", - "Test.Show.S01E02.TVRip.XViD-GROUP", - "Test.Show.S01E02.TVRip.x264-GROUP", - "Test.Show.S01E02.WEBRip.XViD-GROUP", - "Test.Show.S01E02.WEBRip.x264-GROUP", - "Test.Show.S01E02.WEB-DL.x264-GROUP", - "Test.Show.S01E02.WEB-DL.AAC2.0.H.264-GROUP", - "Test.Show.S01E02 WEB-DL H 264-GROUP", - "Test.Show.S01E02_WEB-DL_H_264-GROUP", - "Test.Show.S01E02.WEB-DL.AAC2.0.H264-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality(test)) + cur_test = 'sd_tv' + cur_qual = common.Quality.SDTV + + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) - def test_SDDVD(self): + def test_sd_dvd(self): """ Test SDDVD against nameQuality """ - tests = [ - "Test.Show.S01E02.DVDRiP.XViD-GROUP", - "Test.Show.S01E02.DVDRiP.DiVX-GROUP", - "Test.Show.S01E02.DVDRiP.x264-GROUP", - "Test.Show.S01E02.DVDRip.WS.XViD-GROUP", - "Test.Show.S01E02.DVDRip.WS.DiVX-GROUP", - "Test.Show.S01E02.DVDRip.WS.x264-GROUP", - "Test.Show.S01E02.BDRIP.XViD-GROUP", - "Test.Show.S01E02.BDRIP.DiVX-GROUP", - "Test.Show.S01E02.BDRIP.x264-GROUP", - "Test.Show.S01E02.BDRIP.WS.XViD-GROUP", - "Test.Show.S01E02.BDRIP.WS.DiVX-GROUP", - "Test.Show.S01E02.BDRIP.WS.x264-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality(test)) + cur_test = 'sd_dvd' + cur_qual = common.Quality.SDDVD + + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) - def test_HDTV(self): + def test_hd_tv(self): """ Test HDTV against nameQuality """ - tests = [ - "Test.Show.S01E02.720p.HDTV.x264-GROUP", - "Test.Show.S01E02.HR.WS.PDTV.x264-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.HDTV, common.Quality.nameQuality(test)) + cur_test = 'hd_tv' + cur_qual = common.Quality.HDTV - def test_RAWHDTV(self): + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) + + def test_raw_hd_tv(self): """ Test RAWHDTV against nameQuality """ - tests = [ - "Test.Show.S01E02.720p.HDTV.DD5.1.MPEG2-GROUP", - "Test.Show.S01E02.1080i.HDTV.DD2.0.MPEG2-GROUP", - "Test.Show.S01E02.1080i.HDTV.H.264.DD2.0-GROUP", - "Test Show - S01E02 - 1080i HDTV MPA1.0 H.264 - GROUP", - "Test.Show.S01E02.1080i.HDTV.DD.5.1.h264-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality(test)) + cur_test = 'raw_hd_tv' + cur_qual = common.Quality.RAWHDTV + + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) - def test_FULLHDTV(self): + def test_full_hd_tv(self): """ Test FULLHDTV against nameQuality """ - tests = [ - "Test.Show.S01E02.1080p.HDTV.x264-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.FULLHDTV, common.Quality.nameQuality(test)) + cur_test = 'full_hd_tv' + cur_qual = common.Quality.FULLHDTV - def test_HDWEBDL(self): + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) + + def test_hd_web_dl(self): """ Test HDWEBDL against nameQuality """ - tests = [ - "Test.Show.S01E02.720p.WEB-DL-GROUP", - "Test.Show.S01E02.720p.WEBRip-GROUP", - "Test.Show.S01E02.WEBRip.720p.H.264.AAC.2.0-GROUP", - "Test.Show.S01E02.720p.WEB-DL.AAC2.0.H.264-GROUP", - "Test Show S01E02 720p WEB-DL AAC2 0 H 264-GROUP", - "Test_Show.S01E02_720p_WEB-DL_AAC2.0_H264-GROUP", - "Test.Show.S01E02.720p.WEB-DL.AAC2.0.H264-GROUP", - "Test.Show.S01E02.720p.iTunes.Rip.H264.AAC-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality(test)) + cur_test = 'hd_web_dl' + cur_qual = common.Quality.HDWEBDL + + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) - def test_FULLHDWEBDL(self): + def test_full_hd_web_dl(self): """ Test FULLHDWEBDL against nameQuality """ - tests = [ - "Test.Show.S01E02.1080p.WEB-DL-GROUP", - "Test.Show.S01E02.1080p.WEBRip-GROUP", - "Test.Show.S01E02.WEBRip.1080p.H.264.AAC.2.0-GROUP", - "Test.Show.S01E02.WEBRip.1080p.H264.AAC.2.0-GROUP", - "Test.Show.S01E02.1080p.iTunes.H.264.AAC-GROUP", - "Test Show S01E02 1080p iTunes H 264 AAC-GROUP", - "Test_Show_S01E02_1080p_iTunes_H_264_AAC-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality(test)) + cur_test = 'full_hd_web_dl' + cur_qual = common.Quality.FULLHDWEBDL - def test_HDBLURAY(self): + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) + + def test_hd_bluray(self): """ Test HDBLURAY against nameQuality """ - tests = [ - "Test.Show.S01E02.720p.BluRay.x264-GROUP", - "Test.Show.S01E02.720p.HDDVD.x264-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.HDBLURAY, common.Quality.nameQuality(test)) + cur_test = 'hd_bluray' + cur_qual = common.Quality.HDBLURAY + + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) - def test_FULLHDBLURAY(self): + def test_full_hd_bluray(self): """ Test FULLHDBLURAY against nameQuality """ - tests = [ - "Test.Show.S01E02.1080p.BluRay.x264-GROUP", - "Test.Show.S01E02.1080p.HDDVD.x264-GROUP", - ] - for test in tests: - self.assertEqual(common.Quality.FULLHDBLURAY, common.Quality.nameQuality(test)) + cur_test = 'full_hd_bluray' + cur_qual = common.Quality.FULLHDBLURAY + + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) - def test_UNKNOWN(self): + def test_unknown(self): """ Test UNKNOWN against nameQuality """ - tests = [ - "Test.Show.S01E02-SiCKBEARD", - ] - for test in tests: - self.assertEqual(common.Quality.UNKNOWN, common.Quality.nameQuality(test)) + cur_test = 'unknown' + cur_qual = common.Quality.UNKNOWN + + for name, tests in self.test_cases.items(): + for test in tests: + if name == cur_test: + self.assertEqual(cur_qual, common.Quality.nameQuality(test)) + else: + self.assertNotEqual(cur_qual, common.Quality.nameQuality(test)) + + +class QualityTests(unittest.TestCase): + """ + Test Case for common.Quality + """ + # TODO: repack / proper ? air-by-date ? season rip? multi-ep? @unittest.expectedFailure # reverse parsing does not work def test_reverse_parsing(self): @@ -189,8 +271,92 @@ class QualityTests(unittest.TestCase): self.assertEqual(quality, common.Quality.nameQuality(test), (quality, common.Quality.nameQuality(test), test)) + @unittest.skip('Not yet implemented') + def test_get_status_strings(self): + """ + Test _getStatusStrings + """ + pass + + @unittest.skip('Not yet implemented') + def test_combine_qualities(self): + """ + Test combineQualities + """ + pass + + @unittest.skip('Not yet implemented') + def test_split_quality(self): + """ + Test splitQuality + """ + pass + + @unittest.skip('Not yet implemented') + def test_name_quality(self): + """ + Test nameQuality + """ + pass + + @unittest.skip('Not yet implemented') + def test_scene_quality(self): + """ + Test sceneQuality + """ + pass + + @unittest.skip('Not yet implemented') + def test_assume_quality(self): + """ + Test assumeQuality + """ + pass + + @unittest.skip('Not yet implemented') + def test_quality_from_file_meta(self): + """ + Test qualityFromFileMeta + """ + pass + + @unittest.skip('Not yet implemented') + def test_composite_status(self): + """ + Test compositeStatus + """ + pass -class StatusStringsTest(unittest.TestCase): + @unittest.skip('Not yet implemented') + def test_quality_downloaded(self): + """ + Test qualityDownloaded + """ + pass + + @unittest.skip('Not yet implemented') + def test_split_composite_status(self): + """ + Test splitCompositeStatus + """ + pass + + @unittest.skip('Not yet implemented') + def test_scene_quality_from_name(self): + """ + Test sceneQualityFromName + """ + pass + + @unittest.skip('Not yet implemented') + def test_status_from_name(self): + """ + Test statusFromName + """ + pass + + +class StatusStringsTests(unittest.TestCase): """ Test Case for common.StatusStrings """ @@ -242,13 +408,37 @@ class StatusStringsTest(unittest.TestCase): status_strings[str(i)] = 1 self.assertEqual(status_strings[i], 1) + +class OverviewTests(unittest.TestCase): + """ + Test common.Overview + """ + def test_overview_strings(self): + """ + Test common.Overview.overviewStrings + """ + overview = common.Overview() + + self.assertEqual(overview.overviewStrings[overview.SKIPPED], "skipped") + self.assertEqual(overview.overviewStrings[overview.WANTED], "wanted") + self.assertEqual(overview.overviewStrings[overview.QUAL], "qual") + self.assertEqual(overview.overviewStrings[overview.GOOD], "good") + self.assertEqual(overview.overviewStrings[overview.UNAIRED], "unaired") + self.assertEqual(overview.overviewStrings[overview.SNATCHED], "snatched") + if __name__ == '__main__': print "=======================" print "STARTING - COMMON TESTS" print "=======================" - suite = unittest.TestLoader().loadTestsFromTestCase(QualityTests) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(QualityStringTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(QualityTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(StatusStringsTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) - suite = unittest.TestLoader().loadTestsFromTestCase(StatusStringsTest) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(OverviewTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/config_tests.py b/tests/config_tests.py index 36619ed1a7c0e1262df60da13cdb82069e0b3b3d..b396896919ec140558c9f4799f4f90d7770ba1f2 100644 --- a/tests/config_tests.py +++ b/tests/config_tests.py @@ -1,22 +1,308 @@ +# coding=utf-8 +""" +Test sickbeard.config's classes and methods + +Classes: + ConfigMigrator + migrate_config + _migrate_v1 + _name_to_pattern + _migrate_v2 + _migrate_v3 + _migrate_v4 + _migrate_v5 + _migrate_v6 + _migrate_v7 + +Methods + change_HTTPS_CERT + change_HTTPS_KEY + change_LOG_DIR + change_NZB_DIR + change_TORRENT_DIR + change_TV_DOWNLOAD_DIR + change_AUTOPOSTPROCESSER_FREQUENCY + change_DAILYSEARCH_FREQUENCY + change_BACKLOG_FREQUENCY + change_UPDATE_FREQUENCY + change_SHOWUPDATE_HOUR + change_SUBTITLES_FINDER_FREQUENCY + change_VERSION_NOTIFY + change_DOWNLOAD_PROPERS + change_USE_TRAKT + change_USE_SUBTITLES + change_PROCESS_AUTOMATICALLY + CheckSection + checkbox_to_value + clean_host + clean_hosts + clean_url + to_int + minimax + check_setting_int + check_setting_float + check_setting_str +""" + +# pylint: disable=line-too-long + import sys import os.path +import unittest +import logging +from collections import namedtuple sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) -import unittest - from sickbeard import config -class QualityTests(unittest.TestCase): + +class ConfigTestBasic(unittest.TestCase): + """ + Test basic methods in sickbeard.config + """ + @unittest.skip('Test not implemented') + def test_check_section(self): + """ + Test check_section + """ + pass + + @unittest.skip('Test not implemented') + def test_checkbox_to_value(self): + """ + Test checkbox_to_value + """ + pass + + @unittest.skip('Test not implemented') + def test_clean_host(self): + """ + Test clean_host + """ + pass + + @unittest.skip('Test not implemented') + def test_clean_hosts(self): + """ + Test clean_hosts + """ + pass def test_clean_url(self): - self.assertEqual(config.clean_url("https://subdomain.domain.tld/endpoint"), "https://subdomain.domain.tld/endpoint") - self.assertEqual(config.clean_url("google.com/xml.rpc"), "http://google.com/xml.rpc") - self.assertEqual(config.clean_url("google.com"), "http://google.com/") - self.assertEqual(config.clean_url("http://www.example.com/folder/"), "http://www.example.com/folder/") - self.assertEqual(config.clean_url("scgi:///home/user/.config/path/socket"), "scgi:///home/user/.config/path/socket") + """ + Test cleaning of urls + """ + log = logging.getLogger(__name__) + test = namedtuple('test', 'expected_result dirty clean') + + url_tests = [ + test(True, "https://subdomain.domain.tld/endpoint", "https://subdomain.domain.tld/endpoint"), # does not add a final / + test(True, "http://www.example.com/folder/", "http://www.example.com/folder/"), # does not remove the final / + test(True, "google.com/xml.rpc", "http://google.com/xml.rpc"), # add scheme if missing + test(True, "google.com", "http://google.com/"), # add scheme if missing and final / if its just the domain + test(True, "scgi:///home/user/.config/path/socket", "scgi:///home/user/.config/path/socket"), # scgi identified as scheme + test(True, None, ''), # None URL returns empty string + test(False, "https://subdomain.domain.tld/endpoint", "http://subdomain.domain.tld/endpoint"), # does not change schemes from https to http + test(False, "http://subdomain.domain.tld/endpoint", "https://subdomain.domain.tld/endpoint"), # ...or vice versa + test(False, "google.com/xml.rpc", "google.com/xml.rpc"), # scheme is always added + test(False, "google.com", "https://google.com/"), # does not default to https + test(False, "http://www.example.com/folder/", "http://www.example.com/folder"), # does not strip final / + test(False, "scgi:///home/user/.config/path/socket", "scgi:///home/user/.config/path/socket/"), # does not add a final / + test(AttributeError, 1, 1), # None URL returns empty string + ] + + for test_url in url_tests: + if issubclass(type(Exception), type(test_url.expected_result)): + with self.assertRaises(test_url.expected_result): + self.assertEqual(config.clean_url(test_url.dirty), test_url.clean) + elif test_url.expected_result is True: + self.assertEqual(config.clean_url(test_url.dirty), test_url.clean) + elif not test_url.expected_result is False: + self.assertNotEqual(config.clean_url(test_url.dirty), test_url.clean) + else: + log.error('Test not defined for %s', test_url) + + @unittest.skip('Test not implemented') + def test_to_int(self): + """ + Test to_int + """ + pass + + @unittest.skip('Test not implemented') + def test_mini_max(self): + """ + Test mini_max + """ + pass + + @unittest.skip('Test not implemented') + def test_check_setting_int(self): + """ + Test check_setting_int + """ + pass + + @unittest.skip('Test not implemented') + def test_check_setting_float(self): + """ + Test check_setting_float + """ + pass + + @unittest.skip('Test not implemented') + def test_check_setting_str(self): + """ + Test check_setting_str + """ + pass + + +class ConfigTestChanges(unittest.TestCase): + """ + Test change methods in sickbeard.config + """ + @unittest.skip('Test not implemented') + def test_change_https_cert(self): + """ + Test change_https_cert + """ + pass + + @unittest.skip('Test not implemented') + def test_change_https_key(self): + """ + Test change_https_key + """ + pass + + @unittest.skip('Test not implemented') + def test_change_log_dir(self): + """ + Test change_log_dir + """ + pass + + @unittest.skip('Test not implemented') + def test_change_nzb_dir(self): + """ + Test change_nzb_dir + """ + pass + + @unittest.skip('Test not implemented') + def test_change_torrent_dir(self): + """ + Test change_torrent_dir + """ + pass + + @unittest.skip('Test not implemented') + def test_change_tv_download_dir(self): + """ + Test change_tv_download_dir + """ + pass + + @unittest.skip('Test not implemented') + def test_change_auto_pp_freq(self): + """ + Test change_auto_pp_freq + """ + pass + + @unittest.skip('Test not implemented') + def test_change_daily_search_freq(self): + """ + Test change_daily_search_freq + """ + pass + + @unittest.skip('Test not implemented') + def test_change_backlog_freq(self): + """ + Test change_backlog_freq + """ + pass + + @unittest.skip('Test not implemented') + def test_change_update_freq(self): + """ + Test change_update_freq + """ + pass + + @unittest.skip('Test not implemented') + def test_change_show_update_hour(self): + """ + Test change_show_update_hour + """ + pass + + @unittest.skip('Test not implemented') + def test_change_sub_finder_freq(self): + """ + Test change_sub_finder_freq + """ + pass + + @unittest.skip('Test not implemented') + def test_change_version_notify(self): + """ + Test change_version_notify + """ + pass + + @unittest.skip('Test not implemented') + def test_change_download_propers(self): + """ + Test change_download_propers + """ + pass + + @unittest.skip('Test not implemented') + def test_change_use_trakt(self): + """ + Test change_use_trakt + """ + pass + + @unittest.skip('Test not implemented') + def test_change_use_subtitles(self): + """ + Test change_use_subtitles + """ + pass + + @unittest.skip('Test not implemented') + def test_change_process_auto(self): + """ + Test change_process_auto + """ + pass + + +class ConfigTestMigrator(unittest.TestCase): + """ + Test the sickbeard.config.ConfigMigrator class + """ + @unittest.skip('Not yet implemented') + def test_config_migrator(self): + """ + Test config_migrator + """ + pass + if __name__ == '__main__': - suite = unittest.TestLoader().loadTestsFromTestCase(QualityTests) - unittest.TextTestRunner(verbosity=2).run(suite) + logging.basicConfig(stream=sys.stderr) + logging.getLogger(__name__).setLevel(logging.DEBUG) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(ConfigTestBasic) + unittest.TextTestRunner(verbosity=2).run(SUITE) + SUITE = unittest.TestLoader().loadTestsFromTestCase(ConfigTestChanges) + unittest.TextTestRunner(verbosity=2).run(SUITE) + SUITE = unittest.TestLoader().loadTestsFromTestCase(ConfigTestMigrator) + unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/encoding_tests.py b/tests/encoding_tests.py index fb67ccef49f4da13e3ab06f59b3c6c7759c213e6..b6d042f4aa37dfb0e7b7b18dd256b6ed6167b2ed 100644 --- a/tests/encoding_tests.py +++ b/tests/encoding_tests.py @@ -1,22 +1,34 @@ # coding=utf-8 -import sys, os.path +""" +Test encoding +""" -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +# pylint: disable=line-too-long +import sys +import os.path import locale import unittest +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + import sickbeard -from sickbeard.helpers import sanitizeFileName +from sickrage.helper.common import sanitize_filename from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex class EncodingTests(unittest.TestCase): + """ + Test encodings + """ def test_encoding(self): - rootDir = 'C:\\Temp\\TV' + """ + Test encoding + """ + root_dir = 'C:\\Temp\\TV' strings = [u'Les Enfants De La T\xe9l\xe9', u'RT� One'] sickbeard.SYS_ENCODING = None @@ -31,17 +43,18 @@ class EncodingTests(unittest.TestCase): if not sickbeard.SYS_ENCODING or sickbeard.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'): sickbeard.SYS_ENCODING = 'UTF-8' - for s in strings: + for test in strings: try: - show_dir = ek(os.path.join, rootDir, sanitizeFileName(s)) + show_dir = ek(os.path.join, root_dir, sanitize_filename(test)) self.assertTrue(isinstance(show_dir, unicode)) - except Exception, e: - ex(e) + except Exception as error: # pylint: disable=broad-except + ex(error) if __name__ == "__main__": print "==================" print "STARTING - ENCODING TESTS" print "==================" print "######################################################################" - suite = unittest.TestLoader().loadTestsFromTestCase(EncodingTests) - unittest.TextTestRunner(verbosity=2).run(suite) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(EncodingTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/feedparser_tests.py b/tests/feedparser_tests.py index 5ef68544a27c83fafc8a4ee19876544a94092613..701c23a421edfb8c09f558a02878be9596a20b31 100644 --- a/tests/feedparser_tests.py +++ b/tests/feedparser_tests.py @@ -1,29 +1,41 @@ -import sys, os.path +# coding=utf-8 -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +""" +Test Feed Parser +""" +import sys +import os.path import unittest +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + from sickbeard.providers.womble import provider as womble + class FeedParserTests(unittest.TestCase): - # pylint: disable=W0212 + """ + Test feed parser + """ def test_womble(self): + """ + Test womble + """ result = womble.cache.getRSSFeed('http://newshost.co.za/rss/?sec=tv-sd&fr=false') self.assertTrue('entries' in result) self.assertTrue('feed' in result) for item in result['entries'] or []: - title, url = womble._get_title_and_url(item) + title, url = womble._get_title_and_url(item) # pylint: disable=protected-access self.assertTrue(title and url) if __name__ == "__main__": print "==================" - print "STARTING - FEEDPARSER TESTS" + print "STARTING - FEED PARSER TESTS" print "==================" print "######################################################################" - suite = unittest.TestLoader().loadTestsFromTestCase(FeedParserTests) - testresults = unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(FeedParserTests) + TEST_RESULTS = unittest.TextTestRunner(verbosity=2).run(SUITE) # Return 0 if successful, 1 if there was a failure - sys.exit(not testresults.wasSuccessful()) + sys.exit(not TEST_RESULTS.wasSuccessful()) diff --git a/tests/helpers_tests.py b/tests/helpers_tests.py index f51b3896c3ff196b6ca7e35ed4a53ede28e6d7a2..87b9e1c5dc9c1fbc9b3a4b4c365542d4120cca6b 100755 --- a/tests/helpers_tests.py +++ b/tests/helpers_tests.py @@ -1,22 +1,93 @@ #!/usr/bin/env python2.7 -""" -Author: Dustyn Gibson <miigotu@gmail.com> -URL: http://github.com/SiCKRAGETV/SickRage - -This file is part of SickRage. - -SickRage is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +# Author: Dustyn Gibson <miigotu@gmail.com> +# URL: http://github.com/SiCKRAGETV/SickRage +# +# This file is part of SickRage. +# +# SickRage is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# SickRage is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SickRage. If not, see <http://www.gnu.org/licenses/>. -SickRage is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +""" +Test sickbeard.helpers -You should have received a copy of the GNU General Public License -along with SickRage. If not, see <http://www.gnu.org/licenses/>. +Methods: + isValidLanguage + fixGlob + indentXML + remove_non_release_groups + isMediaFile + isRarFile + isBeingWritten + remove_file_failed + findCertainShow + makeDir + searchDBForShow + searchIndexerForShowID + listMediaFiles + copyFile + moveFile + link + hardlinkFile + symlink + moveAndSymlinkFile + make_dirs + rename_ep_file + delete_empty_folders + fileBitFilter + chmodAsParent + fixSetGroupID + is_anime_in_show_list + update_anime_support + get_absolute_number_from_season_and_episode + get_all_episodes_from_absolute_number + sanitizeSceneName + arithmeticEval + create_https_certificates + backupVersionedFile + restoreVersionedFile + tryInt + md5_for_file + get_lan_ip + check_url + anon_url + encrypt + decrypt + full_sanitizeSceneName + _check_against_names + get_show + is_hidden_folder + real_path + validateShow + set_up_anidb_connection + makeZip + extractZip + backupConfigZip + restoreConfigZip + mapIndexersToShow + touchFile + _getTempDir + codeDescription + _setUpSession + getURL + download_file + get_size + generateApiKey + remove_article + generateCookieSecret + verify_freespace + pretty_time_delta + isFileLocked + getDiskSpaceUsage """ import sys @@ -27,12 +98,13 @@ sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..') import unittest -from sickbeard.helpers import remove_non_release_groups +from sickbeard.helpers import isValidLanguage, remove_non_release_groups +from babelfish import language # pylint: disable=import-error -test_result = 'Show.Name.S01E01.HDTV.x264-RLSGROUP' -test_cases = { +TEST_RESULT = 'Show.Name.S01E01.HDTV.x264-RLSGROUP' +TEST_CASES = { 'removewords': [ - test_result, + TEST_RESULT, 'Show.Name.S01E01.HDTV.x264-RLSGROUP[cttv]', 'Show.Name.S01E01.HDTV.x264-RLSGROUP.RiPSaLoT', 'Show.Name.S01E01.HDTV.x264-RLSGROUP[GloDLS]', @@ -71,25 +143,591 @@ test_cases = { ] } + class HelpersTests(unittest.TestCase): + """ + Test using test generator + """ def __init__(self, *args, **kwargs): + """ + Initialize test + """ super(HelpersTests, self).__init__(*args, **kwargs) + def test_generator(test_strings): + """ + Generate tests from test strings + + :param test_strings: to generate tests from + :return: test + """ def _test(self): + """ + Generate tests + :param self: + :return: test to run + """ for test_string in test_strings: - self.assertEqual(remove_non_release_groups(test_string), test_result) + self.assertEqual(remove_non_release_groups(test_string), TEST_RESULT) return _test + +class HelpersZipTests(unittest.TestCase): + """ + Test zip methods + """ + @unittest.skip('Not yet implemented') + def test_make_zip(self): + """ + Test makeZip + """ + pass + + @unittest.skip('Not yet implemented') + def test_extract_zip(self): + """ + Test extractZip + """ + pass + + @unittest.skip('Not yet implemented') + def test_backup_config_zip(self): + """ + Test backupConfigZip + """ + pass + + @unittest.skip('Not yet implemented') + def test_restore_config_zip(self): + """ + Test restoreConfigZip + """ + pass + + @unittest.skip('Not yet implemented') + def test_is_rar_file(self): + """ + Test isRarFile + """ + pass + + +class HelpersDirectoryTests(unittest.TestCase): + """ + Test directory methods + """ + @unittest.skip('Not yet implemented') + def test_make_dirs(self): + """ + Test make_dirs + """ + pass + + @unittest.skip('Not yet implemented') + def test_delete_empty_folders(self): + """ + Test delete_empty_folders + """ + pass + + @unittest.skip('Not yet implemented') + def test_make_dir(self): + """ + Test makeDir + """ + pass + + @unittest.skip('Not yet implemented') + def test_get_temp_dir(self): + """ + Test _getTempDir + """ + pass + + @unittest.skip('Not yet implemented') + def test_is_hidden_folder(self): + """ + Test is_hidden_folder + """ + pass + + @unittest.skip('Not yet implemented') + def test_real_path(self): + """ + Test real_path + """ + pass + + +class HelpersFileTests(unittest.TestCase): + """ + Test file helpers + """ + @unittest.skip('Not yet implemented') + def test_is_media_file(self): + """ + Test isMediaFile + """ + pass + + @unittest.skip('Not yet implemented') + def test_is_file_locked(self): + """ + Test isFileLocked + """ + pass + + @unittest.skip('Not yet implemented') + def test_is_being_written(self): + """ + Test isBeingWritten + """ + pass + + @unittest.skip('Not yet implemented') + def test_remove_file_failed(self): + """ + Test remove_file_failed + """ + pass + + @unittest.skip('Not yet implemented') + def test_list_media_files(self): + """ + Test listMediaFiles + """ + pass + + @unittest.skip('Not yet implemented') + def test_copy_file(self): + """ + Test copyFile + """ + pass + + @unittest.skip('Not yet implemented') + def test_move_file(self): + """ + Test moveFile + """ + pass + + @unittest.skip('Not yet implemented') + def test_rename_ep_file(self): + """ + Test rename_ep_file + """ + pass + + @unittest.skip('Not yet implemented') + def test_file_bit_filter(self): + """ + Test fileBitFilter + """ + pass + + @unittest.skip('Not yet implemented') + def test_chmod_as_parent(self): + """ + Test chmodAsParent + """ + pass + + @unittest.skip('Not yet implemented') + def test_backup_versioned_file(self): + """ + Test backupVersionedFile + """ + pass + + @unittest.skip('Not yet implemented') + def test_restore_versioned_file(self): + """ + Test restoreVersionedFile + """ + pass + + @unittest.skip('Not yet implemented') + def test_verify_free_space(self): + """ + Test verify_freespace + """ + pass + + @unittest.skip('Not yet implemented') + def test_get_disk_space_usage(self): + """ + Test getDiskSpaceUsage + """ + pass + + @unittest.skip('Not yet implemented') + def test_download_file(self): + """ + Test download_file + """ + pass + + @unittest.skip('Not yet implemented') + def test_get_size(self): + """ + Test get_size + """ + pass + + @unittest.skip('Not yet implemented') + def test_md5_for_file(self): + """ + Test md5_for_file + """ + pass + + @unittest.skip('Not yet implemented') + def test_touch_file(self): + """ + Test touchFile + """ + pass + + +class HelpersFileLinksTests(unittest.TestCase): + """ + Test sym and hard links + """ + @unittest.skip('Not yet implemented') + def test_link(self): + """ + Test link + """ + pass + + @unittest.skip('Not yet implemented') + def test_hardlink_file(self): + """ + Test hardlinkFile + """ + pass + + @unittest.skip('Not yet implemented') + def test_symlink(self): + """ + Test symlink + """ + pass + + @unittest.skip('Not yet implemented') + def test_move_and_symlink_file(self): + """ + Test moveAndSymlinkFile + """ + pass + + +class HelpersEncryptionTests(unittest.TestCase): + """ + Test encryption and decryption + """ + @unittest.skip('Not yet implemented') + def test_create_https_certificates(self): + """ + Test create_https_certificates + """ + pass + + @unittest.skip('Not yet implemented') + def test_encrypt(self): + """ + Test encrypt + """ + pass + + @unittest.skip('Not yet implemented') + def test_decrypt(self): + """ + Test decrypt + """ + pass + + @unittest.skip('Not yet implemented') + def test_generate_cookie_secret(self): + """ + Test generateCookieSecret + """ + pass + + +class HelpersShowTests(unittest.TestCase): + """ + Test show methods + """ + @unittest.skip('Not yet implemented') + def test_find_certain_show(self): + """ + Test findCertainShow + """ + pass + + @unittest.skip('Not yet implemented') + def test_search_db_for_show(self): + """ + Test searchDBForShow + """ + pass + + @unittest.skip('Not yet implemented') + def test_search_indexer_for_show_id(self): + """ + Test searchIndexerForShowID + """ + pass + + @unittest.skip('Not yet implemented') + def test_is_anime_in_show_list(self): + """ + Test is_anime_in_show_list + """ + pass + + @unittest.skip('Not yet implemented') + def test_check_against_names(self): + """ + Test _check_against_names + """ + pass + + @unittest.skip('Not yet implemented') + def test_get_show(self): + """ + Test get_show + """ + pass + + @unittest.skip('Not yet implemented') + def test_validate_show(self): + """ + Test validateShow + """ + pass + + @unittest.skip('Not yet implemented') + def test_map_indexers_to_show(self): + """ + Test mapIndexersToShow + """ + pass + + @unittest.skip('Not yet implemented') + def test_get_abs_no_from_s_and_e(self): + """ + Test get_absolute_number_from_season_and_episode + """ + pass + + @unittest.skip('Not yet implemented') + def test_get_all_eps_from_abs_no(self): + """ + Test get_all_episodes_from_absolute_number + """ + pass + + +class HelpersConnectionTests(unittest.TestCase): + """ + Test connections + """ + @unittest.skip('Not yet implemented') + def test_get_lan_ip(self): + """ + Test get_lan_ip + """ + pass + + @unittest.skip('Not yet implemented') + def test_check_url(self): + """ + Test check_url + """ + pass + + @unittest.skip('Not yet implemented') + def test_anon_url(self): + """ + Test anon_url + """ + pass + + @unittest.skip('Not yet implemented') + def test_set_up_anidb_connection(self): + """ + Test set_up_anidb_connection + """ + pass + + @unittest.skip('Not yet implemented') + def test_set_up_session(self): + """ + Test _setUpSession + """ + pass + + @unittest.skip('Not yet implemented') + def test_get_url(self): + """ + Test getURL + """ + pass + + @unittest.skip('Not yet implemented') + def test_generate_api_key(self): + """ + Test generateApiKey + """ + pass + + +class HelpersMiscTests(unittest.TestCase): + """ + Test misc helper methods + """ + @unittest.expectedFailure + def test_is_valid_language(self): + # TODO: Determine why this fails and at such a high failure % + """ + Test isValidLanguage + """ + exception_count = 0 + total = 0 + for lang in language.LANGUAGES: + total += 1 + try: + self.assertTrue(isValidLanguage(lang), lang) + except NameError: + exception_count += 1 + except Exception as error: + raise error + if exception_count > 0: + raise Exception('Language failure ratio: %s [%s/%s]' % + (100.0 * exception_count/total, exception_count, total)) + + @unittest.skip('Not yet implemented') + def test_fix_glob(self): + """ + Test fixGlob + """ + pass + + @unittest.skip('Not yet implemented') + def test_indent_xml(self): + """ + Test indentXML + """ + pass + + @unittest.skip('Not yet implemented') + def test_remove_non_release_groups(self): + """ + Test remove_non_release_groups + """ + pass + + @unittest.skip('Not yet implemented') + def test_fix_set_group_id(self): + """ + Test fixSetGroupID + """ + pass + + @unittest.skip('Not yet implemented') + def test_update_anime_support(self): + """ + Test update_anime_support + """ + pass + + @unittest.skip('Not yet implemented') + def test_sanitize_scene_name(self): + """ + Test sanitizeSceneName + """ + pass + + @unittest.skip('Not yet implemented') + def test_arithmetic_eval(self): + """ + Test arithmeticEval + """ + pass + + @unittest.skip('Not yet implemented') + def test_try_int(self): + """ + Test tryInt + """ + pass + + @unittest.skip('Not yet implemented') + def test_full_sanitize_scene_name(self): + """ + Test full_sanitizeSceneName + """ + pass + + @unittest.skip('Not yet implemented') + def test_code_description(self): + """ + Test codeDescription + """ + pass + + @unittest.skip('Not yet implemented') + def test_remove_article(self): + """ + Test remove_article + """ + pass + + @unittest.skip('Not yet implemented') + def test_pretty_time_delta(self): + """ + Test pretty_time_delta + """ + pass + + if __name__ == '__main__': print "==================" print "STARTING - Helpers TESTS" print "==================" print "######################################################################" - for name, test_data in test_cases.items(): + for name, test_data in TEST_CASES.items(): test_name = 'test_%s' % name test = test_generator(test_data) setattr(HelpersTests, test_name, test) - suite = unittest.TestLoader().loadTestsFromTestCase(HelpersTests) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersConnectionTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersDirectoryTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersEncryptionTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersFileLinksTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersFileTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersMiscTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersShowTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(HelpersZipTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/issue_submitter_tests.py b/tests/issue_submitter_tests.py index ea8a7a495d1ba05bfdb6dd435442a4216014ffbe..79829f5b45821a1084e969a3e7e7f0422a4bad2c 100644 --- a/tests/issue_submitter_tests.py +++ b/tests/issue_submitter_tests.py @@ -17,29 +17,42 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +""" +Test exception logging +""" -import sys, os.path +import sys +import os.path +import unittest sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) -import unittest - from sickbeard import logger from sickrage.helper.exceptions import ex -def error(): + +def exception_generator(): + """ + Dummy function to raise a fake exception and log it + """ try: raise Exception('FAKE EXCEPTION') - except Exception as e: - logger.log(u"FAKE ERROR: " + ex(e), logger.ERROR) - logger.submit_errors() + except Exception as error: + logger.log(u"FAKE ERROR: " + ex(error), logger.ERROR) # pylint: disable=no-member + logger.submit_errors() # pylint: disable=no-member raise class IssueSubmitterBasicTests(unittest.TestCase): + """ + Tests logging of exceptions + """ def test_submitter(self): - self.assertRaises(Exception, error) + """ + Test that an exception is raised + """ + self.assertRaises(Exception, exception_generator) if __name__ == "__main__": @@ -47,5 +60,6 @@ if __name__ == "__main__": print "STARTING - ISSUE SUBMITTER TESTS" print "==================" print "######################################################################" - suite = unittest.TestLoader().loadTestsFromTestCase(IssueSubmitterBasicTests) - unittest.TextTestRunner(verbosity=2).run(suite) + + SUITE = unittest.TestLoader().loadTestsFromTestCase(IssueSubmitterBasicTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/name_parser_tests.py b/tests/name_parser_tests.py index 7154d75bc039fb796ee9db79c02421cee6c85e46..50293a9078039849bb8b8a4ddb0cb57c0e838987 100644 --- a/tests/name_parser_tests.py +++ b/tests/name_parser_tests.py @@ -1,12 +1,18 @@ -import sys, os.path -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +""" +Test name parsing +""" + +# pylint: disable=line-too-long +import sys +import os.path import datetime import unittest -from tests import test_lib as test +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from tests import test_lib as test import sickbeard from sickbeard import tv from sickbeard.name_parser import parser @@ -15,7 +21,7 @@ sickbeard.SYS_ENCODING = 'UTF-8' DEBUG = VERBOSE = False -simple_test_cases = { +SIMPLE_TEST_CASES = { 'standard': { 'Mr.Show.Name.S01E02.Source.Quality.Etc-Group': parser.ParseResult(None, 'Mr Show Name', 1, [2], 'Source.Quality.Etc', 'Group'), 'Show.Name.S01E02': parser.ParseResult(None, 'Show Name', 1, [2]), @@ -115,7 +121,7 @@ simple_test_cases = { }, } -combination_test_cases = [ +COMBINATION_TEST_CASES = [ ('/test/path/to/Season 02/03 - Ep Name.avi', parser.ParseResult(None, None, 2, [3], 'Ep Name'), ['no_season', 'season_only']), @@ -149,18 +155,20 @@ combination_test_cases = [ ['no_season', 'season_only']), ] -unicode_test_cases = [ +UNICODE_TEST_CASES = [ (u'The.Big.Bang.Theory.2x07.The.Panty.Pi\xf1ata.Polarization.720p.HDTV.x264.AC3-SHELDON.mkv', parser.ParseResult(None, 'The.Big.Bang.Theory', 2, [7], u'The.Panty.Pi\xf1ata.Polarization.720p.HDTV.x264.AC3', 'SHELDON')), ('The.Big.Bang.Theory.2x07.The.Panty.Pi\xc3\xb1ata.Polarization.720p.HDTV.x264.AC3-SHELDON.mkv', parser.ParseResult(None, 'The.Big.Bang.Theory', 2, [7], u'The.Panty.Pi\xf1ata.Polarization.720p.HDTV.x264.AC3', 'SHELDON')) ] -failure_cases = ['7sins-jfcs01e09-720p-bluray-x264'] +FAILURE_CASES = ['7sins-jfcs01e09-720p-bluray-x264'] class UnicodeTests(test.SickbeardTestDBCase): - + """ + Test unicode + """ def __init__(self, something): super(UnicodeTests, self).__init__(something) super(UnicodeTests, self).setUp() @@ -168,24 +176,43 @@ class UnicodeTests(test.SickbeardTestDBCase): self.show.name = "The Big Bang Theory" def _test_unicode(self, name, result): - np = parser.NameParser(True, showObj=self.show) - parse_result = np.parse(name) + """ + Test unicode + + :param name: + :param result: + :return: + """ + name_parser = parser.NameParser(True, showObj=self.show) + parse_result = name_parser.parse(name) # this shouldn't raise an exception repr(str(parse_result)) self.assertEqual(parse_result.extra_info, result.extra_info) def test_unicode(self): - for (name, result) in unicode_test_cases: + """ + Test unicode + """ + for (name, result) in UNICODE_TEST_CASES: self._test_unicode(name, result) -class FailureCaseTests(test.SickbeardTestDBCase): +class FailureCaseTests(test.SickbeardTestDBCase): + """ + Test cases that should fail + """ @staticmethod def _test_name(name): - np = parser.NameParser(True) + """ + Test name + + :param name: + :return: + """ + name_parser = parser.NameParser(True) try: - parse_result = np.parse(name) + parse_result = name_parser.parse(name) except (parser.InvalidNameException, parser.InvalidShowException): return True @@ -194,21 +221,36 @@ class FailureCaseTests(test.SickbeardTestDBCase): return False def test_failures(self): - for name in failure_cases: + """ + Test failures + """ + for name in FAILURE_CASES: self.assertTrue(self._test_name(name)) + class ComboTests(test.SickbeardTestDBCase): + """ + Perform combination tests + """ def _test_combo(self, name, result, which_regexes): + """ + Perform combination test + + :param name: + :param result: + :param which_regexes: + :return: + """ if VERBOSE: print print 'Testing', name - np = parser.NameParser(True) + name_parser = parser.NameParser(True) try: - test_result = np.parse(name) + test_result = name_parser.parse(name) except parser.InvalidShowException: return False @@ -216,50 +258,63 @@ class ComboTests(test.SickbeardTestDBCase): print test_result, test_result.which_regex print result, which_regexes - self.assertEqual(test_result, result) for cur_regex in which_regexes: self.assertTrue(cur_regex in test_result.which_regex) self.assertEqual(len(which_regexes), len(test_result.which_regex)) def test_combos(self): - - for (name, result, which_regexes) in combination_test_cases: + """ + Perform combination tests + """ + for (name, result, which_regexes) in COMBINATION_TEST_CASES: # Normalise the paths. Converts UNIX-style paths into Windows-style # paths when test is run on Windows. self._test_combo(os.path.normpath(name), result, which_regexes) -class BasicTests(test.SickbeardTestDBCase): +class BasicTests(test.SickbeardTestDBCase): + """ + Basic name parsing tests + """ def __init__(self, something): super(BasicTests, self).__init__(something) super(BasicTests, self).setUp() self.show = tv.TVShow(1, 1, 'en') - def _test_names(self, np, section, transform=None, verbose=False): + def _test_names(self, name_parser, section, transform=None, verbose=False): + """ + Performs a test + + :param name_parser: to use for test + :param section: + :param transform: + :param verbose: + :return: + """ if VERBOSE or verbose: print print 'Running', section, 'tests' - for cur_test_base in simple_test_cases[section]: + for cur_test_base in SIMPLE_TEST_CASES[section]: if transform: cur_test = transform(cur_test_base) - np.file_name = cur_test + name_parser.file_name = cur_test else: cur_test = cur_test_base if VERBOSE or verbose: print 'Testing', cur_test - result = simple_test_cases[section][cur_test_base] + result = SIMPLE_TEST_CASES[section][cur_test_base] self.show.name = result.series_name if result else None - np.showObj = self.show + name_parser.showObj = self.show if not result: - self.assertRaises(parser.InvalidNameException, np.parse, cur_test) + self.assertRaises(parser.InvalidNameException, name_parser.parse, cur_test) return else: result.which_regex = [section] - test_result = np.parse(cur_test) + test_result = name_parser.parse(cur_test) if DEBUG or verbose: print 'air_by_date:', test_result.is_air_by_date, 'air_date:', test_result.air_date @@ -270,109 +325,238 @@ class BasicTests(test.SickbeardTestDBCase): self.assertEqual(str(test_result), str(result)) def test_standard_names(self): - np = parser.NameParser(True) - self._test_names(np, 'standard') - - def test_standard_repeat_names(self): - np = parser.NameParser(False) - self._test_names(np, 'standard_repeat') - - def test_fov_names(self): - np = parser.NameParser(False) - self._test_names(np, 'fov') - - def test_fov_repeat_names(self): - np = parser.NameParser(False) - self._test_names(np, 'fov_repeat') - - #def test_bare_names(self): - # np = parser.NameParser(False) - # self._test_names(np, 'bare') - - def test_stupid_names(self): - np = parser.NameParser(False) - self._test_names(np, 'stupid') - - #def test_no_season_names(self): - # np = parser.NameParser(False) - # self._test_names(np, 'no_season') - - def test_no_season_general_names(self): - np = parser.NameParser(False) - self._test_names(np, 'no_season_general') - - def test_no_season_multi_ep_names(self): - np = parser.NameParser(False) - self._test_names(np, 'no_season_multi_ep') - - def test_season_only_names(self): - np = parser.NameParser(False) - self._test_names(np, 'season_only') - - #def test_scene_date_format_names(self): - # np = parser.NameParser(False) - # self._test_names(np, 'scene_date_format') + """ + Test standard names + """ + name_parser = parser.NameParser(True) + self._test_names(name_parser, 'standard') def test_standard_file_names(self): - np = parser.NameParser() - self._test_names(np, 'standard', lambda x: x + '.avi') + """ + Test standard file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'standard', lambda x: x + '.avi') + + def test_standard_repeat_names(self): + """ + Test standard repeat names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'standard_repeat') def test_standard_repeat_file_names(self): - np = parser.NameParser() - self._test_names(np, 'standard_repeat', lambda x: x + '.avi') + """ + Test standard repeat file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'standard_repeat', lambda x: x + '.avi') + + def test_fov_names(self): + """ + Test fov names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'fov') def test_fov_file_names(self): - np = parser.NameParser() - self._test_names(np, 'fov', lambda x: x + '.avi') + """ + Test fov file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'fov', lambda x: x + '.avi') + + def test_fov_repeat_names(self): + """ + Test fov repeat names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'fov_repeat') def test_fov_repeat_file_names(self): - np = parser.NameParser() - self._test_names(np, 'fov_repeat', lambda x: x + '.avi') + """ + Test fov repeat file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'fov_repeat', lambda x: x + '.avi') - #def test_bare_file_names(self): - # np = parser.NameParser() - # self._test_names(np, 'bare', lambda x: x + '.avi') + def test_stupid_names(self): + """ + Test stupid names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'stupid') def test_stupid_file_names(self): - np = parser.NameParser() - self._test_names(np, 'stupid', lambda x: x + '.avi') + """ + Test stupid file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'stupid', lambda x: x + '.avi') + + def test_no_s_general_names(self): + """ + Test no season general names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'no_season_general') + + def test_no_s_general_file_names(self): + """ + Test no season general file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'no_season_general', lambda x: x + '.avi') + + def test_no_s_multi_ep_names(self): + """ + Test no season multi episode names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'no_season_multi_ep') + + def test_no_s_multi_ep_file_names(self): + """ + Test no season multi episode file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'no_season_multi_ep', lambda x: x + '.avi') + + def test_s_only_names(self): + """ + Test season only names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'season_only') + + def test_s_only_file_names(self): + """ + Test season only file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'season_only', lambda x: x + '.avi') + + +# TODO: Make these work or document why they shouldn't +class BasicFailedTests(test.SickbeardTestDBCase): + """ + Basic tests that currently fail + """ + def __init__(self, something): + super(BasicFailedTests, self).__init__(something) + super(BasicFailedTests, self).setUp() + self.show = tv.TVShow(1, 1, 'en') - #def test_no_season_file_names(self): - # np = parser.NameParser() - # self._test_names(np, 'no_season', lambda x: x + '.avi') + def _test_names(self, name_parser, section, transform=None, verbose=False): + """ + Performs a test - def test_no_season_general_file_names(self): - np = parser.NameParser() - self._test_names(np, 'no_season_general', lambda x: x + '.avi') + :param name_parser: to use for test + :param section: + :param transform: + :param verbose: + :return: + """ + if VERBOSE or verbose: + print + print 'Running', section, 'tests' + for cur_test_base in SIMPLE_TEST_CASES[section]: + if transform: + cur_test = transform(cur_test_base) + name_parser.file_name = cur_test + else: + cur_test = cur_test_base + if VERBOSE or verbose: + print 'Testing', cur_test - def test_no_season_multi_ep_file_names(self): - np = parser.NameParser() - self._test_names(np, 'no_season_multi_ep', lambda x: x + '.avi') + result = SIMPLE_TEST_CASES[section][cur_test_base] - def test_season_only_file_names(self): - np = parser.NameParser() - self._test_names(np, 'season_only', lambda x: x + '.avi') + self.show.name = result.series_name if result else None + name_parser.showObj = self.show + if not result: + self.assertRaises(parser.InvalidNameException, name_parser.parse, cur_test) + return + else: + result.which_regex = [section] + test_result = name_parser.parse(cur_test) - #def test_scene_date_format_file_names(self): - # np = parser.NameParser() - # self._test_names(np, 'scene_date_format', lambda x: x + '.avi') + if DEBUG or verbose: + print 'air_by_date:', test_result.is_air_by_date, 'air_date:', test_result.air_date + print 'anime:', test_result.is_anime, 'ab_episode_numbers:', test_result.ab_episode_numbers + print test_result + print result + self.assertEqual(test_result.which_regex, [section]) + self.assertEqual(str(test_result), str(result)) + @unittest.expectedFailure + def test_no_s_names(self): + """ + Test no season names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'no_season') + + @unittest.expectedFailure + def test_no_s_file_names(self): + """ + Test no season file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'no_season', lambda x: x + '.avi') + + @unittest.expectedFailure + def test_bare_names(self): + """ + Test bare names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'bare') + + @unittest.expectedFailure + def test_bare_file_names(self): + """ + Test bare file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'bare', lambda x: x + '.avi') + + @unittest.skip('Not yet implemented') def test_combination_names(self): + """ + Test combination names + """ pass + @unittest.skip('Not trying indexer') + def test_scene_date_fmt_names(self): + """ + Test scene date format names + """ + name_parser = parser.NameParser(False) + self._test_names(name_parser, 'scene_date_format') + + @unittest.skip('Not trying indexer') + def test_scene_date_fmt_file_names(self): + """ + Test scene date format file names + """ + name_parser = parser.NameParser() + self._test_names(name_parser, 'scene_date_format', lambda x: x + '.avi') + + if __name__ == '__main__': if len(sys.argv) > 1: - suite = unittest.TestLoader().loadTestsFromName('name_parser_tests.BasicTests.test_'+sys.argv[1]) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromName('name_parser_tests.BasicTests.test_'+sys.argv[1]) + unittest.TextTestRunner(verbosity=2).run(SUITE) else: - suite = unittest.TestLoader().loadTestsFromTestCase(BasicTests) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(BasicTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) - suite = unittest.TestLoader().loadTestsFromTestCase(ComboTests) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(ComboTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) - suite = unittest.TestLoader().loadTestsFromTestCase(UnicodeTests) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(UnicodeTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) - suite = unittest.TestLoader().loadTestsFromTestCase(FailureCaseTests) - unittest.TextTestRunner(verbosity=2).run(suite) + SUITE = unittest.TestLoader().loadTestsFromTestCase(FailureCaseTests) + unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/notifier_tests.py b/tests/notifier_tests.py index 04701f64d6349eda7ce52a4cb834f72a5277408f..b6b2b9d99bb3c096e66dd63429325838807c789a 100644 --- a/tests/notifier_tests.py +++ b/tests/notifier_tests.py @@ -20,16 +20,23 @@ ### # As a test case, there are instances in which it is necessary to call protected members of -# classes in order to test those classes. Therefore: -# pylint: disable=W0212 +# classes in order to test those classes. Therefore we will be pylint disable protected-access ### -import sys, os.path -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +# pylint: disable=line-too-long + +""" +Test notifiers +""" + +import sys +import os.path import unittest +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + import tests.test_lib as test from sickbeard import db @@ -40,8 +47,11 @@ from sickbeard.notifiers.prowl import ProwlNotifier from sickrage.helper.encoding import ss -class NotifierTests(test.SickbeardTestDBCase): +class NotifierTests(test.SickbeardTestDBCase): # pylint: disable=too-many-public-methods + """ + Test notifiers + """ @classmethod def setUpClass(cls): num_legacy_shows = 3 @@ -81,12 +91,22 @@ class NotifierTests(test.SickbeardTestDBCase): cls.shows.append(show) def setUp(self): + """ + Set up tests + """ self._debug_spew("\n\r") - #def test_boxcar(self): - # pass + @unittest.skip('Not yet implemented') + def test_boxcar(self): + """ + Test boxcar notifications + """ + pass def test_email(self): + """ + Test email notifications + """ email_notifier = EmailNotifier() # Per-show-email notifications were added early on and utilized a different format than the other notifiers. @@ -103,14 +123,13 @@ class NotifierTests(test.SickbeardTestDBCase): showid = self._get_showid_by_showname(show.name) Home.saveShowNotifyList(show=showid, emails=test_emails) - # Now, iterate through all shows using the email list generation routines that are used in the notifier proper shows = self.legacy_shows+self.shows for show in shows: for episode in show.episodes: - ep_name = ss(episode._format_pattern('%SN - %Sx%0E - %EN - ')+episode.quality) - show_name = email_notifier._parseEp(ep_name) - recipients = email_notifier._generate_recipients(show_name) + ep_name = ss(episode._format_pattern('%SN - %Sx%0E - %EN - ')+episode.quality) # pylint: disable=protected-access + show_name = email_notifier._parseEp(ep_name) # pylint: disable=protected-access + recipients = email_notifier._generate_recipients(show_name) # pylint: disable=protected-access self._debug_spew("- Email Notifications for "+show.name+" (episode: "+episode.name+") will be sent to:") for email in recipients: self._debug_spew("-- "+email.strip()) @@ -118,34 +137,73 @@ class NotifierTests(test.SickbeardTestDBCase): return True - #def test_emby(self): - # pass - - #def test_freemobile(self): - # pass - - #def test_growl(self): - # pass - - #def test_kodi(self): - # pass - - #def test_libnotify(self): - # pass - - #def test_nma(self): - # pass - - #def test_nmj(self): - # pass - - #def test_nmjv2(self): - # pass - - #def test_plex(self): - # pass + @unittest.skip('Not yet implemented') + def test_emby(self): + """ + Test emby notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_freemobile(self): + """ + Test freemobile notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_growl(self): + """ + Test growl notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_kodi(self): + """ + Test kodi notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_libnotify(self): + """ + Test libnotify notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_nma(self): + """ + Test nma notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_nmj(self): + """ + Test nmj notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_nmjv2(self): + """ + Test nmjv2 notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_plex(self): + """ + Test plex notifications + """ + pass def test_prowl(self): + """ + Test prowl notifications + """ prowl_notifier = ProwlNotifier() # Prowl per-show-notifications only utilize the new methodology for storage; therefore, the list of legacy_shows @@ -159,9 +217,9 @@ class NotifierTests(test.SickbeardTestDBCase): # Now, iterate through all shows using the Prowl API generation routines that are used in the notifier proper for show in self.shows: for episode in show.episodes: - ep_name = ss(episode._format_pattern('%SN - %Sx%0E - %EN - ')+episode.quality) - show_name = prowl_notifier._parse_episode(ep_name) - recipients = prowl_notifier._generate_recipients(show_name) + ep_name = ss(episode._format_pattern('%SN - %Sx%0E - %EN - ')+episode.quality) # pylint: disable=protected-access + show_name = prowl_notifier._parse_episode(ep_name) # pylint: disable=protected-access + recipients = prowl_notifier._generate_recipients(show_name) # pylint: disable=protected-access self._debug_spew("- Prowl Notifications for "+show.name+" (episode: "+episode.name+") will be sent to:") for api in recipients: self._debug_spew("-- "+api.strip()) @@ -169,36 +227,80 @@ class NotifierTests(test.SickbeardTestDBCase): return True - #def test_pushalot(self): - # pass - - #def test_pushbullet(self): - # pass - - #def test_pushover(self): - # pass - - #def test_pytivo(self): - # pass - - #def test_synoindex(self): - # pass - - #def test_synologynotifier(self): - # pass - - #def test_trakt(self): - # pass - - #def test_tweet(self): - # pass + @unittest.skip('Not yet implemented') + def test_pushalot(self): + """ + Test pushalot notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_pushbullet(self): + """ + Test pushbullet notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_pushover(self): + """ + Test pushover notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_pytivo(self): + """ + Test pytivo notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_synoindex(self): + """ + Test synoindex notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_synologynotifier(self): + """ + Test synologynotifier notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_trakt(self): + """ + Test trakt notifications + """ + pass + + @unittest.skip('Not yet implemented') + def test_tweet(self): + """ + Test tweet notifications + """ + pass @staticmethod def _debug_spew(text): + """ + Spew text notifications + + :param text: to spew + :return: + """ if __name__ == '__main__' and text is not None: print text def _get_showid_by_showname(self, showname): + """ + Get show ID by show name + + :param showname: + :return: + """ if showname is not None: rows = self.mydb.select("SELECT show_id FROM tv_shows WHERE show_name = ?", [showname]) if len(rows) == 1: @@ -210,5 +312,6 @@ if __name__ == '__main__': print "STARTING - NOTIFIER TESTS" print "==================" print "######################################################################" + SUITE = unittest.TestLoader().loadTestsFromTestCase(NotifierTests) unittest.TextTestRunner(verbosity=2).run(SUITE) diff --git a/tests/numdict_tests.py b/tests/numdict_tests.py index f2ed80c7b0cbf148fc2012676761a43b036208e2..4802550bf9ee0c8ccfd5eafb7c1980d198e1145f 100644 --- a/tests/numdict_tests.py +++ b/tests/numdict_tests.py @@ -4,6 +4,8 @@ Unit Tests for sickbeard/numdict.py """ +# pylint: disable=line-too-long + import sys import os.path import unittest @@ -16,7 +18,7 @@ from sickbeard.numdict import NumDict PY3 = sys.version_info >= (3, ) if PY3: - from collections import UserDict + from collections import UserDict # pylint: disable=no-name-in-module else: from UserDict import UserDict @@ -25,97 +27,97 @@ class NumDictTest(unittest.TestCase): """ Test the NumDict class """ - def test_constructors(self): + def test_constructors(self): # pylint: disable=too-many-locals, too-many-statements """ Test NumDict constructors """ # dicts for testing - d0 = {} # Empty dictionary - d1 = {1: 'Elephant'} # Single numeric key - d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys - d3 = {'3': 'Aardvark'} # Numeric string key - d4 = {'3': 'Aardvark', '4': 'Ant'} # Multiple numeric string keys - d5 = {5: 'Cat', '6': 'Dog'} # Mixed numeric and numeric string keys - d6 = {1: None, '2': None} # None as values - d7 = {None: 'Empty'} # None as key + dict_0 = {} # Empty dictionary + dict_1 = {1: 'Elephant'} # Single numeric key + dict_2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + dict_3 = {'3': 'Aardvark'} # Numeric string key + dict_4 = {'3': 'Aardvark', '4': 'Ant'} # Multiple numeric string keys + dict_5 = {5: 'Cat', '6': 'Dog'} # Mixed numeric and numeric string keys + dict_6 = {1: None, '2': None} # None as values + dict_7 = {None: 'Empty'} # None as key # Construct NumDicts from dicts - n = NumDict() - n0 = NumDict(d0) - n1 = NumDict(d1) - n2 = NumDict(d2) - n3 = NumDict(d3) - n4 = NumDict(d4) - n5 = NumDict(d5) - n6 = NumDict(d6) - n7 = NumDict(d7) + num_dict = NumDict() + num_dict_0 = NumDict(dict_0) + num_dict_1 = NumDict(dict_1) + num_dict_2 = NumDict(dict_2) + num_dict_3 = NumDict(dict_3) + num_dict_4 = NumDict(dict_4) + num_dict_5 = NumDict(dict_5) + num_dict_6 = NumDict(dict_6) + num_dict_7 = NumDict(dict_7) # Most NumDicts from dicts should compare equal... - self.assertEqual(n, {}) - self.assertEqual(n0, d0) - self.assertEqual(n1, d1) - self.assertEqual(n2, d2) + self.assertEqual(num_dict, {}) + self.assertEqual(num_dict_0, dict_0) + self.assertEqual(num_dict_1, dict_1) + self.assertEqual(num_dict_2, dict_2) # ...however, numeric keys are not equal to numeric string keys... - self.assertNotEqual(n3, d3) - self.assertNotEqual(n4, d4) - self.assertNotEqual(n5, d5) - self.assertNotEqual(n6, d6) + self.assertNotEqual(num_dict_3, dict_3) + self.assertNotEqual(num_dict_4, dict_4) + self.assertNotEqual(num_dict_5, dict_5) + self.assertNotEqual(num_dict_6, dict_6) # ...but None keys work just fine - self.assertEqual(n7, d7) + self.assertEqual(num_dict_7, dict_7) # Construct dicts from NumDicts - dn = dict(n) - dn1 = dict(n1) - dn2 = dict(n2) - dn3 = dict(n3) - dn4 = dict(n4) - dn5 = dict(n5) - dn6 = dict(n6) - dn7 = dict(n7) + dict_from_num_dict = dict(num_dict) + dict_from_num_dict_1 = dict(num_dict_1) + dict_from_num_dict_2 = dict(num_dict_2) + dict_from_num_dict_3 = dict(num_dict_3) + dict_from_num_dict_4 = dict(num_dict_4) + dict_from_num_dict_5 = dict(num_dict_5) + dict_from_num_dict_6 = dict(num_dict_6) + dict_from_num_dict_7 = dict(num_dict_7) # All dicts from NumDicts should compare equal - self.assertEqual(n, dn) - self.assertEqual(n1, dn1) - self.assertEqual(n2, dn2) - self.assertEqual(n3, dn3) - self.assertEqual(n4, dn4) - self.assertEqual(n5, dn5) - self.assertEqual(n6, dn6) - self.assertEqual(n7, dn7) + self.assertEqual(num_dict, dict_from_num_dict) + self.assertEqual(num_dict_1, dict_from_num_dict_1) + self.assertEqual(num_dict_2, dict_from_num_dict_2) + self.assertEqual(num_dict_3, dict_from_num_dict_3) + self.assertEqual(num_dict_4, dict_from_num_dict_4) + self.assertEqual(num_dict_5, dict_from_num_dict_5) + self.assertEqual(num_dict_6, dict_from_num_dict_6) + self.assertEqual(num_dict_7, dict_from_num_dict_7) # Construct NumDicts from NumDicts - nn = NumDict(n) - nn0 = NumDict(n0) - nn1 = NumDict(n1) - nn2 = NumDict(n2) - nn3 = NumDict(n3) - nn4 = NumDict(n4) - nn5 = NumDict(n5) - nn6 = NumDict(n6) - nn7 = NumDict(n7) + num_dict_from_num_dict = NumDict(num_dict) + num_dict_from_num_dict_0 = NumDict(num_dict_0) + num_dict_from_num_dict_1 = NumDict(num_dict_1) + num_dict_from_num_dict_2 = NumDict(num_dict_2) + num_dict_from_num_dict_3 = NumDict(num_dict_3) + num_dict_from_num_dict_4 = NumDict(num_dict_4) + num_dict_from_num_dict_5 = NumDict(num_dict_5) + num_dict_from_num_dict_6 = NumDict(num_dict_6) + num_dict_from_num_dict_7 = NumDict(num_dict_7) # All NumDicts from NumDicts should compare equal - self.assertEqual(n, nn) - self.assertEqual(n0, nn0) - self.assertEqual(n1, nn1) - self.assertEqual(n2, nn2) - self.assertEqual(n3, nn3) - self.assertEqual(n4, nn4) - self.assertEqual(n5, nn5) - self.assertEqual(n6, nn6) - self.assertEqual(n7, nn7) + self.assertEqual(num_dict, num_dict_from_num_dict) + self.assertEqual(num_dict_0, num_dict_from_num_dict_0) + self.assertEqual(num_dict_1, num_dict_from_num_dict_1) + self.assertEqual(num_dict_2, num_dict_from_num_dict_2) + self.assertEqual(num_dict_3, num_dict_from_num_dict_3) + self.assertEqual(num_dict_4, num_dict_from_num_dict_4) + self.assertEqual(num_dict_5, num_dict_from_num_dict_5) + self.assertEqual(num_dict_6, num_dict_from_num_dict_6) + self.assertEqual(num_dict_7, num_dict_from_num_dict_7) # keyword arg constructor should fail with self.assertRaises(TypeError): NumDict(one=1, two=2) # Raise TypeError since we can't have numeric keywords # item sequence constructors work fine... - self.assertEqual(NumDict([(1, 'Elephant'), (2, 'Mouse')]), dn2) - self.assertEqual(NumDict(dict=[(1, 'Elephant'), (2, 'Mouse')]), dn2) - self.assertEqual(NumDict([(1, 'Elephant'), ('2', 'Mouse')]), dn2) - self.assertEqual(NumDict(dict=[('1', 'Elephant'), (2, 'Mouse')]), dn2) + self.assertEqual(NumDict([(1, 'Elephant'), (2, 'Mouse')]), dict_from_num_dict_2) + self.assertEqual(NumDict(dict=[(1, 'Elephant'), (2, 'Mouse')]), dict_from_num_dict_2) + self.assertEqual(NumDict([(1, 'Elephant'), ('2', 'Mouse')]), dict_from_num_dict_2) + self.assertEqual(NumDict(dict=[('1', 'Elephant'), (2, 'Mouse')]), dict_from_num_dict_2) # ...unless you have a non-numeric key with self.assertRaises(TypeError): @@ -128,39 +130,42 @@ class NumDictTest(unittest.TestCase): NumDict([(1, 'one'), (2, 'two')], two=3, five=4) # alternate constructors - d8 = {1: 'Echo', 2: 'Echo'} - - self.assertEqual(NumDict.fromkeys('1 2'.split()), dn6) - self.assertEqual(NumDict().fromkeys('1 2'.split()), dn6) - self.assertEqual(NumDict.fromkeys('1 2'.split(), 'Echo'), d8) - self.assertEqual(NumDict().fromkeys('1 2'.split(), 'Echo'), d8) - self.assertTrue(n1.fromkeys('1 2'.split()) is not n1) - self.assertIsInstance(n1.fromkeys('1 2'.split()), NumDict) - self.assertIsInstance(n2.fromkeys('1 2'.split()), NumDict) - self.assertIsInstance(n3.fromkeys('1 2'.split()), NumDict) - self.assertIsInstance(n4.fromkeys('1 2'.split()), NumDict) - - def test_repr(self): + dict_8 = {1: 'Echo', 2: 'Echo'} + + self.assertEqual(NumDict.fromkeys('1 2'.split()), dict_from_num_dict_6) + self.assertEqual(NumDict().fromkeys('1 2'.split()), dict_from_num_dict_6) + self.assertEqual(NumDict.fromkeys('1 2'.split(), 'Echo'), dict_8) + self.assertEqual(NumDict().fromkeys('1 2'.split(), 'Echo'), dict_8) + self.assertTrue(num_dict_1.fromkeys('1 2'.split()) is not num_dict_1) + self.assertIsInstance(num_dict_1.fromkeys('1 2'.split()), NumDict) + self.assertIsInstance(num_dict_2.fromkeys('1 2'.split()), NumDict) + self.assertIsInstance(num_dict_3.fromkeys('1 2'.split()), NumDict) + self.assertIsInstance(num_dict_4.fromkeys('1 2'.split()), NumDict) + + def test_repr(self): # pylint: disable=too-many-locals + """ + Test representation of NumDicts + """ # dicts for testing - d0 = {} # Empty dictionary - d1 = {1: 'Elephant'} # Single numeric key - d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys - d3 = {'3': 'Aardvark'} # Numeric string key - d4 = {'3': 'Aardvark', '4': 'Ant'} # Multiple numeric string keys - d5 = {5: 'Cat', '6': 'Dog'} # Mixed numeric and numeric string keys - d6 = {1: None, '2': None} # None as values - d7 = {None: 'Empty'} # None as key + dict_0 = {} # Empty dictionary + dict_1 = {1: 'Elephant'} # Single numeric key + dict_2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + dict_3 = {'3': 'Aardvark'} # Numeric string key + dict_4 = {'3': 'Aardvark', '4': 'Ant'} # Multiple numeric string keys + dict_5 = {5: 'Cat', '6': 'Dog'} # Mixed numeric and numeric string keys + dict_6 = {1: None, '2': None} # None as values + dict_7 = {None: 'Empty'} # None as key # Construct NumDicts from dicts - n = NumDict() - n0 = NumDict(d0) - n1 = NumDict(d1) - n2 = NumDict(d2) - n3 = NumDict(d3) - n4 = NumDict(d4) - n5 = NumDict(d5) - n6 = NumDict(d6) - n7 = NumDict(d7) + num_dict = NumDict() + num_dict_0 = NumDict(dict_0) + num_dict_1 = NumDict(dict_1) + num_dict_2 = NumDict(dict_2) + num_dict_3 = NumDict(dict_3) + num_dict_4 = NumDict(dict_4) + num_dict_5 = NumDict(dict_5) + num_dict_6 = NumDict(dict_6) + num_dict_7 = NumDict(dict_7) reps = ( "{}", @@ -174,137 +179,143 @@ class NumDictTest(unittest.TestCase): ) # Most representations of NumDicts should compare equal to dicts... - self.assertEqual(str(n), str({})) - self.assertEqual(repr(n), repr({})) - self.assertIn(repr(n), reps) + self.assertEqual(str(num_dict), str({})) + self.assertEqual(repr(num_dict), repr({})) + self.assertIn(repr(num_dict), reps) - self.assertEqual(str(n0), str(d0)) - self.assertEqual(repr(n0), repr(d0)) - self.assertIn(repr(n0), reps) + self.assertEqual(str(num_dict_0), str(dict_0)) + self.assertEqual(repr(num_dict_0), repr(dict_0)) + self.assertIn(repr(num_dict_0), reps) - self.assertEqual(str(n1), str(d1)) - self.assertEqual(repr(n1), repr(d1)) - self.assertIn(repr(n1), reps) + self.assertEqual(str(num_dict_1), str(dict_1)) + self.assertEqual(repr(num_dict_1), repr(dict_1)) + self.assertIn(repr(num_dict_1), reps) - self.assertEqual(str(n2), str(d2)) - self.assertEqual(repr(n2), repr(d2)) - self.assertIn(repr(n2), reps) + self.assertEqual(str(num_dict_2), str(dict_2)) + self.assertEqual(repr(num_dict_2), repr(dict_2)) + self.assertIn(repr(num_dict_2), reps) # ...however, numeric keys are not equal to numeric string keys... # ...so the string representations for those are different... - self.assertNotEqual(str(n3), str(d3)) - self.assertNotEqual(repr(n3), repr(d3)) - self.assertNotIn(repr(n3), reps) + self.assertNotEqual(str(num_dict_3), str(dict_3)) + self.assertNotEqual(repr(num_dict_3), repr(dict_3)) + self.assertNotIn(repr(num_dict_3), reps) - self.assertNotEqual(str(n4), str(d4)) - self.assertNotEqual(repr(n4), repr(d4)) - self.assertNotIn(repr(n4), reps) + self.assertNotEqual(str(num_dict_4), str(dict_4)) + self.assertNotEqual(repr(num_dict_4), repr(dict_4)) + self.assertNotIn(repr(num_dict_4), reps) - self.assertNotEqual(str(n5), str(d5)) - self.assertNotEqual(repr(n5), repr(d5)) - self.assertNotIn(repr(n5), reps) + self.assertNotEqual(str(num_dict_5), str(dict_5)) + self.assertNotEqual(repr(num_dict_5), repr(dict_5)) + self.assertNotIn(repr(num_dict_5), reps) - self.assertNotEqual(str(n6), str(d6)) - self.assertNotEqual(repr(n6), repr(d6)) - self.assertNotIn(repr(n6), reps) + self.assertNotEqual(str(num_dict_6), str(dict_6)) + self.assertNotEqual(repr(num_dict_6), repr(dict_6)) + self.assertNotIn(repr(num_dict_6), reps) # ...but None keys work just fine - self.assertEqual(str(n7), str(d7)) - self.assertEqual(repr(n7), repr(d7)) - self.assertIn(repr(n7), reps) + self.assertEqual(str(num_dict_7), str(dict_7)) + self.assertEqual(repr(num_dict_7), repr(dict_7)) + self.assertIn(repr(num_dict_7), reps) def test_rich_comparison_and_len(self): + """ + Test rich comparison and length + """ # dicts for testing - d0 = {} # Empty dictionary - d1 = {1: 'Elephant'} # Single numeric key - d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + dict_0 = {} # Empty dictionary + dict_1 = {1: 'Elephant'} # Single numeric key + dict_2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys # Construct NumDicts from dicts - n = NumDict() - n0 = NumDict(d0) - n1 = NumDict(d1) - n2 = NumDict(d2) + num_dict = NumDict() + num_dict_0 = NumDict(dict_0) + num_dict_1 = NumDict(dict_1) + num_dict_2 = NumDict(dict_2) # Construct NumDicts from NumDicts - nn = NumDict(n) - nn0 = NumDict(n0) - nn1 = NumDict(n1) - nn2 = NumDict(n2) + num_dict_from_num_dict = NumDict(num_dict) + num_dict_from_num_dict_0 = NumDict(num_dict_0) + num_dict_from_num_dict_1 = NumDict(num_dict_1) + num_dict_from_num_dict_2 = NumDict(num_dict_2) - all_dicts = [d0, d1, d2, n, n0, n1, n2, nn, nn0, nn1, nn2] - for a in all_dicts: - for b in all_dicts: - self.assertEqual(a == b, len(a) == len(b)) + all_dicts = [dict_0, dict_1, dict_2, num_dict, num_dict_0, num_dict_1, num_dict_2, num_dict_from_num_dict, num_dict_from_num_dict_0, num_dict_from_num_dict_1, num_dict_from_num_dict_2] + for val_a in all_dicts: + for val_b in all_dicts: + self.assertEqual(val_a == val_b, len(val_a) == len(val_b)) - def test_dict_access_and_modification(self): + def test_dict_access_and_mod(self): # pylint: disable=too-many-locals, too-many-statements + """ + Test num dict access and modification + """ # dicts for testing - d0 = {} # Empty dictionary - d1 = {1: 'Elephant'} # Single numeric key - d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + dict_0 = {} # Empty dictionary + dict_1 = {1: 'Elephant'} # Single numeric key + dict_2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys # Construct NumDicts from dicts - n0 = NumDict() - n1 = NumDict(d1) - n2 = NumDict(d2) + num_dict_0 = NumDict() + num_dict_1 = NumDict(dict_1) + num_dict_2 = NumDict(dict_2) # test __getitem__ - self.assertEqual(n2[1], 'Elephant') + self.assertEqual(num_dict_2[1], 'Elephant') with self.assertRaises(KeyError): - n1['Mouse'] # key is not numeric + _ = num_dict_1['Mouse'] # key is not numeric with self.assertRaises(KeyError): - n1.__getitem__('Mouse') # key is not numeric + _ = num_dict_1.__getitem__('Mouse') # key is not numeric with self.assertRaises(KeyError): - n1[None] # key does not exist + _ = num_dict_1[None] # key does not exist with self.assertRaises(KeyError): - n1.__getitem__(None) # key does not exist + _ = num_dict_1.__getitem__(None) # key does not exist # Test __setitem__ - n3 = NumDict(n2) - self.assertEqual(n2, n3) + num_dict_3 = NumDict(num_dict_2) + self.assertEqual(num_dict_2, num_dict_3) - n3[2] = 'Frog' - self.assertNotEqual(n2, n3) + num_dict_3[2] = 'Frog' + self.assertNotEqual(num_dict_2, num_dict_3) # Check None keys and numeric key conversion - n3['3'] = 'Armadillo' - n3[None] = 'Cockroach' + num_dict_3['3'] = 'Armadillo' + num_dict_3[None] = 'Cockroach' # Check long ints - n3[12390809518259081208909880312] = 'Squid' - n3['12390809518259081208909880312'] = 'Octopus' - self.assertEqual(n3[12390809518259081208909880312], 'Octopus') + num_dict_3[12390809518259081208909880312] = 'Squid' + num_dict_3['12390809518259081208909880312'] = 'Octopus' + self.assertEqual(num_dict_3[12390809518259081208909880312], 'Octopus') with self.assertRaises(TypeError): - n3.__setitem__('Gorilla', 1) # key is not numeric + num_dict_3.__setitem__('Gorilla', 1) # key is not numeric with self.assertRaises(TypeError): - n3['Chimpanzee'] = 1 # key is not numeric + num_dict_3['Chimpanzee'] = 1 # key is not numeric with self.assertRaises(TypeError): - n3[(4, 1)] = 1 # key is not numeric + num_dict_3[(4, 1)] = 1 # key is not numeric with self.assertRaises(TypeError): - n3[[1, 3, 4]] = 1 # key is not numeric and is not hashable + num_dict_3[[1, 3, 4]] = 1 # key is not numeric and is not hashable # Test __delitem__ - del n3[3] - del n3[None] + del num_dict_3[3] + del num_dict_3[None] with self.assertRaises(KeyError): - del n3[3] # already deleted + del num_dict_3[3] # already deleted with self.assertRaises(KeyError): - n3.__delitem__(3) # already deleted + num_dict_3.__delitem__(3) # already deleted with self.assertRaises(KeyError): - del n3['Mouse'] # key would not exist, since it is not numeric + del num_dict_3['Mouse'] # key would not exist, since it is not numeric # Test clear - n3.clear() - self.assertEqual(n3, {}) + num_dict_3.clear() + self.assertEqual(num_dict_3, {}) # Test copy() - n2a = d2.copy() - self.assertEqual(n2, n2a) - n2b = n2.copy() - self.assertEqual(n2b, n2) - n2c = UserDict({1: 'Elephant', 2: 'Mouse'}) - n2d = n2c.copy() # making a copy of a UserDict is special cased - self.assertEqual(n2c, n2d) + num_dict_2a = dict_2.copy() + self.assertEqual(num_dict_2, num_dict_2a) + num_dict_2b = num_dict_2.copy() + self.assertEqual(num_dict_2b, num_dict_2) + num_dict_2c = UserDict({1: 'Elephant', 2: 'Mouse'}) + num_dict_2d = num_dict_2c.copy() # making a copy of a UserDict is special cased + self.assertEqual(num_dict_2c, num_dict_2d) class MyNumDict(NumDict): """ @@ -316,131 +327,135 @@ class NumDictTest(unittest.TestCase): """ print('MyNumDict:', self) - m2 = MyNumDict(n2) - m2a = m2.copy() - self.assertEqual(m2a, m2) + my_num_dict = MyNumDict(num_dict_2) + my_num_dict_a = my_num_dict.copy() + self.assertEqual(my_num_dict_a, my_num_dict) - m2[1] = 'Frog' - self.assertNotEqual(m2a, m2) + my_num_dict[1] = 'Frog' + self.assertNotEqual(my_num_dict_a, my_num_dict) # Test keys, items, values - self.assertEqual(sorted(n2.keys()), sorted(d2.keys())) - self.assertEqual(sorted(n2.items()), sorted(d2.items())) - self.assertEqual(sorted(n2.values()), sorted(d2.values())) + self.assertEqual(sorted(num_dict_2.keys()), sorted(dict_2.keys())) + self.assertEqual(sorted(num_dict_2.items()), sorted(dict_2.items())) + self.assertEqual(sorted(num_dict_2.values()), sorted(dict_2.values())) # Test "in". - for i in n2: - self.assertIn(i, n2) - self.assertEqual(i in n1, i in d1) - self.assertEqual(i in n0, i in d0) + for i in num_dict_2: + self.assertIn(i, num_dict_2) + self.assertEqual(i in num_dict_1, i in dict_1) + self.assertEqual(i in num_dict_0, i in dict_0) - self.assertFalse(None in n2) - self.assertEqual(None in n2, None in d2) + self.assertFalse(None in num_dict_2) + self.assertEqual(None in num_dict_2, None in dict_2) - d2[None] = 'Cow' - n2[None] = d2[None] - self.assertTrue(None in n2) - self.assertEqual(None in n2, None in d2) + dict_2[None] = 'Cow' + num_dict_2[None] = dict_2[None] + self.assertTrue(None in num_dict_2) + self.assertEqual(None in num_dict_2, None in dict_2) - self.assertEqual(n2.has_key(None), None in d2) + self.assertEqual(num_dict_2.has_key(None), None in dict_2) if not PY3: - self.assertEqual(n2.has_key(None), d2.has_key(None)) - self.assertFalse('Penguin' in n2) + self.assertEqual(num_dict_2.has_key(None), dict_2.has_key(None)) + self.assertFalse('Penguin' in num_dict_2) # Test update - t = NumDict() - t.update(d2) - self.assertEqual(t, n2) + test = NumDict() + test.update(dict_2) + self.assertEqual(test, num_dict_2) # Test get - for i in n2: - self.assertEqual(n2.get(i), n2[i]) - self.assertEqual(n1.get(i), d1.get(i)) - self.assertEqual(n0.get(i), d0.get(i)) + for i in num_dict_2: + self.assertEqual(num_dict_2.get(i), num_dict_2[i]) + self.assertEqual(num_dict_1.get(i), dict_1.get(i)) + self.assertEqual(num_dict_0.get(i), dict_0.get(i)) for i in ['purple', None, 12312301924091284, 23]: - self.assertEqual(n2.get(i), d2.get(i), i) + self.assertEqual(num_dict_2.get(i), dict_2.get(i), i) with self.assertRaises(AssertionError): i = '1' - self.assertEqual(n2.get(i), d2.get(i), i) # d2 expects string key which does not exist + self.assertEqual(num_dict_2.get(i), dict_2.get(i), i) # dict_2 expects string key which does not exist # Test "in" iteration. - n2b = n2 + num_dict_2b = num_dict_2 for i in range(20): - n2[i] = str(i) - n2b[str(i)] = str(i) - self.assertEqual(n2, n2b) + num_dict_2[i] = str(i) + num_dict_2b[str(i)] = str(i) + self.assertEqual(num_dict_2, num_dict_2b) ikeys = [] - for k in n2: + for k in num_dict_2: ikeys.append(k) - self.assertEqual(set(ikeys), set(n2.keys())) + self.assertEqual(set(ikeys), set(num_dict_2.keys())) # Test setdefault - x = 1 - t = NumDict() - self.assertEqual(t.setdefault(x, 42), 42) - self.assertEqual(t.setdefault(x, '42'), 42) - self.assertNotEqual(t.setdefault(x, 42), '42') - self.assertNotEqual(t.setdefault(x, '42'), '42') - self.assertIn(x, t) - - self.assertEqual(t.setdefault(x, 23), 42) - self.assertEqual(t.setdefault(x, '23'), 42) - self.assertNotEqual(t.setdefault(x, 23), '42') - self.assertNotEqual(t.setdefault(x, '23'), '42') - self.assertIn(x, t) + val = 1 + test = NumDict() + self.assertEqual(test.setdefault(val, 42), 42) + self.assertEqual(test.setdefault(val, '42'), 42) + self.assertNotEqual(test.setdefault(val, 42), '42') + self.assertNotEqual(test.setdefault(val, '42'), '42') + self.assertIn(val, test) + + self.assertEqual(test.setdefault(val, 23), 42) + self.assertEqual(test.setdefault(val, '23'), 42) + self.assertNotEqual(test.setdefault(val, 23), '42') + self.assertNotEqual(test.setdefault(val, '23'), '42') + self.assertIn(val, test) # Test pop - x = 1 - t = NumDict({x: 42}) - self.assertEqual(t.pop(x), 42) - self.assertRaises(KeyError, t.pop, x) - self.assertEqual(t.pop(x, 1), 1) - t[x] = 42 - self.assertEqual(t.pop(x, 1), 42) + val = 1 + test = NumDict({val: 42}) + self.assertEqual(test.pop(val), 42) + self.assertRaises(KeyError, test.pop, val) + self.assertEqual(test.pop(val, 1), 1) + test[val] = 42 + self.assertEqual(test.pop(val, 1), 42) # Test popitem - x = 1 - t = NumDict({x: 42}) - self.assertEqual(t.popitem(), (x, 42)) - self.assertRaises(KeyError, t.popitem) + val = 1 + test = NumDict({val: 42}) + self.assertEqual(test.popitem(), (val, 42)) + self.assertRaises(KeyError, test.popitem) def test_missing(self): + """ + Test missing keys + """ # Make sure NumDict doesn't have a __missing__ method self.assertEqual(hasattr(NumDict, "__missing__"), False) - class D(NumDict): + class NumDictD(NumDict): """ subclass defines __missing__ method returning a value """ - def __missing__(self, key): - return 42 - - d = D({1: 2, 3: 4}) - self.assertEqual(d[1], 2) - self.assertEqual(d[3], 4) - self.assertNotIn(2, d) - self.assertNotIn(2, d.keys()) - self.assertEqual(d[2], 42) - - class E(NumDict): + def __missing__(self, key): # pylint: disable=no-self-use + key = 42 + return key + + num_dict_d = NumDictD({1: 2, 3: 4}) + self.assertEqual(num_dict_d[1], 2) + self.assertEqual(num_dict_d[3], 4) + self.assertNotIn(2, num_dict_d) + self.assertNotIn(2, num_dict_d.keys()) + self.assertEqual(num_dict_d[2], 42) + + class NumDictE(NumDict): """ subclass defines __missing__ method raising RuntimeError """ - def __missing__(self, key): + def __missing__(self, key): # pylint: disable=no-self-use raise RuntimeError(key) - e = E() + num_dict_e = NumDictE() try: - e[42] + num_dict_e[42] except RuntimeError as err: self.assertEqual(err.args, (42,)) else: - self.fail("e[42] didn't raise RuntimeError") + self.fail("num_dict_e[42] didn't raise RuntimeError") - class F(NumDict): + class NumDictF(NumDict): """ subclass sets __missing__ instance variable (no effect) """ @@ -448,40 +463,43 @@ class NumDictTest(unittest.TestCase): # An instance variable __missing__ should have no effect self.__missing__ = lambda key: None NumDict.__init__(self) - f = F() + num_dict_f = NumDictF() try: - f[42] + num_dict_f[42] except KeyError as err: self.assertEqual(err.args, (42,)) else: - self.fail("f[42] didn't raise KeyError") + self.fail("num_dict_f[42] didn't raise KeyError") - class G(NumDict): + class NumDictG(NumDict): """ subclass doesn't define __missing__ at a all """ pass - g = G() + num_dict_g = NumDictG() try: - g[42] + num_dict_g[42] except KeyError as err: self.assertEqual(err.args, (42,)) else: - self.fail("g[42] didn't raise KeyError") + self.fail("num_dict_g[42] didn't raise KeyError") - class H(D): + class NumDictH(NumDictD): """ subclass calls super classes __missing__ and modifies the value before returning it """ - def __missing__(self, key): - return super(H, self).__missing__(key) + 1 + def __missing__(self, key): # pylint: disable=arguments-differ + return super(NumDictH, self).__missing__(key) + 1 - h = H() - self.assertEqual(h[None], d[None]+1) + num_dict_h = NumDictH() + self.assertEqual(num_dict_h[None], num_dict_d[None]+1) def test_main(): + """ + Run tests when run as main + """ import logging log = logging.getLogger(__name__) logging.basicConfig(level=logging.DEBUG) diff --git a/tests/sickrage_tests/__init__.py b/tests/sickrage_tests/__init__.py index bc77c49432b6bb0bf10b6649c7b7c87e3bbbdb09..f250b9e1d019f65aea1bae0aa142457a68e294ab 100644 --- a/tests/sickrage_tests/__init__.py +++ b/tests/sickrage_tests/__init__.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +from helper.common_tests import CommonTests from helper.quality_tests import QualityTests from show.coming_episodes_tests import ComingEpisodesTests from show.history_tests import HistoryTests @@ -29,6 +30,7 @@ if __name__ == '__main__': test_classes = [ ComingEpisodesTests, + CommonTests, HistoryTests, QualityTests, RestartTests, diff --git a/tests/sickrage_tests/helper/common_tests.py b/tests/sickrage_tests/helper/common_tests.py new file mode 100644 index 0000000000000000000000000000000000000000..8991ab3ef7cb98dc474c6be241a0aded27f6bbef --- /dev/null +++ b/tests/sickrage_tests/helper/common_tests.py @@ -0,0 +1,258 @@ +# This file is part of SickRage. +# +# URL: https://sickrage.github.io +# Git: https://github.com/SickRage/SickRage.git +# +# SickRage is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# SickRage is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SickRage. If not, see <http://www.gnu.org/licenses/>. + +from unittest import TestCase, TestLoader, TextTestRunner + +import os +import sys + +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))) + +import sickbeard + +from sickrage.helper.common import is_sync_file, is_torrent_or_nzb_file, pretty_file_size, remove_extension +from sickrage.helper.common import replace_extension, sanitize_filename + + +class CommonTests(TestCase): + def test_is_sync_file(self): + sickbeard.SYNC_FILES = '!sync,lftp-pget-status,part' + + tests = { + None: False, + 42: False, + '': False, + u'': False, + 'filename': False, + u'filename': False, + '.syncthingfilename': True, + u'.syncthingfilename': True, + '.syncthing.filename': True, + u'.syncthing.filename': True, + '.syncthing-filename': True, + u'.syncthing-filename': True, + '.!sync': True, + u'.!sync': True, + 'file.!sync': True, + u'file.!sync': True, + 'file.!sync.ext': False, + u'file.!sync.ext': False, + '.lftp-pget-status': True, + u'.lftp-pget-status': True, + 'file.lftp-pget-status': True, + u'file.lftp-pget-status': True, + 'file.lftp-pget-status.ext': False, + u'file.lftp-pget-status.ext': False, + '.part': True, + u'.part': True, + 'file.part': True, + u'file.part': True, + 'file.part.ext': False, + u'file.part.ext': False, + } + + for (filename, result) in tests.iteritems(): + self.assertEqual(is_sync_file(filename), result) + + def test_is_torrent_or_nzb_file(self): + tests = { + None: False, + 42: False, + '': False, + u'': False, + 'filename': False, + u'filename': False, + '.nzb': True, + u'.nzb': True, + 'file.nzb': True, + u'file.nzb': True, + 'file.nzb.part': False, + u'file.nzb.part': False, + '.torrent': True, + u'.torrent': True, + 'file.torrent': True, + u'file.torrent': True, + 'file.torrent.part': False, + u'file.torrent.part': False, + } + + for (filename, result) in tests.iteritems(): + self.assertEqual(is_torrent_or_nzb_file(filename), result) + + def test_pretty_file_size(self): + tests = { + None: '', + '': '', + u'': '', + '1024': '1.00 KB', + u'1024': '1.00 KB', + '1024.5': '', + u'1024.5': '', + -42.5: '-42.50 B', + -42: '-42.00 B', + 0: '0.00 B', + 25: '25.00 B', + 25.5: '25.50 B', + 2 ** 10: '1.00 KB', + 50 * 2 ** 10 + 25: '50.02 KB', + 2 ** 20: '1.00 MB', + 100 * 2 ** 20 + 50 * 2 ** 10 + 25: '100.05 MB', + 2 ** 30: '1.00 GB', + 200 * 2 ** 30 + 100 * 2 ** 20 + 50 * 2 ** 10 + 25: '200.10 GB', + 2 ** 40: '1.00 TB', + 400 * 2 ** 40 + 200 * 2 ** 30 + 100 * 2 ** 20 + 50 * 2 ** 10 + 25: '400.20 TB', + 2 ** 50: '1.00 PB', + 800 * 2 ** 50 + 400 * 2 ** 40 + 200 * 2 ** 30 + 100 * 2 ** 20 + 50 * 2 ** 10 + 25: '800.39 PB', + 2 ** 60: 2 ** 60, + } + + for (size, result) in tests.iteritems(): + self.assertEqual(pretty_file_size(size), result) + + def test_remove_extension(self): + tests = { + None: None, + 42: 42, + '': '', + u'': u'', + '.': '.', + u'.': u'.', + 'filename': 'filename', + u'filename': u'filename', + '.bashrc': '.bashrc', + u'.bashrc': u'.bashrc', + '.nzb': '.nzb', + u'.nzb': u'.nzb', + 'file.nzb': 'file', + u'file.nzb': u'file', + 'file.name.nzb': 'file.name', + u'file.name.nzb': u'file.name', + '.torrent': '.torrent', + u'.torrent': u'.torrent', + 'file.torrent': 'file', + u'file.torrent': u'file', + 'file.name.torrent': 'file.name', + u'file.name.torrent': u'file.name', + '.avi': '.avi', + u'.avi': u'.avi', + 'file.avi': 'file', + u'file.avi': u'file', + 'file.name.avi': 'file.name', + u'file.name.avi': u'file.name', + } + + for (extension, result) in tests.iteritems(): + self.assertEqual(remove_extension(extension), result) + + def test_replace_extension(self): + tests = { + (None, None): None, + (None, ''): None, + (None, u''): None, + (42, None): 42, + (42, ''): 42, + (42, u''): 42, + ('', None): '', + ('', ''): '', + ('', u''): '', + (u'', None): u'', + (u'', ''): u'', + (u'', u''): u'', + ('.', None): '.', + ('.', ''): '.', + ('.', u''): '.', + ('.', 'avi'): '.', + ('.', u'avi'): '.', + (u'.', None): u'.', + (u'.', ''): u'.', + (u'.', u''): u'.', + (u'.', 'avi'): u'.', + (u'.', u'avi'): u'.', + ('filename', None): 'filename', + ('filename', ''): 'filename', + ('filename', u''): 'filename', + ('filename', 'avi'): 'filename', + ('filename', u'avi'): 'filename', + (u'filename', None): u'filename', + (u'filename', ''): u'filename', + (u'filename', u''): u'filename', + (u'filename', 'avi'): u'filename', + (u'filename', u'avi'): u'filename', + ('.bashrc', None): '.bashrc', + ('.bashrc', ''): '.bashrc', + ('.bashrc', u''): '.bashrc', + ('.bashrc', 'avi'): '.bashrc', + ('.bashrc', u'avi'): '.bashrc', + (u'.bashrc', None): u'.bashrc', + (u'.bashrc', ''): u'.bashrc', + (u'.bashrc', u''): u'.bashrc', + (u'.bashrc', 'avi'): u'.bashrc', + (u'.bashrc', u'avi'): u'.bashrc', + ('file.mkv', None): 'file.None', + ('file.mkv', ''): 'file.', + ('file.mkv', u''): 'file.', + ('file.mkv', 'avi'): 'file.avi', + ('file.mkv', u'avi'): 'file.avi', + (u'file.mkv', None): u'file.None', + (u'file.mkv', ''): u'file.', + (u'file.mkv', u''): u'file.', + (u'file.mkv', 'avi'): u'file.avi', + (u'file.mkv', u'avi'): u'file.avi', + ('file.name.mkv', None): 'file.name.None', + ('file.name.mkv', ''): 'file.name.', + ('file.name.mkv', u''): 'file.name.', + ('file.name.mkv', 'avi'): 'file.name.avi', + ('file.name.mkv', u'avi'): 'file.name.avi', + (u'file.name.mkv', None): u'file.name.None', + (u'file.name.mkv', ''): u'file.name.', + (u'file.name.mkv', u''): u'file.name.', + (u'file.name.mkv', 'avi'): u'file.name.avi', + (u'file.name.mkv', u'avi'): u'file.name.avi', + } + + for ((filename, extension), result) in tests.iteritems(): + self.assertEqual(replace_extension(filename, extension), result) + + def test_sanitize_filename(self): + tests = { + None: '', + 42: '', + '': '', + u'': u'', + 'filename': 'filename', + u'filename': u'filename', + 'fi\\le/na*me': 'fi-le-na-me', + u'fi\\le/na*me': u'fi-le-na-me', + 'fi:le"na<me': 'filename', + u'fi:le"na<me': u'filename', + 'fi>le|na?me': 'filename', + u'fi>le|na?me': u'filename', + ' . file\u2122name. .': 'file-u2122name', + u' . file\u2122name. .': u'filename', + } + + for (filename, result) in tests.iteritems(): + self.assertEqual(sanitize_filename(filename), result) + + +if __name__ == '__main__': + print('=====> Testing %s' % __file__) + + suite = TestLoader().loadTestsFromTestCase(CommonTests) + TextTestRunner(verbosity=2).run(suite) diff --git a/tests/torrent_tests.py b/tests/torrent_tests.py index 23a60edd6b4d8a75f938510d82746e637b71c44e..7ebe155953aefee44b452c1e004f53ead971c170 100644 --- a/tests/torrent_tests.py +++ b/tests/torrent_tests.py @@ -25,18 +25,47 @@ sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..') import unittest import urlparse -import test_lib as test +import tests.test_lib as test from bs4 import BeautifulSoup from sickbeard.helpers import getURL +from sickbeard.tv import TVEpisode, TVShow import requests +from sickbeard.providers.bitcannon import BitCannonProvider + class TorrentBasicTests(test.SickbeardTestDBCase): + @classmethod + def setUpClass(cls): + cls.shows = [] + + show = TVShow(1, 121361) + show.name = "Italian Works" + show.episodes = [] + episode = TVEpisode(show, 05, 10) + episode.name = "Pines of Rome" + episode.scene_season = 5 + episode.scene_episode = 10 + show.episodes.append(episode) + cls.shows.append(show) + + def test_bitcannon(self): + bitcannon = BitCannonProvider() + bitcannon.custom_url = "" # true testing requires a valid URL here (e.g., "http://localhost:3000/") + bitcannon.api_key = "" + + if len(bitcannon.custom_url) > 0: + search_strings_list = bitcannon._get_episode_search_strings(self.shows[0].episodes[0]) # [{'Episode': ['Italian Works S05E10']}] + for search_strings in search_strings_list: + bitcannon._doSearch(search_strings) # {'Episode': ['Italian Works S05E10']} + + return True + def test_search(self): - self.url = 'http://kickass.to/' - searchURL = 'http://kickass.to/usearch/American%20Dad%21%20S08%20-S08E%20category%3Atv/?field=seeders&sorder=desc' + url = 'http://kickass.to/' + search_url = 'http://kickass.to/usearch/American%20Dad%21%20S08%20-S08E%20category%3Atv/?field=seeders&sorder=desc' - html = getURL(searchURL, session=requests.Session()) + html = getURL(search_url, session=requests.Session()) if not html: return @@ -50,14 +79,14 @@ class TorrentBasicTests(test.SickbeardTestDBCase): #Continue only if one Release is found if len(torrent_rows) < 2: - print(u"The data returned does not contain any torrents") + print "The data returned does not contain any torrents" return for tr in torrent_rows[1:]: try: - link = urlparse.urljoin(self.url, (tr.find('div', {'class': 'torrentname'}).find_all('a')[1])['href']) - id = tr.get('id')[-7:] + link = urlparse.urljoin(url, (tr.find('div', {'class': 'torrentname'}).find_all('a')[1])['href']) + _id = tr.get('id')[-7:] title = (tr.find('div', {'class': 'torrentname'}).find_all('a')[1]).text \ or (tr.find('div', {'class': 'torrentname'}).find_all('a')[2]).text url = tr.find('a', 'imagnet')['href']