diff --git a/public/js/download-manager.js b/public/js/download-manager.js index be64934..01d2e80 100644 --- a/public/js/download-manager.js +++ b/public/js/download-manager.js @@ -1,7 +1,72 @@ $(() => { + $('input.uk-checkbox').each((i, e) => { + $(e).change(() => { + loadConfig(); + }); + }); + loadConfig(); load(); + + const intervalMS = 5000; + setTimeout(() => { + setInterval(() => { + if (globalConfig.autoRefresh !== true) return; + load(); + }, intervalMS); + }, intervalMS); }); +var globalConfig = {}; +var loading = false; + +const loadConfig = () => { + globalConfig.autoRefresh = $('#auto-refresh').prop('checked'); +}; +const remove = (id) => { + var url = '/api/admin/mangadex/queue/delete/'; + if (id !== undefined) { + url += id; + } + $.ajax({ + type: 'POST', + url: url, + dataType: 'json' + }) + .done(data => { + if (!data.success && data.error) { + alert('danger', `Failed to remove job from download queue. Error: ${data.error}`); + return; + } + load(); + }) + .fail((jqXHR, status) => { + alert('danger', `Failed to remove job from download queue. Error: [${jqXHR.status}] ${jqXHR.statusText}`); + }); +}; +const refresh = (id) => { + var url = '/api/admin/mangadex/queue/retry/'; + if (id !== undefined) { + url += id; + } + $.ajax({ + type: 'POST', + url: url, + dataType: 'json' + }) + .done(data => { + if (!data.success && data.error) { + alert('danger', `Failed to restart download job. Error: ${data.error}`); + return; + } + load(); + }) + .fail((jqXHR, status) => { + alert('danger', `Failed to restart download job. Error: [${jqXHR.status}] ${jqXHR.statusText}`); + }); +}; const load = () => { + if (loading) return; + loading = true; + console.log('fetching'); $.ajax({ type: 'GET', url: '/api/admin/mangadex/queue', @@ -18,16 +83,19 @@ const load = () => { if (obj.status === 'MissingPages') cls += 'uk-label-warning'; - const statusSpan = `${obj.status}`; - return ` + const info = obj.status_message.length > 0 ? '' : ''; + const statusSpan = `${obj.status} ${info}`; + const dropdown = obj.status_message.length > 0 ? `
${obj.status_message}
` : ''; + const retryBtn = obj.status_message.length > 0 ? `` : ''; + return ` ${obj.title} ${obj.manga_title} ${obj.success_count}/${obj.pages} ${moment(obj.time).fromNow()} - ${statusSpan} + ${statusSpan} ${dropdown} - - + + ${retryBtn} `; }); @@ -38,5 +106,8 @@ const load = () => { }) .fail((jqXHR, status) => { alert('danger', `Failed to fetch download queue. Error: [${jqXHR.status}] ${jqXHR.statusText}`); + }) + .always(() => { + loading = false; }); }; diff --git a/src/mangadex/downloader.cr b/src/mangadex/downloader.cr index 8c701fc..fb7db3e 100644 --- a/src/mangadex/downloader.cr +++ b/src/mangadex/downloader.cr @@ -140,12 +140,37 @@ module MangaDex self.count - start_count end - def delete(job : Job) + def reset(id : String) DB.open "sqlite3://#{@path}" do |db| - db.exec "delete from queue where id = (?)", job.id + db.exec "update queue set status = 0, status_message = '', " \ + "pages = 0, success_count = 0, fail_count = 0 " \ + "where id = (?)", id end end + def reset (job : Job) + self.reset job.id + end + + # Reset all failed tasks (missing pages and error) + def reset + DB.open "sqlite3://#{@path}" do |db| + db.exec "update queue set status = 0, status_message = '', " \ + "pages = 0, success_count = 0, fail_count = 0 " \ + "where status = 2 or status = 4" + end + end + + def delete(id : String) + DB.open "sqlite3://#{@path}" do |db| + db.exec "delete from queue where id = (?)", id + end + end + + def delete(job : Job) + self.delete job.id + end + def get(job : Job) DB.open "sqlite3://#{@path}" do |db| db.query_one "select * from queue where id = (?)", id do |res| diff --git a/src/routes/api.cr b/src/routes/api.cr index 8c06dcb..798ed54 100644 --- a/src/routes/api.cr +++ b/src/routes/api.cr @@ -131,5 +131,56 @@ class APIRouter < Router jobs = @context.queue.get_all send_json env, jobs.to_json end + + post "/api/admin/mangadex/queue/delete/:id" do |env| + begin + id = env.params.url["id"] + @context.queue.delete id + send_json env, {"success" => true}.to_json + rescue e + send_json env, { + "success" => false, + "error" => e.message + }.to_json + end + end + + # Delete all completed tasks from the queue + post "/api/admin/mangadex/queue/delete" do |env| + begin + @context.queue.delete_status MangaDex::JobStatus::Completed + send_json env, {"success" => true}.to_json + rescue e + send_json env, { + "success" => false, + "error" => e.message + }.to_json + end + end + + post "/api/admin/mangadex/queue/retry/:id" do |env| + begin + id = env.params.url["id"] + @context.queue.reset id + send_json env, {"success" => true}.to_json + rescue e + send_json env, { + "success" => false, + "error" => e.message + }.to_json + end + end + + post "/api/admin/mangadex/queue/retry" do |env| + begin + @context.queue.reset + send_json env, {"success" => true}.to_json + rescue e + send_json env, { + "success" => false, + "error" => e.message + }.to_json + end + end end end diff --git a/src/views/download-manager.ecr b/src/views/download-manager.ecr index 3f2590d..e7d962e 100644 --- a/src/views/download-manager.ecr +++ b/src/views/download-manager.ecr @@ -1,12 +1,11 @@
- - - + + +
- - +