mirror of
https://github.com/hkalexling/Mango.git
synced 2025-08-02 10:55:30 -04:00
Trigger thumbnail generation from the admin page
This commit is contained in:
parent
44f4959477
commit
c4e1ffe023
@ -1,40 +1,88 @@
|
||||
let scanning = false;
|
||||
|
||||
const scan = () => {
|
||||
scanning = true;
|
||||
$('#scan-status > div').removeAttr('hidden');
|
||||
$('#scan-status > span').attr('hidden', '');
|
||||
const color = $('#scan').css('color');
|
||||
$('#scan').css('color', 'gray');
|
||||
$.post(base_url + 'api/admin/scan', (data) => {
|
||||
const ms = data.milliseconds;
|
||||
const titles = data.titles;
|
||||
$('#scan-status > span').text('Scanned ' + titles + ' titles in ' + ms + 'ms');
|
||||
$('#scan-status > span').removeAttr('hidden');
|
||||
$('#scan').css('color', color);
|
||||
$('#scan-status > div').attr('hidden', '');
|
||||
scanning = false;
|
||||
});
|
||||
}
|
||||
|
||||
String.prototype.capitalize = function() {
|
||||
return this.charAt(0).toUpperCase() + this.slice(1);
|
||||
}
|
||||
|
||||
$(() => {
|
||||
$('li').click((e) => {
|
||||
const url = $(e.currentTarget).attr('data-url');
|
||||
if (url) {
|
||||
$(location).attr('href', url);
|
||||
}
|
||||
});
|
||||
|
||||
const setting = loadThemeSetting();
|
||||
$('#theme-select').val(setting.capitalize());
|
||||
|
||||
$('#theme-select').val(capitalize(setting));
|
||||
$('#theme-select').change((e) => {
|
||||
const newSetting = $(e.currentTarget).val().toLowerCase();
|
||||
saveThemeSetting(newSetting);
|
||||
setTheme();
|
||||
});
|
||||
|
||||
setInterval(getProgress, 5000);
|
||||
});
|
||||
|
||||
/**
|
||||
* Capitalize String
|
||||
*
|
||||
* @function capitalize
|
||||
* @param {string} str - The string to be capitalized
|
||||
* @return {string} The capitalized string
|
||||
*/
|
||||
const capitalize = (str) => {
|
||||
return str.charAt(0).toUpperCase() + str.slice(1);
|
||||
};
|
||||
|
||||
/**
|
||||
* Set an alpine.js property
|
||||
*
|
||||
* @function setProp
|
||||
* @param {string} key - Key of the data property
|
||||
* @param {*} prop - The data property
|
||||
*/
|
||||
const setProp = (key, prop) => {
|
||||
$('#root').get(0).__x.$data[key] = prop;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get an alpine.js property
|
||||
*
|
||||
* @function getProp
|
||||
* @param {string} key - Key of the data property
|
||||
* @return {*} The data property
|
||||
*/
|
||||
const getProp = (key) => {
|
||||
return $('#root').get(0).__x.$data[key];
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the thumbnail generation progress from the API
|
||||
*
|
||||
* @function getProgress
|
||||
*/
|
||||
const getProgress = () => {
|
||||
$.get(`${base_url}api/admin/thumbnail_progress`)
|
||||
.then(data => {
|
||||
setProp('progress', data.progress);
|
||||
const generating = data.progress > 0
|
||||
setProp('generating', generating);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Trigger the thumbnail generation
|
||||
*
|
||||
* @function generateThumbnails
|
||||
*/
|
||||
const generateThumbnails = () => {
|
||||
setProp('generating', true);
|
||||
setProp('progress', 0.0);
|
||||
$.post(`${base_url}api/admin/generate_thumbnails`);
|
||||
};
|
||||
|
||||
/**
|
||||
* Trigger the scan
|
||||
*
|
||||
* @function scan
|
||||
*/
|
||||
const scan = () => {
|
||||
setProp('scanning', true);
|
||||
setProp('scanMs', -1);
|
||||
setProp('scanTitles', 0);
|
||||
$.post(`${base_url}api/admin/scan`)
|
||||
.then(data => {
|
||||
setProp('scanMs', data.milliseconds);
|
||||
setProp('scanTitles', data.titles);
|
||||
})
|
||||
.always(() => {
|
||||
setProp('scanning', false);
|
||||
});
|
||||
}
|
||||
|
@ -221,10 +221,16 @@ class Library
|
||||
end
|
||||
|
||||
def thumbnail_generation_progress
|
||||
return 0 if @entries_count == 0
|
||||
@thumbnails_count / @entries_count
|
||||
end
|
||||
|
||||
def generate_thumbnails
|
||||
if @thumbnails_count > 0
|
||||
Logger.debug "Thumbnail generation in progress"
|
||||
return
|
||||
end
|
||||
|
||||
Logger.info "Starting thumbnail generation"
|
||||
entries = deep_titles.map(&.deep_entries).flatten.reject &.err_msg
|
||||
@entries_count = entries.size
|
||||
@ -233,10 +239,18 @@ class Library
|
||||
# Report generation progress regularly
|
||||
spawn do
|
||||
loop do
|
||||
break if thumbnail_generation_progress.to_i == 1
|
||||
Logger.debug "Thumbnail generation progress: " \
|
||||
"#{(thumbnail_generation_progress * 100).round 1}%"
|
||||
sleep 30.seconds
|
||||
unless @thumbnails_count == 0
|
||||
Logger.debug "Thumbnail generation progress: " \
|
||||
"#{(thumbnail_generation_progress * 100).round 1}%"
|
||||
end
|
||||
# Generation is completed. We reset the count to 0 to allow subsequent
|
||||
# calls to the function, and break from the loop to stop the progress
|
||||
# report fiber
|
||||
if thumbnail_generation_progress.to_i == 1
|
||||
@thumbnails_count = 0
|
||||
break
|
||||
end
|
||||
sleep 10.seconds
|
||||
end
|
||||
end
|
||||
|
||||
@ -249,8 +263,6 @@ class Library
|
||||
end
|
||||
@thumbnails_count += 1
|
||||
end
|
||||
Logger.info "Thumbnail generation finished. " \
|
||||
"#{@thumbnails_count}/#{@entries_count} " \
|
||||
"thumbnails generated"
|
||||
Logger.info "Thumbnail generation finished"
|
||||
end
|
||||
end
|
||||
|
@ -76,6 +76,18 @@ class APIRouter < Router
|
||||
}.to_json
|
||||
end
|
||||
|
||||
get "/api/admin/thumbnail_progress" do |env|
|
||||
send_json env, {
|
||||
"progress" => Library.default.thumbnail_generation_progress,
|
||||
}.to_json
|
||||
end
|
||||
|
||||
post "/api/admin/generate_thumbnails" do |env|
|
||||
spawn do
|
||||
Library.default.generate_thumbnails
|
||||
end
|
||||
end
|
||||
|
||||
post "/api/admin/user/delete/:username" do |env|
|
||||
begin
|
||||
username = env.params.url["username"]
|
||||
|
@ -1,11 +1,17 @@
|
||||
<ul class="uk-list uk-list-large uk-list-divider">
|
||||
<li data-url="<%= base_url %>admin/user">User Managerment</li>
|
||||
<li onclick="if(!scanning){scan()}">
|
||||
<span id="scan">Scan Library Files</span>
|
||||
<span id="scan-status" class="uk-align-right">
|
||||
<div uk-spinner hidden></div>
|
||||
<span hidden></span>
|
||||
</span>
|
||||
<ul class="uk-list uk-list-large uk-list-divider" id="root" x-data="{progress : 1.0, generating : false, scanTitles: 0, scanMs: -1, scanning : false}">
|
||||
<li @click="location.href = '<%= base_url %>admin/user'">User Managerment</li>
|
||||
<li :class="{'nopointer' : scanning}" @click="scan()">
|
||||
<span :style="`${scanning ? 'color:grey' : ''}`">Scan Library Files</span>
|
||||
<div class="uk-align-right">
|
||||
<div uk-spinner x-show="scanning"></div>
|
||||
<span x-show="!scanning && scanMs > 0" x-text="`Scan ${scanTitles} titles in ${scanMs}ms`"></span>
|
||||
</div>
|
||||
</li>
|
||||
<li :class="{'nopointer' : generating}" @click="generateThumbnails()">
|
||||
<span :style="`${generating ? 'color:grey' : ''}`">Generate Thumbnails</span>
|
||||
<div class="uk-align-right">
|
||||
<span x-show="generating && progress > 0" x-text="`${(progress * 100).toFixed(2)}%`"></span>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nopointer">
|
||||
<span>Theme</span>
|
||||
|
Loading…
x
Reference in New Issue
Block a user