Mojolicious-Plugin-LinkEmbedder
view release on metacpan or search on metacpan
lib/Mojolicious/Plugin/LinkEmbedder.pm view on Meta::CPAN
=item * L<Mojolicious::Plugin::LinkEmbedder::Link>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Game::_2play>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Image>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Image::Imgur>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Image::Xkcd>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Music::Spotify>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::AppearIn>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::Dbtv>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::Blip>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::Collegehumor>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::Dagbladet>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::Ted>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::Vimeo>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Video::Youtube>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::HTML>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::Github>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::GistGithub>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::Ix>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::Metacpan>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::Pastebin>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::Pastie>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::PasteScsysCoUk>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::Twitter>
=item * L<Mojolicious::Plugin::LinkEmbedder::Link::Text::Travis>
=back
=cut
use Mojo::Base 'Mojolicious::Plugin';
use Mojo::JSON;
use Mojo::UserAgent;
use Mojolicious::Plugin::LinkEmbedder::Link;
use constant DEBUG => $ENV{MOJO_LINKEMBEDDER_DEBUG} || 0;
our $VERSION = '0.2301';
has _ua => sub { Mojo::UserAgent->new(max_redirects => 3) };
=head1 METHODS
=head2 embed_link
See L</SYNOPSIS>.
=cut
sub embed_link {
my ($self, $c, $url, $cb) = @_;
$url = Mojo::URL->new($url || '') unless ref $url;
if ($url =~ m!\.(?:jpg|png|gif)\b!i) {
return $c if $self->_new_link_object(image => $c, {url => $url}, $cb);
}
if ($url =~ m!\.(?:mpg|mpeg|mov|mp4|ogv)\b!i) {
return $c if $self->_new_link_object(video => $c, {url => $url}, $cb);
}
if ($url =~ m!^spotify:\w+!i) {
return $c if $self->_new_link_object('open.spotify' => $c, {url => $url}, $cb);
}
if (!$url or !$url->host) {
return $c->tap(
$cb,
Mojolicious::Plugin::LinkEmbedder::Link->new(
url => Mojo::URL->new,
error => {message => 'Invalid input', code => 400,}
)
);
}
return $c->delay(
sub {
my ($delay) = @_;
$self->_ua->head($url => $delay->begin);
},
sub {
my ($delay, $tx) = @_;
$self->_learn($c, $tx, $cb);
}
);
}
sub _learn {
my ($self, $c, $tx, $cb) = @_;
my $ct = $tx->res->headers->content_type || '';
my $etag = $tx->res->headers->etag;
my $url = $tx->req->url;
if ($etag and $etag eq ($c->req->headers->etag // '')) {
return $c->$cb(Mojolicious::Plugin::LinkEmbedder::Link->new(_tx => $tx, etag => $etag));
}
if (my $err = $tx->error) {
return $c->$cb(Mojolicious::Plugin::LinkEmbedder::Link->new(_tx => $tx, error => $err));
( run in 0.857 second using v1.01-cache-2.11-cpan-71847e10f99 )