Class: Abrizer::Canvas

Inherits:
Object
  • Object
show all
Includes:
FilepathHelpers
Defined in:
lib/abrizer/canvas.rb

Overview

Creates a IIIF Canvas JSON-LD document.

Instance Method Summary collapse

Methods included from FilepathHelpers

#audio_filepath, #audio_filepath_fragmented, #basename, #canvas_filepath, #canvas_partial_filepath, #filename_directory, #first_image_filepath, #hlsts_aac_filepath, #hlsts_aac_partial_filepath, #hlsts_filepath, #hlsts_partial_filepath, #mp4_filepath, #mp4_partial_filepath, #mpd_filepath, #mpd_partial_filepath, #output_directory, #output_directory_basename, #poster_image_filepath, #poster_partial_filepath, #sprites_filepath, #sprites_partial_filepath, #vp9_filepath, #vp9_partial_filepath, #webvtt_input_filepath

Constructor Details

#initialize(filepath, output_directory, base_url) ⇒ Canvas

TODO: allow control of items/versions listed on canvas



8
9
10
11
12
13
14
# File 'lib/abrizer/canvas.rb', line 8

def initialize(filepath, output_directory, base_url)
  @filename = filepath
  @output_directory = output_directory
  @base_url = base_url
  finder = AdaptationFinder.new(@filename)
  @adaptations = finder.adaptations
end

Instance Method Details

#aac_item(json) ⇒ Object



134
135
136
137
138
139
140
141
142
# File 'lib/abrizer/canvas.rb', line 134

def aac_item(json)
  if File.exist? hlsts_aac_filepath
    json.child! do
      json.id hlsts_aac_id
      json.type "Audio"
      json.format 'audio/aac'
    end
  end
end

#canvas_idObject



185
186
187
# File 'lib/abrizer/canvas.rb', line 185

def canvas_id
  File.join media_base_url, canvas_partial_filepath
end

#captions_item(json) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/abrizer/canvas.rb', line 144

def captions_item(json)
  # TODO: update captions for multiple captions
  captions_file = File.join output_directory, 'vtt/captions.vtt'
  if File.exist? captions_file
    json.child! do
      json.id vtt_id
      json.type 'Text'
      json.format 'text/vtt'
      json.kind 'captions'
      json.label 'English captions'
      json.language 'en'
      json._comments "How make explicit how whether to use these as captions or subtitles, descriptions, or chapters?"
    end
  end
end

#createObject



16
17
18
19
20
# File 'lib/abrizer/canvas.rb', line 16

def create
  File.open(canvas_filepath, 'w') do |fh|
    fh.puts create_json
  end
end

#create_jsonObject



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/abrizer/canvas.rb', line 22

def create_json
  Jbuilder.encode do |json|
    json.set! '@context', 'http://iiif.io/api/presentation/3/context.json'
    json.id canvas_id
    json.type "Canvas"
    json.width max_width
    json.height max_height
    json.duration duration
    thumbnail_json(json)
    media_json(json)
  end
end

#durationObject



221
222
223
224
# File 'lib/abrizer/canvas.rb', line 221

def duration
  informer = Abrizer::FfprobeInformer.new(mp4_filename)
  informer.duration.to_f
end

#hlsts_aac_idObject



201
202
203
# File 'lib/abrizer/canvas.rb', line 201

def hlsts_aac_id
  File.join media_base_url, hlsts_aac_partial_filepath
end

#hlsts_idObject



197
198
199
# File 'lib/abrizer/canvas.rb', line 197

def hlsts_id
  File.join media_base_url, hlsts_partial_filepath
end

#hlsts_item(json) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/abrizer/canvas.rb', line 95

def hlsts_item(json)
  if File.exist? hlsts_filepath
    json.child! do
      json.id hlsts_id
      json.type "Video"
      # TODO: or "vnd.apple.mpegURL"
      json.format "application/x-mpegURL"
      json.width max_width
      json.height max_height
    end
  end
end

#max_heightObject



234
235
236
# File 'lib/abrizer/canvas.rb', line 234

def max_height
  @adaptations.last.height
end

#max_widthObject



226
227
228
# File 'lib/abrizer/canvas.rb', line 226

def max_width
  @adaptations.last.width
end

#media_base_urlObject



181
182
183
# File 'lib/abrizer/canvas.rb', line 181

def media_base_url
  File.join @base_url, output_directory_basename
end

#media_json(json) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/abrizer/canvas.rb', line 45

def media_json(json)
  json.content do
    json.child! do
      json.type "AnnotationPage"

      json.items do
        json.child! do
          json.type 'Annotation'
          json.motivation 'painting'
          json.target canvas_id
          json.body do
            json.child! do
              json.type "Choice"
              json.choiceHint 'client'
              json.items do
                mpd_item(json)
                hlsts_item(json)
                vp9_item(json)
                mp4_item(json)
                aac_item(json)
              end
            end
            json.child! do
              json.type 'Choice'
              json.choiceHint 'client'
              json.items do
                captions_item(json)
              end
            end
          end
        end
        sprites_item(json)
      end

    end
  end
end

#min_heightObject



238
239
240
# File 'lib/abrizer/canvas.rb', line 238

def min_height
  @adaptations.first.height
end

#min_widthObject



230
231
232
# File 'lib/abrizer/canvas.rb', line 230

def min_width
  @adaptations.first.width
end

#mp4_filenameObject

TODO: DRY up with progressive_mp4.rb



251
252
253
# File 'lib/abrizer/canvas.rb', line 251

def mp4_filename
  File.join output_directory, "progressive.mp4"
end

#mp4_heightObject



246
247
248
# File 'lib/abrizer/canvas.rb', line 246

def mp4_height
  @adaptations[-2].height
end

#mp4_idObject



205
206
207
# File 'lib/abrizer/canvas.rb', line 205

def mp4_id
  File.join media_base_url, mp4_partial_filepath
end

#mp4_item(json) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/abrizer/canvas.rb', line 121

def mp4_item(json)
  if File.exist? mp4_filepath
    json.child! do
      json.id mp4_id
      json.type "Video"
      #TODO: add mp4 codecs
      json.format "video/mp4"
      json.width mp4_width
      json.height mp4_height
    end
  end
end

#mp4_widthObject



242
243
244
# File 'lib/abrizer/canvas.rb', line 242

def mp4_width
  @adaptations[-2].width
end

#mpd_idObject



193
194
195
# File 'lib/abrizer/canvas.rb', line 193

def mpd_id
  File.join media_base_url, mpd_partial_filepath
end

#mpd_item(json) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/abrizer/canvas.rb', line 83

def mpd_item(json)
  if File.exist? mpd_filepath
    json.child! do
      json.id mpd_id
      json.type "Video"
      json.format "application/dash+xml"
      json.width max_width
      json.height max_height
    end
  end
end

#poster_idObject



189
190
191
# File 'lib/abrizer/canvas.rb', line 189

def poster_id
  File.join media_base_url, poster_partial_filepath
end

#sprites_idObject



217
218
219
# File 'lib/abrizer/canvas.rb', line 217

def sprites_id
  File.join media_base_url, sprites_partial_filepath
end

#sprites_item(json) ⇒ Object



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/abrizer/canvas.rb', line 160

def sprites_item(json)
  if File.exist? sprites_filepath
    json.child! do
      json.type 'Annotation'
      json.motivation 'video-thumbnails'
      json.target canvas_id
      json.body do
        json.child! do
          json.id sprites_id
          json.type 'Text'
          json.format 'text/vtt'
          json.kind 'metadata'
          json.label 'image sprite metadata'
          json._comments "How to include resources like video image sprites like those created by https://github.com/jronallo/video_sprites and used by various players?"
        end
      end

    end
  end
end

#thumbnail_json(json) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/abrizer/canvas.rb', line 35

def thumbnail_json(json)
  if File.exist? poster_image_filepath
    json.thumbnail do
      json.id poster_id
      json.type 'Image'
      json.format 'image/jpeg'
    end
  end
end

#vp9_idObject



209
210
211
# File 'lib/abrizer/canvas.rb', line 209

def vp9_id
  File.join media_base_url, vp9_partial_filepath
end

#vp9_item(json) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/abrizer/canvas.rb', line 108

def vp9_item(json)
  if File.exist? vp9_filepath
    json.child! do
      json.id vp9_id
      json.type "Video"
      #TODO: add webm codecs
      json.format "video/webm"
      json.width max_width
      json.height max_height
    end
  end
end

#vtt_idObject



213
214
215
# File 'lib/abrizer/canvas.rb', line 213

def vtt_id
  File.join media_base_url, 'vtt/captions.vtt'
end