Плэйлист определённой длины



Понадобилось мне однажды составить перемешанный список из выбранных песен, общая продолжительность которых не должна превышать заранее выбранное время.

Для решения задачи решил использовать bash и программу mp3info. Небольшой скрипт create_playlist создает в текущей директории файл newfile со списком песен. Полученный файл можно проиграть в mplayer с помощью ключа -playlist.

Скрипт очень прост и прекрасно выполняет нужную мне задачу. Принимает два аргумента, время и путь до директории со списком песен. Вот сам листинг кода:

#!/bin/bash
if [ "$#" -eq 2 ]; then
  if [ "$1" -gt 0 ]; then
    if [ -d "$2" ]
    then
      listing=$2
    elif [ "$2" = "" ]; then
      listing=`pwd`
    else
      echo "Нет такого каталога"
      exit 0;
    fi
    time="$1";
  else
    echo "Неправильное время"
    exit 0;
  fi
else
  echo "Нужны два параметра, время в секундах и путь до папки"
  exit 0;
fi
find "$listing" -maxdepth 1 -type f -iname "*.mp3" > /tmp/list
numstr=`cat /tmp/list | wc -l`
cat /tmp/list | awk '{print rand()"\t"$0}'|sort|awk -F'\t' '{print $2}' > /tmp/list2
numnow=1
duration=0
if [ -e "`pwd`/newfile" ]; then
  rm "`pwd`/newfile"
fi
while [ "$numnow" -le "$numstr" ]; do
  if [ "$duration" -gt "$time" ]; then
    numnow=$(( $numnow + 1 ));
  else
    headn=`head -n $numnow /tmp/list2|tail -n 1`
    duration_now=`mp3info -p "%S" "$headn"`
    if [ "$(( $duration_now + $duration ))" -gt "$time" ]; then
      numnow=$(( $numnow + 1 ));
    else
      echo "$headn">>"`pwd`/newfile"
      duration=$(( $duration_now + $duration ))
      numnow=$(( $numnow + 1 ));
    fi
  fi
done 
echo ""
echo "плэйлист \"`pwd`/newfile\" создан и случайно отсортирован"
echo "общая продолжительнось: $duration"
echo ""

Последняя версия доступна на github.