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