From 0d9ac9502b66ae21be39ef0e37e6c9fe853c3712 Mon Sep 17 00:00:00 2001 From: Alexandre Morignot <erdnaxeli@cervoi.se> Date: Sun, 29 Nov 2015 15:42:37 +0100 Subject: [PATCH] plugin system --- PlayBot/sessions/irc.pm | 8 ++--- PlayBot/{sites/parser.pm => sites.pm} | 47 ++++++++------------------- PlayBot/sites/dailymotion.pm | 11 +++++++ PlayBot/sites/mixcloud.pm | 12 +++++-- PlayBot/sites/soundcloud.pm | 13 ++++++-- PlayBot/sites/youtube.pm | 9 +++++ PlayBot/sites/zippy.pm | 10 +++++- 7 files changed, 68 insertions(+), 42 deletions(-) rename PlayBot/{sites/parser.pm => sites.pm} (70%) diff --git a/PlayBot/sessions/irc.pm b/PlayBot/sessions/irc.pm index 5035739..dcadc25 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 f375982..db338a7 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 5a14fb8..2e9fdb0 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 0b9bdb3..575b9f6 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 8d2e831..7224e4b 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 16ed31e..20e0aae 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 359765c..9cc1392 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; } -- GitLab