скрипты для копирования музыки на mp3 плеер
Создано: 17-08-2011 22:40:25 изменено: 29-06-2012 06:25:35  Метки: tcl audio
Я не очень люблю слушать музыку альбомами песню за песней - утомляем быстро и надоедает. А тут приобрел плеер самый простой из-за вечной экономии - Digma Mp600, а он не умеет shuffle. Да и в машину FM-трансмиттер купил с той-же проблемой (правда надо сказать что там можно с пульта случайную композицию включать, но это же не безопасно на дороге - особенно если ездишь один). Вот и написал в свободные полчаса пару скриптов:

Это для создания и обновления базы с музыкой 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
1197 просмотров комментировать