Дополнение недостающей информации в тегах mp3

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Дополнение недостающей информации в тегах mp3

Сообщение SLEDopit »

Если есть mp3 файл (для простоты пока не рассматриваем ситуацию с наличием других форматов).
Теги с информацией могут быть заполнены полностью, частично, либо не заполнены вообще.
Так же предполагаем, что название файла, чаще всего, отражает название песни и исполнителя, однако названия не унифицированы. Варианты с именами типа 1.mp3 с пустыми тегами будем считать безнадежными.
Есть ли какие либо средства для получения недостающей в тегах информации (хотя бы по основным параметрам: название композиции - имя исполнителя - название альбома - год выпуска альбома)?
В идеале еще получение текста песни, в абсолютном идеале еще и какого то описания композиции. Хотя эти два пункта необязательны.

Если нету - то какими средствами это лучше реализовывать? (в голове рисуются только некие наброски на баш скрипт)

Задача - перелопатить кучу файлов, с приведением файлов к некому унифицированному виду.
Поэтому хотелось бы автоматизировать процесс.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1104
ОС: ArchLinux

Re: Дополнение недостающей информации в тегах mp3

Сообщение Black »

Здравая мысль. Надо будет тоже покумекать. Пока накопал cddb_query (libcddb). Скрипт для заполнения тегов у меня есть (я его уже где-то тут выкладывал). Правда он для zsh, на bash скорее всего работать не будет. Осталось только разобраться с этим cddb_query и прикрутить его туда.
Сам скрипт вот:

PS: для mp3 нужен media-libs/mutagen, для ogg - media-sound/vorbis-tools, для flac - media-libs/flac.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1104
ОС: ArchLinux

Re: Дополнение недостающей информации в тегах mp3

Сообщение Black »

Накопал вот что:
1. Похоже, искать cddb_query не умеет. Пример из хелпа:

Shell

%> cddb_query search Mezzanine error: server error libcddb: error: server error

Со всеми серверами то же самое. Пишут по этому поводу вот что:
(http://libcddb.sourceforge.net/) писал(а):2006-10-15
IMPORTANT NOTE: Apparently the libcddb text search function is no longer working. It seems that the new FreeDB.org owners have not (yet) implemented a search page. Libcddb used the old search page for this feature, and parses the HTML response page. Until a new search page is available, libcddb search will return a server error if you try to perform a text search.

Так что поиск, похоже, не выйдет. Есть ещё cddb-tool из abcde, но он такого совсем не может. Надо либо стряпать что-то из curl, wget, grep, sed и cut, либо искать готовую утилитку, которая это умеет.

2. Можно по времени треков посчитать disk id, потом скормить его cddb_query:

Shell

%> lengths=$(midentify *.flac | grep '^ID_LENGTH' | cut -d = -f 2) %> num=$(ls -1 *.flac | wc -l) %> length=0; for i in ${=lengths}; do let length=$length+$i; done %> cddb_query query -t $(echo $length $num ${=lengths}) Number of matches: 4 Match 1 category: misc (3) 6b080108 'Octopus' by Gentle Giant Match 2 category: rock (4) 5d080808 'Octopus' by Gentle Giant Match 3 category: rock (4) 55081208 'Octopus' by Gentle Giant Match 4 category: rock (4) 57081308 'Octopus' by Gentle Giant %> cddb_query read rock 57081308 Artist: Gentle Giant Title: Octopus Ext.data: YEAR: 1973 Genre: Progressive Rock Year: 1973 Length: 34:29 (2069 seconds) 8 tracks [01] 'The Advent Of Panurge' by Gentle Giant (4:44) [02] 'Raconteur, Troubadour' by Gentle Giant (4:05) [03] 'A Cry For Everyone' by Gentle Giant (4:08) [04] 'Knots' by Gentle Giant (4:12) [05] 'The Boys In The Band' by Gentle Giant (4:36) [06] 'Dog's Life' by Gentle Giant (3:13) [07] 'Think Of Me With Kindness' by Gentle Giant (3:33) [08] 'River' by Gentle Giant (5:53) %> echo $length $num ${=lengths} 2055.0000000000 8 285.00 243.00 246.00 251.00 274.00 193.00 211.00 352.00

Тут есть одна тонкость: с отдельными треками этот фокус не пройдёт.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Дополнение недостающей информации в тегах mp3

Сообщение SLEDopit »

Спасибо за весьма интересную информацию. Попробую тоже покопать в этом направлении.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1104
ОС: ArchLinux

Re: Дополнение недостающей информации в тегах mp3

Сообщение Black »

Чего-то я сегодня туплю.

me@zsh

%> echo $TRACKS Intro Trбveller System Odda Бigi Muittut Virtual Бigбi So Fine 2000 Hard And Positive Ii Dohko Guvluige Ballad (To The Glory Of Your Nature) Jдnkhд Come On Come On Stay Positive Messengers (The Time Has Come) Sбmi Eatnan

Как из этого засунуть каждую строку в отдельную переменную? А лучше - в отдельный элемент массива? Пробовал делать так:

Shell

%> TRACKS=( $(cddb_read ... | grep ... | cut ...) ) %> echo $TRACKS[3] System

Т.е. разделяет по словам. zsh вроде умел разделять элементы по \n, но как - забыл...
PS: Имена файлов с пробелами в массивах обрабатываются нормально.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1104
ОС: ArchLinux

Re: Дополнение недостающей информации в тегах mp3

Сообщение Black »

Разобрался. Там, похоже, cddb_query выдаёт информацию в досовском (или ещё каком-то) формате. Пришлось городить конструкцию

Shell

echo $(cddb_query read ... | grep ... | cut ...) | while read t; do TRACK+=( $t ); done

Потом прикручу это всё к первому скрипту (filltag). Промежуточный вариант вот:

Код:

#!/bin/zsh FILES=($*) LENGTHS=$(midentify $FILES | grep '^ID_LENGTH' | cut -d = -f 2) NUM=$( (for f in $FILES; do echo $f; done) | wc -l) LENGTH=0 for l in ${=LENGTHS} do let LENGTH=$LENGTH+$l done QUERY=( $(cddb_query query -t $(echo $LENGTH $NUM ${=LENGTHS}) | grep 'category:' | head -n 1 | awk '{print $2" "$4}') ) QGENRE=$QUERY[1] DISK_ID=$QUERY[2] echo Genre: $QGENRE echo Disk ID: $DISK_ID CDDBINFO=$(cddb_query read $QGENRE $DISK_ID) ARTIST=$(echo $CDDBINFO | grep '^Artist' | sed 's/^Artist: *//') ALBUM=$(echo $CDDBINFO | grep '^Title' | sed 's/^Title: *//') GENRE=$(echo $CDDBINFO | grep '^Genre' | sed 's/^Genre: *//') YEAR=$(echo $CDDBINFO | grep '^Year' | sed 's/^Year: *//') TOTNUM=$(echo $CDDBINFO | grep '^[0-9]* tracks' | awk '{print $1}') TRACKS=$(echo $CDDBINFO | grep '^ \[[0-9]*\].*' | cut -d "'" -f 2) echo $TRACKS | while read t; do TRACK+=( $t ); done for file in $FILES; do filltag -a "$ARTIST" "$file"; done for file in $FILES; do filltag -b "$ALBUM" "$file"; done for file in $FILES; do filltag -g "$GENRE" "$file"; done for file in $FILES; do filltag -y "$YEAR" "$file"; done for i in $(seq 1 $TOTNUM); do filltag -t "$(eval $(printf 'echo $TRACK[%d]' $i))" -n $i -N $TOTNUM -r "$(eval $(printf 'echo $FILES[%d]' $i))" done


Скрипт filltag должен лежать в каталоге, перечисленном в $PATH, и называться filltag (без .sh).
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали: