bashを使用してz-music.orgで音楽を検索する

今日の実験の「犠牲者」は z-music.org



z-music.org



このサイトでは、曲を見つけて、聞いてダウンロードする機会があります。

目標はsed



awk



、およびgrep



の「紳士のセット」を使用して音楽を検索するbash



スクリプトを作成することです。 さて、加えて少しカールしたり、味見したりします。



少しz-music.orgを調べたところ、次のことが明らかになりました。

  1. 検索はz-music.org/search/



    ます。 GETパラメーターとして、クエリテキストq



    、リクエストタイプ(AJAX) action



    および検索結果のページ番号を渡すことができます
  2. データ"id=<SONG_ID>"



    とともにPOSTリクエストをz-music.org/bitrate/



    送信することで、曲のビットレートを知ることができます
  3. 曲をダウンロードするための直接リンクはm1.z-music.org/t/<SONG_ID>_<HASH>



    ようにm1.z-music.org/t/<SONG_ID>_<HASH>



    ます。 <HASH>



    z-music.org/theme/new/js/lang.js



    のスクリプトで見つかりました


スクリプトの作成を開始できます。 サーバー要求にはcurl



を使用しますが、 wget



使用を妨げるものは何もありません。 curl -s



代わりにwget -q -O -



curl -F



curl -F



代わりにwget --post-data







最初に、 hsh



変数に<HASH>



を書き込みます。

 hsh=$(curl -s http://z-music.org/theme/new/js/lang.js | sed -n 's/^var hsh="\([^"]*\)";$/\1/p')
      
      





変数$query



および$page



には、クエリテキストと結果のページ番号が含まれます。 サーバーにリクエストを送信します。

 curl -s "http://z-music.org/search/?page=$page&action=ajax&q=$query"
      
      





HTMLを入手してください。 曲に関する情報は、 <a class="info" data-aid="SONG_ID"...>SONG_NAME</a>



という形式の行にあります。 タブで区切られた<SONG_ID>



<SONG_NAME>



<SONG_ID>



します。

 sed -n 's/^\s*<a class="info" data-aid="\([^"]*\)"[^>]*>\([^<]*\)<\/a>\s*$/\1\t\2/p'
      
      





<SONG_ID>



知って<SONG_ID>



ば、ビットレートのリクエストを送信できます。 JSONが戻ってきます。 ビットレート値自体を抽出するために、 cut



ユーティリティを使用します。 変更のため。

 curl -sF "id=$songid" http://z-music.org/bitrate/ | cut -d'"' -f8
      
      





曲をダウンロードするためのリンクは次のようになりますm1.z-music.org/t/${songid}_${hsh}/



/ m1.z-music.org/t/${songid}_${hsh}/



/ m1.z-music.org/t/${songid}_${hsh}/





これらすべてを1つのスクリプトに結合することが残っています。 彼に「ページごと」に曲を検索させ、ビットレートが事前に指定されたものと一致する曲のみに関する情報を表示させます。

 #!/bin/bash case $# in 1) query=$1 bitrate=320 ;; 2) query=$1 bitrate=$2 ;; *) echo -e 'Usage:\n\tzmusic "song name"\nor:\n\tzmusic "song name" 256\nwhere 256 is bitrate' exit ;; esac hsh=$(curl -s http://z-music.org/theme/new/js/lang.js | sed -n 's/^var hsh="\([^"]*\)";$/\1/p') # infinite loop incrementing search page for (( page=1; page>0; page++ )) do result=$( \ curl -s "http://z-music.org/search/?page=$page&action=ajax&q=$query" | \ sed -n 's/^\s*<a class="info" data-aid="\([^"]*\)"[^>]*>\([^<]*\)<\/a>\s*$/\1\t\2/p' | \ awk -v hsh=$hsh -F"\t" ' \ { \ system("curl -sF \"id=" $1 "\" http://z-music.org/bitrate/ | cut -d\"\\\"\" -f8"); \ print "http://m1.z-music.org/t/" $1 "_" hsh "/"; \ print $2 "\n"; \ }') # stop the script if nothing found on this page if [ -z "$result" ]; then exit; fi # output songs with $bitrate only while read -r res; do echo -e $res; done <<< "$result" | grep -A2 "$bitrate" echo -e "-- end of page $page --\n" done
      
      





habrahabrについて何かを見つけようとしています。

 $ zmusic "Habr" "256 \ | 320"
 320
 http://m1.z-music.org/t/-3ev4fnuc23h_2b49895762/
 Habr-中毒性の歌
 -
 320
 http://m1.z-music.org/t/-3ev4fnubytf_2b49895762/
 HaBr-Nedomassaraks
 -
 320
 http://m1.z-music.org/t/-3ev4fnuc1d3_2b49895762/
 HaBr-Travel [ハリネズミとペトルッチョのカバー]
 -
 320
 http://m1.z-music.org/t/-3ev4fntmcfl_2b49895762/
 HaBr-エレベーターに乗らない(新しいシングル)
 -ページ1の終わり-




All Articles