Как был сделан день КИШок

Как и было написано выше, писуар изначально задумывался для автоматизации вещания радивы, а вот скриптования пока нет. Врочем, скриптование изначально задумывалось, и более того, в него была заложена идея коллективного творчества.

Коллективное творчество можно сравнить в сосудом, куда каждый может вложить что-то от себя. Отсюда и раннее название этого проекта - pisspond. Такова жизнь.

Кратко: создаем директорию где будет запущен писуар и настраиваем туда испражнение треков любимым методом, хоть скриптами на любимом языке, хоть файловым менеджером, хоть скайпом и передачей файлов по нему. Вариантов много.

Но приступим к той опердени, которая была написана на день киша:

use Data::Dumper;

$urine = "z:/urine/"; # это директория, которую наполняем


# gen list / readdir
# shuffle
# every

# а это контент, которым будем наполнять
# тут у нас джинглы
# анимешность пополам с дискографией скриллекса
# модульная музыка, которую я хотел ставить по утрам
# голосовые нарезки, которые я посвятил кишу

@jingles = &shuffle(getRecursiveFiles("/jingles/"));
@anime = &shuffle(grep{/mp3$/i}getRecursiveFiles("tmp/Skrillex - Discography - 2007-2014"),getRecursiveFiles("Mitsudomoe [MP3]"));
@kish = &shuffle(grep{/mp3$/i}getRecursiveFiles("tmp/Король и Шут/"));
@mods = &shuffle(getRecursiveFiles("morning/"));
@voices = &shuffle(getRecursiveFiles("cutter/"));

# Формируем плейлист с весовыми коэфициентами
@playlist = every(\@mods, 1, \@jingles, 1, \@anime, 1);
@playlist = every(\@playlist, 3, \@voices, 1, \@kish, 1);

$count = 0;

foreach(@playlist) {
    print "$_\n";

    # Копируем файлы и ждем

    open(dd, $_);
    binmode(dd);
    s/.+\///s;
    open(oo, ">" . $urine . "/" . $_);
    $count++;
    binmode(oo);
    print oo =5) {
        sleep 5;
    }
}

sub every {
    my @pos = ();
    my @src = ();
    my @rate = ();
    my @weight = ();
    while(@_) {
        push(@src, shift);
        push(@weight, shift);
    }

    my @res = ();
    my $num = @src;
    my @finished = (1..$num);
    my $q, $min, $found;

    while(grep{$_>0}@finished) {
        $min = 0xFFFFFFFF;
        for($q = 0; $q < $num; $q++) {
            if($min > $rate[$q]) {
                $min = $rate[$q];
                $found=$q;
            }
        }
        $q=$found;
        print "found $q $pos[$q]\n";
        if($pos[$q] == @{$src[$q]}) {
            $pos[$q] = 0;
            $finished[$q] = 0;
        }
        $rate[$q] += $weight[$q];
        push(@res, $src[$q]->[$pos[$q]]);
        $pos[$q]++;
    }
    return(@res);
}

sub getSeq {
    my $pref = shift;
    my $nums = shift;
    return(map{$pref.$_}(1..$nums));
}

sub getRecursiveFiles {
    my $df;
    opendir($df, $_[0]);
    my @l = readdir($df);
    close($df);
    return(map{-d $_?getRecursiveFiles($_):$_}map{$_[0]."/".$_}grep{!/^\.{1,2}$/}@l);
}

sub shuffle {
    my @src=@_;
    my $q, $r;
    my $tmp;
    for($q=0; $q < @src; $q++) {
        $r = int(rand() * @src);
        $tmp = $src[$r];
    $src[$r] = $src[$q];
    $src[$q] = $tmp;
    }
    return(@src);
}