+sub expand_url_shortener {
+ my $s = shift;
+ my $os = '';
+ my @urlshortener = (
+ 'otf\.me/[[:alnum:]]+',
+ 'hel\.me/[[:alnum:]]+',
+ '7ax\.de/[[:alnum:]]+',
+ 'ow\.ly/[[:alnum:]]+',
+ 'j\.mp/[[:alnum:]]+',
+ 'bit\.ly/[[:alnum:]]+',
+ 'tinyurl\.com/[[:alnum:]]+',
+ );
+ my $ua = LWP::UserAgent->new(agent => 'Mozilla', max_redirect => 0);
+ my $i = 100;
+
+ OUTER: while (($os ne $s) and ($i > 0)) {
+ $os = $s;
+ $i--;
+
+ foreach my $pattern (@urlshortener) {
+ my $p = "https?:\/\/" . $pattern;
+
+ write_debug("Matching %s against %s", $p, $s);
+ if ($s =~ m|($p)|) {
+ my $matched = $1;
+ my $res;
+
+ write_debug("Found %s", $matched);
+ $res = $ua->head($matched);
+ if ($res->is_redirect()) {
+ my $new = $res->headers()->header("Location");
+
+ write_debug("Replacing %s with %s", $matched, $new);
+ $s =~ s/$matched/$new/;
+ next OUTER;
+ } else {
+ write_debug("Error resolving %s", $matched);
+ }
+ }
+ }
+ }
+
+ if ($i == 0) {
+ write_debug("Loop terminated by counter");
+ }
+
+ write_debug("Final string: %s", $s);
+
+ return $s;
+}
+
+