episodic-platform 0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +35 -0
- data/PostInstall.txt +7 -0
- data/README.rdoc +86 -0
- data/Rakefile +45 -0
- data/lib/episodic/platform.rb +82 -0
- data/lib/episodic/platform/analytics_methods.rb +190 -0
- data/lib/episodic/platform/base.rb +64 -0
- data/lib/episodic/platform/collection_response.rb +45 -0
- data/lib/episodic/platform/connection.rb +305 -0
- data/lib/episodic/platform/exceptions.rb +105 -0
- data/lib/episodic/platform/query_methods.rb +721 -0
- data/lib/episodic/platform/response.rb +94 -0
- data/lib/episodic/platform/write_methods.rb +446 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/fixtures/1-0.mp4 +0 -0
- data/test/fixtures/create-episode-response-s3.xml +15 -0
- data/test/fixtures/create-episode-response.xml +3 -0
- data/test/fixtures/episodes-response.xml +408 -0
- data/test/fixtures/episodes-summary-report-response.xml +4 -0
- data/test/fixtures/invalid-param-response-multiple.xml +8 -0
- data/test/fixtures/invalid-param-response-single.xml +9 -0
- data/test/fixtures/playlists-response.xml +611 -0
- data/test/fixtures/shows-response.xml +26 -0
- data/test/test_analytics_requests.rb +42 -0
- data/test/test_analytics_responses.rb +14 -0
- data/test/test_connection.rb +31 -0
- data/test/test_error_responses.rb +29 -0
- data/test/test_helper.rb +8 -0
- data/test/test_query_requests.rb +62 -0
- data/test/test_query_responses.rb +165 -0
- data/test/test_write_requests.rb +56 -0
- data/test/test_write_responses.rb +24 -0
- metadata +135 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
PostInstall.txt
|
4
|
+
README.rdoc
|
5
|
+
Rakefile
|
6
|
+
lib/episodic/platform.rb
|
7
|
+
lib/episodic/platform/analytics_methods.rb
|
8
|
+
lib/episodic/platform/base.rb
|
9
|
+
lib/episodic/platform/collection_response.rb
|
10
|
+
lib/episodic/platform/connection.rb
|
11
|
+
lib/episodic/platform/exceptions.rb
|
12
|
+
lib/episodic/platform/query_methods.rb
|
13
|
+
lib/episodic/platform/response.rb
|
14
|
+
lib/episodic/platform/write_methods.rb
|
15
|
+
script/console
|
16
|
+
script/destroy
|
17
|
+
script/generate
|
18
|
+
test/fixtures/1-0.mp4
|
19
|
+
test/fixtures/create-episode-response-s3.xml
|
20
|
+
test/fixtures/create-episode-response.xml
|
21
|
+
test/fixtures/episodes-response.xml
|
22
|
+
test/fixtures/episodes-summary-report-response.xml
|
23
|
+
test/fixtures/invalid-param-response-multiple.xml
|
24
|
+
test/fixtures/invalid-param-response-single.xml
|
25
|
+
test/fixtures/playlists-response.xml
|
26
|
+
test/fixtures/shows-response.xml
|
27
|
+
test/test_analytics_requests.rb
|
28
|
+
test/test_analytics_responses.rb
|
29
|
+
test/test_connection.rb
|
30
|
+
test/test_error_responses.rb
|
31
|
+
test/test_helper.rb
|
32
|
+
test/test_query_requests.rb
|
33
|
+
test/test_query_responses.rb
|
34
|
+
test/test_write_requests.rb
|
35
|
+
test/test_write_responses.rb
|
data/PostInstall.txt
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
= Episodic Platform SDK for Ruby
|
2
|
+
|
3
|
+
* http://github.com/episodic/episodic-platform-ruby
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
Ruby client library for Episodic's Platform REST API
|
8
|
+
|
9
|
+
For more information about Episodic's Platform API see {http://app.episodic.com/help/server_api}[http://app.episodic.com/help/server_api]
|
10
|
+
|
11
|
+
Rdocs are located at {http://episodic.github.com/episodic-platform-ruby/doc/index.html}[http://episodic.github.com/episodic-platform-ruby/doc/index.html]
|
12
|
+
|
13
|
+
== GETTING STARTED:
|
14
|
+
|
15
|
+
To get started you need to require 'episodic/platform':
|
16
|
+
|
17
|
+
require 'episodic/platform'
|
18
|
+
|
19
|
+
Before you can use any of the object methods, you need to create a connection using <tt>Base.establish_connection!</tt>. The
|
20
|
+
<tt>Base.establish_connection!</tt> method requires that you pass your Episodic API Key and Episodic Secret Key.
|
21
|
+
|
22
|
+
Episodic::Platform::Base.establish_connection!('my_api_key', 'my_secret_key')
|
23
|
+
|
24
|
+
After establishing a connection you can call any of the methods in the <tt>Episodic::Platform::QueryMehtods</tt>, <tt>Episodic::Platform::WriteMehtods</tt>
|
25
|
+
or <tt>Episodic::Platform::AnaylticsMehtods</tt>. Generally these methods will return some subclass of <tt>Episodic::Platform::Response</tt> which
|
26
|
+
contains the parsed response. However, you can also access the XML response body directly by calling <tt>response.xml</tt>.
|
27
|
+
|
28
|
+
== SAMPLE USAGE:
|
29
|
+
|
30
|
+
To query for a list of episodes:
|
31
|
+
|
32
|
+
response = Episodic::Platform::QueryMethods.episodes({:show_id => "12345678", search_term => "fun", :status => "on_the_air", :sort_by => "air_date"})
|
33
|
+
|
34
|
+
puts "There are a total of #{response.total} episodes matching the query"
|
35
|
+
|
36
|
+
# For each episode display the episode's name and embed code for the default player.
|
37
|
+
response.episodes.each do |episode|
|
38
|
+
puts episode.name
|
39
|
+
default_player = episode.players.detect {|p| p.default}
|
40
|
+
puts default_player.embed_code
|
41
|
+
end
|
42
|
+
|
43
|
+
To create a new episode:
|
44
|
+
|
45
|
+
# Create the episode and tell Episodic about the video file and thumbnail file to use
|
46
|
+
response = ::Episodic::Platform::WriteMethods.create_episode("oz04s1q0i29t", "My Episode", {:air_date => Time.now + 1.week, :upload_types => "s3", :video_filename => "my_video.mp4", :thumbnail_filename => "my_thumb.png"})
|
47
|
+
|
48
|
+
# Now upload the video and thumbnail. It is best to upload the thumbnail first since it is usually smaller.
|
49
|
+
::Episodic::Platform::WriteMethods.upload_file_for_episode(response.upload_for_filepath("/home/viceos/my_thumb.png"))
|
50
|
+
::Episodic::Platform::WriteMethods.upload_file_for_episode(response.upload_for_filepath("/home/viceos/my_video.mp4"))
|
51
|
+
|
52
|
+
== HANDLING ERRORS:
|
53
|
+
|
54
|
+
Any errors returned from the Episodic Platform API are converted to exceptions and raised from the called method. For example,
|
55
|
+
the following response would cause <tt>Episodic::Platform::InvalidAPIKey</tt> to be raised.
|
56
|
+
|
57
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
58
|
+
<error>
|
59
|
+
<code>1</code>
|
60
|
+
<message>Invalid API Key</message>
|
61
|
+
</error>
|
62
|
+
|
63
|
+
== LICENSE:
|
64
|
+
|
65
|
+
(The MIT License)
|
66
|
+
|
67
|
+
Copyright (c) 2010 Episodic, Inc.
|
68
|
+
|
69
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
70
|
+
a copy of this software and associated documentation files (the
|
71
|
+
'Software'), to deal in the Software without restriction, including
|
72
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
73
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
74
|
+
permit persons to whom the Software is furnished to do so, subject to
|
75
|
+
the following conditions:
|
76
|
+
|
77
|
+
The above copyright notice and this permission notice shall be
|
78
|
+
included in all copies or substantial portions of the Software.
|
79
|
+
|
80
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
81
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
82
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
83
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
84
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
85
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
86
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'hoe', '>= 2.1.0'
|
3
|
+
require 'hoe'
|
4
|
+
require 'fileutils'
|
5
|
+
require './lib/episodic/platform'
|
6
|
+
|
7
|
+
Hoe.plugin :newgem
|
8
|
+
# Hoe.plugin :website
|
9
|
+
# Hoe.plugin :cucumberfeatures
|
10
|
+
|
11
|
+
# Generate all the Rake tasks
|
12
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
13
|
+
$hoe = Hoe.spec 'episodic-platform' do
|
14
|
+
self.developer 'Randy Simon', 'support@episodic.com'
|
15
|
+
self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
|
16
|
+
self.rubyforge_name = self.name # TODO this is default value
|
17
|
+
self.version = '0.9'
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'newgem/tasks'
|
22
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
23
|
+
|
24
|
+
gem 'rdoc'
|
25
|
+
gem 'hanna'
|
26
|
+
require 'rake/rdoctask'
|
27
|
+
require 'hanna/rdoctask'
|
28
|
+
|
29
|
+
desc 'Generate RDoc documentation'
|
30
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
31
|
+
# rdoc.rdoc_files.include('README.rdoc', 'LICENSE', 'CHANGELOG').
|
32
|
+
# include('lib/**/*.rb').
|
33
|
+
## exclude('lib/will_paginate/named_scope*').
|
34
|
+
|
35
|
+
rdoc.main = "README.rdoc" # page to start on
|
36
|
+
rdoc.title = "Episodic Platform GEM documentation"
|
37
|
+
|
38
|
+
rdoc.rdoc_dir = 'doc' # rdoc output folder
|
39
|
+
# rdoc.options << '--webcvs=http://github.com/mislav/will_paginate/tree/master/'
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# TODO - want other tests/tasks run by default? Add them to the list
|
44
|
+
# remove_task :default
|
45
|
+
# task :default => [:spec, :features]
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'digest/sha1'
|
3
|
+
require 'digest/md5'
|
4
|
+
require 'net/http'
|
5
|
+
require 'uri'
|
6
|
+
require 'zlib'
|
7
|
+
|
8
|
+
def require_library_or_gem(library, gem_name = nil)
|
9
|
+
if RUBY_VERSION >= '1.9'
|
10
|
+
gem(gem_name || library, '>=0')
|
11
|
+
end
|
12
|
+
require library
|
13
|
+
rescue LoadError => library_not_installed
|
14
|
+
begin
|
15
|
+
require 'rubygems'
|
16
|
+
require library
|
17
|
+
rescue LoadError
|
18
|
+
raise library_not_installed
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
23
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
24
|
+
require_library_or_gem 'curb' unless defined? Curb
|
25
|
+
require_library_or_gem 'xmlsimple', 'xml-simple' unless defined? XmlSimple
|
26
|
+
require_library_or_gem 'hanna', 'mislav-hanna' unless defined? Hanna
|
27
|
+
|
28
|
+
class Class # :nodoc:
|
29
|
+
def cattr_reader(*syms)
|
30
|
+
syms.flatten.each do |sym|
|
31
|
+
class_eval(<<-EOS, __FILE__, __LINE__)
|
32
|
+
unless defined? @@#{sym}
|
33
|
+
@@#{sym} = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.#{sym}
|
37
|
+
@@#{sym}
|
38
|
+
end
|
39
|
+
|
40
|
+
def #{sym}
|
41
|
+
@@#{sym}
|
42
|
+
end
|
43
|
+
EOS
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def cattr_writer(*syms)
|
48
|
+
syms.flatten.each do |sym|
|
49
|
+
class_eval(<<-EOS, __FILE__, __LINE__)
|
50
|
+
unless defined? @@#{sym}
|
51
|
+
@@#{sym} = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.#{sym}=(obj)
|
55
|
+
@@#{sym} = obj
|
56
|
+
end
|
57
|
+
|
58
|
+
def #{sym}=(obj)
|
59
|
+
@@#{sym} = obj
|
60
|
+
end
|
61
|
+
EOS
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def cattr_accessor(*syms)
|
66
|
+
cattr_reader(*syms)
|
67
|
+
cattr_writer(*syms)
|
68
|
+
end
|
69
|
+
end if Class.instance_methods(false).grep(/^cattr_(?:reader|writer|accessor)$/).empty?
|
70
|
+
|
71
|
+
require 'platform/exceptions'
|
72
|
+
require 'platform/response'
|
73
|
+
require 'platform/collection_response'
|
74
|
+
require 'platform/connection'
|
75
|
+
require 'platform/base'
|
76
|
+
require 'platform/analytics_methods'
|
77
|
+
require 'platform/query_methods'
|
78
|
+
require 'platform/write_methods'
|
79
|
+
|
80
|
+
Episodic::Platform::Base.class_eval do
|
81
|
+
include Episodic::Platform::Connection::Management
|
82
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
module Episodic #:nodoc:
|
2
|
+
|
3
|
+
module Platform
|
4
|
+
|
5
|
+
#
|
6
|
+
# Class for making requests against the Episodic Platform Analytics API.
|
7
|
+
#
|
8
|
+
class AnalyticsMethods < Base
|
9
|
+
|
10
|
+
class << self
|
11
|
+
|
12
|
+
#
|
13
|
+
# Fetches a previously generated report.
|
14
|
+
#
|
15
|
+
# ==== Parameters
|
16
|
+
#
|
17
|
+
# report_token<String>:: This is the value returned from one of the report generation methods.
|
18
|
+
#
|
19
|
+
# ==== Returns
|
20
|
+
#
|
21
|
+
# String:: The contents of the report.
|
22
|
+
#
|
23
|
+
def get_report token
|
24
|
+
params = {
|
25
|
+
:report_token => token,
|
26
|
+
}
|
27
|
+
|
28
|
+
response = connection.do_get(construct_url("analytics", "get_report"), params)
|
29
|
+
|
30
|
+
return response.body
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Generates a report for all episodes in a show. The report will contain information such as
|
35
|
+
# the total views, complete views, downloads, etc for each episode in the show.
|
36
|
+
#
|
37
|
+
# It is important to note that this method just generates the report and returns a token
|
38
|
+
# that can be used to get the report by calling <tt>Episodic::Platform::AnalyticsMethods.get_report</tt>.
|
39
|
+
#
|
40
|
+
# ==== Parameters
|
41
|
+
#
|
42
|
+
# show_id<String>:: The id of the show that contains your episodes. To get a list of your
|
43
|
+
# shows see <tt>Episodic::Platform::QueryMethods.show</tt>.
|
44
|
+
# date_range<String>:: Specifies period of your report. The value of this parameter must be one
|
45
|
+
# of 'today', 'last_seven', 'last_thirty'.
|
46
|
+
# date_grouping<String>:: Must be one of 'daily' or 'aggregate' to list the data by day or just a total
|
47
|
+
# for the entire period respectively.
|
48
|
+
# format<String>:: The format parameter is required and must be one of 'csv' or 'xml'.
|
49
|
+
#
|
50
|
+
# ==== Returns
|
51
|
+
#
|
52
|
+
# Episodic::Platform::TokenResponse:: This response object includes a token that can be used to
|
53
|
+
# actually get the report by calling <tt>Episodic::Platform::AnalyticsMethods.get_report</tt>.
|
54
|
+
#
|
55
|
+
def episodes_summary_report show_id, date_range, date_grouping, format
|
56
|
+
|
57
|
+
params = {
|
58
|
+
:show_id => show_id,
|
59
|
+
:date_range => date_range,
|
60
|
+
:date_grouping => date_grouping,
|
61
|
+
:format => format
|
62
|
+
}
|
63
|
+
|
64
|
+
response = connection.do_get(construct_url("analytics", "request_episodes_summary_report"), params)
|
65
|
+
|
66
|
+
# Convert to a hash
|
67
|
+
return parse_token_response(response)
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Generates a report for a specific episode in a show. The report will contain information
|
72
|
+
# such as the total views, complete views, downloads, etc for each episode in the show.
|
73
|
+
#
|
74
|
+
# It is important to note that this method just generates the report and returns a token
|
75
|
+
# that can be used to get the report by calling <tt>Episodic::Platform::AnalyticsMethods.get_report</tt>.
|
76
|
+
#
|
77
|
+
# ==== Parameters
|
78
|
+
#
|
79
|
+
# show_id<String>:: The id of the show that contains your episodes. To get a list of your
|
80
|
+
# shows see <tt>Episodic::Platform::QueryMethods.show</tt>.
|
81
|
+
# episode_id<String>:: The id of the episodes to generate the report for. To get a list of your
|
82
|
+
# episodes see <tt>Episodic::Platform::QueryMethods.episodes</tt>.
|
83
|
+
# date_range<String>:: Specifies period of your report. The value of this parameter must be one
|
84
|
+
# of 'today', 'last_seven', 'last_thirty'.
|
85
|
+
# format<String>:: The format parameter is required and must be one of 'csv' or 'xml'.
|
86
|
+
#
|
87
|
+
# ==== Returns
|
88
|
+
#
|
89
|
+
# Episodic::Platform::TokenResponse:: This response object includes a token that can be used to
|
90
|
+
# actually get the report by calling <tt>Episodic::Platform::AnalyticsMethods.get_report</tt>.
|
91
|
+
#
|
92
|
+
def episode_daily_report show_id, episode_id, date_range, format
|
93
|
+
|
94
|
+
params = {
|
95
|
+
:show_id => show_id,
|
96
|
+
:date_range => date_range,
|
97
|
+
:id => episode_id,
|
98
|
+
:format => format
|
99
|
+
}
|
100
|
+
|
101
|
+
response = connection.do_get(construct_url("analytics", "request_episode_daily_report"), params)
|
102
|
+
|
103
|
+
# Convert to a hash
|
104
|
+
return parse_token_response(response)
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
# Generates a report for all campaigns in a specific show. The report will contain information
|
109
|
+
# such as the total views, complete views, downloads, click throughs, etc for each campaign in the show.
|
110
|
+
#
|
111
|
+
# It is important to note that this method just generates the report and returns a token
|
112
|
+
# that can be used to get the report by calling <tt>Episodic::Platform::AnalyticsMethods.get_report</tt>.
|
113
|
+
#
|
114
|
+
# ==== Parameters
|
115
|
+
#
|
116
|
+
# show_id<String>:: The id of the show that contains your campaigns. To get a list of your
|
117
|
+
# shows see <tt>Episodic::Platform::QueryMethods.show</tt>.
|
118
|
+
# date_range<String>:: Specifies period of your report. The value of this parameter must be one
|
119
|
+
# of 'today', 'last_seven', 'last_thirty'.
|
120
|
+
# format<String>:: The format parameter is required and must be one of 'csv' or 'xml'.
|
121
|
+
#
|
122
|
+
# ==== Returns
|
123
|
+
#
|
124
|
+
# Episodic::Platform::TokenResponse:: This response object includes a token that can be used to
|
125
|
+
# actually get the report by calling <tt>Episodic::Platform::AnalyticsMethods.get_report</tt>.
|
126
|
+
#
|
127
|
+
def campaigns_daily_report show_id, date_range, format
|
128
|
+
|
129
|
+
params = {
|
130
|
+
:show_id => show_id,
|
131
|
+
:date_range => date_range,
|
132
|
+
:format => format
|
133
|
+
}
|
134
|
+
|
135
|
+
response = connection.do_get(construct_url("analytics", "request_campaigns_daily_report"), params)
|
136
|
+
|
137
|
+
# Convert to a hash
|
138
|
+
return parse_token_response(response)
|
139
|
+
end
|
140
|
+
|
141
|
+
protected
|
142
|
+
|
143
|
+
#
|
144
|
+
# Method factored out to make unit testing easier. This method simply creates the <tt>::Episodic::Platform::TokenResponse</tt>
|
145
|
+
# object.
|
146
|
+
#
|
147
|
+
# ==== Parameters
|
148
|
+
#
|
149
|
+
# response<Episodic::Platform::HTTPResponse>:: The response from any token request
|
150
|
+
#
|
151
|
+
# ==== Returns
|
152
|
+
#
|
153
|
+
# ::Episodic::Platform::TokenResponse:: The parsed response.
|
154
|
+
#
|
155
|
+
def parse_token_response response
|
156
|
+
return TokenResponse.new(response)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
#
|
162
|
+
# All token request methods have a similar response structure. This class extends <tt>Episodic::Platform::Response</tt>
|
163
|
+
# and adds a method to get the token of the generated report.
|
164
|
+
#
|
165
|
+
class TokenResponse < Response
|
166
|
+
|
167
|
+
#
|
168
|
+
# Constructor
|
169
|
+
#
|
170
|
+
# ==== Parameters
|
171
|
+
#
|
172
|
+
# response<Episodic::Platform::HTTPResponse>:: The response object returned from an Episodic Platform API request.
|
173
|
+
#
|
174
|
+
def initialize response
|
175
|
+
super(response, "ForceArray" => false)
|
176
|
+
end
|
177
|
+
|
178
|
+
#
|
179
|
+
# Get the token used to request the generated report. This token is passed to
|
180
|
+
# <tt>Episodic::Platform::AnalyticsMethods.get_report</tt>.
|
181
|
+
#
|
182
|
+
def token
|
183
|
+
return @parsed_body["report_token"]
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|