hyrax-iiif_av 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7175259d686db59f6e4d217489dc482160627417
4
- data.tar.gz: 625d46c52ad2e322f43404ce59d463e2a2fa66a1
3
+ metadata.gz: 1048d5bad3dcabb9cfbaa7617e7ac7e325e650bf
4
+ data.tar.gz: b53798072660f48f69438f5569eb8b51451c8b7e
5
5
  SHA512:
6
- metadata.gz: 84d57cae07a601937a22832fe3591b3303de66f766bdc1fafec4a03f7baa588761c7c28f271650918d9c90da6444d2f2476fb12c85a1a66c78c9a3a39b6b9eb1
7
- data.tar.gz: c5f7569a394a53b5de49406402cb30d3d26cd741a97b3a0810651726e9f9ecf8f1ac2f406869d7ba3b0f2b1c2b7e8225baaa5f4435ca04012bcf25c74ced2aaa
6
+ metadata.gz: 7f9759d67ab956c8aa7e2b1f09efe2ba53c17e9922c45d2317b4f2248a14d6503a6587231d113b6daf3ce85228be9bf3b4e3df6d3f60f41f33fcedd8d66398c9
7
+ data.tar.gz: 9cf31dba99e9c3c2b646c08f06889b4d55c625752f7dcce859b4b654a453e57977da2afed310b0875ac5f835d868836559431d0a3d4100380fa90a9e46f37d62
@@ -24,7 +24,6 @@ module Hyrax
24
24
 
25
25
  included do
26
26
  prepend_view_path(Hyrax::IiifAv::Engine.view_path)
27
- helper Hyrax::IiifAv::IiifAvHelper
28
27
  end
29
28
 
30
29
  IIIF_PRESENTATION_2_MIME = 'application/json;profile=http://iiif.io/api/presentation/2/context.json'
@@ -76,18 +76,12 @@ module Hyrax
76
76
 
77
77
  def video_content
78
78
  # @see https://github.com/samvera-labs/iiif_manifest
79
- if solr_document['derivatives_metadata_ssi'].present?
80
- files_metadata = JSON.parse(solr_document['derivatives_metadata_ssi'])
81
- external_files = files_metadata.select { |f| f['external_file_uri'].present? }
82
- unless external_files.empty?
83
- return external_files.map do |f|
84
- uri = URI(f['external_file_uri'])
85
- uri = URI.join(request.base_url, uri) if uri.relative?
86
- video_display_content(uri, f['label'])
87
- end
88
- end
79
+ streams = stream_urls
80
+ if streams.present?
81
+ streams.collect { |label, url| video_display_content(url, label) }
82
+ else
83
+ [video_display_content(download_path('mp4'), 'mp4'), video_display_content(download_path('webm'), 'webm')]
89
84
  end
90
- [video_display_content(download_path('mp4'), 'mp4'), video_display_content(download_path('webm'), 'webm')]
91
85
  end
92
86
 
93
87
  def video_display_content(url, label = '')
@@ -100,12 +94,12 @@ module Hyrax
100
94
  end
101
95
 
102
96
  def audio_content
103
- if solr_document['derivatives_metadata_ssi'].present?
104
- files_metadata = JSON.parse(solr_document['derivatives_metadata_ssi'])
105
- external_files = files_metadata.select { |f| f['external_file_uri'].present? }
106
- return external_files.map { |f| audio_display_content(f['external_file_uri'], f['label']) } unless external_files.empty?
97
+ streams = stream_urls
98
+ if streams.present?
99
+ streams.collect { |label, url| audio_display_content(url, label) }
100
+ else
101
+ [audio_display_content(download_path('ogg'), 'ogg'), audio_display_content(download_path('mp3'), 'mp3')]
107
102
  end
108
- [audio_display_content(download_path('ogg'), 'ogg'), audio_display_content(download_path('mp3'), 'mp3')]
109
103
  end
110
104
 
111
105
  def audio_display_content(url, label = '')
@@ -118,6 +112,22 @@ module Hyrax
118
112
  def download_path(extension)
119
113
  Hyrax::Engine.routes.url_helpers.download_url(solr_document, file: extension, host: request.base_url)
120
114
  end
115
+
116
+ def stream_urls
117
+ return {} unless solr_document['derivatives_metadata_ssi'].present?
118
+ files_metadata = JSON.parse(solr_document['derivatives_metadata_ssi'])
119
+ file_locations = files_metadata.select { |f| f['file_location_uri'].present? }
120
+ streams = {}
121
+ if file_locations.present?
122
+ file_locations.each do |f|
123
+ streams[f['label']] = Hyrax::IiifAv.config.iiif_av_url_builder.call(
124
+ f['file_location_uri'],
125
+ request.base_url
126
+ )
127
+ end
128
+ end
129
+ streams
130
+ end
121
131
  end
122
132
  end
123
133
  end
@@ -36,14 +36,11 @@ module Hyrax
36
36
  (representative_presenter.image? && Hyrax.config.iiif_image_server?))
37
37
  end
38
38
 
39
- alias universal_viewer? iiif_viewer?
40
- # deprecation_deprecate universal_viewer?: "use iiif_viewer? instead"
41
-
42
39
  def iiif_viewer
43
40
  if representative_presenter.video? || representative_presenter.audio?
44
41
  :avalon
45
- elsif representative_presenter.image?
46
- :universal_viewer
42
+ else
43
+ super
47
44
  end
48
45
  end
49
46
 
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.add_dependency "rails", "~>5.1"
23
23
  s.add_dependency "blacklight"
24
- s.add_dependency "hyrax", "~> 2.1"
24
+ s.add_dependency "hyrax", "~> 2.4"
25
25
  s.add_dependency "iiif_manifest", "~> 0.5"
26
26
 
27
27
  s.add_development_dependency 'bixby'
@@ -20,4 +20,4 @@ limitations under the License.
20
20
  <%= javascript_pack_tag 'application' %>
21
21
  <%= stylesheet_pack_tag 'application' %>
22
22
  <% end %>
23
- <%= react_component("AvalonIiifPlayer", { manifestUrl: main_app.polymorphic_path([main_app, :manifest, presenter], { locale: nil }) }) %>
23
+ <%= react_component("AvalonIiifPlayer", { manifestUrl: main_app.polymorphic_url([main_app, :manifest, presenter], { locale: nil }) }) %>
@@ -3,6 +3,25 @@ require "hyrax/iiif_av/engine"
3
3
 
4
4
  module Hyrax
5
5
  module IiifAv
6
- # Your code goes here...
6
+ extend ActiveSupport::Autoload
7
+
8
+ eager_autoload do
9
+ autoload :Configuration
10
+ end
11
+
12
+ # @api public
13
+ #
14
+ # Exposes the Hyrax configuration
15
+ #
16
+ # @yield [Hyrax::IiifAv::Configuration] if a block is passed
17
+ # @return [Hyrax::IiifAv::Configuration]
18
+ # @see Hyrax::IiifAv::Configuration for configuration options
19
+ def self.config(&block)
20
+ @config ||= Hyrax::IiifAv::Configuration.new
21
+
22
+ yield @config if block
23
+
24
+ @config
25
+ end
7
26
  end
8
27
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ module Hyrax
3
+ module IiifAv
4
+ class Configuration
5
+ # URL that resolves to an AV stream provided to a IIIF presentation manifest
6
+ #
7
+ # @return [#call] lambda/proc that generates a URL to an AV stream
8
+ def iiif_av_url_builder
9
+ @iiif_av_url_builder ||= lambda do |file_location_uri, _base_url|
10
+ # Reverse engineering Hyrax::DerivativePath
11
+ path = file_location_uri.sub(/^#{Hyrax.config.derivatives_path}/, '')
12
+ id_path, file_path = path.split('-', 2)
13
+ file_set_id = id_path.delete('/')
14
+ filename = file_path[0, file_path.size / 2]
15
+ Hyrax::Engine.routes.url_helpers.download_path(file_set_id, file: filename)
16
+ end
17
+ end
18
+ attr_writer :iiif_av_url_builder
19
+ end
20
+ end
21
+ end
@@ -80,10 +80,11 @@ RSpec.shared_examples "IiifAv::DisplaysContent" do
80
80
  end
81
81
 
82
82
  context 'when the file is an audio derivative with metadata' do
83
+ let(:file_set_id) { 'abcdefg' }
83
84
  let(:derivatives_metadata) do
84
85
  [
85
- { id: '1', label: 'high', external_file_uri: 'http://test.com/high.mp3' },
86
- { id: '2', label: 'medium', external_file_uri: 'http://test.com/medium.mp3' }
86
+ { id: '1', label: 'high', file_location_uri: Hyrax::DerivativePath.derivative_path_for_reference(file_set_id, 'medium.mp3') },
87
+ { id: '2', label: 'medium', file_location_uri: Hyrax::DerivativePath.derivative_path_for_reference(file_set_id, 'high.mp3') }
87
88
  ]
88
89
  end
89
90
  let(:solr_document) { SolrDocument.new(id: '12345', duration_tesim: 1000, derivatives_metadata_ssi: derivatives_metadata.to_json) }
@@ -96,7 +97,29 @@ RSpec.shared_examples "IiifAv::DisplaysContent" do
96
97
  expect(content).to all(be_instance_of IIIFManifest::V3::DisplayContent)
97
98
  expect(content.length).to eq 2
98
99
  expect(content.map(&:label)).to match_array(['high', 'medium'])
99
- expect(content.map(&:url)).to match_array(['http://test.com/high.mp3', 'http://test.com/medium.mp3'])
100
+ expect(content.map(&:url)).to match_array([Hyrax::Engine.routes.url_helpers.download_path(file_set_id, file: 'high.mp3'),
101
+ Hyrax::Engine.routes.url_helpers.download_path(file_set_id, file: 'medium.mp3')])
102
+ end
103
+
104
+ context 'with custom av url builder' do
105
+ let(:custom_builder) do
106
+ ->(file_location_uri, _base_url) { "http://streaming.example.com/stream/#{File.basename(file_location_uri)}" }
107
+ end
108
+
109
+ around do |example|
110
+ default_builder = Hyrax::IiifAv.config.iiif_av_url_builder
111
+ Hyrax::IiifAv.config.iiif_av_url_builder = custom_builder
112
+ example.run
113
+ Hyrax::IiifAv.config.iiif_av_url_builder = default_builder
114
+ end
115
+
116
+ it 'creates an array of content objects with metadata' do
117
+ expect(content).to all(be_instance_of IIIFManifest::V3::DisplayContent)
118
+ expect(content.length).to eq 2
119
+ expect(content.map(&:label)).to match_array(['high', 'medium'])
120
+ expect(content.map(&:url)).to match_array(['http://streaming.example.com/stream/g-high.mp3.high.mp3',
121
+ 'http://streaming.example.com/stream/g-medium.mp3.medium.mp3'])
122
+ end
100
123
  end
101
124
  end
102
125
 
@@ -123,7 +123,7 @@ RSpec.shared_examples "IiifAv::DisplaysIiifAv" do
123
123
  context 'with no representative_presenter' do
124
124
  let(:representative_presenter) { instance_double('Hyrax::FileSetPresenter', present?: false) }
125
125
 
126
- it { is_expected.to be nil }
126
+ it { is_expected.to be :universal_viewer }
127
127
  end
128
128
  end
129
129
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
3
  module IiifAv
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyrax-iiif_av
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Colvard
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-10-02 00:00:00.000000000 Z
14
+ date: 2018-11-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -47,14 +47,14 @@ dependencies:
47
47
  requirements:
48
48
  - - "~>"
49
49
  - !ruby/object:Gem::Version
50
- version: '2.1'
50
+ version: '2.4'
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - "~>"
56
56
  - !ruby/object:Gem::Version
57
- version: '2.1'
57
+ version: '2.4'
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: iiif_manifest
60
60
  requirement: !ruby/object:Gem::Requirement
@@ -172,12 +172,10 @@ files:
172
172
  - README.md
173
173
  - Rakefile
174
174
  - app/controllers/concerns/hyrax/iiif_av/controller_behavior.rb
175
- - app/helpers/hyrax/iiif_av/iiif_av_helper.rb
175
+ - app/models/hyrax/iiif_av/manifest_range.rb
176
176
  - app/presenters/concerns/hyrax/iiif_av/displays_content.rb
177
177
  - app/presenters/concerns/hyrax/iiif_av/displays_iiif_av.rb
178
178
  - app/presenters/hyrax/iiif_av/iiif_file_set_presenter.rb
179
- - app/views/hyrax/base/_representative_media.html.erb
180
- - app/views/hyrax/base/iiif_viewers/_universal_viewer.html.erb
181
179
  - bin/rails
182
180
  - hyrax-iiif_av.gemspec
183
181
  - lib/generators/hyrax/iiif_av/add_to_work_type_generator.rb
@@ -186,8 +184,8 @@ files:
186
184
  - lib/generators/hyrax/iiif_av/templates/AvalonIiifPlayer.js
187
185
  - lib/generators/hyrax/iiif_av/templates/_avalon.html.erb
188
186
  - lib/hyrax/iiif_av.rb
187
+ - lib/hyrax/iiif_av/configuration.rb
189
188
  - lib/hyrax/iiif_av/engine.rb
190
- - lib/hyrax/iiif_av/manifest_range.rb
191
189
  - lib/hyrax/iiif_av/spec/shared_specs.rb
192
190
  - lib/hyrax/iiif_av/spec/shared_specs/controller_behavior.rb
193
191
  - lib/hyrax/iiif_av/spec/shared_specs/displays_content.rb
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
- # Copyright 2011-2018, The Trustees of Indiana University and Northwestern
3
- # University. Additional copyright may be held by others, as reflected in
4
- # the commit history.
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- # --- END LICENSE_HEADER BLOCK ---
18
-
19
- module Hyrax
20
- module IiifAv
21
- module IiifAvHelper
22
- def iiif_viewer_display(presenter, locals = {})
23
- render iiif_viewer_display_partial(presenter),
24
- locals.merge(presenter: presenter)
25
- end
26
-
27
- def iiif_viewer_display_partial(work_presenter)
28
- 'hyrax/base/iiif_viewers/' + iiif_viewer_for_work(work_presenter).to_s
29
- end
30
-
31
- def iiif_viewer_for_work(work_presenter)
32
- if work_presenter.respond_to? :iiif_viewer
33
- work_presenter.iiif_viewer
34
- else
35
- :universal_viewer
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,27 +0,0 @@
1
- <%#
2
- Copyright 2011-2018, The Trustees of Indiana University and Northwestern
3
- University. Additional copyright may be held by others, as reflected in
4
- the commit history.
5
-
6
- Licensed under the Apache License, Version 2.0 (the "License");
7
- you may not use this file except in compliance with the License.
8
- You may obtain a copy of the License at
9
-
10
- http://www.apache.org/licenses/LICENSE-2.0
11
-
12
- Unless required by applicable law or agreed to in writing, software
13
- distributed under the License is distributed on an "AS IS" BASIS,
14
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- See the License for the specific language governing permissions and
16
- limitations under the License.
17
- --- END LICENSE_HEADER BLOCK ---
18
- %>
19
- <% if presenter.representative_id.present? && presenter.representative_presenter.present? %>
20
- <% if defined?(viewer) && viewer %>
21
- <%= iiif_viewer_display presenter %>
22
- <% else %>
23
- <%= media_display presenter.representative_presenter %>
24
- <% end %>
25
- <% else %>
26
- <%= image_tag 'default.png', class: "canonical-image" %>
27
- <% end %>
@@ -1,4 +0,0 @@
1
- <%= PulUvRails::UniversalViewer.script_tag %>
2
- <div class="viewer-wrapper">
3
- <div class="uv viewer" data-uri="<%= main_app.polymorphic_path [main_app, :manifest, presenter], { locale: nil } %>"></div>
4
- </div>