求一段批量转换MP3文件id3和id3v2信息的脚本

sh/bash/dash/ksh/zsh等Shell脚本
回复
Xchange
帖子: 10
注册时间: 2006-02-26 16:17

求一段批量转换MP3文件id3和id3v2信息的脚本

#1

帖子 Xchange » 2006-02-27 19:23

现有MP3文件的id3和id3v2编码都为GB18030,能不能写一段脚本把它们都转换为UTF-8编码的?

有id3和id3v2两个软件包可以更改id3和id3v2信息。

万分感谢!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2006-02-27 20:01

man exif自己写就是了。
● 鸣学
rods
帖子: 181
注册时间: 2005-11-19 18:43

#3

帖子 rods » 2006-06-08 13:50

网上找到一个,不过下载不了,供参考

一直找不到合用的能正確處理utf-8的id3tag editor,最後索性自己閉門造車寫了一個。功能很簡單,就是編輯id3tag,而且只能產生id3v2.4、UTF-8的tag。我只在UTF-8的環境下測試過,不知道能不能在其他locale正常運作,我想是不行的。最簡單的執行方法:

代碼:
id3v2 filename.mp3


就可以顯示id3v2標籤,並可以選擇要不要更新。
加上-p參數可以分割檔名,由檔名切割出想要的id3標籤。

代碼:
id3v2 曲目#-歌手-歌名.mp3 -p %n-%a-%t.mp3


這樣可以由檔名切割出曲目、歌手、歌名,並寫入tag中。目前支援的有%n(曲目編號)、%a(歌手)、%t(歌名)、%b(專輯)。不過碰到用空格分開、又是有空格的歌名時(英文歌)會出問題。在-p模式之下,有時候檔名不見得能切出所有想要的資訊,例如上例中沒有專輯,可以用--set-album參數:

代碼:
id3v2 曲目#-歌手-歌名.mp3 -p %n-%a-%t.mp3 --set-album 專輯


這種參數有兩個,--set-album可以設定專輯、--set-singer可以設定歌手。

這個程式最主要的功能就是可以批次轉檔,因為沒有研究linux下的檔案處理,所以只能透過外部程式取得檔案列表,導入程式的標準輸入。加上--standard-input參數,程式就會從標準輸入讀取檔名,一個檔案一行。配合ls指令使用如下:

代碼:

ls -1 *.mp3 | id3v2 -p %n-%a-%t.mp3 --set-album 專輯 --standard-input


就會把目錄下所有的mp3檔案用「曲目#-歌手-歌名.mp3」的方式分解,並把專輯名稱設為「專輯」。

最後,如果擔心-p之後的pattern分析有錯,可以加--preview參數。在preview模式之下,會印出結果,但所有的修改都不會被寫入。

程式的寫法很暴力,不過最後還是達到我的目的,在xmms、rhythmbox、amarok還有我的mp3隨身聽都能正常顯示。在寫入tag的時候,程式會把整個mp3一次讀到記憶體中,所以對於太大的mp3檔案可能不太合適。

程式與原始碼:
http://beta.yousendit.com/transfer.php? ... A87D908F43
不积跬步,无以致千里

ArchLinux
rods
帖子: 181
注册时间: 2005-11-19 18:43

#4

帖子 rods » 2006-06-08 13:52

还有一个,改改应该可以
嗨,樓上的訪客兄,
小弟在 sid 下測試, zh-autoconvert 可以把 big5/gb 轉成 utf-8 哦.
它還可以 gb <=> big5 / big5 <=> utf-8 / gb <=> utf-8
用來把 gb/big5 轉成 utf-8 時,只須指定 -o utf8 即可
若要把簡體中文 gb 轉成繁體 utf-8, 也只要先轉 big5 再轉成 utf-8.
簡體 utf-8 也可以用這種方法轉成繁體 utf-8.

只可惜, 若 input 是 utf-8 時, 就沒辦法省略 -i

下面是小弟用 zh-autoconvert 及 id3v2 湊出來的轉換script
代碼:
#!/bin/sh
function conv
{
TARGETSONG="$1"
id3v2 -R "$TARGETSONG" >/tmp/id3conv.sh.tmp
ID3V1_TITLE=$(cat /tmp/id3conv.sh.tmp|head -4|tail -3|head -1|tail -1|cut -c10-41|autogb -o big5|autogb -o utf8|tr -s ' ' ' ')
ID3V1_ARTIST=$(cat /tmp/id3conv.sh.tmp|head -4|tail -3|head -1|tail -1|cut -c49- |autogb -o big5|autogb -o utf8|tr -s ' ' ' ')
ID3V1_ALBUM=$(cat /tmp/id3conv.sh.tmp|head -4|tail -3|head -2|tail -1|cut -c10-41|autogb -o big5|autogb -o utf8|tr -s ' ' ' ')
ID3V1_COMMENT=$(cat /tmp/id3conv.sh.tmp|head -4|tail -3|head -3|tail -1|cut -c10-41|autogb -o big5|autogb -o utf8|tr -s ' ' ' ')
ID3V2_TALB=$(cat /tmp/id3conv.sh.tmp|grep TALB|cut -c32-|autogb -o big5|autogb -o utf8)
ID3V2_TPE1=$(cat /tmp/id3conv.sh.tmp|grep TPE1|cut -c38-|autogb -o big5|autogb -o utf8)
ID3V2_TIT2=$(cat /tmp/id3conv.sh.tmp|grep TIT2|cut -c44-|autogb -o big5|autogb -o utf8)
ID3V2_TCON=$(cat /tmp/id3conv.sh.tmp|grep TCON|cut -c22-|cut -d " " -f1|autogb -o big5|autogb -o utf8)
ID3V2_COMM=$(cat /tmp/id3conv.sh.tmp|grep COMM|cut -c24-|autogb -o big5|autogb -o utf8)
ID3V1_TITLE=${ID3V1_TITLE##\ }
ID3V1_ARTIST=${ID3V1_ARTIST##\ }
ID3V1_ALBUM=${ID3V1_ALBUM##\ }
ID3V1_COMMENT=${ID3V1_COMMENT##\ }
ID3V2_TALB=${ID3V2_TALB##\ }
ID3V2_TPE1=${ID3V2_TPE1##\ }
ID3V2_TIT2=${ID3V2_TIT2##\ }
ID3V2_TCON=${ID3V2_TCON##\ }
ID3V2_COMM=${ID3V2_COMM##\ }
ID3V1_TITLE=${ID3V1_TITLE%\ }
ID3V1_ARTIST=${ID3V1_ARTIST%\ }
ID3V1_ALBUM=${ID3V1_ALBUM%\ }
ID3V1_COMMENT=${ID3V1_COMMENT%\ }
ID3V2_TALB=${ID3V2_TALB%\ }
ID3V2_TPE1=${ID3V2_TPE1%\ }
ID3V2_TIT2=${ID3V2_TIT2%\ }
ID3V2_TCON=${ID3V2_TCON%\ }
ID3V2_COMM=${ID3V2_COMM%\ }
id3v2 --artist "$ID3V1_ARTIST" --album "$ID3V1_ALBUM" --song "$ID3V1_TITLE" --comment "":"$ID3V1_COMMENT":"" $TARGETSONG
id3v2 --TPE1 "$ID3V2_TPE1" --TALB "$ID3V2_TALB" --TIT2 "$ID3V2_TIT2" --COMM "$ID3V2_COMM" --TCON "$ID3V2_TCON" $TARGETSONG
}
function shinfo
{
echo "Usage: $SHNAME file1|path1 [file2|path2]... "
}
declare -i NOMS=$#
SHNAME=$0
SHNAME=${SHNAME##*/}
if [ $NOMS -eq 0 ];then
shinfo
else
while [ $NOMS -gt 0 ];do
if [ -d "$1" ]; then
IFS=":"
for abc in $(find "$1" -name *.[Mm][Pp]3|tr -s "\n" ":") ;do
conv "$abc"
done
elif [ -f "$1" ]; then
conv "$1"
else
echo "$1 does not exist!"
fi
NOMS=$NOMS-1
shift
done
fi


寫得很沒效率,功能也很陽春,就只是把 id3v1/v2 讀出來, 一個個轉碼後再存回去.
但這個 script 只能吃 id3 為 gb/big5 編碼的 mp3
(小弟還想不到方法在 script 中自動判別utf-8/big-5.
所以,若餵一個id3用 utf-8 編碼的 mp3, 它沒辦法判別, 會轉成亂碼.
請哪位大大出面指導一下小弟吧 ^_^ )
不积跬步,无以致千里

ArchLinux
头像
内存不足
论坛版主
帖子: 3277
注册时间: 2005-08-18 18:43
联系:

#5

帖子 内存不足 » 2006-08-30 11:05

下载连接要注册的吗?

這兩天都在找转换ID3 tag的小工具
໌→ iCookie Gtk Theme
໌→DropPlusBluetheme
กรัก กรัก`菠萝
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#6

帖子 bones7456 » 2006-10-11 22:13

eexpress 写了:man exif自己写就是了。
exif好像是编辑jpg图像文件的啊!
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

#7

帖子 oneleaf » 2006-10-12 8:57

回复