App-phoebe
view release on metacpan or search on metacpan
lib/App/Phoebe/Galleries.pm view on Meta::CPAN
my $url = shift;
my $host = $galleries_host;
my $port = port($stream);
if ($url =~ m!^gemini://$host(?::$port)?/do/gallery$!) {
success($stream);
$log->info("Serving galleries");
$stream->write("# Galleries\n");
for my $dir (
sort {
my ($year_a, $title_a) = split(/-/, $a, 2);
my ($year_b, $title_b) = split(/-/, $b, 2);
return ($year_b <=> $year_a || $title_a cmp $title_b);
} grep {
-d "$galleries_dir/$_"
} read_dir($galleries_dir)) {
gallery_print_link($stream, $host, gallery_title($dir), "do/gallery/$dir");
};
return 1;
} elsif (my ($dir) = $url =~ m!^gemini://$host(?::$port)?/do/gallery/([^/?]*)$!) {
if (not -d "$galleries_dir/$dir") {
result($stream, "40", "This is not actuall a gallery");
return 1;
}
if (not -r "$galleries_dir/$dir/data.json") {
result($stream, "40", "This gallery does not contain a data.json file like the one created by sitelen-mute or fgallery");
return 1;
}
my $bytes = read_binary("$galleries_dir/$dir/data.json");
if (not $bytes) {
result($stream, "40", "Cannot read the data.json file in this gallery");
return 1;
}
my $data;
eval { $data = decode_json $bytes };
$log->error("decode_json: $@") if $@;
if ($@ or not %$data) {
result($stream, "40", "Cannot decode the data.json file in this gallery");
return 1;
}
success($stream);
$log->info("Serving gallery $dir");
if (-r "$galleries_dir/$dir/index.html") {
my $dom = Mojo::DOM->new(read_text("$galleries_dir/$dir/index.html"));
$log->info("Parsed index.html");
my $title = $dom->at('*[itemprop="name"]');
$title = $title ? $title->text : gallery_title($dir);
$stream->write(encode_utf8 "# $title\n");
my $description = $dom->at('*[itemprop="description"]');
$stream->write(encode_utf8 $description->text . "\n") if $description;
$stream->write("## Images\n");
} else {
$stream->write(encode_utf8 "# " . gallery_title($dir) . "\n");
}
for my $image (@{$data->{data}}) {
$stream->write("\n");
$stream->write(encode_utf8 join("\n", grep /\S/, @{$image->{caption}}) . "\n") if $image->{caption};
gallery_print_link($stream, $host, "Thumbnail", "do/gallery/$dir/" . $image->{thumb}->[0]);
gallery_print_link($stream, $host, "Image", "do/gallery/$dir/" . $image->{img}->[0]);
}
return 1;
} elsif (my ($file, $extension) = $url =~ m!^gemini://$host(?::$port)?/do/gallery/([^/?]*/(?:thumbs|imgs)/[^/?]*\.(jpe?g|png))$!i) {
if (not -r "$galleries_dir/$file") {
$stream->write(encode_utf8 "40 Cannot read $file\r\n");
} else {
success($stream, $extension =~ /^png$/i ? "image/png" : "image/jpeg");
$log->info("Serving image $file");
$stream->write(read_binary("$galleries_dir/$file"));
}
return 1;
}
return;
}
sub gallery_print_link {
my $stream = shift;
my $host = shift;
my $title = shift;
my $id = shift;
return print_link($stream, $host, undef, $title, $id);
}
( run in 0.856 second using v1.01-cache-2.11-cpan-df04353d9ac )