Spaces:
Build error
Build error
#!/bin/bash | |
# | |
# Copyright (C) 2023 Wenva <lvyexuwenfa100@126.com> | |
# | |
# Permission is hereby granted, free of charge, to any person obtaining a copy | |
# of this software and associated documentation files (the "Software"), to deal | |
# in the Software without restriction, including without limitation the rights | |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
# copies of the Software, and to permit persons to whom the Software is furnished | |
# to do so, subject to the following conditions: | |
# | |
# The above copyright notice and this permission notice shall be included in all | |
# copies or substantial portions of the Software. | |
# | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
# THE SOFTWARE. | |
spushd() { | |
pushd "$1" 2>&1> /dev/null | |
} | |
spopd() { | |
popd 2>&1> /dev/null | |
} | |
info() { | |
local green="\033[1;32m" | |
local normal="\033[0m" | |
echo -e "[${green}INFO${normal}] $1" | |
} | |
cmdcheck() { | |
command -v $1>/dev/null 2>&1 || { error >&2 "Please install command $1 first."; exit 1; } | |
} | |
error() { | |
local red="\033[1;31m" | |
local normal="\033[0m" | |
echo -e "[${red}ERROR${normal}] $1" | |
} | |
curdir() { | |
if [ ${0:0:1} = '/' ] || [ ${0:0:1} = '~' ]; then | |
echo "$(dirname $0)" | |
elif [ -L $0 ];then | |
name=`readlink $0` | |
echo $(dirname $name) | |
else | |
echo "`pwd`/$(dirname $0)" | |
fi | |
} | |
myos() { | |
echo `uname|tr "[:upper:]" "[:lower:]"` | |
} | |
######################################### | |
### GROBLE DEFINE ### | |
######################################### | |
VERSION=2.0.1 | |
AUTHOR=smallmuou | |
######################################### | |
### ARG PARSER ### | |
######################################### | |
usage() { | |
prog=`basename $0` | |
cat << EOF | |
$prog version $VERSION by $AUTHOR | |
USAGE: $prog [OPTIONS] albumId type [type-param1 [type-param1 ...]] | |
DESCRIPTION: | |
This tool is used to download tracks under ximalaya.com. | |
albumId - the id of album, you can see from url,like https://www.ximalaya.com/album/2677356, the albumId is 2677356 | |
type - all/page/track, when type is all, no type-params required; when type is page, the type-params is the pagenum (start with 1); when type is track, the type-params is trackid; | |
trackId - the id of track, you can see from url,like https://www.ximalaya.com/sound/25202, the trackId is 25202 | |
OPTIONS: | |
-h Show this help message and exit. | |
-o Output directory, default is current directory. | |
EXAMPLES: | |
$prog 12891461 all | |
$prog 12891461 page 1 2 3 | |
$prog 12891461 track 211393643 | |
$prog -o 'output_directory' 12891461 all | |
EOF | |
exit 1 | |
} | |
# output set current directory | |
dst_dir=. | |
while getopts 'o:h' arg; do | |
case $arg in | |
h) | |
usage | |
;; | |
o) | |
dst_dir=$OPTARG | |
;; | |
?) | |
usage | |
;; | |
esac | |
done | |
shift $(($OPTIND - 1)) | |
[ ! -d $dst_dir ] && { error "The output directory $dst_dir does not exist."; exit -1; } | |
######################################### | |
### MAIN ENTRY ### | |
######################################### | |
PAGE_SIZE=30 | |
# params: jsonobject key | |
decode_json() { | |
statement=`cat << EOF | |
import json,sys | |
if sys.version_info<(3,0,0): | |
reload(sys) | |
sys.setdefaultencoding("utf8") | |
try: | |
print(json.dumps(json.load(sys.stdin)[sys.argv[1]],ensure_ascii=False)) | |
except KeyError as e: | |
print('') | |
EOF` | |
echo `cat|python -c "$statement" "$1"` | |
} | |
# param track_id | |
fetch_track_by_id() { | |
result=`curl -s "http://mobile.ximalaya.com/v1/track/baseInfo?device=iPhone&trackId=$1"|grep title` | |
if [ -n "$result" ];then | |
uid=`echo $result|decode_json uid|sed 's/\"//g'` | |
title=`echo $result|decode_json title|sed 's/\"//g'` | |
url64=`echo $result|decode_json playUrl64|sed 's/\"//g'|sed 's/\\\//g'` | |
if [ -n "$url64" ];then | |
title=`echo $title|sed 's/\.//g'|sed 's/\///g'` | |
wget "$url64" -O "$dst_dir/$title.mp3" | |
else | |
error "Failed to fetch the track, may be a paid resource." | |
fi | |
else | |
error "The trackId $1 does not exist." | |
fi | |
} | |
# param track_id track_id | |
fetch_track_by_ids() { | |
for id in $@; do | |
fetch_track_by_id $id | |
done | |
} | |
# param: album_id page_num | |
fetch_tracks_by_page() { | |
local album_id=$1 | |
local page_num=$2 | |
local page_size=$PAGE_SIZE | |
local content=`curl -s "https://www.ximalaya.com/revision/album/v1/getTracksList?albumId=$album_id&pageNum=$page_num&pageSize=$page_size"` | |
statement=`cat << EOF | |
import json,sys | |
items = json.loads(sys.argv[1])['data']['tracks'] | |
for item in items: | |
print(item['trackId']) | |
EOF` | |
track_ids=`python -c "$statement" "$content"` | |
fetch_track_by_ids $track_ids | |
} | |
# param: album_id | |
fetch_album_track_count() { | |
local album_id=$1 | |
local content=`curl -s "https://www.ximalaya.com/revision/album/v1/getTracksList?albumId=$album_id&pageNum=0&pageSize=1"` | |
statement=`cat << EOF | |
import json,sys | |
count = json.loads(sys.argv[1])['data']['trackTotalCount'] | |
print(count) | |
EOF` | |
echo `python -c "$statement" "$content"` | |
} | |
# param: album_id page_num1 page_num2 | |
fetch_tracks_by_pages() { | |
local album_id=$1 | |
shift | |
for page in $@; do | |
fetch_tracks_by_page $album_id $page | |
done | |
} | |
# main | |
[ $# -lt 2 ] && usage | |
album_id=$1 | |
type=$2 | |
# remove the first two parameters | |
shift | |
shift | |
if [ "$type" == "all" ];then | |
count=`fetch_album_track_count $album_id` | |
page_count=$((count/$PAGE_SIZE)) | |
info "Total count is $count" | |
for (( i = 0; i <= $page_count+1; i++ )); do | |
fetch_tracks_by_page $album_id $i | |
done | |
elif [ "$type" == "page" ];then | |
fetch_tracks_by_pages $album_id $@ | |
elif [ "$type" == "track" ];then | |
fetch_track_by_ids $@ | |
else | |
usage | |
fi | |