May 6, 2008

Ubuntu 中下载音乐的脚本 [zz]

From : http://hi.baidu.com/lucilu

在ubuntu 论坛看到一个下载音乐的脚本。转一下

--------------------8<-------------------------
#!/bin/bash
#检测一些必要的工具 和路径
if [ -d ~/Music ];then
echo "下载的音乐将会保存到 ~/Music 文件夹下"
else
echo "~/Music 文件夹不存在 脚本将会自动创建"
mkdir ~/Music
fi
if [ -s /usr/bin/axel ];then
echo "检测到你已经安装了axel 将会成为你默认的下载工具"
else
echo "你还没有安装axel 多线程下载工具,将会自动选择单线程工具wget下载。如果你的系统是ubuntu你可以执行:sudo apt-get install axel 下载并安装axel."
fi
if [ -s /usr/bin/mid3v2 ];then
echo "检测到mid3v2会把你音乐的tag都删除掉,预防出现乱码"
else
echo "你还没有安装mid3v2,这个工具 可以去掉音乐里面的tag(乱码的根源),如果你的系统是ubuntu你可以执行:sudo apt-get install python-mutagen下载并安装."
fi
if [ -e file ];then
rm file
fi
if [ -e file_1 ];then
rm file_1
fi
if [ -e size ];then
rm size
fi
if [ -e size_1 ];then
rm size_1
fi
#核心部分(提取连接 和把中文转换成url编码)
#把中文转换成16进制数字和字母不变
a=`echo "$1" | iconv -c -f utf-8 -t gb2312 | LANG=C sed 's/./&\n/g' | sed -n '$!l' |
while read str;do
str=${str%$}
if [ ${#str} -eq 3 ];then
printf "%%%X" "0${str}"
elif [ "X${str}" == "X" ];then
echo -n '%20'
else
echo -n $str
fi
done
echo`

wget "http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word="$a"&lm=-1" -O file #下载网页的源代码
iconv -c -f gb2312 -t utf8 file |grep -m 20 "M</td>"|awk -F">" '{print $2}'|awk -F"<" '{print $1} ' >size #找到下载音乐文件的对应后缀
iconv -c -f gb2312 -t utf8 file |grep -m 20 "<td class=d><a href="|awk -F"," '{print $2}'|awk -F"&" '{print $1}'>>size # 提取出20个有效的下载连接里的要转换成url编码的连接符
iconv -c -f gb2312 -t utf8 file |grep -m 20 "[wm][mp][a3]</td>"|awk -F">" '{print $2}'|awk -F"<" '{print $1}' >>size #找到下载文件的大小

awk '{a[NR]=$0}END{for(i=1;i<=NR/3;i++)printf "(%d)\t%s\t%s\t%s\n",i,a[i],a[i+NR/3],a[i+40]}' size >size_1 #
cat size_1

read -p "请选择你要下载第几首:" c
f=`cat size_1 | sed -n "${c}p" | awk '{print $NF}'` #提取你要下载的取文件后缀
b=`iconv -c -f gb2312 -t utf8 file |grep -m $c "<td class=d><a href=" | sed -n "${c}p" |awk -F"," '{print $2}'|awk -F"&" '{print $1}' ` #提取你要下载文件的第 2连接(有了这个这个连接就能找到下载源文件)
#把连接里的中文转换成url
c=`echo "$b" | iconv -c -f utf-8 -t gb2312 | LANG=C sed 's/./&\n/g' | sed -n '$!l' |
while read str;do
str=${str%$}
if [ ${#str} -eq 3 ];then
printf "%%%X" "0${str}"
elif [ "X${str}" == "X" ];then
echo -n '%20'
else
echo -n $str
fi
done
echo`
url_1=`iconv -c -f gb2312 -t utf8 file |grep -m 1 "<td class=d><a href="|awk -F"\"" '{print $2}'|awk -F"," 'BEGIN{OFS=","}{$2="'$c'&word=mp3"}NF'` #找到下载第1连接的源文件

wget "$url_1" -O file_1 #下载第1连接的源文件
iconv -c -f gb2312 -t utf8 file_1 |grep -m 1 "<a href"|awk -F"\"" '{print $2}' >url_2
#下载部分

h=`cat url_2`
if [ -s /usr/bin/axel ];then
axel -n 10 -o ~/Music/"$1.$f" "$h" #在这里你可以改变你的下载路径
else
wget -t 5 -c -i url_2 -O ~/Music/"$1.$f" #下载音乐
fi
if [ -s /usr/bin/mid3v2 ];then
mid3v2 -D ~/Music/"$1.$f"
fi
rm file file_1 url_2 size size_1

---------------------8<------------------------

把代码保存成url.sh
然后: $ sudo chmod u+x url.sh
运行: $ ./url.sh '搜索音乐名字' (引号是英文输入的引号)


默认的locale是utf8的。如果你的不是。自己改一下
$ locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

一些声音:
1 "mid3iconv -e GBK $1$f 可以消除tag乱码"

2 "axel加个-a参数,输出会好看的多 "

3 " read -p "请选择你要下载第几首:" c
f=`cat size_1 | sed -n "${c}p" | awk '{print $NF}'` #提取你要下载的取文件后缀

name=`cat size_1 | sed -n "${c}p" | awk '{print $4}'` #提取歌曲名
我觉得加上这句可能会好一些,很多时候我都不知道歌曲的全名 "

No comments:

Post a Comment

您的评论将使我blog更有动力~