summaryrefslogtreecommitdiff
path: root/lib/ghetto/blaster/cli.rb
blob: 16bad178a8dd524dfc6aa6019d0f871db9ae7185 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
require 'thor'
require 'net/hippie'

module Ghetto
  module Blaster
    class CLI < Thor
      class_option :client_id, default: ENV['SOUNDCLOUD_CLIENT_ID']

      desc "play username", "play music by a specific user"
      def play(username)
        tracks_for(username).each do |track|
          stream_url = "#{track[:stream_url]}s/?client_id=#{client_id}"
          json = JSON.parse(client.get(stream_url).body, symbolize_names: true)
          say json[json.keys.first]
        end
      end

      desc "user username", "fetch user info"
      def user(username)
        say client.get(resolve(username)[:location]).body
      end

      desc "tracks username", "fetch tracks for user"
      def tracks(username)
        say tracks_for(username, parse: false)
      end

      desc "version", "print version"
      def version
        say Ghetto::Blaster::VERSION
      end

      private

      def tracks_for(username, parse: true)
        user_id = resolve(username)[:location].split('?')[0].split('/').last
        body = client.get(build_uri("/users/#{user_id}/tracks?client_id=#{client_id}")).body
        parse ? JSON.parse(body, symbolize_names: true) : body
      end

      def client
        @client ||= Net::Hippie::Client.new
      end

      def client_id
        options[:client_id]
      end

      def build_uri(path)
        URI.join("https://api.soundcloud.com", path)
      end

      def resolve(username)
        JSON.parse(client.get(build_uri("/resolve?url=https://soundcloud.com/#{username}&client_id=#{client_id}")).body, symbolize_names: true)
      end
    end
  end
end