#!/bin/bash
#Copyright (c) 2005 ubuntu.org.cn
#License: GPLv2
#需要安裝編碼轉換器
#sudo apt-get install recode
#mp3的地址
SOURCE="http://list.mp3.baidu.com/list/newhits.html"
#保存mp3的目錄
SAVE="${HOME}/mp3100"
#下載重試次數
TRYCOUNT=2
#臨時目錄
TMP="/tmp/${USER}"
#創建下載目錄
if [ ! -d "${SAVE}" ];then
? ? mkdir -p "${SAVE}"
fi
#創建臨時下載目錄
if [ ! -d "${TMP}" ];then
? ? mkdir -p "${TMP}"
fi
echo "開始下載百度最新100首歌曲列表"
wget -O ${TMP}/mp3.html ${SOURCE}
echo "下載百度最新100首歌曲列表完成。"
#轉換網頁編碼
iconv -f gbk -t utf8 ${TMP}/mp3.html |\
grep "<a href=\"http://mp3.baidu.com/m" |\
#將mp3list.txt所有開頭的空格去掉
sed -e 's/ *//' |\
#將mp3list.txt所有全角空格去掉
sed -e 's/ //g' |\
#將所有的回車符去掉
sed ':a;N;$!ba;s/\n/,/g' |\
#在td>,后面加上回車符,一行表示一個mp3文件。
sed -e 's/,<td/\n<td/g' |\
sed -e 's/td>,/td>\n/g' |\
#刪除<td width="30%"> <td> </td> <td...FFFFFF"> <p> </p>
sed -e 's/<td width="30%">//g' |\
sed -e 's/<td>//g' |\
sed -e 's/<\/td>//g' |\
sed -e 's/<p>//g' |\
sed -e 's/<\/p>//g' |\
sed -e 's/<td.*FFFFFF">//g' |\
#刪除</a>..."_blank">
sed -e 's/<\/a>.*_blank">/-/g' |\
sed -e 's/<\/a>.*_blank>/-/g' |\
#刪除&
sed -e 's/\&\;/\//g' >${TMP}/mp3list.txt
#得到:<a target="_blank">Baby ,Baby tell me-王心凌</a>
#取得行號,循環
line=$(awk 'END{print NR}' ${TMP}/mp3list.txt)
i=1;
while((i<=line));do
? ?downed=0;
? ?mpline=`awk 'NR=='"$i"'' ${TMP}/mp3list.txt`
? ?url=`echo $mpline | sed -e 's/<a href="http://g' | sed 's/\ target.*//g' | sed 's/"http://g' | cat`
? ?name=`echo $mpline | sed -e 's/.*_blank">//g' | sed -e 's/.*_blank>//g' |\
? ? ? ? sed -e 's/<\/a>//g' | sed -e 's/\//-/g' | sed -e 's/:/-/g'? | sed -e 's/"/'\''/g'? | cat`
?
? ?#檢查是否已經下載過這首歌,如果下載過,放棄
? ?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++))
? ? ? continue;
? ?fi
? ?echo "開始通過 $url 下載 $name";
? ?wget -O ${TMP}/down.html $url
? ?echo "獲取 $name 下載列表完成。";
? ?##### 找出有效的歌曲下載地址并根據下載文件的大小從大至少排序 ###############
? ?#down.txt為有效的下載地址
? ?iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "<td height=\"28\" class=\"d\">" |\
? ?sed -e 's/.*<a href="http://g' | sed -e 's/" target=_blank>.*//g' |\
? ?sed '/mid/d' > ${TMP}/down.txt
? ?#size.txt為有效的下載文件大小
? ?iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "M<\/td>" |\
? ?sed -e 's/<td class="t">//g' | sed -e 's/ M<\/td>//g' > ${TMP}/size.txt
? ?#down.txt與size.txt合并而在的down_size.txt文件中字段之間以" "作為分隔符
? ?paste -d ' ' ${TMP}/down.txt ${TMP}/size.txt > ${TMP}/down_size.txt
? ?#得到以下形式 (下載地址 文件大小)
? ?#http://wma2.7t7t.com/pycs/pycs/311/370247.Wma 1.2
? ?#http://snakelmq.hfxyd.com/milk/babybabytellme.mp3 3.2
? ?#http://bbsatt2.ccmove.com.cn/download/1280590/baby%20baby%20tell%20me%28PXC%D6%C6%D7%F7%29.mp3 0.3
? ?#http://vod.music165.com/music/song/new02/wxl_05.07.29/3.Wma 1.6
? ?#http://202.107.247.54/16/0406/94/3.wma 1.6
? ?#排序
? ?sort "+1nr" ${TMP}/down_size.txt > ${TMP}/down_size_sort.txt
? ?#去掉后面的尺寸
? ?sed 's/ .*$//' ${TMP}/down_size_sort.txt > ${TMP}/temp.txt
? ?
? ?##### 析取出mp3 的下載地址或 wma的下載地址 ##############
? ?grep -i "mp3$" ${TMP}/temp.txt > ${TMP}/down_mp3.txt
? ?grep -i "wma$" ${TMP}/temp.txt > ${TMP}/down_wma.txt
? ?downline_mp3=$(awk 'END{print NR}' ${TMP}/down_mp3.txt);
? ?downline_wma=$(awk 'END{print NR}' ${TMP}/down_wma.txt);
? ?echo -e "\e[1;6m\e[1;31m發現 ${downline_mp3} 個名為 ${name}.mp3 下載地址。\e[1;6m\e[00m"
? ?echo -e "\e[1;6m\e[1;31m發現 ${downline_wma} 個名為 ${name}.wma 下載地址。\e[1;6m\e[00m"
? ?# 初始化計數器
? ?j=1;
? ?# 優先下載mp3格式的歌曲
? ?while((j<=downline_mp3)); do
? ? ? mp3=`awk 'NR=='"$j"'' ${TMP}/down_mp3.txt`
? ? ? echo -e "\e[1;6m\e[1;31m正在下載${name}.mp3\e[1;6m\e[00m"
? ? ? wget -c --tries=$TRYCOUNT $mp3 -O "${TMP}/${name}.mp3"
? ? ? if [ "$?" = 0 ]; then
? ? ? ? ?if [ `file -ib "${TMP}/${name}.mp3" | sed -e 's/\/.*//g'` = "audio" ]; then
? ? ? ? ? ? mv "${TMP}/${name}.mp3" "${SAVE}/${name}.mp3"
? ? ? ? ? ? downed=1;
? ? ? ? ? ? break;
? ? ? ? ?else
? ? ? ? ? ? echo -e "\e[1;6m\e[1;31m下載 ${name}.mp3 文件無效,正在刪除重新下載\e[1;6m\e[00m"
? ? ? ? ? ? rm "${TMP}/${name}.mp3";
? ? ? ? ? ? ((j++))? ?
? ? ? ? ?fi
? ? ? else
? ? ? ? ?echo -e "\e[1;6m\e[1;31m下載 ${name}.mp3 文件無效,正在刪除重新下載\e[1;6m\e[00m"
? ? ? ? ?rm "${TMP}/${name}.mp3";
? ? ? ? ?((j++))
? ? ? fi
? ?done
? ?#如果下載成功繼續下其余的歌
? ?#continue用于跳過循環體中的后續命令
? ?if [ "$downed" = 1 ] ; then
? ? ? ((i++))
? ? ? echo -e "\e[1;7m\e[1;41m下載 $name 成功\e[1;7m\e[00m"
? ? ? continue;
? ?fi
? ?# 如果沒有mp3格式的則下載wma格式的歌
? ?j=1;
? ?while((j<=downline_wma)); do
? ? ? wma=`awk 'NR=='"$j"'' ${TMP}/down_wma.txt`
? ? ? echo -e "\e[1;6m\e[1;31m正在下載${name}.wma\e[1;6m\e[00m"
? ? ? wget -c --tries=$TRYCOUNT $wma -O "${TMP}/${name}.wma"
? ? ? if [ "$?" = 0 ]; then
? ? ? ? ?if [ `file -ib "${TMP}/${name}.wma" | sed -e 's/\/.*//g'` = "application" ]; then
? ? ? ? ? ? mv "${TMP}/${name}.wma" "${SAVE}/${name}.wma"
? ? ? ? ? ? downed=1;
? ? ? ? ? ? break;
? ? ? ? ?else
? ? ? ? ? ? echo -e "\e[1;6m\e[1;31m下載 ${name}.wma 文件無效,正在刪除重新下載\e[1;6m\e[00m"
? ? ? ? ? ? rm "${TMP}/${name}.wma";
? ? ? ? ? ? ((j++))? ?
? ? ? ? ?fi
? ? ? else
? ? ? ? ? echo -e "\e[1;6m\e[1;31m下載 ${name}.wma 文件無效,正在刪除重新下載\e[1;6m\e[00m"
? ? ? ? ? rm "${TMP}/${name}.wma";
? ? ? ? ? ((j++))
? ? ? fi
? ?done
? ?((i++))
? ?if [ "$downed" = 1 ] ; then
? ? ? echo -e "\e[1;7m\e[1;41m下載 $name 成功\e[1;7m\e[00m"
? ?else
? ? ? echo -e "\e[1;7m\e[1;41m下載 $name 失敗\e[1;7m\e[00m"
? ?fi
done
rm -fr ${TMP}
exit 0
原理是用wget下載下頁面來,然后用SED來提取頁面,提取到連接后下載
posted on 2006-10-27 15:41
小小程序程序員混口飯吃 閱讀(1160)
評論(1) 編輯 收藏 所屬分類:
java