Сортировка музыкальной библиотеки по BPM

274
Adrien MORIN

Я использую инструмент под названием bpm-tag, который принимает mp3-файл («myfile.mp3») в качестве входных данных и выводит «myfile.mp3: XX.XXX BPM». Я хотел бы запустить скрипт, который проходит через мою музыкальную библиотеку, вычисляет BPM каждой песни и перемещает ее в каталог в соответствии с его BPM (например, каталог «Slow» для <80 BPM и т. Д.). У меня есть смутное представление о том, как это сделать, но я не знаю, как проанализировать вывод bpm-tag, чтобы получить значение BPM.

Какие-либо предложения ?

1
SU - это не служба написания сценариев, но многие из нас готовы и могут помочь, если вы застряли в написании своего текста. Что у тебя до сих пор? Если вы хотите получить значение "BPM" для файла, может показаться, что вы можете запустить BPM = $ (bpm-tag myfile.mp3 | cut -f2 -d ""), который поместит BPM в переменную $ BPM. davidgo 6 лет назад 4
Я не знал о sed и cut, пока вы не упомянули их; благодарю вас. Я понял, как написать свой сценарий, должен ли я включить его в качестве ответа? Adrien MORIN 6 лет назад 2
Конечно, было бы полезно, если бы вы это сделали. знак равно Anaksunaman 6 лет назад 0

1 ответ на вопрос

2
Adrien MORIN

Вот что я сделал. Кажется, это сработало (но, к сожалению, bpm-tag не был достаточно точным для многих песен ...).

#!/bin/bash  cd /path/to/my/library  while IFS= read -r -d '' FILE; do BPM=$(bpm-tag -f -n "$FILE" 2>&1 | sed "s/.mp3:/%/" | cut -d'%' -f2 | sed "s/ BPM//" | sed "s/^ //" | cut -d'.' -f1)  #bpm-tag has its output in stderr, so I use 2>&1 to redirect it to stdout, then format it with sed and cut if [ "$BPM" -le 130 ] then cp "$FILE" /path/to/my/library/Slow/ elif [ "$BPM" -le 180 ] then cp "$FILE" /path/to/my/library/Medium/ else cp "$FILE" /path/to/my/library/Fast/ fi done < <(find . -type f -name '*.mp3' -print0) 

Здесь делают

while IFS= read -r -d '' FILE; do echo "$FILE" done < <(find . -type f -name '*.mp3' -print0) 

печатает все файлы (-type f), заканчивающиеся на .mp3 (-name '* .mp3'), которые находятся в папке или одной из ее подпапок. Насколько я понимаю, параметры -print0 и -r -d '' предназначены для форматирования, но я не совсем понимаю, как это работает.

Похожие вопросы