Skip to content

Instantly share code, notes, and snippets.

@brbrr
Created August 4, 2015 10:59
Show Gist options
  • Save brbrr/0fe91d48cf8f8b3a3f7f to your computer and use it in GitHub Desktop.
Save brbrr/0fe91d48cf8f8b3a3f7f to your computer and use it in GitHub Desktop.
#!/bin/bash
#-------------- Module Identification Data -------------#
export MODULE_AKEY="b8d5d6eca9ef30427712f2f0151334a2"
export MODULE_AUTH=""
export MODULE_NAME="VK"
export MODULE_VERS="-0.95"
export MODULE_DATE="06.IX.2011"
export MODULE_DESC="Поиск музыки ВКонтакте"
export MODULE_URII="http://ftemp.net/static/vksearch";
export MODULE_DPDC="mplayer sed awk grep wget ps"
export MODULE_CPID="$$"
export MODULE_FILE="$0"
#-------------- Module Identification Ends -------------#
SETTINGsimilarartcount=10 #кол-во артистов в поиске похожих
SETTINGsimilartrcount=5 #кол-во песен каждого артиста в поиске похожих
id="5807425" # системная переменная. Взято из VK_Search Amarok Script (c) Взято из vksearch by snoopcatt script
d_method='audio.search' # метод поиска музыки ВКонтакте. by default. Взято из vksearch by snoopcatt script
secret='dTckAoaSzH' # системная переменная. Секретный код приложения. Взято из VK_Search Amarok Script (c) Взято из vksearch by snoopcatt script
d_query="$*"
#show_filtered=0 # лол фильтрованные #лол хуёвые у тебя фильтрованные, сматри как нада
cat $HOME/.vk_filter &>/dev/null || echo "Настройки фильтра неизвестны, используйте sf" && show_filtered=0
source $HOME/.vk_filter 2>/dev/null
save_last=1 # лол последнее (типа плейлист)
vr=$$
ifs_backup=$IFS
help='Возможные действия: p(проиграть) d(скачать) t(печатать текст) e(выход) l(напомнить список) k(убить mplayer) r(случайное) h(помощь) h all(расширенная помощь) s(новый поиск) +f/-f(включить/отключить режим повтора) m(найти похожие), qa(добавить в очередь), qd(удалить из очереди), ql(просмотреть очередь), qc(очистить очередь), +q/-q(включить/отключить проигрывание очереди), qh(подробнее о режиме очереди), sf(настройки фильтра)'
if [ -z "$*" ] ;then
#echo "Не указан запрос для поиска"
#echo "Введите '$0 запрос' для поиска данных или $0 --help для получения расширенной помощи"
#kill -11 $$
#fi
[ -f /tmp/last_query ] && d_query="$( cat /tmp/last_query )"
fi
me_man()
{
echo "Запуск: $0 'запрос' (при наличии пробелов и спецсимволов в запросе кавычки обязательны)"
echo "Внутренние команды:"
echo "p <номер> -- воспроизведение песни с указанным порядковым номером"
echo "d <номер> -- скачивание песни с указанным порядковым номером"
echo "k <номер> -- прервать воспроизведение песни с указанным порядковым номером"
echo "k -- завершить _все_ процессы mplayer"
echo "t <номер> -- показать текст выбранной песни (если есть)"
echo "l -- повторно вывести результаты последнего поиска"
echo "r -- воспроизвести случайную песню из найденных"
echo "s 'запрос' -- повторно провести поиск с новым запросом (при наличии пробелов и спецсимволов в запросе кавычки обязательны)"
echo "h -- показать список команд"
echo "h all -- показать эту справку"
echo "o <количество> -- указать количество показываемых результатов поиска"
echo "+f/-f -- включить/отключить режим принудительного повтора. [ВНИМАНИE]: это может быть опасно с командами 'd','l','h','t'"
echo "m <номер> -- найти исполнителей, схожих с исполнителем песни с указанным номером"
echo "+q/-q -- включить/отключить режим воспроизведения очереди. [ВНИМАНИЕ]: в режиме воспроизведения очереди недоступны мультикоманды, а также переход в режим force forever"
echo "qa <номер или выражение> -- добавить треки в очередь. введите qh для вывода подробной информации"
echo "qd <номер пункта очереди> -- удалить выбранный пункт очереди"
echo "qc -- очистить очередь"
echo "ql -- вывести текущее состояние очереди на экран"
echo ". -- повтор предыдущей команды"
echo "sf <0/1> -- показывать песни, отфильтрованные как дубликаты"
echo "lms -- команда для отладки, которой не нужно пользоваться"
}
if [ "$1" = "--help" ]; then
me_man
exit 0
fi
qhelp(){
echo "Добавление в очередь: "
echo "Возможны следующие варианты: "
echo "qa <номер> -- добавить трек в конец очереди (например, 'qa 5' добавляет 5-ю песню в конец очереди)"
echo "qa r -- добавить случайный трек в конец очереди"
echo "qa <НомерПервой>.<НомерПоследней> -- добавить песни от Первой до Последней в очередь (например, 'qa 3.7' добавляет песни 3,4,5,6,7 в конец очереди"
echo "qa <номер/r>x<количество> -- добавить песню <номер> в конец очереди Количество раз (например, 'qa 4x2' добавляет песню №4 в конец очереди два раза, 'qa rx3' добавляет 3 случайных песни в конец очереди"
echo "qa all -- добавить все песни в конец очереди. [ВНИМАНИЕ] Аргумент 'all' не допустим для перечисления через запятую вместе с остальными"
echo ""
echo "Также, ввод"
echo "qa 4"
echo "qa 6"
echo "И ввод"
echo "qa 4,6"
echo "Абсолютно идентичны. Чтобы добавить несколько треков, идущих не-подряд, в очередь, просто разделите их запятыми. Также, допустим ввод"
echo "qa 4,6,1.3,rx2"
echo "Будут добавлены последовательно треки: 4,6,1,2,3,Случайный,Случайный"
echo "Недопустимо сочетание '.' и 'x' в одном аргументе"
echo "Недопустимо сочетание '.' и 'r' в одном аргументе"
echo "Например 'qa 1.10x2' -- недопустимо"
echo "Например 'qa r.7' -- недопустимо"
echo ""
echo "Также, вместо команды qa можно использовать просто q"
echo ""
echo ""
echo "Удаление из очереди: "
echo "Возможны следующие варианты: "
echo "qd <номерПунктаОчереди> -- удалить пункт №номерПунктаОчереди из очереди, сместив все нижестоящие элементы на позицию вверх"
echo "qd <номерПервогоПункта>,<номерПоследнегоПункта> -- удалить все элементы очереди от №номерПервого до №номерПоследнего, сместив все нижестоящие элементы на некоторое количество позиций вверх, равное суммарному количеству удалённых последним выполнением команды qd из очереди элементов"
echo ""
echo ""
echo "Листинг очереди: "
echo "ql -- вывести список всех элементов очереди в виде"
echo "<номерПунктаОчереди Команда>"
echo ""
echo ""
echo "Очистка очереди: "
echo "Команда 'qc' очищает очередь, удаляя из неё абсолютно все элементы. Удаленная очередь восстановлению не подлежит"
}
get_data(){ # Получение списка
method="$1"
count="$2"
query="$3"
if [ "$4" = "" ]; then
outfile="/tmp/vk$vr"
else
outfile="$4"
fi
#echo $1 / $2 / $3 / $4
#echo $outfile
sig=`echo -n "${id}api_id=1696393count=${count}method=${method}q=${query}test_mode=1v=2.0${secret}"|md5sum|awk '{ print $1 }'`
fields="aid artist title duration url lyrics_id"
wget "http://api.vkontakte.ru/api.php?api_id=1696393&count=${count}&v=2.0&method=${method}&sig=$sig&test_mode=1&q=$query" -qO "$outfile"
}
print_text(){
method="audio.getLyrics"
sig=`echo -n "${id}api_id=1696393lyrics_id=${1}method=${method}test_mode=1v=2.0${secret}"|md5sum|awk '{ print $1 }'`
wget "http://api.vkontakte.ru/api.php?api_id=1696393&v=2.0&method=${method}&sig=$sig&test_mode=1&lyrics_id=$1" -qO /tmp/vkl$vr
cat /tmp/vkl$vr | sed 's/<.*>//g' | grep -oE '^.*$'
}
fill_array(){
#echo $1
ctr=0
IFS=$'\n'
field=$1
#echo fillarray $2
if [ "$2" = "" ];
then filevr="/tmp/vk$vr";
else filevr="$2";
fi
for i in `cat "$filevr" | grep $field | sed "s/[</]\{1,2\}$field>//g" | sed 's/^[ \t]*//;s/[ \t]*$//'`; do
ctr=$[ctr+1];
fl="`echo "$i" | sed 's/&//g'| sed 's/;//g'`"
#echo "Ща будет eval $fileds [$ctr] = '$fl'"
eval $field[$ctr]=\'$fl\' 2>/dev/null;
done
# echo $ctr
IFS=$ifs_backup
}
get_similar() {
wget -qO - "http://ws.audioscrobbler.com/2.0/artist/$1/similar.txt" | awk -F "," '{print $3}' > /tmp/vksim$$
IFSA=$IFS
IFS=$'\n'
#echo -ne "Обрабатываются схожие исполнители..\e[0;33m ["
for i in `cat /tmp/vksim$$ | head -n $SETTINGsimilarartcount`; do
IFS=$IFSA
get_data $d_method $SETTINGsimilartrcount "$i" /tmp/vksem$$
cat /tmp/vksem$$ >> /tmp/vktsem$$
#echo -ne '#'
IFS=$'\n'
done
#echo -ne "] \e[0m "
#echo "Done."
IFS=$IFSA
fields="aid artist title duration url lyrics_id"
for i in $fields; do fill_array $i "/tmp/vktsem$$"; done
total=0
get_list
#echo $help
#echo 'Поиск завершён. Выберите действие и номер найденного трека:'
rm /tmp/vksim$$ /tmp/vksem$$ /tmp/vktsem$$
}
get_list () {
IFS=$ifs_backup
filtered=0
echo > /tmp/vkli$vr
echo > /tmp/vkdi$vr
for num in $(seq 1 $cnt); do
total=$num
if [ -z "${artist[$num]}" ] && [ -z "${title[$num]}" ]; then break; fi
if [ -z $( echo ${lyrics_id[$num]} | grep -oE '[0-9]*') ]; then TEXT='\e[1;31m[-]\e[0;37m'; else TEXT='\e[1;33m[+]\e[0;37m'; fi
clmr=${duration[$num]} #длительность
clmo=$((clmr%60)) #секунды длительности
if [ "$(echo -n $clmo | wc -m)" = "1" ]; then
clmo="0$clmo"
fi
onum=$(cat /tmp/vkli$vr | grep -n "${artist[$num]} - ${title[$num]}" | head -n 1)
# echo $onum
echo "${artist[$num]} - ${title[$num]}" >> /tmp/vkli$vr
if [ -z "$onum" ] ; then
filtered=$((filtered+1)) ;
echo -e "\e[0;35m$num. \e[1;37m${artist[$num]} - ${title[$num]} $TEXT \e[0;34m$((clmr/60)):$clmo\e[0;37m";
echo $num >> /tmp/vkdi$vr
else
[ $show_filtered -eq 1 ] && echo $num удалена как повтор записи $onum;
fi
done
echo '--- Найдено ' $cnt', из них отфильтровано '$((cnt-filtered))
}
get_pid_for_song() { #для убийства конкретного плеера
echo $(ps uax | grep "mplayer ${url[$1]}" | awk '{print $2}')
}
#--------------------------------------------
cnt=15 #количество by default
if [ -z "$(cat $HOME/.vk_set_count 2>/dev/null)" ]; then
echo 'Нет сохранённых настроек для списка. Принято решение использовать стандартные (limit: 15)'
else
cnt=$(cat $HOME/.vk_set_count)
fi
if [ -n "$d_query" ]; then
[ $save_last -eq 1 ] && echo "$d_query" > /tmp/last_query || rm -r /tmp/last_query 2>/dev/null
get_data $d_method $cnt "$d_query"
for i in $fields; do fill_array $i; done
total=0
get_list
fi
#echo $help
#echo 'Поиск завершён. Выберите действие и номер найденного трека:'
parse_input() { #выполняется при попадании параметра
userselect_d=$(echo $whatdo | awk '{print $1}')
userselect_n=$(echo $whatdo | awk '{print $2}')
userselect_d="$1"
userselect_n="$2"
[ -n "$( echo "$userselect_d" | grep -E '(s|pa|q)' )" ] || songinfo="#VK/${aid[$userselect_n]}: ${artist[$userselect_n]} - ${title[$userselect_n]}"
#echo $userselect_n
case $userselect_d in
p)
if [ -z $userselect_n ] ; then echo "Нечего петь. Введите номер после 'p'" ; else
if [ -z $(cat /tmp/vkdi$vr | awk '{print $1}' | grep -E "^${userselect_n}\$") ] ; then echo -e "\e[0;31m[$(date +%H:%M:%S)]: Пластинка $userselect_n проигнорирована \e[0m"; else
echo -e "\e[0;35m[$(date +%H:%M:%S)]\e[0;37m: Запевай пластинку \e[1;37m$songinfo\e[0;37m"
drrr=${duration[$userselect_n]} #длительность для forever'a
mplayer "${url[$userselect_n]}" &>/dev/null </dev/null &
P_PID=$(ps uax |grep "mplayer ${url[$userselect_n]}" | grep -v grep | awk '{print $2}')
fi
fi
;;
d)
if [ -z $userselect_n ] ; then echo "Нечего скачивать. Введите номер после 'd'" ; else
echo -e "Пластинка \e[1;37m$songinfo\e[0;37m будет сохранена в \e[1;37m$HOME/${aid[$userselect_n]}.mp3\e[0;37m"
wget -O "$HOME/${aid[$userselect_n]}.mp3" "${url[$userselect_n]}"
fi
;;
t)
test -z $userselect_n || print_text ${lyrics_id[$userselect_n]}
;;
e)
#echo "Запевай пластинку 295: kill -9 $$"
kill -9 $$
;;
l)
get_list
;;
ql)
echo "Команды в очереди:"
cat -b /tmp/vk$$.queue 2>/dev/null|| echo 'Очередь не найдена'
;;
qc)
rm /tmp/vk$$.queue 2>/dev/null && echo "Очередь очищена"
;;
qa|q)
cn_prev=$(cat /tmp/vk$$.queue 2>/dev/null | wc -l)
if [ "$userselect_n" = "all" ]; then
userselect_all=$(seq 1 $cnt)
else
userselect_all="$(echo $userselect_n | sed 's/,/ /g')"
fi
for queue_data in $userselect_all; do
if [ -n "$(echo $queue_data | grep '\.')" ] ; then
lz_start="$(echo $queue_data | awk -F '.' ' { print $1 } ')"
lz_endop="$(echo $queue_data | awk -F '.' ' { print $2 } ')"
for i in $(seq $lz_start $lz_endop); do
echo p $i >> /tmp/vk$$.queue
done
else
if [ -n "$(echo $queue_data | grep 'x')" ] ; then
for zc in `seq 1 $(echo $queue_data | awk -F 'x' '{print $2}')` ; do
zr="$(echo $queue_data | awk -F 'x' '{print $1}')"
if [ "$zr" == "r" ]; then echo r >> /tmp/vk$$.queue; else echo p $zr >> /tmp/vk$$.queue; fi
done
else
if [ "$queue_data" == "r" ]; then echo r >> /tmp/vk$$.queue; else echo p $queue_data >> /tmp/vk$$.queue; fi
fi
fi
done
cn_post=$(cat /tmp/vk$$.queue 2>/dev/null | wc -l)
# echo "Команды в очереди:"
# cat -b /tmp/vk$$.queue 2>/dev/null || echo 'Очередь не найдена'
echo "Добавлено успешно $((cn_post-cn_prev)) элементов. Для просмотра очереди наберите ql"
;;
qd)
if [ -n "$userselect_n" ]; then
sed "${userselect_n}d" /tmp/vk$$.queue > /tmp/vk$$.queue.last
mv /tmp/vk$$.queue.last /tmp/vk$$.queue
fi
echo "Команды в очереди:"
cat -b /tmp/vk$$.queue 2>/dev/null || echo 'Очередь не найдена'
;;
qh)
qhelp
;;
sf)
case "$userselect_n" in
1)
show_filtered=1
echo Результаты работы фильтра отныне будут отображаться
echo show_filtered=1 > $HOME/.vk_filter
;;
0)
show_filtered=0
echo Результаты работы фильтра отныне не будут больше отображаться
echo show_filtered=0 > $HOME/.vk_filter
;;
*)
echo "0 или 1. Третьего не дано."
;;
esac
;;
pa)
echo -e "\e[0;35m[$(date +%H:%M:%S)]\e[0;37m: Отправляемся па на \e[1;37m$(echo $userselect_n| sed 's/s/ сек./g;s/h/ ч./g;s/m/ мин./g')\e[0;37m"
sleep "$userselect_n"
;;
k)
if [ -z $userselect_n ] ; then
echo 'Завершаем все процессы mplayer'
killall -v mplayer
else
echo "Пробуем завершить процесс mplayer для пластинки $userselect_n"
for i in $(get_pid_for_song $userselect_n); do kill -9 $i 2>/dev/null && echo 'Удача!'; done
fi
;;
r)
nrand=0
while [ "$nrand" != "1" ] ; do
r_d=$[RANDOM%$total];
if [ -z $(cat /tmp/vkdi$vr | awk '{print $1}' | grep -E "^$r_d\$") ] ; then echo -e "\e[0;35m[$(date +%H:%M:%S)]\e[0;37m: Кубик показал \e[1;37m$r_d\e[0;37m. У кубика нет стороны \e[1;37m$r_d \e[0;37m, поэтому он будет брошен ещё раз"; else nrand=1; fi
done
echo -e "\e[0;35m[$(date +%H:%M:%S)]\e[0;37m Кубик показал \e[1;37m$r_d. Запевай пластинку \e[1;37m#VK/${aid[$r_d]}: ${artist[$r_d]} - ${title[$r_d]}\e[0;37m"
drrr=${duration[$r_d]}
mplayer "${url[$r_d]}" &>/dev/null </dev/null &
P_PID=$(ps uax |grep "mplayer ${url[$r_d]}" | grep -v grep | awk '{print $2}')
;;
lms)
echo 'Это команда для отладки, ей не нужно пользоваться'$'\n'Нет, правда.
if [ -z "$(ps ax -o pid | grep $P_PID)" ] ; then echo 'Died'; else echo 'Still alive'; fi
;;
h)
if [ -z "$userselect_n" ]; then echo $help; else me_man; fi
;;
s)
unset $fields
fields="aid artist title duration url lyrics_id"
whatfind="`echo $whatdo | sed 's/^s //g'`"
get_data $d_method $cnt "$whatfind"
for i in $fields; do fill_array $i; done
total=0
get_list
# echo 'Поиск завершён. Выберите действие и номер найденного трека:'
;;
m)
get_similar "${artist[$userselect_n]}"
;;
o)
[ -n "$userselect_n" ] && cnt=$userselect_n && echo $cnt > $HOME/.vk_set_count && echo -e "Отныне показывать найденных: \e[1;37m$cnt\e[0;37m"
;;
w)
echo "Ok"
clear;;
esac
}
forever() {
echo "Введите команду. Введите '-f' для останова. Возможно придётся вручную остановить mplayer."
echo -n "data2/VK(+f)# "
read f_cmd
d_cmd="force forever"
while [ "$d_cmd" != '-f' ]; do
parse_input $f_cmd
read -t $drrr d_cmd
if [ -n "$d_cmd" ]; then f_cmd="$d_cmd"; fi #подмена команды на лету
done
echo "Force-forever режим отключён. Возможно придётся вручную остановить mplayer, если необходимо"
}
just_queue() {
d_cmd="force queue"
while [ "$d_cmd" != '-q' ]; do
if [ -z "$(cat /tmp/vk$$.queue 2> /dev/null)" ] ; then
break
else
echo "Осталось позиций в очереди: $(cat /tmp/vk$$.queue |wc -l)"
fi
parse_input $(cat /tmp/vk$$.queue)
sed '1d' /tmp/vk$$.queue > /tmp/vk$$.queue.last
mv /tmp/vk$$.queue.last /tmp/vk$$.queue
echo -n "data2/VK(+q)# "
while [ -n "$(ps ax -o pid | grep $P_PID)" ]; do
read -t 5 d_cmd
## echo alive
if [ -n "$d_cmd" ]; then
# d_usselect_d="$(echo $d_cmd | awk '{print $1}')";
# d_usselect_n="$(echo $d_cmd | awk '{print $2}')";
# case $d_usselect_d in
if [ "$d_cmd" = "-q" ]; then
echo "Прерывание..."
break 2
fi;
parse_input $d_cmd
echo -n "data2/VK(+q)# "
fi
done
#echo 'died, go next'
done
echo "Режим очереди отключен. Возможно, очередь закончилась или ещё не начиналась."
}
while true ; do
echo -n "data2/VK( )# "; read whatdo
if [ -z "$d_query" ] ; then
if [ -z "$(echo $whatdo|awk '{ print $1 }'|grep -iE 's.*')" ] ; then echo "Сначала введите запрос."; continue;
else
d_query="$( echo $whatdo | sed 's/s//' )"
parse_input $whatdo
whatdo=skip
fi
fi
[ -z "$whatdo" ] && whatdo=nozavison
[ -z `echo $whatdo | awk '{ print $1 }' | grep -iE '(\.|k|s-*|l-*|t-*|o-*|h-*|w)'` ] && echo "$whatdo" > /tmp/whatdo
if [ "$whatdo" = "+f" ]; then
forever
else
if [ "$whatdo" = "+q" ]; then
just_queue
fi
if [ "$whatdo" = "." ]; then
parse_input `cat /tmp/whatdo`
fi
IFS='-';
for does in $whatdo; do #мультикоманды
IFS=$ifs_backup;
parse_input $does;
IFS='-';
done
fi
IFS=$ifs_backup
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment