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 )