Created
August 4, 2015 10:59
-
-
Save brbrr/0fe91d48cf8f8b3a3f7f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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