#!/bin/bash

onSIGINT()
{ # создаем функцию которая будет завершать вечный цикл
    echo "SIGINT received, bye bye!"
    exit 0
}
trap 'onSIGINT' INT # трап, вызывающий эту функцию на SIGINT

regexType="posix-egrep" # переменная указывающая на то, какие регулярные выражения будет использовать утилита find
regex=".*\.(avi)$" # сам шаблон регулярного выражения
depth="u" # глубина поиска. u [unlimited] - не ограничена, может быть числом

if [[ $# -eq 0 ]]; then # проверка. Если не получили аргументов, то выводим хелп и выходим
    echo "Usage: $0 [-d DEPTH] DIR1 [DIR2 [DIR3 [...]]]"
    exit 0
fi

index=0
for i in `seq 1 $#`; do # цикл обработки аргументов командной строки
    arg=${!i}
    if [[ $bNextDepth -eq 1 ]]; then
        bNextDepth=0
        if [[ $arg =~ ^[0-9]+$ ]]; then # по сути проверка - число ли depth или нет
            depth=$arg
            continue
        else
            echo "Missing value for -d."  # ошибка. Юзер написал -d но не написал значение для него
            exit 1
        fi
    fi
    if [ "$arg" = "-d" ]; then
        bNextDepth=1
        if [[ $# -eq $i ]]; then
            echo "Missing value for -d."
            exit 1
        fi
        continue
    fi
    if [ ! -d "$arg" ]; then # проверяем, действительно ли нам подали директорию?
        echo "Directory $arg does not exists."
    else
        dirList[$index]=$arg # сохраняем ее в массив
        let "index++"
    fi
done # конец обработки аргументов командной строки

if [[ ${#dirList[@]} -eq 0 ]]; then # если юзер глупый и не ввел не одну правильную директорию выходим, сообщая ошибку
    echo "No one correct directory has been found."
    exit 2
fi

index=0
if [ "$depth" != "u" ]; then # если у нас в depth число
    depthArg="-maxdepth $depth"
fi

while read line
do
    filesArray[$index]="$line"
    let "index++"
done < <(find "${dirList[@]}" $depthArg -regextype "$regexType" -iregex "$regex" -type f) # когда я впервые увидел эту строку в одном примере, желание писать скрипты на баше у меня почти отпало. Спасибо людям на канале #gentoo-ru которые мне объяснили ее смысл. А про find я расскажу ниже.

filesNum=${#filesArray[@]}
echo "Found $filesNum files."

let "filesNum--" # уменьшаем на 1. Потому что for в баше (в отличии от Си) выберет последний элемент тоже.
while [ true ]; do
    for i in `seq 0 "$filesNum"`; do # цикл который перемешает массив
        let "rndPos = RANDOM % $filesNum"
        temp="${filesArray[$i]}" # в этих 3 строках меняем местами элементы
        filesArray[$i]="${filesArray[$rndPos]}"
        filesArray[$rndPos]="$temp"
    done
    for i in `seq 0 "$filesNum"`; do # собственно, цикл запускающий нашу программу с нужным аргументом
           /usr/bin/mplayer -fs "${filesArray[$i]}"
    if [ "$i" = "4" ]; then #этим мы ограничим воспроизведение списка 5-ю файлами
    exit 0
    fi
    done   
done

exit 0 # все
