vhx-ruby 0.0.7 → 0.0.8

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -1
  3. data/lib/vhx.rb +4 -3
  4. data/lib/vhx/client.rb +6 -3
  5. data/lib/vhx/objects/analytics.rb +9 -0
  6. data/lib/vhx/utilities/vhx_object.rb +2 -2
  7. data/lib/vhx/version.rb +2 -2
  8. data/spec/client_spec.rb +44 -9
  9. data/spec/fixtures/sample_authorization_response.json +19 -0
  10. data/spec/fixtures/sample_collection_response.json +20 -0
  11. data/spec/fixtures/sample_collections_response.json +14 -0
  12. data/spec/fixtures/sample_create_video_response.json +33 -0
  13. data/spec/fixtures/sample_customer_response.json +16 -0
  14. data/spec/fixtures/sample_customers_response.json +28 -0
  15. data/spec/fixtures/sample_files_response.json +16 -0
  16. data/spec/fixtures/sample_product_response.json +30 -0
  17. data/spec/fixtures/sample_products_response.json +14 -0
  18. data/spec/fixtures/sample_video_response.json +47 -31
  19. data/spec/fixtures/sample_videos_response.json +14 -0
  20. data/spec/middleware/error_response_spec.rb +3 -7
  21. data/spec/middleware/oauth2_spec.rb +3 -7
  22. data/spec/objects/analytics_spec.rb +41 -0
  23. data/spec/objects/authorization_spec.rb +58 -0
  24. data/spec/objects/collection_item_spec.rb +53 -0
  25. data/spec/objects/collection_spec.rb +66 -0
  26. data/spec/objects/customer_spec.rb +82 -0
  27. data/spec/objects/product_spec.rb +65 -0
  28. data/spec/objects/site_spec.rb +36 -27
  29. data/spec/objects/user_spec.rb +40 -32
  30. data/spec/objects/video_file_spec.rb +52 -0
  31. data/spec/objects/video_spec.rb +67 -23
  32. data/spec/spec_helper.rb +2 -11
  33. data/spec/utilities/vhx_helper_spec.rb +11 -7
  34. data/spec/utilities/vhx_list_object_spec.rb +27 -0
  35. data/spec/utilities/vhx_object_spec.rb +69 -26
  36. data/vhx.gemspec +4 -4
  37. metadata +59 -66
  38. data/spec/fixtures/sample_package_response.json +0 -185
  39. data/spec/objects/file_spec.rb +0 -29
  40. data/spec/objects/package_spec.rb +0 -74
  41. data/spec/test_data.rb +0 -55
  42. data/spec/utilities/vhx_collection_spec.rb +0 -27
  43. data/spec/vcr/Vhx_Client/application_user/_refresh_access_token/access_token_changed.yml +0 -57
  44. data/spec/vcr/Vhx_Client/application_user/_refresh_access_token/oauth_token_refreshed.yml +0 -57
  45. data/spec/vcr/Vhx_File/associations/are_present.yml +0 -409
  46. data/spec/vcr/Vhx_Middleware_ErrorResponse/unauthorized_user_credentials.yml +0 -122
  47. data/spec/vcr/Vhx_Middleware_OAuth2/access_token_refresh.yml +0 -797
  48. data/spec/vcr/Vhx_Package/_add_video/with_hypermedia/returns_package_object.yml +0 -51
  49. data/spec/vcr/Vhx_Package/_add_video/with_id/returns_package_object.yml +0 -51
  50. data/spec/vcr/Vhx_Package/_create/returns_package_object.yml +0 -140
  51. data/spec/vcr/Vhx_Package/_find/with_hypermedia.yml +0 -243
  52. data/spec/vcr/Vhx_Package/_find/with_id.yml +0 -243
  53. data/spec/vcr/Vhx_Package/_remove_video/with_hypermedia/returns_success.yml +0 -51
  54. data/spec/vcr/Vhx_Package/_remove_video/with_id/returns_success.yml +0 -51
  55. data/spec/vcr/Vhx_Package/associations/are_present.yml +0 -195
  56. data/spec/vcr/Vhx_Site/_create/returns_site_object.yml +0 -91
  57. data/spec/vcr/Vhx_Site/_find/with_hypermedia.yml +0 -195
  58. data/spec/vcr/Vhx_Site/_find/with_id.yml +0 -195
  59. data/spec/vcr/Vhx_User/_find/with_hypermedia.yml +0 -81
  60. data/spec/vcr/Vhx_User/_find/with_id.yml +0 -81
  61. data/spec/vcr/Vhx_User/_me/returns_user_object.yml +0 -720
  62. data/spec/vcr/Vhx_User/_update/returns_user_object.yml +0 -212
  63. data/spec/vcr/Vhx_VhxObject/associations/cache/retreive_if_available.yml +0 -195
  64. data/spec/vcr/Vhx_VhxObject/associations/falls_back_to_links.yml +0 -310
  65. data/spec/vcr/Vhx_Video/_create/returns_video_object.yml +0 -125
  66. data/spec/vcr/Vhx_Video/associations/are_present.yml +0 -294
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a3fc113efc37f664b7f62505bdf410c86ae76cc4
4
- data.tar.gz: 1b04aaa9fe91585a6c3be1e6feb3b6340d2a6ca1
3
+ metadata.gz: 134b9c8e24549b65fe6d38d553c0d786ab86cd55
4
+ data.tar.gz: 608cef9093c267377aa41769e5fd47233f9530a2
5
5
  SHA512:
6
- metadata.gz: ae25bb65da0752a96c67c5ad311f49e7caa10c0fec85c0bd36d34699c4ce4ab0c05d55f2d86b2eb32c94986aa653196cedee138b0fbdbc151f53d2d6f3631692
7
- data.tar.gz: b1282761cb591341d18d68c6de39d03ac4b4e3c09a80c1c281c4601bd0763ef9e24ab12b5eecc357c9db0cebe43eb2cc8ee857aaf19edbddf1346a0775cf5297
6
+ metadata.gz: f6095076d2b38e520bccc62395f64ca787c3b4c32f8a829fbc9e9bd8b393c7d176bae1d6b948abfcbf42db3630f7c824dc9b156481314c782f2fafe364ab31e7
7
+ data.tar.gz: f771ba677ea096b041cc86f251d8b4584e61a7487a3de372c86228b96537db1dd7a39b1c45200e618aef620c5ba4a091e531c1fad66abbdc02713120df88b955
data/README.md CHANGED
@@ -19,7 +19,7 @@ Before requesting your first resource, you must setup an instance of the Vhx Cli
19
19
  vhx = Vhx.setup({ api_key: 'your VHX API key'} )
20
20
  ```
21
21
 
22
- Here's an example of creating a Vhx resource with payload options. You can handle errors by rescuing Vhx::VhxError.
22
+ Here's an example of creating a Vhx resource with payload options. You can handle errors by rescuing Vhx::VhxError.
23
23
 
24
24
  ```ruby
25
25
  begin
@@ -57,3 +57,6 @@ collections
57
57
  * [`retrieve`](http://dev.vhx.tv/docs/api?ruby#retrieve_collection)
58
58
  * [`list`](http://dev.vhx.tv/docs/api?ruby#list_collections)
59
59
  * [`items`](http://dev.vhx.tv/docs/api?ruby#list_collection_items)
60
+
61
+ analytics
62
+ * [`report`](http://dev.vhx.tv/docs/api/?ruby#analytics)
data/lib/vhx.rb CHANGED
@@ -29,6 +29,7 @@ require "vhx/objects/video"
29
29
  require "vhx/objects/video_file"
30
30
  require "vhx/objects/customer"
31
31
  require "vhx/objects/authorization"
32
+ require "vhx/objects/analytics"
32
33
 
33
34
  module Vhx
34
35
  API_BASE_URL = 'https://api.vhx.tv'
@@ -39,7 +40,7 @@ module Vhx
39
40
  options[:client_secret] ||= @client_secret
40
41
  options[:api_key] ||= @api_key
41
42
  options[:api_base] ||= @api_base_url
42
- options[:skip_auto_refresh] = @skip_auto_refresh if options[:skip_auto_refresh].nil?
43
+ options[:auto_refresh] = @auto_refresh || false
43
44
  Vhx.client = Vhx::Client.new(options)
44
45
  end
45
46
 
@@ -47,7 +48,7 @@ module Vhx
47
48
  @client_id = config[:client_id]
48
49
  @client_secret = config[:client_secret]
49
50
  @api_key = config[:api_key]
50
- @skip_auto_refresh = config[:skip_auto_refresh] || false
51
+ @auto_refresh = config[:auto_refresh] || false
51
52
  @api_base_url = config[:api_base]
52
53
  end
53
54
 
@@ -63,4 +64,4 @@ module Vhx
63
64
  client ? client.connection : nil
64
65
  end
65
66
  end
66
- end
67
+ end
data/lib/vhx/client.rb CHANGED
@@ -7,9 +7,9 @@ module Vhx
7
7
  @api_base_url = options[:api_base] || API_BASE_URL
8
8
  @client_id = options[:client_id]
9
9
  @client_secret = options[:client_secret]
10
- @oauth_token = options[:api_key] ? nil : OAuthToken.new(options, refreshed = false)
10
+ @oauth_token = options[:api_key] ? nil : OAuthToken.new(options[:oauth_token], refreshed = false)
11
11
  @api_key = options[:api_key]
12
- @skip_auto_refresh = options[:skip_auto_refresh]
12
+ @auto_refresh = options[:auto_refresh]
13
13
  @ssl = options[:ssl] || {}
14
14
  @headers = {}
15
15
 
@@ -21,7 +21,10 @@ module Vhx
21
21
  faraday.request :url_encoded
22
22
  faraday.request :json
23
23
  faraday.response :logger
24
- faraday.use Vhx::Middleware::OAuth2, :vhx_client => self unless @skip_auto_refresh
24
+
25
+ if @auto_refresh
26
+ faraday.use Vhx::Middleware::OAuth2, :vhx_client => self
27
+ end
25
28
 
26
29
  faraday.adapter Faraday.default_adapter
27
30
 
@@ -0,0 +1,9 @@
1
+ module Vhx
2
+ class Analytics < VhxObject
3
+ def self.report(query_params = {})
4
+ response = Vhx.connection.get("/analytics", query_params)
5
+
6
+ self.new(response.body)
7
+ end
8
+ end
9
+ end
@@ -75,11 +75,11 @@ module Vhx
75
75
  associations = (obj_hash.fetch('_links', {}).keys | obj_hash.fetch('_embedded', {}).keys).select{|k| ASSOCIATION_WHITELIST.include?(k)}
76
76
  associations.each do |association_method|
77
77
  self.class.send(:define_method, association_method) do |payload = {}|
78
- if payload.empty? && obj_hash['_embedded'] && obj_hash['_embedded'].fetch(association_method, []).length > 0
78
+ if payload.empty? && obj_hash['_embedded'] && obj_hash['_embedded'].has_key?(association_method)
79
79
  return instance_variable_set("@#{association_method}", fetch_embedded_association(obj_hash, association_method))
80
80
  end
81
81
 
82
- if obj_hash['_links'] && obj_hash['_links'].fetch(association_method, []).length > 0
82
+ if obj_hash['_links'] && obj_hash['_links'].has_key?(association_method)
83
83
  return instance_variable_set("@#{association_method}", fetch_linked_association(obj_hash, association_method, payload))
84
84
  end
85
85
 
data/lib/vhx/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Vhx
2
- VERSION = "0.0.7"
3
- end
2
+ VERSION = "0.0.8"
3
+ end
data/spec/client_spec.rb CHANGED
@@ -1,20 +1,47 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Vhx::Client, :vcr do
3
+ describe Vhx::Client do
4
+ def application_only_credentials
5
+ {api_key: "-12345"}
6
+ end
7
+
8
+ def application_user_credentials
9
+ {
10
+ client_id: '12345',
11
+ client_secret: '12345',
12
+ oauth_token: {
13
+ access_token: "123456",
14
+ refresh_token: "12345",
15
+ expires_at: 1430330123,
16
+ expires_in: 7200
17
+ }
18
+ }
19
+ end
20
+
4
21
  describe 'faraday configuration' do
5
- subject(:vhx_client){ Vhx::Client.new(application_only_credentials)}
22
+ let(:vhx_client){ Vhx::Client.new(application_only_credentials)}
6
23
 
7
24
  it 'uses custom error response middleware' do
8
25
  expect(vhx_client.connection.builder.handlers).to include(Vhx::Middleware::ErrorResponse)
9
26
  end
10
27
 
28
+ it 'does not utilize oauth2 middleware by default' do
29
+ expect(vhx_client.connection.builder.handlers).to_not include(Vhx::Middleware::OAuth2)
30
+ end
31
+
32
+ it 'utilizes oauth2 middleware if auto_refresh option passed' do
33
+ credentials = application_only_credentials.merge(auto_refresh: true)
34
+ vhx_client = Vhx::Client.new(credentials)
35
+ expect(vhx_client.connection.builder.handlers).to include(Vhx::Middleware::OAuth2)
36
+ end
37
+
11
38
  it 'uses api host' do
12
- expect(vhx_client.connection.url_prefix.host).to eq 'api.crystal.dev'
39
+ expect(vhx_client.connection.url_prefix.host).to eq 'api.vhx.tv'
13
40
  end
14
41
  end
15
42
 
16
43
  context 'application_only' do
17
- subject(:vhx_client){ Vhx::Client.new(application_only_credentials)}
44
+ let(:vhx_client){ Vhx::Client.new(application_only_credentials)}
18
45
 
19
46
  describe 'connection' do
20
47
  it 'initializes faraday connection' do
@@ -32,7 +59,7 @@ describe Vhx::Client, :vcr do
32
59
  end
33
60
 
34
61
  context 'application_user' do
35
- subject(:vhx_client){ Vhx::Client.new(application_user_credentials)}
62
+ let!(:vhx_client){ Vhx::Client.new(application_user_credentials)}
36
63
 
37
64
  it 'oauth_token presence' do
38
65
  expect(vhx_client.oauth_token).to be_an_instance_of(OAuthToken)
@@ -53,17 +80,25 @@ describe Vhx::Client, :vcr do
53
80
  end
54
81
 
55
82
  describe '#refresh_access_token!' do
56
- subject(:oauth_token){ vhx_client.oauth_token }
57
- let!(:original_access_token){ oauth_token.access_token }
58
- before { vhx_client.refresh_access_token! }
83
+ let(:oauth_token){ vhx_client.oauth_token }
59
84
 
60
85
  it 'oauth_token refreshed' do
86
+ new_token_hash = {access_token: '123', refresh_token: '456', expires_in: '3600'}
87
+ new_token_response = OpenStruct.new(body: new_token_hash)
88
+ Faraday::Connection.any_instance.stub(:post).and_return(new_token_response)
89
+ original_access_token = oauth_token.access_token
90
+ vhx_client.refresh_access_token!
61
91
  expect(vhx_client.oauth_token.refreshed).to eq(true)
62
92
  end
63
93
 
64
94
  it 'access_token changed' do
95
+ new_token_hash = {access_token: '123', refresh_token: '456', expires_in: '3600'}
96
+ new_token_response = OpenStruct.new(body: new_token_hash)
97
+ Faraday::Connection.any_instance.stub(:post).and_return(new_token_response)
98
+ original_access_token = oauth_token.access_token
99
+ vhx_client.refresh_access_token!
65
100
  expect(vhx_client.oauth_token.access_token).to_not eq(original_access_token)
66
101
  end
67
102
  end
68
103
  end
69
- end
104
+ end
@@ -0,0 +1,19 @@
1
+ {
2
+ "_links": {
3
+ "customer": {
4
+ "href": "https://api.vhx.tv/customers/1"
5
+ },
6
+ "video": {
7
+ "href": "https://api.vhx.tv/videos/1"
8
+ }
9
+ },
10
+ "token": "QVJ-cavyvwSX6JpafMCX7zsd1wKg2XfDuZnN",
11
+ "expires_at": "2015-11-10T23:46:46Z",
12
+ "player": {
13
+ "host": "https://embed.vhx.tv",
14
+ "path": "/videos/1",
15
+ "html": "<iframe src=\"https://embed.vhx.tv/videos/1?authorization=QVJ-cavyvwSX6JpafMCX7zsd1wKg2XfDuZnN\" width=\"640\" height=\"360\" frameborder=\"0\" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>"
16
+ },
17
+ "created_at": "2015-11-10T22:46:46Z",
18
+ "updated_at": "2015-11-10T22:46:46Z"
19
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/collections/1" },
4
+ "items": { "href": "https://api.vhx.tv/collections/1/items" }
5
+ },
6
+ "id": 1,
7
+ "name": "Comedy",
8
+ "description": "Comedy series and movies.",
9
+ "slug": "comedy",
10
+ "thumbnail": {
11
+ "small": "https://cdn.vhx.tv/assets/thumbnails/default-small.png",
12
+ "medium": "https://cdn.vhx.tv/assets/thumbnails/default-medium.png",
13
+ "large": "https://cdn.vhx.tv/assets/thumbnails/default-large.png",
14
+ "source": "https://cdn.vhx.tv/assets/thumbnails/original.jpg"
15
+ },
16
+ "type": "category",
17
+ "items_count": 10,
18
+ "created_at": "2014-02-25T20:19:30Z",
19
+ "updated_at": "2014-02-25T20:19:30Z"
20
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/collections?page=1&product=:href" },
4
+ "first": { "href": "https://api.vhx.tv/collections?product=:href" },
5
+ "prev": { "href": null },
6
+ "next": { "href": "https://api.vhx.tv/collections?page=2&product=:href" },
7
+ "last": { "href": "https://api.vhx.tv/collections?page=5&product=:href" }
8
+ },
9
+ "count": 100,
10
+ "total": 500,
11
+ "_embedded": {
12
+ "collections": []
13
+ }
14
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/videos/1" },
4
+ "files": { "href": "https://api.vhx.tv/videos/1/files" }
5
+ },
6
+ "_embedded": {
7
+ "files": []
8
+ },
9
+ "id": 1,
10
+ "title": "My Video",
11
+ "description": "My video description.",
12
+ "status": "processing",
13
+ "duration": {
14
+ "seconds": 7200,
15
+ "formatted": "02:00:00"
16
+ },
17
+ "thumbnail": {
18
+ "small": "https://cdn.vhx.tv/assets/thumbnails/default-small.png",
19
+ "medium": "https://cdn.vhx.tv/assets/thumbnails/default-medium.png",
20
+ "large": "https://cdn.vhx.tv/assets/thumbnails/default-large.png",
21
+ "source": "https://cdn.vhx.tv/assets/thumbnails/original.jpg"
22
+ },
23
+ "tracks": {
24
+ "subtitles": []
25
+ },
26
+ "advertising": {},
27
+ "metadata": {
28
+ "advertising_keywords": []
29
+ },
30
+ "files_count": 0,
31
+ "created_at": "2014-02-25T20:19:30Z",
32
+ "updated_at": "2014-02-25T20:19:30Z"
33
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/customers/1" },
4
+ "watchlist": { "href": "https://api.vhx.tv/customers/1/watchlist" },
5
+ "watching": { "href": "https://api.vhx.tv/customers/1/watching" },
6
+ "products": { "href": "https://api.vhx.tv/products/1" }
7
+ },
8
+ "_embedded": {
9
+ "products": []
10
+ },
11
+ "id": 1,
12
+ "name": "First Last",
13
+ "email": "customer@email.com",
14
+ "created_at": "2014-02-25T20:19:30Z",
15
+ "updated_at": "2014-02-25T20:19:30Z"
16
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/customers?page=1&query=term" },
4
+ "first": { "href": "https://api.vhx.tv/customers?query=term" },
5
+ "prev": { "href": null },
6
+ "next": { "href": "https://api.vhx.tv/customers?page=2&query=term" },
7
+ "last": { "href": "https://api.vhx.tv/customers?page=5&query=term" }
8
+ },
9
+ "count": 100,
10
+ "total": 500,
11
+ "_embedded": {
12
+ "customers": [
13
+ {
14
+ "_links": {
15
+ "self": { "href": "https://api.vhx.tv/customers/1" },
16
+ "watchlist": { "href": "https://api.vhx.tv/customers/1/watchlist" },
17
+ "watching": { "href": "https://api.vhx.tv/customers/1/watching" }
18
+ },
19
+ "_embedded": {},
20
+ "id": 1,
21
+ "name": "First Last",
22
+ "email": "customer@email.com",
23
+ "created_at": "2014-02-25T20:19:30Z",
24
+ "updated_at": "2014-02-25T20:19:30Z"
25
+ }
26
+ ]
27
+ }
28
+ }
@@ -0,0 +1,16 @@
1
+ [{
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/videos/1/files?quality=adaptive&format=m3u8" },
4
+ "source": { "href": "https://video.vhx.tv/mymovie/adaptive.m3u8?token=f4v3v3i4c2o209_3" }
5
+ },
6
+ "quality": "adaptive",
7
+ "format": "m3u8",
8
+ "method": "hls",
9
+ "size": {
10
+ "bytes": 1073741824,
11
+ "formatted": "1 GB"
12
+ },
13
+ "mime_type": "application/x-mpegURL",
14
+ "created_at": "2014-02-25T20:19:30Z",
15
+ "updated_at": "2014-02-25T20:19:30Z"
16
+ }]
@@ -0,0 +1,30 @@
1
+ {
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/products/1" },
4
+ "collections": { "href": "https://api.vhx.tv/collections?product=:href" },
5
+ "customers": { "href": "https://api.vhx.tv/customers?product=:href" }
6
+ },
7
+ "_embedded": {},
8
+ "id": 1,
9
+ "name": "Subscription NOW",
10
+ "description": "Subscribe to Subscription NOW today!",
11
+ "thumbnail": {},
12
+ "price": {
13
+ "monthly": {
14
+ "cents": 800,
15
+ "currency": "USD",
16
+ "formatted": "$8"
17
+ },
18
+ "yearly": {
19
+ "cents": 6500,
20
+ "currency": "USD",
21
+ "formatted": "$65"
22
+ }
23
+ },
24
+ "is_active": true,
25
+ "series_count": 100,
26
+ "movies_count": 100,
27
+ "playlists_count": 100,
28
+ "created_at": "2014-02-25T20:19:30Z",
29
+ "updated_at": "2014-02-25T20:19:30Z"
30
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "_links": {
3
+ "self": { "href": "https://api.vhx.tv/products?page=1&query=term" },
4
+ "first": { "href": "https://api.vhx.tv/products?query=term" },
5
+ "prev": { "href": null },
6
+ "next": { "href": "https://api.vhx.tv/products?page=2&query=term" },
7
+ "last": { "href": "https://api.vhx.tv/products?page=5&query=term" }
8
+ },
9
+ "count": 100,
10
+ "total": 500,
11
+ "_embedded": {
12
+ "products": []
13
+ }
14
+ }
@@ -1,35 +1,24 @@
1
1
  {
2
2
  "_links": {
3
- "self": { "href": "http://api.crystal.dev/videos/1" },
4
- "site": { "href": "http://api.crystal.dev/sites/1" },
5
- "files": { "href": "http://api.crystal.dev/videos/1/files" }
3
+ "self": { "href": "https://api.vhx.tv/videos/1" },
4
+ "files": { "href": "https://api.vhx.tv/videos/1/files" }
6
5
  },
7
6
  "_embedded": {
8
- "site": {},
9
- "subtitles": [{
10
- "_links": {
11
- "self": { "href": "http://cdn.crystal.dev/assets/spanish.srt" },
12
- "video": { "href": "http://api.crystal.dev/videos/1" },
13
- "site": { "href": "http://api.crystal.dev/sites/1" }
14
- },
15
- "language": "Spanish",
16
- "type": "srt"
17
- }],
18
- "files": [{
19
- "_links": {
20
- "self": { "href": "http://api.crystal.dev/videos/1/files?quality=adaptive&format=m3u8" },
21
- "video": { "href": "http://api.crystal.dev/videos/1" },
22
- "site": { "href": "http://api.crystal.dev/sites/1" }
23
- },
24
- "quality": "adaptive",
25
- "format": "m3u8",
26
- "method": "hls",
27
- "size": {
28
- "bytes": 1073741824,
29
- "formatted": "1 GB"
30
- },
31
- "mime_type": "application/x-mpegURL"
32
- }]
7
+ "files": [
8
+ {
9
+ "_links": {
10
+ "self": { "href": "https://api.vhx.tv/videos/1/files?quality=adaptive&format=m3u8" }
11
+ },
12
+ "quality": "adaptive",
13
+ "format": "m3u8",
14
+ "method": "hls",
15
+ "size": {
16
+ "bytes": 1073741824,
17
+ "formatted": "1 GB"
18
+ },
19
+ "mime_type": "application/x-mpegURL"
20
+ }
21
+ ]
33
22
  },
34
23
  "id": 1,
35
24
  "title": "My Video",
@@ -42,10 +31,37 @@
42
31
  "thumbnail": {
43
32
  "small": "https://cdn.vhx.tv/assets/thumbnails/default-small.png",
44
33
  "medium": "https://cdn.vhx.tv/assets/thumbnails/default-medium.png",
45
- "large": "https://cdn.vhx.tv/assets/thumbnails/default-large.png"
34
+ "large": "https://cdn.vhx.tv/assets/thumbnails/default-large.png",
35
+ "source": "https://cdn.vhx.tv/assets/thumbnails/original.jpg"
36
+ },
37
+ "tracks": {
38
+ "subtitles": [
39
+ {
40
+ "_links": {
41
+ "srt": { "href": "https://cdn.vhx.tv/file.srt" },
42
+ "vtt": { "href": "https://cdn.vhx.tv/file.vtt" }
43
+ },
44
+ "label": "English",
45
+ "srclang": "en",
46
+ "kind": "subtitles"
47
+ }
48
+ ]
49
+ },
50
+ "advertising": {
51
+ "_links": {
52
+ "tag": { "href": "https://static.vhx.tv/vmap.xml" }
53
+ },
54
+ "client": "vmap",
55
+ "provider": "dfp"
56
+ },
57
+ "metadata": {
58
+ "series_name": "Series Name",
59
+ "season_name": "Season 1",
60
+ "season_number": 1,
61
+ "episode_number": 5,
62
+ "advertising_keywords": []
46
63
  },
47
- "subtitles_count": 3,
48
64
  "files_count": 5,
49
65
  "created_at": "2014-02-25T20:19:30Z",
50
66
  "updated_at": "2014-02-25T20:19:30Z"
51
- }
67
+ }