Если есть mp3 файл (для простоты пока не рассматриваем ситуацию с наличием других форматов).
Теги с информацией могут быть заполнены полностью, частично, либо не заполнены вообще.
Так же предполагаем, что название файла, чаще всего, отражает название песни и исполнителя, однако названия не унифицированы. Варианты с именами типа 1.mp3 с пустыми тегами будем считать безнадежными.
Есть ли какие либо средства для получения недостающей в тегах информации (хотя бы по основным параметрам: название композиции - имя исполнителя - название альбома - год выпуска альбома)?
В идеале еще получение текста песни, в абсолютном идеале еще и какого то описания композиции. Хотя эти два пункта необязательны.
Если нету - то какими средствами это лучше реализовывать? (в голове рисуются только некие наброски на баш скрипт)
Задача - перелопатить кучу файлов, с приведением файлов к некому унифицированному виду.
Поэтому хотелось бы автоматизировать процесс.
Дополнение недостающей информации в тегах mp3
Модераторы: /dev/random, Модераторы разделов
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Дополнение недостающей информации в тегах 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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
- Сообщения: 1104
- ОС: ArchLinux
Re: Дополнение недостающей информации в тегах mp3
Здравая мысль. Надо будет тоже покумекать. Пока накопал cddb_query (libcddb). Скрипт для заполнения тегов у меня есть (я его уже где-то тут выкладывал). Правда он для zsh, на bash скорее всего работать не будет. Осталось только разобраться с этим cddb_query и прикрутить его туда.
Сам скрипт вот:
PS: для mp3 нужен media-libs/mutagen, для ogg - media-sound/vorbis-tools, для flac - media-libs/flac.
Сам скрипт вот:
PS: для mp3 нужен media-libs/mutagen, для ogg - media-sound/vorbis-tools, для flac - media-libs/flac.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
-
- Сообщения: 1104
- ОС: ArchLinux
Re: Дополнение недостающей информации в тегах mp3
Накопал вот что:
1. Похоже, искать cddb_query не умеет. Пример из хелпа:
Со всеми серверами то же самое. Пишут по этому поводу вот что:
Так что поиск, похоже, не выйдет. Есть ещё cddb-tool из abcde, но он такого совсем не может. Надо либо стряпать что-то из curl, wget, grep, sed и cut, либо искать готовую утилитку, которая это умеет.
2. Можно по времени треков посчитать disk id, потом скормить его cddb_query:
Тут есть одна тонкость: с отдельными треками этот фокус не пройдёт.
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
Тут есть одна тонкость: с отдельными треками этот фокус не пройдёт.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Дополнение недостающей информации в тегах 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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
- Сообщения: 1104
- ОС: ArchLinux
Re: Дополнение недостающей информации в тегах mp3
Чего-то я сегодня туплю.
Как из этого засунуть каждую строку в отдельную переменную? А лучше - в отдельный элемент массива? Пробовал делать так:
Т.е. разделяет по словам. zsh вроде умел разделять элементы по \n, но как - забыл...
PS: Имена файлов с пробелами в массивах обрабатываются нормально.
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: Имена файлов с пробелами в массивах обрабатываются нормально.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
-
- Сообщения: 1104
- ОС: ArchLinux
Re: Дополнение недостающей информации в тегах mp3
Разобрался. Там, похоже, cddb_query выдаёт информацию в досовском (или ещё каком-то) формате. Пришлось городить конструкцию
Потом прикручу это всё к первому скрипту (filltag). Промежуточный вариант вот:
Скрипт filltag должен лежать в каталоге, перечисленном в $PATH, и называться filltag (без .sh).
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).
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало