audiosearch 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []