diff --git a/PlayBot/sessions/irc.pm b/PlayBot/sessions/irc.pm index 5035739b3c41e5d6a145db0fdb18bb13d2933037..dcadc253866645bf19c2125cc8c616a2a54e2fe5 100644 --- a/PlayBot/sessions/irc.pm +++ b/PlayBot/sessions/irc.pm @@ -13,7 +13,7 @@ use Module::Reload; use PlayBot::utils::Logging; use PlayBot::sessions::irc::later; -use PlayBot::sites::parser; +use PlayBot::sites; use PlayBot::commands::parser; my $log = PlayBot::utils::Logging->new('STDOUT', 1); @@ -116,8 +116,8 @@ sub setConf { PlayBot::commands::parser::setConf($irc, $dbh, $log, \%lastID); - $PlayBot::sites::parser::irc = $irc; - $PlayBot::sites::parser::log = $log; + $PlayBot::sites::irc = $irc; + $PlayBot::sites::log = $log; } @@ -256,7 +256,7 @@ sub on_speak my %content; # first we check for url - my @processed_str = PlayBot::sites::parser::parse(@args); + my @processed_str = PlayBot::sites::parse(@args); # we remove any part processed (url and tags) foreach (@processed_str) { diff --git a/PlayBot/sites/parser.pm b/PlayBot/sites.pm similarity index 70% rename from PlayBot/sites/parser.pm rename to PlayBot/sites.pm index f3759822ab24b7e63c48624cd3ac9d69c614d767..db338a7bd1545a6458f7cb96a9f90c7abeda122b 100644 --- a/PlayBot/sites/parser.pm +++ b/PlayBot/sites.pm @@ -1,13 +1,9 @@ -package PlayBot::sites::parser; +package PlayBot::sites; use strict; use warnings; -use PlayBot::sites::youtube; -use PlayBot::sites::soundcloud; -use PlayBot::sites::mixcloud; -use PlayBot::sites::zippy; -use PlayBot::sites::dailymotion; +use Module::Pluggable sub_name => 'sites', search_path => ['PlayBot::sites'], require => 1; use PlayBot::utils::db; use PlayBot::utils::print; @@ -15,6 +11,11 @@ use PlayBot::commands::parser; our $irc; our $log; +our $regex; + +sub regex { + return $regex; +} sub parse { my ($kernel, $user, $chan, $msg) = @_; @@ -25,33 +26,13 @@ sub parse { my $dbh = PlayBot::utils::db::main_session(); # parsing - if ($msg =~ m#(?:^|[^!])https?://(?:www.youtube.com/watch\?[a-zA-Z0-9_=&-]*v=|youtu.be/)([a-zA-Z0-9_-]+)#) { - eval { %content = PlayBot::sites::youtube::get($1) }; - - $content{'site'} = 'youtube'; - $content{'url'} = 'https://www.youtube.com/watch?v='.$1; - } - elsif ($msg =~ m#(?:^|[^!])https?://(?:www\.)?soundcloud.com/([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+)(?:\?.+)?#) { - my $url = 'https://www.soundcloud.com/'.$1; - eval { %content = PlayBot::sites::soundcloud::get($url) }; - - $content{'site'} = 'soundcloud'; - } - elsif ($msg =~ m#(^|[^!])https?://www.mixcloud.com/([a-zA-Z0-9-_]+/[a-zA-Z0-9-_]+)#) { - my $url = 'https://www.mixcloud.com/'.$2; - eval { %content = PlayBot::sites::mixcloud::get($url) }; - $content{'site'} = 'mixcloud'; - } - elsif ($msg =~ m#((^|[^!])http://www[0-9]+.zippyshare.com/v/[0-9]+/file.html)#) { - my $url = $1; - eval { %content = PlayBot::sites::zippy::get($url) }; - $content{'site'} = 'zippyshare'; - } - elsif ($msg =~ m#(?:^|[^!])https?://www.dailymotion.com/video/([a-z0-9]+)#) { - eval { %content = PlayBot::sites::dailymotion::get($1) }; - - $content{'site'} = 'dailymotion'; - $content{'url'} = 'https://www.dailymotion.com/video/' . $1; + foreach my $site (__PACKAGE__->sites) + { + if (my @args = ($msg =~ $site->regex)) + { + eval { %content = $site->get(@args) }; + last; + } } my $matching_url = $&; diff --git a/PlayBot/sites/dailymotion.pm b/PlayBot/sites/dailymotion.pm index 5a14fb8183dfca25e2c8f78a8aa4be7f4ac5c790..2e9fdb0a4c0e41e94c2a528366c0e722386d9c20 100644 --- a/PlayBot/sites/dailymotion.pm +++ b/PlayBot/sites/dailymotion.pm @@ -5,7 +5,15 @@ use warnings; use Inline Python => 'DATA'; + +sub regex +{ + return qr#(?:^|[^!])https?://www.dailymotion.com/video/([a-z0-9]+)#; +} + + sub get { + shift; my $id = shift; my $content = weboob_get($id); @@ -13,6 +21,9 @@ sub get { my ($h, $m, $s) = ($content->{'duration'} =~ /(.):(..):(..)/); $content->{'duration'} = $h * 3600 + $m * 60 + $s; + $content->{site} = 'dailymotion'; + $content->{'url'} = 'https://www.dailymotion.com/video/'.$id; + return %{$content}; } diff --git a/PlayBot/sites/mixcloud.pm b/PlayBot/sites/mixcloud.pm index 0b9bdb30635320579e069aa4fe5d5945d1968ef1..575b9f65c53587419bc338815ed98315f56d27fe 100644 --- a/PlayBot/sites/mixcloud.pm +++ b/PlayBot/sites/mixcloud.pm @@ -7,9 +7,17 @@ use LWP::UserAgent; use JSON; use Encode; + +sub regex +{ + return qr#(^|[^!])https?://www.mixcloud.com/([a-zA-Z0-9-_]+/[a-zA-Z0-9-_]+)#; +} + + sub get { - my ($url) = @_; - $url =~ s/www/api/; + shift; + my $id = shift; + my $url = 'https://api.mixcloud.com/'.$2; my $ua = LWP::UserAgent->new( timeout => 30, diff --git a/PlayBot/sites/soundcloud.pm b/PlayBot/sites/soundcloud.pm index 8d2e831cc53d13df5a3d2d76962cc07be509bf7b..7224e4b121d9389dab085ef134b6f3fee3074a32 100644 --- a/PlayBot/sites/soundcloud.pm +++ b/PlayBot/sites/soundcloud.pm @@ -11,8 +11,16 @@ my $root = 'http://api.soundcloud.com'; my $clientId = 'f4956716fe1a9dc9c3725af822963365'; +sub regex +{ + return qr#(?:^|[^!])https?://(?:www\.)?soundcloud.com/([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+)(?:\?.+)?#; +} + + sub get { - my ($url) = @_; + shift; + my $id = shift; + my $url = 'https://www.soundcloud.com/'.$id; my $ua = LWP::UserAgent->new( timeout => 30, @@ -24,9 +32,10 @@ sub get { my $content = decode_json($response->decoded_content); my $infos = { - title => $content->{'title'}, author => $content->{'user'}->{'username'}, duration => $content->{'duration'} / 1000, + site => 'soundcloud', + title => $content->{'title'}, url => $url, }; diff --git a/PlayBot/sites/youtube.pm b/PlayBot/sites/youtube.pm index 16ed31ef907591260e8c50623c92004abf25a20b..20e0aae2c84a5cf835546cfb145bce158f535f1b 100644 --- a/PlayBot/sites/youtube.pm +++ b/PlayBot/sites/youtube.pm @@ -18,7 +18,14 @@ BEGIN { $conf = decode_json($json); } + +sub regex +{ + return qr#(?:^|[^!])https?://(?:www.youtube.com/watch\?[a-zA-Z0-9_=&-]*v=|youtu.be/)([a-zA-Z0-9_-]+)#; +} + sub get { + shift; my $id = shift; my $ua = LWP::UserAgent->new( @@ -51,6 +58,8 @@ sub get { $infos{'duration'} = $h*3600 + $m*60 + $s - 1; $infos{'author'} = $video->{'snippet'}->{'channelTitle'}; + $infos{'site'} = 'youtube'; + $infos{'url'} = 'https://www.youtube.com/watch?v='.$id; return %infos; } diff --git a/PlayBot/sites/zippy.pm b/PlayBot/sites/zippy.pm index 359765cc16843b17a7a97a0cccbe56bf446483bb..9cc13927241447582f15a0d7b538b38cc97eecb6 100644 --- a/PlayBot/sites/zippy.pm +++ b/PlayBot/sites/zippy.pm @@ -12,8 +12,15 @@ my $inAuthor = 0; my %infos; +sub regex +{ + return qr#((^|[^!])http://www[0-9]+.zippyshare.com/v/[0-9]+/file.html)#; +} + + sub get { - my ($url) = @_; + shift; + my $url = shift; my $ua = LWP::UserAgent->new( agent => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1", @@ -37,6 +44,7 @@ sub get { $infos{'url'} = $url; $infos{'author'} = undef; + $infos{'site'} = 'zippyshare'; return %infos; }