#!/usr/bin/perl -w

use strict;
use Getopt::Long;
use File::Spec;
use File::Basename;
use Cwd qw(realpath);

sub ploader {

    my $dir = shift;
    my $pattern = shift;
    my $type = shift;
    my @list;
    my $p;
    my $g;
    my @g = ();

    unshift(@INC, $dir);

    opendir(D, $dir) || return ();
    @list = grep {/$pattern/ && -f File::Spec->catfile($dir, $_) } readdir(D);
    closedir(D);

    foreach $p (@list) {
        $p =~ s/\.pm$//;
        eval qq{ require $p; };
        if ($@) {
            print("Failed to load plugin: $@");
            next;
        }

        $g = eval $p.q{->new();};
        if ($@) {
            print("Failed to instanciate: $@");
            delete($INC{$p});
            next;
        }

        if ($type eq $g->{'TYPE'}) {
            push(@g, $g);
        } else {
            printf('%s has wrong type (got %s, expected %s)', $p, $g->{'TYPE'}, $type);
            delete($INC{$p});
        }
    }

    return @g;
}

my $hq = 0;
my $ext = '.flv';
my $y;
my $f;
my $m;
my @g;
my $bp;

# This is some dark magic to find out our real base directory,
# where we hope to find our plugins.
$bp = File::Spec->catdir(dirname(realpath($0)), 'videosite');

@g = ploader($bp, '.*Grabber\.pm$', 'grabber');
($f) = ploader($bp, '^FileGetter\.pm$', 'getter');

unless(@g and defined($f)) {
    print("No plugins could be loaded\n");
    exit 1;
}

$f->setval('FILEPATTERN', './%3$s' . $ext);

foreach (@ARGV) {
    foreach $y (@g) {
        ($m, undef) = $y->get($_);
        if (defined($m)) {
            print("Downloading $m->{'TITLE'}\n");
            $f->get($m);
        }
    }
}
