hyrax-iiif_av 0.1.0 → 0.2.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.
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>