Это для создания и обновления базы с музыкой updatemuzbase.tcl:
#! /usr/bin/tclsh # откуда по умолчанию берем музыку set from /mnt/dva/music # где у нас база музыки set dbase ~/muzic.db # вынужденная глобальная переменная для рекурсивного glob set ::dirs "" ############# рекурсивный glob для создания списка директорий ############### proc globdir {{name .}} { lappend ::dirs $name foreach subdir [glob -nocomplain -directory $name -type d *] { globdir $subdir } } # если есть аргументы, берем музыку оттуда if {$argc > 0} {set from $argv} package require sqlite3 sqlite3 db $dbase # если таблица не существует, создаем id-номер, name-имя файла, use-копировался уже на флэшку или нет if ![db exists "select name from sqlite_master where type='table' and tbl_name='muz';"] { db eval "CREATE TABLE muz (id integer primary key, name text, use integer);" } # мой костыль для подмонтирования NAS с музыкой exec sudo mount -t cifs //192.168.0.2/public /mnt -o users,iocharset=utf8,username=guest,password= puts "Стираем ссылки на несуществующие файлы......" db eval "select * from muz;" { if ![file exists $name] { puts $name db eval "delete from muz where id='$id';" } } puts "Заносим в базу новые файлы......." globdir $from foreach d $::dirs { foreach f [glob -nocomplain -directory $d -type f *.{mp,MP,Mp}3] { regsub -all {'} $f {''} f #' if ![db exists "select id from muz where name='$f';"] { puts $f db eval "insert into muz values (NULL, '$f' ,0);" } } } # отмонтируем NAS exec sudo umount /mnt
А это для копирования на флэшку в случайном порядке randommuz.tcl:
#! /usr/bin/tclsh # база с музыкой set dbase ~/muzic.db # куда копируем по умолчанию set path /media/Transcend # меняем путь при наличии аргументов if {$argc > 0} {set path $argv} puts $path # мой костыль для NAS exec sudo mount -t cifs //192.168.0.2/public /mnt -o users,iocharset=utf8,username=guest,password= package require sqlite3 sqlite3 db $dbase # начальный номер композиции, они берутся в случайном порядке для тупых китайских плейеров не умеющих shuffle set num 1000 # для того чтоб выходило когда кончится место на флэшке catch { while [db exists "select id from muz where use='0';"] { db eval "select id,name from muz where use='0' order by random() limit 1;" { file copy $name ${path}/${num}.mp3 puts "$num $name" # помечаем что копировали для того чтоб избегнуть повторов db eval "update muz set use='1' where id='$id';" incr num } } } # отмонтируем NAS exec sudo umount /mnt