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