mirror of
https://github.com/evilhero/mylar
synced 2024-12-25 01:01:47 +00:00
21eee17344
torrents will now properly hide torrent information, IMP: Specified daemon port for deluge as an on-screen tip for more detail, IMP: Added 100,200,ALL as viewable watchlist views, FIX: When viewing pullist and annual integration enabled, if annual was present would incorrectly link to invalid annual series instead of the actual series itself, IMP: Added more detail error messages to metatagging errors and better handling of stranded files during cleanup, IMP: Improved some handling for weekly pull-list one-off's and refactored the nzb/oneoff post-processing into a seperate function for future callables, Moved all the main url locations for public torrent sites to the init module so that it can be cascaded down for use in other modules instead as a global, IMP: Added a 'deep_search_32p' variable in the config.ini for specific usage with 32p, where if there is more than one result will dig deeper into each result to try and figure out if there are series matches, as opposed to the default where it will only use ref32p table if available or just the first hit in a multiple series search results and ignore the remainder, FIX:Fixed some unknown characters appearing in the pullist due to unicode-related conversion problems, FIX: fixed some special cases of file parsing errors due to Volume label being named different than expected, FIX: Added a 3s pause between experimental searches to try and not hit their frequency limitation, IMP: Weekly Pullist One-off's will now show status of Snatched/Downloaded as required, FIX: Fixed some deluge parameter problems when using auto-snatch torrent script/option, IMP: Changed the downlocation in the auto-snatch option to an env variable instead of being passed to avoid unicode-related problems, FIX: Fixed some magnet-related issues for torrents when using a watchdir + TPSE, FIX: Added more verbose error message for rtorrent connection issues, FIX: Could not connect to rtorrent client if no username/password were provided, IMP: Set the db updater to run every 5 minutes on the watchlist, automatically refreshing the oldest updated series each time that is more than 5 hours old (force db update from the activity/job schedulers page will run the db updater against the entire watchlist in sequence), IMP: Attempt to handle long paths in windows (ie. > 256c) by prepending the unicode windows api character to the import a directory path (windows only), IMP: When manual metatagging a series, will update the series after all the metatagging has been completed as opposed to after each issue, IMP: Will now display available inkdrops on Config/Search Providers tab when using 32P (future will utilize/indicate inkdrop threshold when downloading)
290 lines
19 KiB
HTML
Executable file
290 lines
19 KiB
HTML
Executable file
<%inherit file="base.html" />
|
|
<%!
|
|
import mylar
|
|
from mylar.helpers import checked
|
|
%>
|
|
<%def name="headerIncludes()">
|
|
<div id="subhead_container">
|
|
<div id="subhead_menu">
|
|
<a id="menu_link_edit" href="manageComics">Manage Comics</a>
|
|
<a id="menu_link_edit" href="manageIssues?status=Wanted">Manage Issues</a>
|
|
<a id="menu_link_edit" href="manageFailed">Manage Failed Links</a>
|
|
</div>
|
|
</div>
|
|
</%def>
|
|
|
|
<%def name="body()">
|
|
<div id="paddingheader">
|
|
<h1 class="clearfix">Manage</h1>
|
|
</div>
|
|
<div id="tabs">
|
|
<ul>
|
|
<li><a href="#tabs-1">Scan Comic Library</a></li>
|
|
<li><a href="#tabs-2">Manual Post-Processing</a></li>
|
|
<li><a href="#tabs-3">Advanced Options</a></li>
|
|
<li><a href="#tabs-4" title="jobs">Activity / Jobs</a></li>
|
|
</ul>
|
|
<div id="tabs-1" class="configtable">
|
|
<div style="float:right;position:absolute;right:0;top;0;margin-right:50px;">
|
|
<legend>Current Import Status</legend>
|
|
%if mylar.IMPORT_STATUS:
|
|
%if mylar.IMPORT_STATUS == 'Import completed.':
|
|
<input type="text" name="importstatus" id="importstatus" style="text-align:center; font-size:11px;" size="60" DISABLED /></br>
|
|
<script>
|
|
turnitoff();
|
|
</script>
|
|
%else:
|
|
<input type="text" name="importstatus" id="importstatus" style="text-align:center; font-size:11px;" size="60" DISABLED /></br>
|
|
<script>
|
|
turniton();
|
|
</script>
|
|
%endif
|
|
%else:
|
|
<script>
|
|
turnitoff();
|
|
</script>
|
|
<input type="text" name="importstatus" id="importstatus" style="text-align:center; font-size:11px;" size="60" value="Import is currently not running" DISABLED /></br>
|
|
%endif
|
|
<label>Number of valid files to process: </label>${mylar.IMPORT_TOTALFILES}
|
|
%if int(mylar.IMPORT_FILES) != int(mylar.IMPORT_TOTALFILES):
|
|
/ ${mylar.IMPORT_FILES}
|
|
%endif
|
|
</br>
|
|
<label>Files with ComicID's present: </label>${mylar.IMPORT_CID_COUNT}</br>
|
|
<label>Files that were parsed: </label>${mylar.IMPORT_PARSED_COUNT}</br>
|
|
<label>Files that couldn't be parsed: </label>${mylar.IMPORT_FAILURE_COUNT}</br>
|
|
|
|
%if mylar.IMPORTLOCK:
|
|
</br></br></br></br>
|
|
<div class="row checkbox">
|
|
<input type="checkbox" style="vertical-align: middle; margin: 3px; margin-top: -1px;" name="forcescan" id="forcescan" value="1"><label>Existing Import Running. Force this import?</label>
|
|
</div>
|
|
%endif
|
|
</div>
|
|
<form action="comicScan" method="GET" id="comicScan">
|
|
<legend>Scan Comic Library</legend>
|
|
<p><strong>Where are the comics you want scanned in located?</strong></p>
|
|
<p>You can put in any directory, and it will scan for comics</br>
|
|
in that folder (including all subdirectories). <br/>
|
|
<small>For example: '/Users/name/Comics'</small></p>
|
|
<p>
|
|
It may take a while depending on how many files you have.</br>
|
|
You can navigate away from the page as soon as you click 'Save changes'
|
|
</p>
|
|
<br/>
|
|
<div class="row">
|
|
<label for="">Path to directory</label>
|
|
%if mylar.COMIC_DIR:
|
|
<input type="text" value="${mylar.COMIC_DIR}" name="path" size="70" />
|
|
%else:
|
|
<input type="text" value="Enter a Comic Directory to scan" onfocus="if
|
|
(this.value==this.defaultValue) this.value='';" name="path" size="70" />
|
|
%endif
|
|
</div>
|
|
<div class="row checkbox">
|
|
<input type="checkbox" name="autoadd" id="autoadd" value="1" ${checked(mylar.ADD_COMICS)}><label>Auto-add new series</label>
|
|
</div>
|
|
<div class="row checkbox">
|
|
<input type="checkbox" style="vertical-align: middle; margin: 3px; margin-top: -1px;" name="imp_metadata" id="imp_metadata" value="1" ${checked(mylar.IMP_METADATA)}><label>Use existing Metadata</label>
|
|
<small>Use existing Metadata to better locate series for import</small>
|
|
</div>
|
|
<div class="row checkbox">
|
|
<input type="checkbox" style="vertical-align: middle; margin: 3px; margin-top: -1px;" name="imp_move" onclick="initConfigCheckbox($this));" id="imp_move" value="1" ${checked(mylar.IMP_MOVE)}><label>Move files into corresponding Series directory</label>
|
|
<small>Leaving this unchecked will not move anything, but will mark the issues as Archived</small>
|
|
</div>
|
|
<div class="config">
|
|
<input type="checkbox" style="vertical-align: middle; margin: 3px; margin-top: -1px;" name="imp_rename" id="imp_rename" value="1" ${checked(mylar.IMP_RENAME)}><label>Rename Files </label>
|
|
<small>Rename files to configuration settings</small>
|
|
</div>
|
|
<br/>
|
|
<input type="button" value="Save Changes and Scan" onclick="addScanAction();doAjaxCall('comicScan',$(this),'tabs',true);return true;" data-success="Import Scan now submitted." data-error="Unable to start the scan. Check the logs.">
|
|
<input type="button" value="Save Changes without Scanning Library" onclick="doAjaxCall('comicScan',$(this),'tabs',true);return false;" data-success="Changes Saved Successfully" data-error="Unable to save settings. Check the logs.">
|
|
%if mylar.IMPORTBUTTON:
|
|
<input type="button" value="Import Results Management" style="float: right;" onclick="location.href='importResults';" />
|
|
%endif
|
|
</form>
|
|
</div>
|
|
<div id="tabs-2" class="configtable">
|
|
<tr>
|
|
<td>
|
|
<form action="post_process" method="GET" id="post_process">
|
|
<fieldset>
|
|
<legend>Manual Run</legend>
|
|
<p><strong>Manual Post-Processing</strong></p>
|
|
<p>You can put in any directory, and it will scan for comic files in that folder
|
|
(including all subdirectories) that exist on your watchlist.
|
|
<br/><small>For example: '/Users/name/Comics'</small></p>
|
|
<p>
|
|
It may take a while depending on how many files you have. You can navigate away from this
|
|
as soon as you click 'Go'.
|
|
</p>
|
|
<br/>
|
|
<p><strong>Only series' that exist on your watchlist will be post-processed with your current
|
|
post-processing options.<br/> The remainder will not be moved from the given directory</strong></p>
|
|
<div class="row">
|
|
<label for="">Path to Manually Run</label>
|
|
%if mylar.CHECK_FOLDER:
|
|
<input type="text" value="${mylar.CHECK_FOLDER}" name="nzb_folder" size="70" />
|
|
%else:
|
|
<input type="text" value="Enter the full path to post-process" onfocus="if
|
|
(this.value==this.defaultValue) this.value='';" name="nzb_folder" size="70" />
|
|
%endif
|
|
<input type="hidden" name="nzb_name" value='Manual Run' />
|
|
</div>
|
|
<input type="button" value="Go Manual Run!" onclick="doAjaxCall('post_process',$(this),'tabs',true);return false;" data-success="Manual post-processing now running." data-error="Manual post-processing unable to run at this time.">
|
|
</fieldset>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</div>
|
|
|
|
<div id="tabs-3">
|
|
<table summary="Advanced Options" class="configtable">
|
|
<tr>
|
|
<td>
|
|
<fieldset>
|
|
<legend>Export</legend>
|
|
<div class="links">
|
|
<a href="#" onclick="doAjaxCall('wanted_Export?mode=Wanted',$(this))" data-sucess="Exported to Wanted list." data-error="Failed to export. Check logs"><span class="ui-icon ui-icon-refresh"></span>Export Wanted to CSV</a>
|
|
<a href="#" onclick="doAjaxCall('wanted_Export?mode=Downloaded',$(this))" data-sucess="Exported to Downloaded list." data-error="Failed to export. Check logs"><span class="ui-icon ui-icon-refresh"></span>Export Downloaded to CSV</a>
|
|
</div>
|
|
</fieldset>
|
|
</td>
|
|
<td>
|
|
<fieldset>
|
|
<legend>Additional Options</legend>
|
|
<div class="links">
|
|
<a href="readlist">Reading List Management</a><br/>
|
|
<a href="storyarc_main">Story Arc Management</a><br/>
|
|
<a href="importResults">Import Results Management</a>
|
|
</div>
|
|
</fieldset>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
|
|
<div id="tabs-4">
|
|
<div id="curtime" style="float:right;"></div>
|
|
<table summary="Activity / Jobs" width="100%" cellpadding="6px" cellspacing="2px">
|
|
<legend><center><h1>Schedulers<h1><center></legend>
|
|
<br />
|
|
<thead>
|
|
<tr border="1">
|
|
<th id="job" style="width: 50px;text-align: center;">Name</th>
|
|
<th id="nextrun" style="width: 90px;text-align: center;">Next</th>
|
|
<th id="interval" style="width: 20px;text-align: center;">Interval</th>
|
|
<th id="prevrun" style="width: 90px;text-align: center;">Prev</th>
|
|
<th id="status" style="width: 50px;text-align: center;">Status</th>
|
|
<th id="options" style="width: 50px;;text-align: center;">Options</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
%for j in jobs:
|
|
<%
|
|
if j['status'] == 'Paused':
|
|
grade = '#D9150F'
|
|
elif j['status'] == 'Waiting':
|
|
grade = '#0F49D9'
|
|
elif j['status'] == 'Running':
|
|
grade = '#55D90F'
|
|
%>
|
|
<tr>
|
|
<td id="job" style="width: 50px;text-align: center;">${j['jobname']}</td>
|
|
<td id="nextrun" style="width: 90px;text-align: center;">${j['next_run_datetime']}</td>
|
|
<td id="interval" style="width: 20px;text-align: center;">${j['interval']}</td>
|
|
<td id="prevrun" style="width: 90px;text-align: center;">${j['prev_run_datetime']}</td>
|
|
<td id="status" style="width: 50px;text-align: center;color: ${grade};">${j['status']}</td>
|
|
<td id="options" style="width: 50px;text-align: center;">
|
|
%if any([j['status'] == 'Running', j['status'] == 'Waiting']):
|
|
<a href="#" onclick="doAjaxCall('jobmanage?job=${j['jobname']}&mode=pause',$(this),'tabs',true);return true;" data-success="Successfully paused ${j['jobname']}" data-error="Error Pausing ${j['jobname']}."><span class="ui-icon ui-icon-stop"></span>Pause</a>
|
|
%elif j['status'] == 'Paused':
|
|
<a href="#" onclick="doAjaxCall('jobmanage?job=${j['jobname']}&mode=resume',$(this),'tabs',true);return true;" data-success="Successfully resumed ${j['jobname']}" data-error="Error Pausing ${j['jobname']}."><span class="ui-icon ui-icon-play"></span>Resume</a>
|
|
%endif
|
|
%if j['jobname'] == 'Auto-Search':
|
|
<a href="#" onclick="doAjaxCall('schedulerForceCheck?jobid=search',$(this),'tabs',true);return true;" data-success="Force Search successfully submitted" data-error="Error checking wanted issues"><span class="ui-icon ui-icon-star"></span>Force</a>
|
|
%elif j['jobname'] == 'DB Updater':
|
|
<a href="#" onclick="doAjaxCall('schedulerForceCheck?jobid=updater',$(this),'tabs',true);return true;" data-success="Update active series now running" data-error="Error forcing update Comics"><span class="ui-icon ui-icon-star"></span>Force</a>
|
|
%elif j['jobname'] == 'Weekly Pullist':
|
|
<a href="#" onclick="doAjaxCall('schedulerForceCheck?jobid=weekly',$(this),'tabs',true);return true;" data-success="Now updating Weekly Pullist" data-error="Error forcing update to Weekly Pullist"><span class="ui-icon ui-icon-star"></span>Force</a>
|
|
%elif j['jobname'] == 'Folder Monitor':
|
|
<a href="#" onclick="doAjaxCall('schedulerForceCheck?jobid=monitor',$(this),'tabs',true);return true;" data-success="Folder Monitor now running" data-error="Error forcing Folder Monitor to run"><span class="ui-icon ui-icon-star"></span>Force</a>
|
|
%elif j['jobname'] == 'RSS Feeds':
|
|
<a href="#" onclick="doAjaxCall('schedulerForceCheck?jobid=rss',$(this),'tabs',true);return true;" data-success="Force RSS Check now running" data-error="Error forcing update Comics"><span class="ui-icon ui-icon-star"></span>Force</a>
|
|
%elif j['jobname'] == 'Check Version':
|
|
<a href="#" onclick="doAjaxCall('schedulerForceCheck?jobid=version',$(this),'tabs',true);return true;" data-success="Version check successfully submitted" data-error="Error checking for update"><span class="ui-icon ui-icon-star"></span>Force</a>
|
|
%endif
|
|
</td>
|
|
</tr>
|
|
%endfor
|
|
</tbody>
|
|
</table>
|
|
</br><small><center>There could be up to a 60s delay in a given scheduler running due to other processes currently running</center></small>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</%def>
|
|
<%def name="javascriptIncludes()">
|
|
<script>
|
|
var CheckEnabled = true;
|
|
function startTime() {
|
|
var today = new Date();
|
|
var h = today.getHours();
|
|
var m = today.getMinutes();
|
|
var s = today.getSeconds();
|
|
h = checkTime(h);
|
|
m = checkTime(m);
|
|
s = checkTime(s);
|
|
document.getElementById('curtime').innerHTML = h + ":" + m + ":" + s;
|
|
var t = setTimeout(startTime, 500);
|
|
};
|
|
function checkTime(i) {
|
|
if (i < 10) {i = "0" + i}; // add zero in front of numbers if < 10
|
|
return i;
|
|
};
|
|
function addScanAction() {
|
|
$('#autoadd').append('<input type="hidden" name="scan" value=1 />');
|
|
CheckEnabled = true;
|
|
statuscheck();
|
|
};
|
|
function statuscheck() {
|
|
if (CheckEnabled == true){
|
|
var ImportTimer = setInterval(function(){
|
|
$.get('Check_ImportStatus',
|
|
function(data){
|
|
if (data.error != undefined) {
|
|
alert(data.error);
|
|
return;
|
|
}
|
|
$('#importstatus').val(data);
|
|
if (data == 'Import completed.') {
|
|
CheckEnabled = false;
|
|
clearInterval(ImportTimer);
|
|
return;
|
|
}
|
|
});
|
|
}, 5000);
|
|
};
|
|
};
|
|
function turnitoff() {
|
|
CheckEnabled = false;
|
|
clearInterval(ImportTimer);
|
|
};
|
|
function turniton() {
|
|
if (CheckEnabled == false) {
|
|
CheckEnabled = true;
|
|
statuscheck();
|
|
}
|
|
};
|
|
function initThisPage() {
|
|
jQuery( "#tabs" ).tabs();
|
|
initActions();
|
|
initConfigCheckbox("#imp_move");
|
|
startTime();
|
|
};
|
|
$(document).ready(function() {
|
|
initThisPage();
|
|
});
|
|
</script>
|
|
</%def>
|