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 @@