user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
* [PATCH] search: allow downloading search results as mbox
@ 2017-12-01  8:59 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2017-12-01  8:59 UTC (permalink / raw)
  To: meta

Allowing downloading of all search results as an gzipped mboxrd
file can be convenient for some users.
---
 lib/PublicInbox/Mbox.pm       | 24 +++++++++++++++++++-----
 lib/PublicInbox/SearchView.pm | 13 +++++++++----
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/lib/PublicInbox/Mbox.pm b/lib/PublicInbox/Mbox.pm
index 2ea326a..ead5c7d 100644
--- a/lib/PublicInbox/Mbox.pm
+++ b/lib/PublicInbox/Mbox.pm
@@ -101,17 +101,22 @@ sub thread_mbox {
 sub emit_range {
 	my ($ctx, $range) = @_;
 
-	eval { require IO::Compress::Gzip };
-	return sub { need_gzip(@_) } if $@;
 	my $query;
 	if ($range eq 'all') { # TODO: YYYY[-MM]
 		$query = '';
 	} else {
 		return [404, [qw(Content-Type text/plain)], []];
 	}
+	mbox_all($ctx, $query);
+}
 
+sub mbox_all {
+	my ($ctx, $query) = @_;
+
+	eval { require IO::Compress::Gzip };
+	return sub { need_gzip(@_) } if $@;
 	my $cb = sub { $ctx->{srch}->query($query, @_) };
-	PublicInbox::MboxGz->response($ctx, $cb);
+	PublicInbox::MboxGz->response($ctx, $cb, 'results-'.$query);
 }
 
 sub need_gzip {
@@ -131,6 +136,7 @@ EOF
 package PublicInbox::MboxGz;
 use strict;
 use warnings;
+use PublicInbox::Hval qw/to_filename/;
 
 sub new {
 	my ($class, $ctx, $cb) = @_;
@@ -146,14 +152,22 @@ sub new {
 }
 
 sub response {
-	my ($class, $ctx, $cb) = @_;
+	my ($class, $ctx, $cb, $fn) = @_;
 	my $body = $class->new($ctx, $cb);
 	# http://www.iana.org/assignments/media-types/application/gzip
 	$body->{hdr} = [ 'Content-Type', 'application/gzip' ];
+	$body->{fn} = $fn;
 	my $hdr = $body->getline; # fill in Content-Disposition filename
 	[ 200, $hdr, $body ];
 }
 
+sub set_filename ($$) {
+	my ($fn, $msg) = @_;
+	return to_filename($fn) if defined($fn);
+
+	PublicInbox::Mbox::subject_fn($msg);
+}
+
 # called by Plack::Util::foreach or similar
 sub getline {
 	my ($self) = @_;
@@ -170,7 +184,7 @@ sub getline {
 
 			# use subject of first message as subject
 			if (my $hdr = delete $self->{hdr}) {
-				my $fn = PublicInbox::Mbox::subject_fn($msg);
+				my $fn = set_filename($self->{fn}, $msg);
 				push @$hdr, 'Content-Disposition',
 						"inline; filename=$fn.mbox.gz";
 				return $hdr;
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index 39400d6..3eff708 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -21,8 +21,11 @@ sub noop {}
 sub sres_top_html {
 	my ($ctx) = @_;
 	my $q = PublicInbox::SearchQuery->new($ctx->{qp});
-	my $code = 200;
+	my $x = $q->{x};
+	my $query = $q->{'q'};
+	return PublicInbox::Mbox::mbox_all($ctx, $query) if $x eq 'm';
 
+	my $code = 200;
 	# double the limit for expanded views:
 	my $opts = {
 		limit => $LIM,
@@ -33,7 +36,7 @@ sub sres_top_html {
 	my ($mset, $total, $err, $cb);
 retry:
 	eval {
-		$mset = $ctx->{srch}->query($q->{'q'}, $opts);
+		$mset = $ctx->{srch}->query($query, $opts);
 		$total = $mset->get_matches_estimated;
 	};
 	$err = $@;
@@ -55,7 +58,6 @@ retry:
 		$ctx->{-html_tip} = "<pre>\n[No results found]</pre><hr>";
 		$cb = *noop;
 	} else {
-		my $x = $q->{x};
 		return adump($_[0], $mset, $q, $ctx) if $x eq 'A';
 
 		$ctx->{-html_tip} = search_nav_top($mset, $q, $ctx) . "\n\n";
@@ -164,6 +166,9 @@ sub search_nav_top {
 	}
 	my $A = $q->qs_html(x => 'A', r => undef);
 	$rv .= qq{|<a\nhref="?$A">Atom feed</a>]};
+	my $m = $q->qs_html(x => 'm', r => undef);
+	warn "m: $m\n";
+	$rv .= qq{\n\t\t\t\t\t\tdownload: <a\nhref="?$m">mbox.gz</a>};
 }
 
 sub search_nav_bot {
@@ -327,7 +332,7 @@ sub qs_html {
 		$qs .= "&amp;r";
 	}
 	if (my $x = $self->{x}) {
-		$qs .= "&amp;x=$x" if ($x eq 't' || $x eq 'A');
+		$qs .= "&amp;x=$x" if ($x eq 't' || $x eq 'A' || $x eq 'm');
 	}
 	$qs;
 }
-- 
EW


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2017-12-01  8:59 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-12-01  8:59 [PATCH] search: allow downloading search results as mbox Eric Wong

Code repositories for project(s) associated with this public inbox

	https://80x24.org/public-inbox.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).