bash скрипт использующий API ВК без авторизации:
#!/bin/bash
sys_version="0.3b"
sys_method='audio.search'
sys_temp='/tmp'
vkapi_secret='dTckAoaSzH'
vkapi_appid='1696393'
vkapi_id="5807425"
cfg_save_to="$HOME"
cfg_new_playlist='1'
cfg_write_tags='0'
cfg_search_count='300'
cfg_mplayer='/usr/bin/mplayer -playlist'
cfg_wget="/usr/bin/curl -#"
cfg_mode='play'
######################################################
Info() {
echo "[$(date +%k:%M:%S)] $1"
[ "$2" == "die" ] && exit 1
}
ShowHelp() {
echo "VKSearch $sys_version: Поиск, прослушивание и закачка музыки с сайта VKontakte.ru!"
echo "Для работы скрипта не требуется авторизация ВКонтакте. by snoopcatt, © 2010-2011. Лицензировано под GNU GPL v2."
echo -e "* Использование: vksearch [опции] запрос"
echo -e "\t--help: показать это сообщение и закрыть vksearch\n"
echo -e "\t--user-playlist: использовать плейлист пользователя по ID"
echo -e "\t--search: использовать поиск по всей коллекции ВК\n"
echo -e "\t--play: проиграть найденный список треков"
echo -e "\t--get: скачать найденный список треков"
echo -e "\t--play-one: проиграть один из найденных треков"
echo -e "\t--get-one: скачать один трек"
echo -e "\t--make-playlist: создать плейлист\n"
echo -e "\t--count=N: искать N треков"
echo -e "\t--save-to=PATH: сохранять плейлист и треки в указанный PATH"
echo -e "\t--write-tags: записывать Id3v2 теги в скачанные треки"
echo -e "\t--get-lyrics: скачать текст песни"
exit 0
}
GetParams() {
for var in $@
do
case $var in
--help) ShowHelp;;
--user-playlist) sys_method='audio.get' ;;
--search) sys_method='audio.search' ;;
--get-lyrics) sys_method='audio.getLyrics' && cfg_mode='get-lyrics' ;;
--play) cfg_mode=play ;;
--get) cfg_mode=get ;;
--play-one) cfg_mode=play && cfg_search_count=1 ;;
--get-one) cfg_mode=get && cfg_search_count=1 ;;
--make-playlist) cfg_mode=make-playlist ;;
--count=*) cfg_search_count=$(echo $var | cut -d '=' -f 2) ;;
--save-to=*) cfg_save_to=$(echo $var | cut -d '=' -f 2) ;;
--write-tags) cfg_write_tags=1 ;;
--*) Info "Ошибка разбора аргументов: Неизвестный параметр $var" die ;;
*) [ -z "$query" ] && query="${var}" || query="${query} ${var}" ;;
esac
done
[ -z "$query" ] && ShowHelp
}
Request() {
Info "Добро пожаловать в VKSearch $sys_version!"
Info "Загрузка списка треков..."
case $sys_method in
"audio.get")
vkapi_signature=$(echo -n "${vkapi_id}api_id=${vkapi_appid}method=audio.gettest_mode=1uid=${query}v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
wget "http://api.vkontakte.ru/api.php?api_id=${vkapi_appid}&method=audio.get&uid=${query}&test_mode=1&v=2.0&sig=${vkapi_signature}" -qO "${sys_temp}/vksearch.out"
found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l) ;;
"audio.search")
vkapi_signature=$(echo -n "${vkapi_id}api_id=1696393count=${cfg_search_count}method=audio.searchq=${query}test_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
wget "http://api.vkontakte.ru/api.php?api_id=1696393&count=${cfg_search_count}&v=2.0&method=audio.search&sig=${vkapi_signature}&test_mode=1&q=$query" -qO "${sys_temp}/vksearch.out"
found=$(cat ${sys_temp}/vksearch.out | sed -ne 's,<count>\([^<]*\)</count>,\1,p'|sed 's/^[ \t]*//') ;;
"audio.getLyrics")
vkapi_signature=$(echo -n "${vkapi_id}api_id=1696393count=1lyrics=1method=audio.searchq=${query}test_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
wget "http://api.vkontakte.ru/api.php?api_id=1696393&count=1&v=2.0&lyrics=1&method=audio.search&sig=${vkapi_signature}&test_mode=1&q=$query" -qO ${sys_temp}/vksearch.out
lyrics_id="$(cat ${sys_temp}/vksearch.out | sed -n 's|<lyrics_id>\(.*\)</lyrics_id>|\1|p'|sed 's/^[ \t]*//')"
vkapi_signature=$(echo -n "${vkapi_id}api_id=${vkapi_appid}lyrics_id=${lyrics_id}method=audio.getLyricstest_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
wget "http://api.vkontakte.ru/api.php?api_id=${vkapi_appid}&method=audio.getLyrics&lyrics_id=${lyrics_id}&test_mode=1&v=2.0&sig=${vkapi_signature}" -qO ${sys_temp}/vksearch.lyrics
found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l) ;;
esac
error_msg="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_msg>\(.*\)</error_msg>|\1|p'|sed 's/^[ \t]*//'|head -n1 )"
error_code="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_code>\(.*\)</error_code>|\1|p'|sed 's/^[ \t]*//'|head -n1)"
[ -n "$error_msg" ] && Info "Ошибка: $error_msg (Код $error_code)" die
song_count=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l )
[ $song_count -eq 0 ] && Info "По запросу ${query} не найдено ни одного трека..." die || Info "По запросу ${query} найдено ${found} композиций. Обработка первых ${song_count}."
}
Parse() {
OLD_IFS=$IFS
IFS=$'\n'
song_urls=( `cat ${sys_temp}/vksearch.out | sed -n 's|<url>\(.*\)</url>|\1|p'|sed 's/^[ \t]*//' ` )
song_artists=( `cat ${sys_temp}/vksearch.out | sed -n 's|<artist>\(.*\)</artist>|\1|p'|sed 's/^[ \t]*//' ` )
song_titles=( `cat ${sys_temp}/vksearch.out | sed -n 's|<title>\(.*\)</title>|\1|p'|sed 's/^ //' ` )
song_durations=( `cat ${sys_temp}/vksearch.out |sed -n 's|<duration>\(.*\)</duration>|\1|p'|sed 's/^[ \t]*//' ` )
song_counts=$(( ${#song_urls[@]} - 1 ))
IFS=$OLD_IFS
}
RemoveDoubles() {
rm ${sys_temp}/vksearch.pars* 2>&-
Info "Начинаю удаление треков с одинаковой длительностью..."
for i in `seq 0 $song_counts`
do
echo "<1>${song_durations[$i]}<2>${song_artists[$i]}<3>${song_titles[$i]}<4>${song_urls[$i]}<5>" >> ${sys_temp}/vksearch.parsing
done
cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 > ${sys_temp}/vksearch.parsed
cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 -d > ${sys_temp}/vksearch.doubles
OLD_IFS=$IFS
IFS=$'\n'
song_urls=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<4>\([^<]*\)<5>.*,\1,p' ` )
song_artists=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<2>\([^<]*\)<3>.*,\1,p' ` )
song_titles=( `cat ${sys_temp}/vksearch.parsed | sed -ne 's,.*<3>\([^<]*\)<4>.*,\1,p' ` )
song_durations=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<1>\([^<]*\)<2>.*,\1,p' ` )
song_counts=$(( ${#song_urls[@]} - 1 ))
IFS=$OLD_IFS
Info "В плейлисте осталось ${#song_urls[@]} треков."
}
MakePlaylist() {
[ $cfg_new_playlist -eq 1 ] && rm $cfg_save_to/VKontakte_PlayList.m3u 2>&-
[ -f "$cfg_save_to/VKontakte_PlayList.m3u" ] || echo -ne "#EXTM3U\n" > $cfg_save_to/VKontakte_PlayList.m3u
for i in `seq 0 $song_counts`
do
echo -e "#EXTINF:${song_durations[$i]},${song_artists[$i]} - ${song_titles[$i]}\n${song_urls[$i]}\n" >> $cfg_save_to/VKontakte_PlayList.m3u
done
Info "Плейлист сохранен как $cfg_save_to/VKontakte_PlayList.m3u"
}
GetFiles() {
cd "$cfg_save_to"
for i in `seq 0 $song_counts`
do
Info "Начинаю закачку: ${song_artists[$i]} - ${song_titles[$i]}"
$cfg_wget "${song_urls[$i]}" > "${song_artists[$i]} - ${song_titles[$i]}.mp3"
Info "Файл ${song_artists[$i]} - ${song_titles[$i]} был загружен!"
[ "$cfg_write_tags" -eq 1 ] && id3 -2 -a "${song_artists[$i]}" -t "${song_titles[$i]}" "${song_artists[$i]} - ${song_titles[$i]}.mp3"
done
}
SaveLyrics() {
cd "$cfg_save_to"
cat ${sys_temp}/vksearch.lyrics|sed 's/<.*>//g;/^[[:space:]]*$/d;s/^[ \t]*//' > "${song_artists[0]} - ${song_titles[0]}.txt"
Info "Текст песни ${song_artists[0]} - ${song_titles[0]} сохранён!"
}
MediaPlay() {
${cfg_mplayer} "$cfg_save_to/VKontakte_PlayList.m3u"
}
GetParams $*
Request
Parse
RemoveDoubles
case $cfg_mode in
play)
MakePlaylist
MediaPlay ;;
get)
GetFiles ;;
make-playlist)
MakePlaylist ;;
get-lyrics)
SaveLyrics ;;
esac
Комментариев нет:
Отправить комментарий