master
1require 'thor'
2require 'net/hippie'
3
4module Ghetto
5 module Blaster
6 class CLI < Thor
7 class_option :client_id, default: ENV['SOUNDCLOUD_CLIENT_ID']
8
9 desc "play username", "play music by a specific user"
10 def play(username)
11 tracks_for(username).each do |track|
12 stream_url = "#{track[:stream_url]}s/?client_id=#{client_id}"
13 json = JSON.parse(client.get(stream_url).body, symbolize_names: true)
14 say json[json.keys.first]
15 end
16 end
17
18 desc "user username", "fetch user info"
19 def user(username)
20 say client.get(resolve(username)[:location]).body
21 end
22
23 desc "tracks username", "fetch tracks for user"
24 def tracks(username)
25 say tracks_for(username, parse: false)
26 end
27
28 desc "version", "print version"
29 def version
30 say Ghetto::Blaster::VERSION
31 end
32
33 private
34
35 def tracks_for(username, parse: true)
36 user_id = resolve(username)[:location].split('?')[0].split('/').last
37 body = client.get(build_uri("/users/#{user_id}/tracks?client_id=#{client_id}")).body
38 parse ? JSON.parse(body, symbolize_names: true) : body
39 end
40
41 def client
42 @client ||= Net::Hippie::Client.new
43 end
44
45 def client_id
46 options[:client_id]
47 end
48
49 def build_uri(path)
50 URI.join("https://api.soundcloud.com", path)
51 end
52
53 def resolve(username)
54 JSON.parse(client.get(build_uri("/resolve?url=https://soundcloud.com/#{username}&client_id=#{client_id}")).body, symbolize_names: true)
55 end
56 end
57 end
58end