炒个冷饭吧, baidu mp3下载, 带gui的shell脚本

sh/bash/dash/ksh/zsh等Shell脚本
回复
fengzishaoye
帖子: 15
注册时间: 2007-10-22 2:21

炒个冷饭吧, baidu mp3下载, 带gui的shell脚本

#1

帖子 fengzishaoye » 2008-10-30 16:31

最近找不到工作, 持续失业中, 非常的郁闷, 无聊之中, 写脚本自娱自乐...
没什么技术含量, 纯属学习和练习, 代码里做了详细的注释

代码: 全选

#!/bin/bash

MUSIC_DIR="~/Desktop"	#音乐下载到的目录

search_key() {
	keyword=`zenity --entry --title=百度MP3下载 --text=请输入歌名:`	#获取歌名

	if (($?==1)); then	#歌名为空就退出
		exit 0
	fi

	if [ `locale | grep "LANG=.*UTF-8"` ]; then	#检查输出的歌名编码, 并转换成url中的编码
	    key=`echo "$keyword" | iconv -c -f utf-8 -t gbk | \
		od -t x1 -A n | tr "\n" " " | tr " " % | sed 's/%%/%/g;s/%0a%$//'`
	else
	    key=`echo "$keyword" | \
		od -t x1 -A n | tr "\n" " " | tr " " % | sed 's/%%/%/g;s/%0a%$//'`
	fi

	#获取歌曲列表的那个网页
	wget "http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word="$key"&lm=-1" \
	    -O ./tmp_src1.htm -q

	#下面这段为什么不行呢, 谁能告诉我啊...
	#w3m -dump "./tmp_src1.htm" | grep -E -m 31 "歌曲名|^[0-9]" | \
	#	sed 's/试听//g' | sed 's/歌词/    /g' | sed 's/铃声/    /g' | \
	#	sed 's/\[d9\]//g' | sed 's/链接速//g' >> list.tmp
	#
	#opt=$(zenity --list --text "请选择你要下载的歌曲" --checklist --column "选择" --column "歌曲列表" \
	#	`i=0
	#	while read line; do
	#		echo -n "FALSE \"$line\""
	#	done < list.tmp` 
	#	--separator=":")
	#
	#echo $opt

	#去除无用的信息, 然后显示歌曲列表
	w3m -dump "./tmp_src1.htm" | grep -E -m 31 "歌曲名|^[0-9]" | \
	    sed 's/试听//g' | sed 's/歌词/    /g' | sed 's/铃声/    /g' | \
	    sed 's/\[d9\]//g' | sed 's/链接速//g' | \
	    zenity --title="歌曲列表" --text-info --width 530 --height 540 &
}

download_list() {
	songid=`zenity --entry --title=百度MP3下载 --text=请输入你要下载的歌曲序号:`

	if (($?==1)); then	#没有输入, 退出
		killall -q zenity
		exit 0
	fi

	tmp_src2=`cat "tmp_src1.htm" | \
	    LANG=C grep -A5 "<td class=tdn>"$songid"</td>" | \
	    LANG=C grep "class=d" | \ 
	    LANG=C sed 's/" title.*$//g' | \
	    sed 's/^.*href="//g'`
	#上面这段从grep那行开始, 每一行的作用分别是:
	#1.得到第$songid首歌附近的代码 2.得到有url的那行 3.去尾 4.去头

	#下载小页面	
	wget "$tmp_src2" -O ./tmp_src2.htm -q

	#从小页面的js中得到歌曲的加密地址
	codeurl=`cat ./tmp_src2.htm | LANG=C grep "function" | \
	    LANG=C sed 's/^.*I="//g' | LANG=C sed 's/",J=.*$//g'`

	#下面的部分是解密歌曲地址
	head=`echo $codeurl | cut -c1`   #取首字母

	thirdc=`echo $codeurl | cut -c4` #根据冒号的位置判断url类型(ftp还是http)
	forthc=`echo $codeurl | cut -c5`

	if [ "$thirdc" == ':' ]; then
	    key="fghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcde" #ftp
	elif [ "$forthc" == ':' ]; then
	    key="hijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg" #http
	else
	    key="Unknow Url" #这可以换成别的处理方法
	fi

	#根据首字母构造字符串
	urlQue=`echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" | \
	    sed "s/^\(.*\)${head}\(.*\)/${head}\2\1/g"` #把$codeurl首字母以前的字母都放在最后面

	#用tr转换
	realurl=`echo $codeurl | tr $urlQue $key`
	#解密歌曲地址部分结束

	#下载歌曲, 并用zenity显示进度
	wget -P $MUSIC_DIR "$realurl" 2>&1 | \
	    sed -u 's/.*\ \([0-9]\+%\)\ \+\([0-9.]\+\ [KMB\/s]\+\)$/\1\n# 下载中... \2/' | \
	    zenity --progress --title="下载歌曲"
}

#清理零时文件
clean() {
	rm -f ./tmp_src1.htm
	rm -f ./tmp_src2.htm
	killall -q zenity
}

#----------------------------------------main-------------------------------------------#
goonrun=0
while [ $goonrun = 0 ]; do
	clean
	search_key
	goonlist=0
	while [ $goonlist = 0 ]; do
		download_list
		zenity --question --text "要继续下载列表中的歌曲吗?"
		let goonlist=$?
	done 
	zenity --question --text "下载另一首歌吗?"
	let goonrun=$?
done 

clean
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本

#2

帖子 bones7456 » 2008-10-30 16:56

:em05
关注我的blog: ε==3
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本

#3

帖子 xiooli » 2008-10-30 17:30

恩,加上了地址解密,还带了个龟壳 :em05
ps:为啥不直接在列表那儿选择要下的歌曲呢?
rikhtdss
帖子: 115
注册时间: 2006-09-08 18:57
联系:

Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本

#4

帖子 rikhtdss » 2008-11-19 14:38

好强大的脚本啊!
头像
tianping
帖子: 278
注册时间: 2007-08-26 15:57

Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本

#5

帖子 tianping » 2008-11-19 19:33

rikhtdss 写了:好强大的脚本啊!
我的为什么下载不下来?提示下载了,但是并没有找到下载的文件。
fengzishaoye
帖子: 15
注册时间: 2007-10-22 2:21

Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本

#6

帖子 fengzishaoye » 2008-11-20 20:02

回xiooli: 我本来是想在列表那选择的, 但是试了好长时间都不行, 你看我注释的那一大段, 就是那个意思
回tianping: 我终于找到工作了, 最近比较忙, 所以没有再看过这个, 恩, 我的代码注释写得很详细的, 你可以找找问题出在哪
回复