summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsoundcloud82
1 files changed, 82 insertions, 0 deletions
diff --git a/soundcloud b/soundcloud
new file mode 100755
index 0000000..9e827cc
--- /dev/null
+++ b/soundcloud
@@ -0,0 +1,82 @@
+#! /bin/sh
+
+# Url Page -> Eff Play
+play_stream() {
+ echo "play: $1"
+ mpv "$(get_streams "$1" | head -1)"
+ play_stream "$(next_stream "$1")"
+}
+
+# Url Page -> Url Page
+next_stream() {
+ get_related "$1" | head -1
+}
+
+# Url Page -> Streams
+get_streams() {(
+ streams_url=$(streams_url "$(get "$1")")
+ get "$streams_url" | jq -r 'to_entries[] | "\(.key) \(.value)"' | grep -v ^preview | awk '{print$2}'
+)}
+
+# Url Page -> [Url Page]
+get_related() {(
+ page_url=$1
+ track_path=${page_url#https://soundcloud.com}
+ related_url=$1/recommended
+ related=$(get "$related_url")
+ echo "$related" | sed -n 's/<a itemprop="url" href="\([^"]*\)">/\ntrack_path \1\n/gp' \
+ | awk \
+ -v track_path="$track_path" \
+ '
+ ($1 == "track_path" && $2 != track_path) {print"https://soundcloud.com"$2}
+ '
+
+)}
+
+# Page -> Url Streams
+streams_url() {(
+ page=$1
+ app_url=$(app_url "$page")
+ app=$(get "$app_url")
+ public_api_host=$(public_api_host "$app")
+ stream_id=$(stream_id "$page")
+ client_id=$(client_id "$app")
+ streams_path=$(paths "$app" | sed -n "/streams$/{s/:id/$stream_id/p;T;q}")
+ app_version=$(app_version "$page")
+ streams_url="$public_api_host$streams_path?client_id=$client_id&app_version=$app_version"
+ echo "$streams_url"
+)}
+
+get() {
+ curl -fsS "$1"
+}
+
+# Page -> Url App
+app_url() {
+ echo "$1" | sed -n 's|.*"\(https:[^"]*/app-[^"]*\.js\)".*|\1|p'
+}
+
+# Page -> StreamId
+stream_id() {
+ echo "$1" | sed -n 's|.*"soundcloud://sounds:\([0-9]\+\)".*|\1|p;T;q'
+}
+
+# App -> ClientId
+client_id() {
+ echo "$1" | sed -n 's|.*\<client_id:"\([^"]\+\)".*|\1|p;T;q'
+}
+
+# Page -> AppVersion
+app_version() {
+ echo "$1" | sed -n 's|.*__sc_version\s*=\s*"\([^"]*\)".*|\1|p;T;q'
+}
+
+# App -> [PathPattern]
+paths() {
+ echo "$1" | sed -n 's|\<path:"[^"]*"|\n&\n|gp' | sed -n 's/^path:"\([^"]*\)"$/\1/p'
+}
+
+# App -> Url
+public_api_host() {
+ echo "$1" | sed -n 's|.*\<public_api_host:\s*"\([^"]*\)".*|\1|p;T;q'
+}