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) {
    $file = url_unescape $file; # do not decode UTF-8
    my $name = decode_utf8($file);
    if (not -r "$galleries_dir/$file") {
      $stream->write(encode_utf8 "40 Cannot read $name\r\n");
    } else {
      success($stream, $extension =~ /^png$/i ? "image/png" : "image/jpeg");
      $log->info("Serving image $name");
      $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.895 second using v1.01-cache-2.11-cpan-df04353d9ac )