All pastes #1919219 Raw Edit

urltitle.pl for irssi

public text v1 · immutable
#1919219 ·published 2010-08-18 05:22 UTC
rendered paste body
# originally posted by FourOhFour: http://paste.lisp.org/display/58040
# with message:
# stupid url titling script for irssi
# I place this into the public domain. If it breaks, bite me.
#
# modified by chiman 7/2009

use Irssi;
use Irssi::Irc;
use LWP::UserAgent;
use HTML::Entities;

use warnings;
use strict;

our %title_cache;

sub pubmsg {
        my $max_width = 99;
        my ($server, $data, $nick, $mask, $target) = @_;

        if($data =~ m{(?:^|\s)((?:http://)?([^/@\s>]+\.
                                     (com|org|net|edu|gov|mil|int
                                                |biz|pro|info|aero|coop|name
                                                |museum|[a-z][a-z]))
                                         [^\s>]*)}ix
        ) {
                my ($url, $domain) = ($1, lc($2));

                if($url !~ m/^http/) {
                        $url = 'http://' . $url;
                }

                # files and people to ignore
                if($url !~ m{\.(?:jpe?g|gif|png|tiff?|m?pkg|zip|sitx?|.ar|pdf|gz|bz2|7z|txt|js|css|mp.|aiff?|wav|snd|mod|m4a|m4p|wma|wmv|ogg|swf|mov|mpe?g|avi)$}i
                        && $nick !~ m{(?:Bot|Serv)$}i
                ) {
                        my $title = get_title($url);

                        if(length($title) > $max_width) {
                                #$title = substr($title, 0, $max_width-3) . '...';
                                $title = substr($title, 0, $max_width-1) . "\x{2026}";
                        }

                        # try to figure out if the title is just a pretty version of
                        # the URL.
                        my $baretitle = lc($title);
                        $baretitle =~ s/\W//ig; # strip all except letters and nubmers
                        $domain =~ s/www\.//;
                        $domain =~ s/\.(?:com|org|net|edu|gov|mil|int|biz|pro|info|aero|coop|name|museum|\w\w)//;
                        $baretitle =~ s/\.(?:com|org|net|edu|gov|mil|int|biz|pro|info|aero|coop|name|museum|\w\w)//;

                        if($title !~ m/^\s*$/ && $baretitle ne $domain) {
                                $server->command("msg $target Title: $title");
                                # $server->print($target, $title);
                        }
                }
        }
}

sub get_title {
        my ($url) = @_;

        if(defined $title_cache{$url}) { return $title_cache{$url}; }

        my $ua = LWP::UserAgent->new(
                max_size => 3000,
                timeout => 2,
                protocols_allowed => ['http'],
                agent => "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.6.1234",
        );

        my $resp = $ua->get($url,
                Range => "0-2000");

        if($resp->decoded_content() =~ m|<title>([^<]*)</title>|i) {
                my $title = $1;

                decode_entities($title);

                $title =~ s/\s+/ /g;
                $title =~ s/^\s//;
                $title =~ s/\s$//;

                $title_cache{$url} = $title;
                return $title;
        }
}

Irssi::signal_add_last('message public', 'pubmsg');