免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1887 | 回复: 0
打印 上一主题 下一主题

完善:Yahoo音乐排行榜,自动纠错下载600首*.mp3或*.wma(>2MB)脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-01 17:22 |只看该作者 |倒序浏览
今天花了点时间将这个自动下载音乐的脚本最后完善了一下。

#完善后的功能:
1.自动获取由Yahoo HOT 600 Music提供的所有相关音乐链接地址
2.自动获取音乐名,格式,文件大小
3.自动按文件大小19MB-2MB的创建有效的地址链接表,并依照文件大小由高至底排序地址
4.自动从最大文件地址处开始下载
5.下载后文件自动检查,删除<2MB的错误文件。
6.自动纠错(若文件下载错误或小于<2MB)重新下载该音乐文件,尝试链接所有有效地址。

#确保下载音乐>2MB,同时下载的音乐文件有效,希望大家会喜欢。

------------------------------------------------------
#!/bin/bash
#License: GPLv2

#Welcome~!
cat << EOF
###########################################################
#                                                         #
#          Auto-download mp3 music script v1.0            #
#           Music from YAHOO MP3_新歌TOP600               #
#             http://music.cn.yahoo.com                   #
#              Save files:/mp3download/                   #
#           Temporary files:/tmp/tmp_dlmp3/               #
#                                                         #
###########################################################
EOF

#需要安装编码转换器
#sudo apt-get install recode
i=1


#mp3的地址
MP3SOURCE="http://music.cn.yahoo.com/mp3list_top.php?pid=ysearch&sub1=%B8%E8%C7%FA&sub2=%C8%C8%CB%D1%B8%E8%C7%FA&origin=onesearch&source=ysmt_lbuzz_r"

#保存mp3的目录
SAVE="/mp3download"

#下载重试次数
TRYCOUNT=2
#重复链接时间
TIMEOUT=8

#临时目录
TMP="/tmp/tmp_dlmp3"

#下载地址编号
DOWNNUM=1
#文件大小编号
SIZENUM="$DOWNNUM"

#创建下载目录
if [ ! -d "$SAVE" ];then
mkdir "$SAVE"
fi

#创临时下载目录
if [ ! -d "$TMP" ];then
mkdir "$TMP"
fi

echo "---------------开始下载YAHOO最热600首歌曲列表------------------------"
wget -q -O ${TMP}/yahoo.html $MP3SOURCE | 1>/dev/null
echo
echo "---------------下载YAHOO最热600首歌曲列表完成------------------------"
#转换网页编码
iconv -f gbk -t utf8 ${TMP}/yahoo.html | grep -i '<td class="z_h2".*href' >${TMP}/mp3page.html

#过滤空行和行首空格
#sed -e '/^$/d' ${TMP}/mp3page.html |\
#sed -e 's/  +//g' |\
#获取音乐URLlist
sed -e 's/"//g' ${TMP}/mp3page.html |\
sed -e 's/<\/span><\/a>//g' |\
sed -e 's/target=.*class=p20>//g' |\
sed -e 's/<td class.*href=//g' >${TMP}/mp3list.txt

echo "--------------------本地下载列表转换完成---------------------------"
#获得要下载歌曲的总数
line=`awk 'END {print NR}' ${TMP}/mp3list.txt`
while [ "$i" -le "$line" ]  ;do
mp3access=`awk 'NR=='"$i"'{print $0}' ${TMP}/mp3list.txt`
url=`echo "$mp3access" | cut -d" " -f1`
name=`echo "$mp3access" | cut -d" " -f2`
#echo $url
#echo $name
#break

#检查是否已经下载过这首歌,如果下载过,放弃
if [ -e "${SAVE}/${name}.mp3" ] || [ -e "${SAVE}/${name}.wma" ]; then
echo -e "\e[1;6m\e[1;31m发现 ${name} 下载过,忽略,继续下一首。\e[1;6m\e[00m"
((i++))
DOWNNUM=1
continue;
fi

#链接下载列表
echo
echo "链接到下载页面url"
echo
wget -q -O ${TMP}/mp3down.html $url
echo
echo "--------------------获得 $name 下载页面--------------------------"
#获得文件链接地址数目
sed 's/"//g' ${TMP}/mp3down.html |\
sed 's/  +//g' |\
egrep -i '<td class=m_song.*</td>' |\
sed 's/^.*href=//g' |\
sed 's/ onclick.*<\/td>$//g' >${TMP}/mp3down.txt
numdown=`awk 'BEGIN {
COUNT=0
}
$1~/http:\/\/.*/ {
COUNT++
}
END {
if(COUNT==NR)
print COUNT
else
print 0
}' ${TMP}/mp3down.txt`
if (("$numdown"<=0)) ;then
echo -e "\e[1;6m\e[1;31m ${name}未获取有效链接,忽略,继续下一首。\e[1;6m\e[00m"
break
fi
echo -e "\n歌曲name,共获得$numdown个有效链接地址。"

#获得下载文件大小和格式
iconv -t utf8 -c ${TMP}/mp3down.html |\
sed -e 's/"//g' |\
sed -e 's/   *//g' |\
grep -i '<td>.*<\/td>' |\
sed -e 's/^.*<td>//g' |\
sed -e 's/<\/td>$//g' |\
egrep '^([wm][mp][a3])|(.*M)$' >${TMP}/mp3size.txt

#重新构建mp3resize.txt文件
cat ${TMP}/mp3size.txt | awk 'BEGIN {
FS="\n"
RS=""
}
{
for(i=1;i<NF;i+=2)
print $i,$(i+1)
}'  >${TMP}/mp3resize.txt

#为下载歌曲重新构建链接表
paste -d" " ${TMP}/mp3down.txt ${TMP}/mp3resize.txt  >${TMP}/mp3_down.txt
sort -nr -k 3 ${TMP}/mp3_down.txt | egrep -i '\<1?[2-9]\..*M\>' >${TMP}/mp3data.txt

#选择文件SIZE>=2MBytes的链接地址,并获取文件格式和大小
SUMNUM=`awk 'END {print NR}' ${TMP}/mp3data.txt`
echo -e "\n歌曲name,选取$SUMNUM个,文件大小>2MB的有效链接地址。"
while (($DOWNNUM<=$SUMNUM))  ;do
format=`awk 'NR==ARGV[2] {print $2}' "${TMP}/mp3data.txt"  ${DOWNNUM}  2>/dev/null`
size=`awk 'NR==ARGV[2] {print $3}' "${TMP}/mp3data.txt"  ${SIZENUM}  2>/dev/null`
intsize=`echo $size |\
awk '{
gsub(/M/,"",$0)
print int($0)}'`
#intsize=`echo $size | sed 's/\..*M//g'`
if [ "$format"=="wma" ] || [ "$format"=="mp3" ] ;then
if (("$intsize">=2)) ;then
echo -e "\n获得音乐格式:$format"
echo -e "\n获得文件大小: $size"
else
((DOWNNUM++))
continue
fi
else
((DOWNNUM++))
continue
fi

#开始下载音乐
echo
echo "-----------------获得下载链接,开始音乐下载-------------------------"
echo
link=`awk 'NR==ARGV[2] {print $1}' "${TMP}/mp3data.txt" "$DOWNNUM" 2>/dev/null`
wget -q -O ${TMP}/downpage.html ${link}
iconv -f gbk -t utf8 ${TMP}/downpage.html |\
egrep -i '</b><a href=.*blank>' |\
sed 's/"//g' |\
sed 's/target=.*>//g'  |\
sed 's/<b>.*href=//g' >${TMP}/downpage.txt
downpath=`awk 'NR==1 {print $1}' ${TMP}/downpage.txt`
wget -c -t "$TRYCOUNT" -T "$TIMEOUT" -O "${SAVE}/${name}.${format}" $downpath
#判断下载后文件大小
zerosize=`du -m ${SAVE}/${name}.${format} | awk '$1~/[0-9]+/ {print $1}'`
if (($zerosize<2)) ;then
echo -e "\e[1;6m\e[1;31m 检查下载歌曲:${name},文件小于2M,删除,链接下一个地址。\e[1;6m\e[00m"
sudo rm -f ${SAVE}/${name}.${format}
((DOWNNUM++))
else
echo "--------------------下载成功,开始新下载---------------------------"
break
fi
done

#判断所有地址的文件SIZE是否<2MBytes
if (("$DOWNNUM">"$SUMNUM") ;then
echo -e "\e[1;6m\e[1;31m 歌曲:${name},所有链接文件大小均<2M,忽略,继续下一首。\e[1;6m\e[00m"
fi
DOWNNUM=1
((i++))
done

#删除网页临时文件
rm -f ${TMP}/*.txt ${TMP}/*.html
echo "------------------------下载链接结束-------------------------------"
exit 0

[ 本帖最后由 linuxleio 于 2009-6-1 17:32 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP