Advertisement
foozzi

upload music VK

Nov 12th, 2011
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 8.53 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #################################################################
  4. ########### VKSearch script (c) snoopcatt, 2010-2011 ############
  5. ########### Licensed under GNU GPL v2. ##########################
  6. #################################################################
  7.  
  8. #####################################################
  9. sys_version="0.3b"
  10. sys_method='audio.search'
  11. sys_temp='/tmp'
  12.  
  13. vkapi_secret='dTckAoaSzH'
  14. vkapi_appid='1696393'
  15. vkapi_id="5807425"
  16.  
  17. cfg_save_to="$HOME"
  18. cfg_new_playlist='1'
  19. cfg_write_tags='0'
  20. cfg_search_count='300'
  21. cfg_mplayer='/usr/bin/mplayer -playlist'
  22. cfg_wget="/usr/bin/curl -#"
  23. cfg_mode='play'
  24. ######################################################
  25.  
  26. Info() {
  27.  echo "[$(date +%k:%M:%S)] $1"
  28.  [ "$2" == "die" ] && exit 1
  29. }
  30.  
  31. ShowHelp() {
  32.  echo  "VKSearch $sys_version: Поиск, прослушивание и закачка музыки с сайта VKontakte.ru!"
  33.  echo "Для работы скрипта не требуется авторизация ВКонтакте. by snoopcatt, © 2010-2011. Лицензировано под GNU GPL v2."
  34.  echo -e "* Использование: vksearch [опции] запрос"
  35.  echo -e "\t--help: показать это сообщение и закрыть vksearch\n"
  36.  echo -e "\t--user-playlist: использовать плейлист пользователя по ID"
  37.  echo -e "\t--search: использовать поиск по всей коллекции ВК\n"
  38.  echo -e "\t--play: проиграть найденный список треков"
  39.  echo -e "\t--get: скачать найденный список треков"
  40.  echo -e "\t--play-one: проиграть один из найденных треков"
  41.  echo -e "\t--get-one: скачать один трек"
  42.  echo -e "\t--make-playlist: создать плейлист\n"
  43.  echo -e "\t--count=N: искать N треков"
  44.  echo -e "\t--save-to=PATH: сохранять плейлист и треки в указанный PATH"
  45.  echo -e "\t--write-tags: записывать Id3v2 теги в скачанные треки"
  46.  echo -e "\t--get-lyrics: скачать текст песни"
  47.  
  48.  exit 0
  49. }
  50.  
  51. GetParams() {
  52. for var in $@
  53. do
  54.  case $var in
  55.   --help) ShowHelp;;
  56.   --user-playlist) sys_method='audio.get' ;;
  57.   --search) sys_method='audio.search' ;;
  58.   --get-lyrics) sys_method='audio.getLyrics' && cfg_mode='get-lyrics' ;;
  59.   --play) cfg_mode=play ;;
  60.   --get) cfg_mode=get ;;
  61.   --play-one) cfg_mode=play && cfg_search_count=1 ;;
  62.   --get-one) cfg_mode=get && cfg_search_count=1 ;;
  63.   --make-playlist) cfg_mode=make-playlist ;;
  64.   --count=*) cfg_search_count=$(echo $var | cut -d '=' -f 2) ;;
  65.   --save-to=*) cfg_save_to=$(echo $var | cut -d '=' -f 2) ;;
  66.   --write-tags) cfg_write_tags=1 ;;
  67.   --*) Info "Ошибка разбора аргументов: Неизвестный параметр $var" die ;;
  68.   *) [ -z "$query" ] && query="${var}" || query="${query} ${var}"  ;;
  69.  esac
  70. done
  71. [ -z "$query" ] && ShowHelp
  72. }
  73.  
  74. Request() {
  75.  Info "Добро пожаловать в VKSearch $sys_version!"
  76.  Info "Загрузка списка треков..."
  77.  case $sys_method in
  78.   "audio.get")
  79.     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}')
  80.     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"
  81.     found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l) ;;
  82.   "audio.search")
  83.     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}')
  84.     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"
  85.     found=$(cat ${sys_temp}/vksearch.out | sed -ne 's,<count>\([^<]*\)</count>,\1,p'|sed 's/^[ \t]*//')  ;;
  86.   "audio.getLyrics")
  87.     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}')
  88.     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
  89.     lyrics_id="$(cat ${sys_temp}/vksearch.out | sed -n 's|<lyrics_id>\(.*\)</lyrics_id>|\1|p'|sed 's/^[ \t]*//')"
  90.     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}')
  91.     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
  92.     found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l)  ;;
  93.  esac
  94.  
  95.  error_msg="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_msg>\(.*\)</error_msg>|\1|p'|sed 's/^[ \t]*//'|head -n1 )"
  96.  error_code="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_code>\(.*\)</error_code>|\1|p'|sed 's/^[ \t]*//'|head -n1)"
  97.  [ -n "$error_msg" ] && Info "Ошибка: $error_msg (Код $error_code)" die
  98.  
  99.  song_count=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l )
  100.  [ $song_count -eq 0 ] && Info "По запросу ${query} не найдено ни одного трека..." die || Info "По запросу ${query} найдено ${found} композиций. Обработка первых ${song_count}."
  101. }
  102.  
  103. Parse() {
  104.  OLD_IFS=$IFS
  105.  IFS=$'\n'
  106.  song_urls=( `cat ${sys_temp}/vksearch.out | sed -n 's|<url>\(.*\)</url>|\1|p'|sed 's/^[ \t]*//' ` )
  107.  song_artists=( `cat ${sys_temp}/vksearch.out | sed -n 's|<artist>\(.*\)</artist>|\1|p'|sed 's/^[ \t]*//' ` )
  108.  song_titles=( `cat ${sys_temp}/vksearch.out | sed -n 's|<title>\(.*\)</title>|\1|p'|sed 's/^  //' ` )
  109.  song_durations=( `cat ${sys_temp}/vksearch.out |sed -n 's|<duration>\(.*\)</duration>|\1|p'|sed 's/^[ \t]*//' ` )
  110.  song_counts=$(( ${#song_urls[@]} - 1 ))
  111.  IFS=$OLD_IFS
  112. }
  113.  
  114. RemoveDoubles() {
  115.  rm ${sys_temp}/vksearch.pars* 2>&-
  116.  Info "Начинаю удаление треков с одинаковой длительностью..."
  117.  for i in `seq 0 $song_counts`
  118.  do
  119.   echo "<1>${song_durations[$i]}<2>${song_artists[$i]}<3>${song_titles[$i]}<4>${song_urls[$i]}<5>" >> ${sys_temp}/vksearch.parsing
  120.  done
  121.  cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 > ${sys_temp}/vksearch.parsed
  122.  cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 -d > ${sys_temp}/vksearch.doubles
  123.  OLD_IFS=$IFS
  124.  IFS=$'\n'
  125.  song_urls=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<4>\([^<]*\)<5>.*,\1,p' ` )
  126.  song_artists=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<2>\([^<]*\)<3>.*,\1,p' ` )
  127.  song_titles=( `cat ${sys_temp}/vksearch.parsed | sed -ne 's,.*<3>\([^<]*\)<4>.*,\1,p' ` )
  128.  song_durations=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<1>\([^<]*\)<2>.*,\1,p' ` )
  129.  song_counts=$(( ${#song_urls[@]} - 1 ))
  130.  IFS=$OLD_IFS
  131.  Info "В плейлисте осталось ${#song_urls[@]} треков."
  132. }
  133.  
  134. MakePlaylist() {
  135.  [ $cfg_new_playlist -eq 1 ] && rm $cfg_save_to/VKontakte_PlayList.m3u 2>&-
  136.  [ -f "$cfg_save_to/VKontakte_PlayList.m3u" ] || echo -ne "#EXTM3U\n" > $cfg_save_to/VKontakte_PlayList.m3u
  137.  for i in `seq 0 $song_counts`
  138.  do
  139.   echo -e "#EXTINF:${song_durations[$i]},${song_artists[$i]} - ${song_titles[$i]}\n${song_urls[$i]}\n" >> $cfg_save_to/VKontakte_PlayList.m3u
  140.  done
  141.  Info "Плейлист сохранен как $cfg_save_to/VKontakte_PlayList.m3u"
  142. }
  143.  
  144. GetFiles() {
  145.  cd "$cfg_save_to"
  146.  for i in `seq 0 $song_counts`
  147.  do
  148.   Info "Начинаю закачку: ${song_artists[$i]} - ${song_titles[$i]}"
  149.   $cfg_wget "${song_urls[$i]}" > "${song_artists[$i]} - ${song_titles[$i]}.mp3"
  150.   Info "Файл ${song_artists[$i]} - ${song_titles[$i]} был загружен!"
  151.   [ "$cfg_write_tags" -eq 1 ]  &&  id3 -2 -a "${song_artists[$i]}" -t "${song_titles[$i]}" "${song_artists[$i]} - ${song_titles[$i]}.mp3"
  152.  done
  153. }
  154.  
  155. SaveLyrics() {
  156.  cd "$cfg_save_to"
  157.  cat ${sys_temp}/vksearch.lyrics|sed 's/<.*>//g;/^[[:space:]]*$/d;s/^[ \t]*//' > "${song_artists[0]} - ${song_titles[0]}.txt"
  158.  Info "Текст песни ${song_artists[0]} - ${song_titles[0]} сохранён!"
  159. }
  160.  
  161. MediaPlay() {
  162.  ${cfg_mplayer} "$cfg_save_to/VKontakte_PlayList.m3u"
  163. }
  164.  
  165. GetParams $*
  166. Request
  167. Parse
  168. RemoveDoubles
  169.  
  170. case $cfg_mode in
  171.  play)
  172.     MakePlaylist
  173.     MediaPlay ;;
  174.  get)
  175.     GetFiles ;;
  176.  make-playlist)
  177.     MakePlaylist ;;
  178.  get-lyrics)
  179.     SaveLyrics ;;
  180. esac
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement