Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ToC metadata for archive #879

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 31 additions & 0 deletions lib/LANraragi/Controller/Api/Archive.pm
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,37 @@ sub update_metadata {
}
}

sub update_toc {
my $self = shift;
my $id = check_id_parameter( $self, "update_toc" ) || return;

my $page = $self->req->param('page');
my $title = $self->req->param('title');

my $res = LANraragi::Model::Archive::update_toc( $id, $page, $title);

if ( $res eq "" ) {
render_api_response( $self, "update_toc" );
} else {
render_api_response( $self, "update_toc", $res );
}
}

sub remove_toc {
my $self = shift;
my $id = check_id_parameter( $self, "remove_toc" ) || return;

my $page = $self->req->param('page');

my $res = LANraragi::Model::Archive::remove_toc( $id, $page);

if ( $res eq "" ) {
render_api_response( $self, "remove_toc" );
} else {
render_api_response( $self, "remove_toc", $res );
}
}

sub update_progress {
my $self = shift;
my $id = check_id_parameter( $self, "update_progress" ) || return;
Expand Down
54 changes: 54 additions & 0 deletions lib/LANraragi/Model/Archive.pm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ no warnings 'experimental::signatures';

use Cwd 'abs_path';
use Redis;
use Mojo::JSON qw(decode_json encode_json);
use Time::HiRes qw(usleep);
use File::Basename;
use File::Copy "cp";
Expand Down Expand Up @@ -270,4 +271,57 @@ sub update_metadata {
return "";
}

sub update_toc {
my ( $id, $page, $title ) = @_;

my $redis = LANraragi::Model::Config->get_redis;
my $logger = get_logger( "File Serving", "lanraragi" );

unless ( defined $page and defined $title ) {
return "Data incomplete";
}

my $toc = $redis->hget( $id, "toc" );

if ( defined $toc ) {
eval { $toc = decode_json( $toc ) };
$toc->{$page} = $title;
$toc = encode_json( $toc );
$redis->hset( $id, "toc", $toc );
} else {
$redis->hset( $id, "toc", "{}" );
}

$redis->quit();

return "";
}

sub remove_toc {
my ( $id, $page ) = @_;

my $redis = LANraragi::Model::Config->get_redis;
my $logger = get_logger( "File Serving", "lanraragi" );

unless ( defined $page ) {
return "Please especify a page to remove";
}

my $toc = $redis->hget( $id, "toc" );

if ( defined $toc ) {
eval { $toc = decode_json( $toc ) };
delete $toc->{$page};
$toc = encode_json( $toc );
$redis->hset( $id, "toc", $toc );
} else {
$logger->info( "ToC no defined, Creating..." );
$redis->hset( $id, "toc", "{}" );
}

$redis->quit();

return "";
}

1;
42 changes: 41 additions & 1 deletion lib/LANraragi/Utils/Database.pm
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use LANraragi::Utils::Logging qw(get_logger);
# Functions for interacting with the DB Model.
use Exporter 'import';
our @EXPORT_OK =
qw(redis_encode redis_decode invalidate_cache compute_id set_tags set_title set_isnew get_computed_tagrules save_computed_tagrules get_archive_json get_archive_json_multi get_tankoubons_by_file);
qw(redis_encode redis_decode invalidate_cache compute_id set_tags set_title set_isnew get_computed_tagrules save_computed_tagrules get_archive_json get_archive_json_multi get_tankoubons_by_file get_toc get_toc_titles);

# Creates a DB entry for a file path with the given ID.
# This function doesn't actually require the file to exist at its given location.
Expand Down Expand Up @@ -610,4 +610,44 @@ sub get_arcsize ( $redis, $id ) {
return $redis->hget( $id, "arcsize" );
}

sub get_toc ( $id ) {
my $redis = LANraragi::Model::Config->get_redis;

my $toc = $redis->hget( $id, "toc" );
my %ordered;

if ( defined $toc ) {
eval { $toc = decode_json( $toc ) };

foreach my $name ( sort keys %$toc ) {
$ordered{$name} = $toc->{$name};
}
} else {
$redis->hset( $id, "toc", "{}" );
}

$redis->quit();

return %ordered;
}

sub get_toc_titles ( $id ) {
my $redis = LANraragi::Model::Config->get_redis;

my $toc = $redis->hget( $id, "toc" );
my @vals;

if ( defined $toc ) {
eval { $toc = decode_json( $toc ) };

@vals = values %$toc;
} else {
$redis->hset( $id, "toc", "{}" );
}

$redis->quit();

return @vals;
}

1;
2 changes: 2 additions & 0 deletions lib/LANraragi/Utils/Routing.pm
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,9 @@ sub apply_routes {
$public_api->get('/api/archives/:id/metadata')->to('api-archive#serve_metadata');
$logged_in_api->put('/api/archives/:id/thumbnail')->to('api-archive#update_thumbnail');
$logged_in_api->put('/api/archives/:id/metadata')->to('api-archive#update_metadata');
$logged_in_api->put('/api/archives/:id/toc')->to('api-archive#update_toc');
$logged_in_api->delete('/api/archives/:id')->to('api-archive#delete_archive');
$logged_in_api->delete('/api/archives/:id/rtoc')->to('api-archive#remove_toc');

# Search API
$public_api->get('/search')->to('api-search#handle_datatables');
Expand Down
35 changes: 34 additions & 1 deletion public/js/reader.js
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,7 @@ Reader.initializeArchiveOverlay = function () {

const thumbCss = (localStorage.cropthumbs === "true") ? "id3" : "id3 nocrop";
const thumbnail = `
<div class='${thumbCss} quick-thumbnail' page='${index}' style='display: inline-block; cursor: pointer'>
<div class='${thumbCss} quick-thumbnail context-menu' page='${index}' style='display: inline-block; cursor: pointer'>
<span class='page-number'>Page ${page}</span>
<img src="./img/wait_warmly.jpg" id="${index}_thumb" />
<i id="${index}_spinner" class="fa fa-4x fa-circle-notch fa-spin ttspinner" style="display:flex;justify-content: center; align-items: center;"></i>
Expand Down Expand Up @@ -757,6 +757,39 @@ Reader.initializeArchiveOverlay = function () {
$("#archivePagesOverlay").attr("loaded", "true");
};

Reader.handleContextMenu = function (option, page) {
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const id = urlParams.get('id');

switch (option) {
case "setpage":
var name = prompt("Enter title of the section:");

Server.callAPI(`/api/archives/${id}/toc?page=${page}&title=${name}`, "PUT", `Bookmark created!`, "Error creating element:",
(data) => {
},
);
break;
case "editpage":
var name = prompt("Enter title of the section:");

Server.callAPI(`/api/archives/${id}/toc?page=${page}&title=${name}`, "PUT", `Bookmark created!`, "Error creating element:",
(data) => {
},
);
break;
case "unsetpage":
Server.callAPI(`/api/archives/${id}/rtoc?page=${page}`, "DELETE", `Bookmark removed!`, "Error removing element:",
(data) => {
},
);
break;
default:
break;
}
};

Reader.changePage = function (targetPage) {
let destination;
if (targetPage === "first") {
Expand Down
33 changes: 33 additions & 0 deletions templates/reader.html.tt2
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<link rel="stylesheet" type="text/css" href="./css/vendor/fontawesome-all.min.css" />
<link rel="stylesheet" type="text/css" href="/css/vendor/ReactToastify.min.css" />
<link rel="stylesheet" type="text/css" href="/css/vendor/sweetalert2.min.css" />
<link rel="stylesheet" type="text/css" href="/css/vendor/jquery.contextMenu.min.css" />
[% csshead %]

<script src="./js/vendor/jquery.min.js" type="text/javascript"></script>
Expand All @@ -23,6 +24,7 @@
<script src="/js/vendor/clsx.min.js" type="text/JAVASCRIPT"></script>
<script src="/js/vendor/react-toastify.umd.js" type="text/JAVASCRIPT"></script>
<script src="/js/vendor/sweetalert2.min.js" type="text/JAVASCRIPT"></script>
<script src="/js/vendor/jquery.contextMenu.min.js" type="text/JAVASCRIPT"></script>

<script src="./js/common.js?[% version %]" type="text/javascript"></script>
<script src="./js/server.js?[% version %]" type="text/javascript"></script>
Expand Down Expand Up @@ -180,6 +182,37 @@
</div>

[% INCLUDE footer %]

<script>

// Last few remains of JS using server-provided data
jQuery(() => {
// Initialize context menu
[% IF userlogged %]
$.contextMenu({
selector: '.context-menu',
build: ($trigger, e) => {
return {
callback: function (key, options) {
Reader.handleContextMenu(key, $(this).attr("page"));
},
items: {
"toc": {
"name": "Table of Contents",
"icon": "fas fa-book",
"items": {
"setpage": {"name": "Set Page", "icon":"fas fa-plus"},
"editpage": {"name": "Edit Page", "icon":"fas fa-pen-to-square"},
"unsetpage": {"name": "Unset Page", "icon":"fas fa-minus"}
}
}
}
}
}
});
[% END %]
});
</script>
</body>

</html>
Expand Down