audiosearch 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/audiosearch.rb +205 -0
  3. metadata +142 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f48135672343647101342f966247f37cfcf30086
4
+ data.tar.gz: 99a4dc4c7c139b2ec01e89bb5d7d5463d7cb02a0
5
+ SHA512:
6
+ metadata.gz: 51cfcb3319afaf74e9f271aade6b254c60ca843355e9fb230d2eb4607f8e215c71b657b8f08fa0ec97c41af31b73f05032194c4e224a5fd4e6186a87805b7bd8
7
+ data.tar.gz: 14e79de60fe366655764d06bf8b4107d2389ec5b44afc88eda410391cfea63ba6f776485bc1443965a1f4f9775aa5d6c8ea2336bfd52468247dc4c5c88fb8b77
@@ -0,0 +1,205 @@
1
+ # Audiosear.ch Ruby Client
2
+ # Copyright 2015 - Pop Up Archive
3
+ # Licensed under Apache 2 license - see LICENSE file
4
+ #
5
+ #
6
+
7
+ require 'rubygems'
8
+ require 'json'
9
+ require 'faraday_middleware'
10
+ require 'oauth2'
11
+ require 'uri'
12
+
13
+ module Audiosearch
14
+
15
+ module Error
16
+ class NotFound < StandardError
17
+
18
+ end
19
+ end
20
+
21
+ class FaradayErrHandler < Faraday::Response::Middleware
22
+ def on_complete(env)
23
+ # Ignore any non-error response codes
24
+ return if (status = env[:status]) < 400
25
+ #puts "got response status #{status}"
26
+ case status
27
+ when 404
28
+ #raise Error::NotFound
29
+ # 404 errors not fatal
30
+ else
31
+ #puts pp(env)
32
+ super # let parent class deal with it
33
+ end
34
+ end
35
+ end
36
+
37
+ class Client
38
+
39
+ attr_accessor :host
40
+ attr_accessor :debug
41
+ attr_accessor :agent
42
+ attr_accessor :user_agent
43
+ attr_accessor :cookies
44
+ attr_accessor :api_endpoint
45
+ attr_accessor :croak_on_404
46
+
47
+ def version
48
+ return "1.0.0"
49
+ end
50
+
51
+ def initialize(args)
52
+ #puts args.inspect
53
+ @un = args[:username]
54
+ @pw = args[:password]
55
+ @oauth_id = args[:id]
56
+ @oauth_secret = args[:secret]
57
+ @oauth_redir_uri = args[:redir_uri] || 'urn:ietf:wg:oauth:2.0:oob'
58
+ @host = args[:host] || 'https://www.audiosear.ch'
59
+ @debug = args[:debug]
60
+ @user_agent = args[:user_agent] || 'audiosearch-ruby-client/'+version()
61
+ @api_endpoint = args[:api_endpoint] || '/api'
62
+ @croak_on_404 = args[:croak_on_404] || false
63
+
64
+ # normalize host
65
+ @host.gsub!(/\/$/, '')
66
+
67
+ # sanity check
68
+ begin
69
+ uri = URI.parse(@host)
70
+ rescue URI::InvalidURIError => err
71
+ raise "Bad :host value " + err
72
+ end
73
+ if (!uri.host || !uri.port)
74
+ raise "Bad :host value " + @server
75
+ end
76
+
77
+ @agent = get_agent()
78
+
79
+ end
80
+
81
+ def get_oauth_token(options={})
82
+ oauth_options = {
83
+ site: @host + @api_endpoint,
84
+ authorize_url: @host + '/oauth/authorize',
85
+ token_url: @host + '/oauth/token',
86
+ redirect_uri: @oauth_redir_uri,
87
+ connection_opts: options.merge( { :ssl => {:verify => false}, } )
88
+ }
89
+
90
+ # TODO
91
+
92
+ client = OAuth2::Client.new(@oauth_id, @oauth_secret, oauth_options) do |faraday|
93
+ faraday.request :url_encoded
94
+ faraday.response :logger if @debug
95
+ faraday.adapter :excon
96
+ end
97
+
98
+ token = nil
99
+ if @un && @pw
100
+ # TODO 3-legged oauth to @authorize_url
101
+ else
102
+ token = client.client_credentials.get_token()
103
+ end
104
+
105
+ return token
106
+ end
107
+
108
+ def get_agent()
109
+ uri = @host + @api_endpoint
110
+ opts = {
111
+ :url => uri,
112
+ :ssl => {:verify => false},
113
+ :headers => {
114
+ 'User-Agent' => @user_agent,
115
+ 'Accept' => 'application/json',
116
+ 'Cookie' => @cookies
117
+ }
118
+ }
119
+ @token = get_oauth_token
120
+ #puts "token="
121
+ #puts pp(@token)
122
+ conn = Faraday.new(opts) do |faraday|
123
+ faraday.request :url_encoded
124
+ [:mashify, :json].each{|mw| faraday.response(mw) }
125
+ if !@croak_on_404
126
+ faraday.use Audiosearch::FaradayErrHandler
127
+ else
128
+ faraday.response(:raise_error)
129
+ end
130
+ faraday.request :authorization, 'Bearer', @token.token
131
+ faraday.response :logger if @debug
132
+ faraday.adapter :excon # IMPORTANT this is last
133
+ end
134
+
135
+ return conn
136
+ end
137
+
138
+ def get(path, params={})
139
+ resp = @agent.get @api_endpoint + path, params
140
+ @debug and pp(resp)
141
+ return Audiosearch::Response.new resp
142
+ end
143
+
144
+ def get_show(id)
145
+ resp = get('/shows/'+id.to_s)
146
+ return resp.http_resp.body
147
+ end
148
+
149
+ def get_episode(ep_id)
150
+ resp = get('/episodes/'+ep_id.to_s)
151
+ return resp.http_resp.body
152
+ end
153
+
154
+ def search(type, params)
155
+ path = '/search/'+type
156
+ get(path, params)
157
+ end
158
+
159
+ end # end Client
160
+
161
+ # dependent classes
162
+ class Response
163
+
164
+ attr_accessor :http_resp
165
+
166
+ def initialize(http_resp)
167
+ @http_resp = http_resp
168
+
169
+ #warn http_resp.headers.inspect
170
+ #warn "code=" + http_resp.status.to_s
171
+
172
+ @is_ok = false
173
+ if http_resp.status.to_s =~ /^2\d\d/
174
+ @is_ok = true
175
+ end
176
+
177
+ end
178
+
179
+ def status()
180
+ return @http_resp.status
181
+ end
182
+
183
+ def is_success()
184
+ return @is_ok
185
+ end
186
+
187
+ def method_missing(meth, *args, &block)
188
+ if @http_resp.body.respond_to? meth
189
+ @http_resp.body.send(meth, *args, &block)
190
+ else
191
+ super
192
+ end
193
+ end
194
+
195
+ def respond_to?(meth)
196
+ if @http_resp.body.respond_to? meth
197
+ true
198
+ else
199
+ super
200
+ end
201
+ end
202
+
203
+ end # end Response
204
+
205
+ end # end module
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: audiosearch
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter Karman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: excon
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hashie
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: oauth2
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dotenv
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Ruby client for the Audiosear.ch API. See https://www.audiosear.ch/
112
+ email: peter@popuparchive.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - lib/audiosearch.rb
118
+ homepage: https://github.com/popuparchive/audiosearch-client-ruby
119
+ licenses:
120
+ - Apache
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project: nowarning
138
+ rubygems_version: 2.0.14
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Ruby client for the Audiosear.ch API
142
+ test_files: []